Получить значение массива (integer[]) из результата запроса PostgreSQL с использованием библиотеки libpq

после выполнения запроса я запускаю следующие функции, но не знаю, как преобразовать значение в целочисленный массив c.

как получить целочисленный массив из pptRawValue, где COLUMN_VALUE_IN_BINARY_FORMAT, когда я посмотрел на память, я увидел, что значение присутствует в pptRawValue, но не смог получить эти значения в целочисленном массиве в коде c?

пожалуйста помоги.

long lColumnNum = PQfnumber(ptQueryRes, pstrColumnName);
long lFormat = PQfformat(ptQueryRes, lColumnNum);
*pptRawValue = PQgetvalue(ptQueryRes, lRowNum, lColumnNum);
*plValueLength = PQgetlength(ptQueryRes, lRowNum, lColumnNum);
int iarray[];

person MUKHTAR INAMDAR    schedule 12.12.2017    source источник
comment
integer не является типом данных C (хотя этот термин используется для категории типов данных). Вы имеете в виду int?   -  person John Bollinger    schedule 12.12.2017


Ответы (2)


Вы можете либо запросить вывод в текстовом режиме, тогда integer[] будет выглядеть как {1,2,42}, либо вы можете запросить двоичный режим, но тогда вам придется иметь дело с представлением внутреннего массива сервера PostgreSQL.

О бинарном режиме для integer[]:

Целые числа представлены в сетевом порядке байтов, поэтому порядок байтов не должен быть проблемой.

Вам придется прочитать исходный код PostgreSQL, чтобы понять структуру файла ArrayType.

Двоичное больше может быть проблемой, если клиент и сервер имеют различную архитектуру, потому что выравнивание может отличаться.

person Laurenz Albe    schedule 12.12.2017
comment
да, но в настоящее время я не могу преобразовать его в текст, так как это требование, но я могу использовать ntohl, ntohs, - person MUKHTAR INAMDAR; 13.12.2017
comment
Это не проблема (я расширил ответ). Внутренняя структура массива является проблемой. - person Laurenz Albe; 13.12.2017
comment
да, я читал о внутреннем формате, однако сначала я проверяю, является ли ответ в двоичном формате, если да, я продолжаю. Спасибо за вашу помощь. - person MUKHTAR INAMDAR; 20.12.2017
comment
в будущем мне будет доступна текстовая опция, так что это будет более экономно. Спасибо за предупреждение. - person MUKHTAR INAMDAR; 20.12.2017

Найден способ извлечения значений из полученного бинарного массива

Полученный двоичный массив имеет следующий формат. Я действительно проверил это.

Это не совсем согласовывалось с тем, что я нашел, но дало мне отправную точку. Вот что я нашел и надеюсь, что эксперты поправят меня, если я ошибаюсь:

Первые 20 байтов содержат следующую информацию о массиве:

--первые 4 байта не знают, что это такое, но это всегда 1
Это может быть номер формата, как упоминал выше Лоренц Альбе.
Ссылка:https://www.postgresql.org/docs/current/static/protocol-overview.html#PROTOCOL-FORMAT-CODES
--вторые 4 байта " " " " " " " " " 0
--третьи 4 байта oid типа данных в массиве
--4-е 4 байта число элементов в массиве
--5-е 4-байтовое измерение массива

Форма здесь у нас есть фактические данные. Каждому элементу данных предшествует 4-байтовое целое число, указывающее количество байтов, которое занимает следующий элемент. Зная количество элементов, можно разобрать память и получить доступ к элементам.

Пожалуйста, перейдите по ссылке: https://www.postgresql.org/message-id/attachment/13504/arrayAccess.txt

person MUKHTAR INAMDAR    schedule 13.12.2017