使用libpq库从PostgreSQL的查询结果中获取(integer [])数组值

时间:2017-12-12 13:56:56

标签: c 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[];

2 个答案:

答案 0 :(得分:0)

您可以请求文本模式输出,然后integer[]看起来像{1,2,42},或者您可以请求二进制模式,但是您必须处理PostgreSQL的内部数组表示服务器

关于integer[]的二进制模式:

Integers themselves are represented in network byte order,所以字数不应该是个问题。

您必须阅读PostgreSQL源代码才能理解ArrayType的结构。

如果客户端和服务器具有不同的体系结构,则二进制更多可能是一个问题,因为对齐可能不同。

答案 1 :(得分:0)

找到从接收的二进制数组中提取值的方法

收到的二进制数组格式如下。 我实际已经验证了它。

这与我发现的内容并不完全一致,但它给了我一个起点。   这是我发现的,希望如果我错了,专家会纠正我:

前20个字节似乎有关于数组的以下信息:

- 前4个字节不知道它是什么但总是1个这可能是上面提到的Laurenz Albe的格式编号。
参考:https://www.postgresql.org/docs/current/static/protocol-overview.html#PROTOCOL-FORMAT-CODES <登记/> - 第二个4字节&#34; &#34; &#34; &#34; &#34; &#34; &#34; &#34; &#34; 0
- 数组中数据类型的第三个4字节oid - 数组中第4个4字节的元素数量
- 阵列的第5个4字节维度

此处表格我们有实际数据。每个数据前面都有一个4字节   整数,表示下一个元素占用的字节数。会心   可以解析内存并获取访问权限的元素数量   元件。

请暂停链接:https://www.postgresql.org/message-id/attachment/13504/arrayAccess.txt