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

时间:2012-09-21 12:16:13

标签: c postgresql libpq

我正在使用PostgreSQL C API,libpq。我需要能够将PGresult*中的值转换为Ruby中的等效数据类型。我目前只是选择所有数据并使用PQgetvalue(),它为我提供了char*,我可以将其转换为ruby字符串。这很简单。但是根据{{返回的OID,是否有人可以共享的任何示例,从char*intfloatdouble进行类型转换。 1}}?

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

2 个答案:

答案 0 :(得分:12)

在问到这个之后我找到了答案。基本上有一个名为catalog / pg_type.h的文件,以及libpq-fe.h和postgres.h。您需要在包含libpq-fe.h和postgres.h之后加入,然后您可以访问TEXTOIDBOOLOIDINT4OID等定义。

#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
  }
}

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

答案 1 :(得分:3)

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

SELECT  700::oid::regtype -- real

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

SELECT  pg_typeof(1::real) -- real

在psql或pgAdmin中为您提供regtype类型的答案,displayedtext。如果需要,您可以明确地将其强制转换为text

SELECT  pg_typeof(1::real)::text -- real

还有这个“大名单”,即vulgo目录表pg_type,其中注册了类型。这可能很大,请看一眼:

SELECT * from pg_type LIMIT 10;

More info in the excellent manual.