これらの関数を使用して、既存のデータベース接続オブジェクトの状態を調べることができます。
libpqアプリケーションのプログラマは注意してPGconn
という抽象化を維持してください。
PGconn
の内容は以下に挙げるアクセス用関数を使って取り出してください。
PGconn
構造体中のフィールドは将来予告なく変更されることがありますので、libpq-int.h
を使用したフィールドの参照は避けてください。
以下の関数は、接続で確立したパラメータの値を返します。
これらの値はPGconn
の存続期間中で固定されます。
PQdb
接続したデータベース名を返します。
char *PQdb(const PGconn *conn);
PQuser
接続したユーザ名を返します。
char *PQuser(const PGconn *conn);
PQpass
接続したパスワードを返します。
char *PQpass(const PGconn *conn);
PQhost
接続したサーバホスト名を返します。
これはホスト名、IPアドレス、あるいはUnixソケット経由で接続している場合はディレクトリパスになります。
(パスの場合は必ず/
で始まる絶対パスになるので、他と区別できます。)
char *PQhost(const PGconn *conn);
PQport
接続したポートを返します。
char *PQport(const PGconn *conn);
PQtty
接続のデバッグ用TTYを返します。 (これは廃れたものです。サーバはもはやTTY設定を参照しません。 後方互換性のためにこの関数が残っています。)
char *PQtty(const PGconn *conn);
PQoptions
接続要求時に渡されたコマンドラインオプションを返します。
char *PQoptions(const PGconn *conn);
以下の関数は、PGconn
オブジェクトに対して操作を行うことで変更可能な状態データを返します。
PQstatus
接続の状態を返します。
ConnStatusType PQstatus(const PGconn *conn);
この状態は多くの値の中の1つとなるはずです。
しかし非同期接続手順の外部からは、その中でたった2つ、CONNECTION_OK
とCONNECTION_BAD
だけが現れます。
データベースへの接続に問題がなければ、CONNECTION_OK
状態になります。
接続に失敗している場合はCONNECTION_BAD
状態となります。
通常、OK状態はPQfinish
まで維持されますが、通信失敗のために早まってCONNECTION_BAD
になることもあります。
その場合、アプリケーションはPQreset
を呼び出して修復を試みることができます。
返される可能性があるその他の状態コードについてはPQconnectStartParams
、PQconnectStart
およびPQconnectPoll
の項目を参照してください。
PQtransactionStatus
サーバの現在のトランザクション内部状態を返します。
PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
この状態は、PQTRANS_IDLE
(現在待機中)、PQTRANS_ACTIVE
(コマンド実行中)、PQTRANS_INTRANS
(有効なトランザクションブロック内で待機中)、PQTRANS_INERROR
(無効なトランザクションブロック内で待機中)となり得ます。
接続に問題がある場合のみPQTRANS_UNKNOWN
が報告されます。
サーバへ問い合わせが送信されたが、まだ完了していない場合のみPQTRANS_ACTIVE
が報告されます。
PQparameterStatus
サーバの現在のパラメータ設定を検索します。
const char *PQparameterStatus(const PGconn *conn, const char *paramName);
あるパラメータ値は、接続開始時に、もしくは、その値が変更された時は常にサーバによって自動的に報告されます。
PQparameterStatus
はそれらの設定の調査に役立ちます。
パラメータの現在値がわかればその値を、わからない場合はNULL
を返します。
現在のリリースで報告されるパラメータには、server_version
、server_encoding
、client_encoding
、application_name
、is_superuser
、session_authorization
、DateStyle
、IntervalStyle
、TimeZone
、integer_datetimes
およびstandard_conforming_strings
があります。
(8.0より前ではserver_encoding
、TimeZone
およびinteger_datetimes
が、8.1より前ではstandard_conforming_strings
が、そして8.4より前ではIntervalStyle
が、9.0より前ではapplication_name
が報告されませんでした。 )
server_version
、server_encoding
およびinteger_datetimes
は起動後変更できないことに注意してください。
プロトコル3.0より前のサーバはパラメータ設定を報告しません。
しかし、libpqにはserver_version
とclient_encoding
の値を取り出す仕組みがとりあえずあります。
アプリケーションは、付け焼き刃なコードでこれらの値を決定するのではなく、PQparameterStatus
を使用することが求められています。
(しかし、3.0より前の接続では、接続開始後にSET
によるclient_encoding
の変更はPQparameterStatus
に反映されないことに注意してください。)
server_version
については、この情報をより比較し易い数値形式で返すPQserverVersion
も参照してください。
standard_conforming_strings
の値がないと報告された場合、アプリケーションはoff
と推測することができます。
つまり、バックスラッシュは文字リテラル中のエスケープ文字として扱います。
また、このパラメータが存在すると、エスケープ文字構文(E'...'
)が受付けられることを意味するものと取られます。
返されるポインタはconst
と宣言されていますが、実際にはPGconn
構造体に関連付けされた変化する領域を指し示します。
このポインタが諸問い合わせに渡って有効なままであるとみなすのは賢明ではありません。
PQprotocolVersion
使用されるフロントエンド/バックエンドプロトコルを調査します。
int PQprotocolVersion(const PGconn *conn);
ある機能がサポートされているかどうかを決定するために、アプリケーションはこの関数を使用することができます。 現在、取り得る値は2(2.0プロトコル)、3(3.0プロトコル)、あるいは0(接続不良)です。 このプロトコルバージョンは接続の開始が完了した後で変更することはできません。 しかし、理論的には接続のリセット時に変更可能です。 PostgreSQL 7.4以降での通信時、通常3.0プロトコルが使用されます。 7.4より前のサーバでは2.0プロトコルのみをサポートします。 (1.0プロトコルは廃止され、libpqではサポートされていません。)
PQserverVersion
バックエンドのバージョンの整数表現を返します。
int PQserverVersion(const PGconn *conn);
この関数を使用してアプリケーションは接続したデータベースサーバのバージョンを決定することができます。 この数値の形式は、メジャー、マイナー、リビジョン番号を2桁の10進数に変換し、連結させたものです。 例えば、バージョン8.1.5では80105を返し、バージョン8.2では80200を返します。 (先頭の0は現れません。) 接続不良の場合は0が返されます。
PQerrorMessage
接続における操作において、最も最近に生成されたエラーメッセージを返します。
char *PQerrorMessage(const PGconn *conn);
ほとんどすべてのlibpq関数は、失敗時にPQerrorMessage
用のメッセージを設定します。
libpqでの決まりとして、空でないPQerrorMessage
の結果は複数行に渡ることも可能で、最後に改行が含まれることがある点に注意してください。
呼び出し元はこの結果を直接解放してはいけません。
関連するPGconn
ハンドルがPQfinish
に渡された時にこれは解放されます。
PGconn
構造体への操作を跨って、この結果文字列が同一であると想定してはいけません。
PQsocket
サーバとの接続ソケットに対するファイル記述子番号を得ます。 有効な記述子なら値は0以上です。 -1の場合は、サーバとの接続がまだ開いていないことを示します。 (これは通常の操作では変更することはできません。 接続設定中やリセット中に変更されます。)
int PQsocket(const PGconn *conn);
PQbackendPID
接続を処理するバックエンドのプロセスID(PID)を返します。
int PQbackendPID(const PGconn *conn);
バックエンドのPIDは、デバッグする場合やNOTIFY
メッセージ(これは通知を発行したバックエンドプロセスのPIDを含んでいます)の比較に便利です。
このPIDはデータベースサーバホスト上で実行されているプロセスのものであり、ローカルホスト側のものではありません!
注意してください。
PQconnectionNeedsPassword
接続認証方式がパスワードを要求し、利用可能なパスワードがない場合真(1)を返します。 さもなくば偽(0)を返します。
int PQconnectionNeedsPassword(const PGconn *conn);
この関数を、接続試行に失敗した後でユーザにパスワード入力を促すかどうかを決定するために適用することができます。
PQconnectionUsedPassword
接続認証方式でパスワードを使用する場合は真(1)、さもなくば偽(0)を返します。
int PQconnectionUsedPassword(const PGconn *conn);
この関数は、接続の試みが失敗したか成功したかの後に、サーバがパスワードを要求したかどうかを検出するために適用できます。
以下の関数はSSLに関連した情報を返します。 この情報は通常、接続の確立後には変更されません。
PQsslInUse
接続がSSLを使っていれば真(1)、使っていなければ偽(0)を返します。
int PQsslInUse(const PGconn *conn);
PQsslAttribute
接続におけるSSL関連の情報を返します。
const char *PQsslAttribute(const PGconn *conn, const char *attribute_name);
利用可能な属性のリストは使用されているSSLライブラリおよび接続の種類に依存して変わります。 属性が利用可能でないときはNULLが返されます。
一般的には、以下の属性が利用可能です。
library
使用されているSSLの実装の名前です。
(現在は"OpenSSL"
だけが実装されています。)
protocol
使用されているSSL/TLSのバージョンです。
一般的な値は、"SSLv2"
、"SSLv3"
、"TLSv1"
、"TLSv1.1"
、"TLSv1.2"
ですが、他のプロトコルが使用されれば、異なる文字列が返されるかもしれません。
key_bits
暗号アルゴリズムで使用されている鍵のビット数です。
cipher
使用されている暗号スイートの短縮名、例えば"DHE-RSA-DES-CBC3-SHA"
です。
この名前は各SSLの実装に固有のものです。
compression
SSL圧縮が使用されている場合、圧縮アルゴリズムの名前を返します。 圧縮は使われているがアルゴリズムが不明という場合を"on"を返します。 圧縮が使われていない場合は"off"を返します。
PQsslAttributeNames
利用可能なSSL属性名の配列を返します。 配列の最後のメンバにはNULLポインタが入ります。
const char * const * PQsslAttributeNames(const PGconn *conn);
PQsslStruct
接続を説明するSSLの実装に固有のオブジェクトへのポインタを返します。
void *PQsslStruct(const PGconn *conn, const char *struct_name);
利用可能な構造体は、使用されるSSLの実装に依存します。
OpenSSLでは、"OpenSSL"の名前の下に利用可能な構造体が1つあり、OpenSSLのSSL
構造体へのポインタを返します。
この関数を使用するには、以下のようなプログラムが利用できます。
#include <libpq-fe.h> #include <openssl/ssl.h> ... SSL *ssl; dbconn = PQconnectdb(...); ... ssl = PQsslStruct(dbconn, "OpenSSL"); if (ssl) { /* sslにアクセスするためOpenSSLの関数を使う */ }
この構造体は、暗号化レベルの確認、サーバ証明書の検証、その他に使用できます。 この構造体に関する情報についてはOpenSSLのドキュメントを参照して下さい。
PQgetssl
接続で使用されているSSLの構造体を返します。 SSLが使われていなければNULLを返します。
void *PQgetssl(const PGconn *conn);
この関数はPQsslStruct(conn, "OpenSSL")
と同等です。
返される構造体はOpenSSLに固有のもので他のSSL実装が利用されていると使用できないので、新しく作成するアプリケーションでは使うべきではありません。
接続がSSLを使用しているかどうかを調べるには、代わりにPQsslInUse
を呼び出して下さい。
また、接続に関するより詳細についてはPQsslAttribute
を使って下さい。