使用libpq库从PostgreSQL的查询结果中获取(integer[])数组值
Get (integer[]) array value from the query result of PostgreSQL using libpq library
执行查询后,我 运行 下面的功能,但不知道如何将值转换为 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[];
您可以请求文本模式输出,然后 integer[]
看起来像 {1,2,42}
,或者您可以请求二进制模式,但是您必须处理内部数组表示PostgreSQL 服务器。
关于 integer[]
的二进制模式:
Integers themselves are represented in network byte order,所以字节顺序应该不是问题。
您必须阅读 PostgreSQL 源代码才能理解 ArrayType
.
的结构
如果客户端和服务器具有不同的体系结构,则二进制 more 可能会成为问题,因为对齐方式可能不同。
找到了从接收到的二进制数组中提取值的方法
接收到的二进制数组格式如下。
我确实验证过了
这与我的发现不太一致,但它给了我一个起点。
以下是我的发现,如有错误希望专家指正:
前 20 个字节似乎包含有关数组的以下信息:
--前4个字节不知道是什么但总是1
这可能是上面提到的Laurenz Albe的格式编号。
参考:https://www.postgresql.org/docs/current/static/protocol-overview.html#PROTOCOL-FORMAT-CODES
--second 4 bytes " " " " " " " " " " 0
--数组中数据类型的第三个 4 字节 oid
--4th 4 bytes 数组元素个数
--数组的第5个4字节维度
这里我们有实际数据。每个数据前面有一个 4 字节
指示下一个元素占用的字节数的整数。会心
可以解析内存并访问的元素数量
元素。
请休假 link: https://www.postgresql.org/message-id/attachment/13504/arrayAccess.txt
执行查询后,我 运行 下面的功能,但不知道如何将值转换为 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[];
您可以请求文本模式输出,然后 integer[]
看起来像 {1,2,42}
,或者您可以请求二进制模式,但是您必须处理内部数组表示PostgreSQL 服务器。
关于 integer[]
的二进制模式:
Integers themselves are represented in network byte order,所以字节顺序应该不是问题。
您必须阅读 PostgreSQL 源代码才能理解 ArrayType
.
如果客户端和服务器具有不同的体系结构,则二进制 more 可能会成为问题,因为对齐方式可能不同。
找到了从接收到的二进制数组中提取值的方法
接收到的二进制数组格式如下。 我确实验证过了
这与我的发现不太一致,但它给了我一个起点。 以下是我的发现,如有错误希望专家指正:
前 20 个字节似乎包含有关数组的以下信息:
--前4个字节不知道是什么但总是1
这可能是上面提到的Laurenz Albe的格式编号。
参考:https://www.postgresql.org/docs/current/static/protocol-overview.html#PROTOCOL-FORMAT-CODES
--second 4 bytes " " " " " " " " " " 0
--数组中数据类型的第三个 4 字节 oid
--4th 4 bytes 数组元素个数
--数组的第5个4字节维度
这里我们有实际数据。每个数据前面有一个 4 字节 指示下一个元素占用的字节数的整数。会心 可以解析内存并访问的元素数量 元素。
请休假 link: https://www.postgresql.org/message-id/attachment/13504/arrayAccess.txt