Преобразование типов. Что мне делать с значением OID PostgreSQL в libpq в C?

Я работаю с API PostgreSQL C, libpq. Мне нужно иметь возможность преобразовывать значения в PGresult* в их эквивалентные типы данных в Ruby. В настоящее время я просто PQgetvalue() все данные и использую PQgetvalue() , который дает мне char* который я могу преобразовать в Ruby String. Это легко. Но есть ли какие-нибудь примеры, которые кто-то может поделиться, которые делают преобразование типа из char* , например, int , float или double , в соответствии с OID, возвращаемым PQftype() ?

На самом деле, короче говоря, я понятия не имею, как интерпретировать OID, и документация , похоже, не дает никаких указателей. Я нашел эту страницу , но это не помогает понять, как использовать этот OID для преобразования типов в C API. Я предполагаю, что есть список констант где-нибудь, с которого я могу сделать большой оператор switch?

Я нашел ответ, спросив об этом. В основном есть файл под названием catalog / pg_type.h, наряду с libpq-fe.h и postgres.h. Вы должны включить после включения libpq-fe.h и postgres.h, тогда вы можете получить доступ к определениям типа TEXTOID , BOOLOID , INT4OID и т. Д.

 #include  #include  #include  #include  // ... 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 } } 

Вам нужно посмотреть все OID в pg_type.h, чтобы на самом деле иметь обширный список, или просто проверить, что вы получаете, выполняя базовые запросы SELECT 't'::boolean т. Д., И создайте коммутатор только по мере того, как вам нужен новый тип поддержка.

Чтобы получить имя типа из OID, просто regtype его в regtype :

 SELECT 700::oid::regtype -- real 

Чтобы получить тип любых столбцов (или переменных в plpgsql), используйте pg_typeof() :

 SELECT pg_typeof(1::real) -- real 

Дает вам ответ типа regtype который displayed как text в psql или pgAdmin. При необходимости вы можете направить text в text поле:

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

Существует также этот «большой список», каталог каталога pg_type , где регистрируются типы. Это может быть большим, заглянуть:

 SELECT * from pg_type LIMIT 10; 

Больше информации в отличном руководстве.