【问题标题】:Get (integer[]) array value from the query result of PostgreSQL using libpq library使用 libpq 库从 PostgreSQL 的查询结果中获取 (integer[]) 数组值
【发布时间】:2017-12-20 21:23:54
【问题描述】:

执行查询后,我运行下面的函数,但不知道如何将值转换为 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" 不是 C 数据类型(尽管该术语用于数据类型的类别)。你的意思是int

标签: c postgresql libpq


【解决方案1】:

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

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

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

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

如果客户端和服务器具有不同的架构,二进制更多可能会成为问题,因为对齐方式可能不同。

【讨论】:

  • 是的,但目前我无法将其转换为文本,因为这是必需的,但我可以使用 ntohl、ntohs、
  • 没问题(我已经扩展了答案)。数组的内部结构是问题。
  • 是的,我阅读了有关内部格式的信息,但首先我检查是否以二进制格式响应,如果是,我将继续。感谢您的帮助。
  • 以后我可以使用文本选项,这样会更省钱。谢谢提醒。
【解决方案2】:

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

接收到的二进制数组具有以下格式。 我已经验证过了。

这与我的发现不太一致,但它给了我一个起点。 这是我发现的,如果我错了,希望专家能纠正我:

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

--前4个字节不知道是什么但总是1
      这可能是上面提到的Laurenz Albe的格式号。
      参考:https://www.postgresql.org/docs/current/static/protocol-overview.html#PROTOCOL-FORMAT-CODES
--second 4字节 " " " " " " " " " 0
--数组中数据类型的第三个4字节oid
--4th 4 字节数组中的元素个数
--数组的第5个4字节维度

这里我们有实际的数据。每个数据前面都有一个 4 字节 整数,指示下一个元素占用的字节数。会心 可以解析内存并访问 元素。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2011-09-04
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多