类型转换。如何处理C中libpq中的PostgreSQL OID值?
我正在使用PostgreSQL C API,libpq。我需要能够将PGresult*中的值转换为Ruby中的等效数据类型。我现在只是选择所有数据并使用PQgetvalue,它给我一个char*,我可以将其转换成ruby字符串。那很容易。但是有没有人可以分享一些例子,根据PQftype返回的OID,将char*转换为int、float或double类型转换。如何处理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中进行类型转换。我猜在某个地方
事实上,简而言之,我不知道如何解释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
}
}