类型转换.如何在C中的libpq中使用PostgreSQL OID值?

d11*_*wtq 9 c postgresql libpq

我正在使用PostgreSQL C API,libpq.我需要能够将a中的值转换为PGresult*Ruby中的等效数据类型.我目前只是选择所有数据并使用PQgetvalue(),这给了我一个char*我可以转换成ruby String的东西.这很简单.但是否有任何的例子有人可以共享从做一个类型转换char*,比方说,int,float或者double,根据OID由归国PQftype()

实际上,简而言之,我不知道如何解释OID,文档似乎没有给出任何指示.我找到了这个页面,但这无助于理解如何使用此OID在C API中进行类型转换.我猜这里有一个常量列表,我可以从中做出一个很大的转换声明吗?

d11*_*wtq 13

问这个之后我找到了答案.基本上有一个名为catalog/pg_type.h的文件,以及libpq-fe.h和postgres.h.你需要包含libpq-fe.h和了postgres.h,那么你就可以像访问的定义之后,包括TEXTOID,BOOLOID,INT4OID等.

#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
  }
}
Run Code Online (Sandbox Code Playgroud)

您需要查看pg_type.h中的所有OID以实际拥有一个扩展列表,或者仅测试您返回的基本SELECT 't'::boolean类型查询等,并仅在您需要新类型支持时构建交换机.

  • 这些头文件是postgres服务器代码的一部分,而不是libpq客户端代码.postgres发布之间的值是否会发生变化? (3认同)

Erw*_*ter 4

要从 OID 获取类型名称,只需将其转换为regtype

SELECT  700::oid::regtype -- real
Run Code Online (Sandbox Code Playgroud)

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

SELECT  pg_typeof(1::real) -- real
Run Code Online (Sandbox Code Playgroud)

regtype给你一个类似于psql 或 pgAdmindisplayed类型的答案。如果需要,text您可以将其显式转换为:text

SELECT  pg_typeof(1::real)::text -- real
Run Code Online (Sandbox Code Playgroud)

还有这个“大列表”,vulgo 目录表pg_type,其中注册了类型。这可能很大,看一下:

SELECT * from pg_type LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

更多信息请参阅优秀手册。