Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类型转换。如何处理C中libpq中的PostgreSQL OID值?_C_Postgresql_Libpq - Fatal编程技术网

类型转换。如何处理C中libpq中的PostgreSQL OID值?

类型转换。如何处理C中libpq中的PostgreSQL OID值?,c,postgresql,libpq,C,Postgresql,Libpq,我正在使用PostgreSQL C API,libpq。我需要能够将PGresult*中的值转换为Ruby中的等效数据类型。我现在只是选择所有数据并使用PQgetvalue,它给我一个char*,我可以将其转换成ruby字符串。那很容易。但是有没有人可以分享一些例子,根据PQftype返回的OID,将char*转换为int、float或double 事实上,简而言之,我不知道如何解释OID,似乎也没有给出任何提示。我发现了,但这无助于理解如何使用此OID在C API中进行类型转换。我猜在某个地方

我正在使用PostgreSQL C API,libpq。我需要能够将PGresult*中的值转换为Ruby中的等效数据类型。我现在只是选择所有数据并使用PQgetvalue,它给我一个char*,我可以将其转换成ruby字符串。那很容易。但是有没有人可以分享一些例子,根据PQftype返回的OID,将char*转换为int、float或double


事实上,简而言之,我不知道如何解释OID,似乎也没有给出任何提示。我发现了,但这无助于理解如何使用此OID在C API中进行类型转换。我猜在某个地方有一个常量列表,我可以从中生成一个大的switch语句。

要从OID中获取类型名称,只需将其强制转换为:

要获取plpgsql中任何列或变量的类型,请使用:

为您提供regtype类型的答案,该答案在psql或pgAdmin中显示为文本。如果需要,可以将其显式转换为文本:

SELECT  pg_typeof(1::real)::text -- real
还有一个很大的列表,vulgo目录表pg_type,其中注册了类型。这可能很大,看一看:

SELECT * from pg_type LIMIT 10;

问了这个问题后,我找到了答案。基本上,除了libpq fe.h和postgres.h之外,还有一个名为catalog/pg_type.h的文件。在包含libpq fe.h和postgres.h之后,您需要包含,然后您可以访问TEXTOID、BOOLOID、INT4OID等定义


您需要查看pg_type.h中的所有OID才能真正拥有一个广泛的列表,或者只需测试您在执行基本选择“t”::布尔类型查询等操作时得到的结果,并仅在您需要新类型支持时构建开关。

谢谢,不过,您知道是否有一种方法可以从C API获得该结果,而不是在每个结果的每个列中往返到服务器?我只对核心类型感兴趣,而不是用户类型。你可以让Postgres在每次结果中发送此信息,只需添加选定的项,尽管每行都是多余的。我不熟悉C API。没有戏剧。谢谢你的帮助。我正在实现一个客户端库,所以我不希望修改用户查询,也不希望向服务器发送过多的额外请求。我想我现在已经在catalog/pg_type.h:@d11wtq:Cool中找到了它。这名字没什么好惊讶的吧这些头是postgres服务器代码的一部分,而不是libpq客户端代码。postgres版本之间的值是否发生变化?
SELECT  pg_typeof(1::real)::text -- real
SELECT * from pg_type LIMIT 10;
#include <stdio.h>
#include <postgres.h>
#include <libpq-fe.h>
#include <catalog/pg_type.h>

// ... snip ...

if (PQgetisnull(result, row, col)) {
  // value is NULL, nothing more to do
} else {
  char * value  = PQgetvalue(result, row, col);
  int    length = PQgetlength(result, row, col);

  switch (PQftype(result, col)) {
    case INT2OID:
    case INT4OID:
    case INT8OID:
      // process value as an integer
      break;

    default:
      // just default to a text representation
  }
}