Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.84.155] |
|
Сообщ.
#1
,
|
|
|
Уважаемые подскажите пожалуйста,
имеется некий буфер ( BUFER ) в котором байты требуется преобразовать этот буфер в таблицу в которой каждая колонка свой тип и длина (хранится в отдельной STRUCTURA на каждый столбик т.е STRUCTURA[n].type - тип n-ного столбика STRUCTURA[n].len - длина n-ного столбика ) подскажите пожалуйста какие существуют алгоритмы чтобы быстро можно было распарсить буфер в типизированный набор данных |
Сообщ.
#2
,
|
|
|
Протокол/описание структуры буфера имеется?
|
Сообщ.
#3
,
|
|
|
Цитата MBo @ Протокол/описание структуры буфера имеется? да есть Добавлено это как бы описание Добавлено если описывать словесно то BUFER - это двухмерный массив байтов если конкретизировать к Си то это char *bufOut = new char[РазмерСтроки * Кол-воСтрок]; // Адрес буфера для присылаемых записей. и имеется структура описывающая эти данные в буфере в структуре как раз и хранится информация о каждом столбике STRUCTURA[n].type - тип n-ного столбика STRUCTURA[n].len - длина n-ного столбика Добавлено если в С++ то буфер выглядит так std::vector<char> masResult(n *pRecSize); Добавлено n - кол-во строк pRecSize - размер строки в байтах |
Сообщ.
#4
,
|
|
|
Это описание пока не годится. Можно попробовать на пальцах. Вот есть массив байтов (b[0], b[1], b[2], b[3], b[4],...).
Какая информация содержится в каждом байте, и как на это ложится STRUCTURA ? P.S. Это имеет отношение к разбору данных из темы Функция из DLL ? |
Сообщ.
#5
,
|
|
|
Цитата MBo @ P.S. Это имеет отношение к разбору данных из темы Функция из DLL ? да да да , мы делаем там конектор к СУБД HyTech , и вот я пытаюсь хоть разобрать алгоритм и вообще какие существуют методы и способы разбора пачки данных полученного от сервера в ответ на SQL-запрос Добавлено Цитата MBo @ Вот есть массив байтов (b[0], b[1], b[2], b[3], b[4],...). да точно Цитата MBo @ Какая информация содержится в каждом байте, и как на это ложится STRUCTURA ? STRUCTURA содержит в себе несколько параметров о колонках тип и размер в байтах сколько занимает данная колонка т.е. получив пачку байтов ( BUFER ) которую надо преобразовать в типизированную таблицу мы уже имеем STRUCTURA и количество строк и столбцов в этом BUFER остается только этот BUFER преобразовать в таблицу решение в лоб мы как бы там написали через два цикла и switch , но рассматривая исходники ClickHouse я заметил что у них там что то другое помоему |
Сообщ.
#6
,
|
|
|
Уважаемые форумчане , вопрос еще актуален и если у кого есть мысли поделитесь пожалуйста ,
или возможно кто то знает уже стандартные алгоритмы разбора "байтового результата в ответ на SQL-запрос" |
Сообщ.
#7
,
|
|
|
Цитата kms @ решение в лоб мы как бы там написали через два цикла и switch , но рассматривая исходники ClickHouse я заметил что у них там что то другое помоему Там у тебя не "в лоб" решение, а вполне нормальное. Дальше нужно определится, в каком виде тебе нужно хранить полученные значения столбцов. Тут можно сделать либо класс, типа std::variant, либо тупо хранить их в строках, std::string, что для тебя по-моему предпочтительнее. |
Сообщ.
#8
,
|
|
|
Я так понимаю, есть буфер, типичная куча байтов., если быть точным - одна структура или несколько структур, сложенных по порядку. Разница лишь в том, что каждый раз структуры в буфере разные, и количество их так же меняется. Верно?
Но раз мы знаем что ждем, или по заголовку узнаем что пришло, то почему данные просто не представить как ожидаемую структуру? // Допустим, был буфер. char* buf; // Допустим, известно, что в нем может быть две структуры struct DataOne { int i; float f; } struct DataTwo { float f1; float f2; char stamp[4]; } // Мы знаем, что в буфере лежит структура DataTwo // и просим компилятор представить буфер как структуру DataTwo float f1 = ((DataTwo*)buf)->f1; // И самое интересное, нам нужно получить доступ именно к пятой по порядку лежащей структуре DataTwo* pDTW; pDTW = (DataTwo*)buf; float f2 = pDTW[4]->f2; Как-то так, ну а дальше все зависит от фантазии. Можно еще union использовать, дабы одну кучу байт одновременно видеть по разному (разными структурами). Ну и конечно же, обязательно надо следить за выравниванием структур, в таком случае. |
Сообщ.
#9
,
|
|
|
Цитата simsergey @ Я так понимаю, есть буфер, типичная куча байтов., если быть точным - одна структура или несколько структур, сложенных по порядку. Разница лишь в том, что каждый раз структуры в буфере разные, и количество их так же меняется. Верно? да точно , это же результат sql-запроса , Добавлено Цитата simsergey @ Но раз мы знаем что ждем, или по заголовку узнаем что пришло, да , точно , перед разбором буфера прилетает структура описывающая каждый столбец результата, точней если не трудно посмотрите http://hytechdb.ru/index.php?s=docs&ru=V25...SqlDstInfoT.htm Добавлено Цитата simsergey @ то почему данные просто не представить как ожидаемую структуру? вот как раз это и проблема, немного на сколько хватило ума посматриваю на исходники PostgreSQL , ClickHouse , MySQL но пока не могу уловить как у них сделано |
Сообщ.
#10
,
|
|
|
Цитата kms @ перед разбором буфера прилетает структура описывающая каждый столбец результата, Ну если на С++, то сделай фабрику объектов на крайняк. Реализуй базовые типы данных, все. По сути тип столбика важен только тогда, когда нужно редактировать какие то данные в таблице, а для чтения - достаточно чтоб все данные были представлены как строка. |
Сообщ.
#11
,
|
|
|
Цитата KILLER @ а для чтения - достаточно чтоб все данные были представлены как строка. да это точно , и я бы так и сделал , но как тогда делать преобразования в строку |
Сообщ.
#12
,
|
|
|
Цитата kms @ Было время, было не трудно, глянул.точней если не трудно посмотрите http://hytechdb.ru/index.php?s=docs&ru=V25...SqlDstInfoT.htm Там описывают структуру. Алгоритмов по разбору ответа sql сервера я там не заметил. kms, если данные не зашифрованы (не запакованы), они обычно складываются в буфер в своем порядке, по очереди, например, и отправляется этот буфер получателю. Получатель - твоя программа, она получает этот буфер. При условии, что буфер не меняется в дороге, твоя программа его получает с тем же самым порядком данных. Логично? В таком случае, чтобы их разложить по типам и собрать себе в таблицу (в массивы и т.д.) нужно знать структуру, знать что именно лежит в буфере. Порядок данных в буфере известен? В общем-то, мой вопрос в том, ты знаешь что ожидаешь (состав буфера) ? |
Сообщ.
#13
,
|
|
|
Цитата simsergey @ Порядок данных в буфере известен? да известен Добавлено Цитата simsergey @ , если данные не зашифрованы (не запакованы), нет они без шифрования |