2012-09-21 10 views
9

私はPostgreSQL C APIのlibpqを使っています。 PGresult*の値をRubyの同等のデータ型に変換できる必要があります。私は現在、すべてのデータを選択して、PQgetvalue()を使用しています。私にはchar*というルビー文字列に変換することができます。それは簡単です。しかし、PQftype()によって返されたOIDに従って、char*からintfloatまたはdoubleへの型変換を行うことができる例がありますか?タイプ変換。 CのlibpqでPostgreSQLのOID値をどうすればよいですか?

実際に、私はOIDをどのように解釈するのか分かりませんし、the documentationはポインタを与えてくれないようです。 this pageが見つかりましたが、このOIDを使用してC APIの型変換を行う方法を理解するのには役立ちません。私はどこかで私は大きなswitch文を作ることができる定数のリストがあると思いますか?ただregtypeにキャストし、OIDから型名を取得するために

答えて

3

SELECT 700::oid::regtype -- real 

(plpgsqlが中または変数)任意の列の型を取得するには、pg_typeof()を使用します。

SELECT pg_typeof(1::real) -- real 

psqlまたはpgAdminにregtypeというdisplayedのタイプの回答がtextとして表示されます。必要な場合は、明示的textにキャストすることができます

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

タイプが登録されているこの「大きなリスト」、vulgoカタログ表pg_typeは、もあります。これは大きなことができ、のぞき見を持っている:

SELECT * from pg_type LIMIT 10; 

More info in the excellent manual.

+1

ありがとうございますが、すべての結果のすべての列についてサーバーにラウンドトリップするのではなく、C APIからこれを取得する方法があるかどうかは分かりますか?私はコアタイプだけに興味があり、ユーザタイプには興味がありません。 – d11wtq

+0

Postgresはこの情報をすべての結果と共に送信することができます。SELECT項目を追加するだけです(行ごとに冗長になります)。私はC APIに精通していません。 –

+0

ドラマはありません。ご協力いただきありがとうございます。私はクライアントライブラリを実装しているので、ユーザのクエリを変更したくない、または過度の追加要求をサーバに送信したくない。私はカタログ/ pg_type.hで実際にそれを見つけたと思います:) – d11wtq

11

私はこれを求めた後、答えを見つけました。基本的に、catalog/pg_type.hというファイルがlibpq-fe.hとpostgres.hの横にあります。あなたは、あなたがにpg_type.hにすべてのOIDを見てする必要があります

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

など INT4OIDBOOLOID、その後、あなたは TEXTOIDのような定義にアクセスすることができ、libpqの-fe.hとpostgres.hを含めた後に含める必要があります実際には広範なリストを持っているか、基本的な SELECT 't'::booleanタイプのクエリなどを実行して戻ってきたものをテストし、新しいタイプのサポートが必要な場合にのみスイッチを構築します。

+2

これらのヘッダは、libpqクライアントコードではなくpostgresサーバコードの一部です。 postgresのリリース間で値が変わるのですか? – KayEss

関連する問題