27.2. 連接狀態函數

這些函數可以用于詢問現存數據庫連接對象的狀態。

Tip: libpq應用程序員應該仔細維護PGconn結構。 使用下面的訪問函數來獲取PGconn的內容。 避免直接引用PGconn結構裡的字段, 因為這些字段在今後可能被改變。 (從 PostgreSQL 版本 6.4 開始, 類型 struct PGconn 後面的定義甚至都 沒有放在 libpq-fe.h裡。 如果你有一些直接訪問PGconn數據域的舊代碼, 你可以通過包含 libpq-int.h 來訪問它們,但我們鼓勵你趕快修改那些代碼。)

下面的函數返回連接建立時的參數。這些參數在 PGconn 對象的生命期期間是固定的。

PQdb

返回連接的數據庫名。

char *PQdb(const PGconn *conn);

PQuser

返回連接的用戶名。

char *PQuser(const PGconn *conn);

PQpass

返回連接的口令。

char *PQpass(const PGconn *conn);

PQhost

返回連接的服務器主機名。

char *PQhost(const PGconn *conn);

PQport

返回連接的端口號。

char *PQport(const PGconn *conn);

PQtty

返回連接的調試控制台TTY。 (這個已經過時了,因為服務器不再注意 TTY 設置,這個函數存在是為了向下兼容。)

char *PQtty(const PGconn *conn);

PQoptions

PQoptions 返回連接請求中傳遞的命令行選項。

char *PQoptions(const PGconn *conn);

下面的函數返回那些在對 PGconn 對象進行操作的過程中可能變化的狀態數據。

PQstatus

返回連接的狀態。

ConnStatusType PQstatus(const PGconn *conn);

這個狀態可以是一系列值之一。 不過,我們在一個異步連接過程外面只能看到其中的兩個: CONNECTION_OKCONNECTION_BAD。一個與數據庫的成功的連接返回狀態 CONNECTION_OK。 一次失敗的企圖用狀態 CONNECTION_BAD 標識。 通常,一個 OK 狀態將保持到 PQfinish,但是一個通訊失敗可能會導致狀態過早地改變為 CONNECTION_BAD 。這時應用可以試著調用 PQreset 來恢復。

參閱PQconnectStartPQconnectPoll條目看看可能出現的其他的狀態碼。

PQtransactionStatus

返回當前服務器的事務內狀態。

PGTransactionStatusType PQtransactionStatus(const PGconn *conn);

狀態可以是 PQTRANS_IDLE (當前空閒), PQTRANS_ACTIVE (正在處理一個命令), PQTRANS_INTRANS (空閒,在一個合法的事務塊內), 或者 PQTRANS_INERROR (空閒,在一個失敗的事務塊內)。 如果連接有問題,則返回 PQTRANS_UNKNOWN。 只有在一個查詢發送給了服務器並且還沒有完成的時候才返回 PQTRANS_ACTIVE

Caution

如果使用一個支持 autocommit 參數,並且設置為關閉的 PostgreSQL 7.3 版本的服務器, 那麼 PQtransactionStatus 將給出不正確的結果。服務器端的 autocommit (自動提交)特性已經廢棄了, 在將來的版本的服務器中不再存在。

PQparameterStatus

查找服務器的一個當前參數設置。

const char *PQparameterStatus(const PGconn *conn, const char *paramName);

有些參數在建立連接或者它們的值改變的時候會由服務器自動報告。 PQparameterStatus 可以用于查詢這些設置。 如果它認識這些參數,那麼它返回當前值,否則返回 NULL

當前版本報告的參數有 server_version (啟動後無法更改); client_encodingis_superusersession_authorization, 和 DateStyle

協議版本 3.0 之前的服務器不會報告參數設置,但是 libpq 裡包含一些邏輯用于獲取 server_version,和 client_encoding 的數值。 我們鼓勵應用裡面使用 PQparameterStatus,而不是使用特殊的代碼來檢測這些值。 (不過要注意,在 3.0 之前的連接協議裡,啟動後通過 SET 改變了 client_encoding 將不會被 PQparameterStatus 反映出來。)

PQprotocolVersion

查詢所使用的前/後端協議。

int PQprotocolVersion(const PGconn *conn);

應用可能希望使用這個函數來判斷某種特性是否被支持。 目前,可能的數值是 2(2.0 版本的協議),3(3.0 版本的協議),或者零(連接錯誤)。 在連接啟動完成之後,這個數值將不會改變,但是在連接重置的過程中,理論上是可能改變的。 3.0 協議通常將用于與 PostgreSQL 7.4 或者更新版本的服務器通訊; 7.4 以前的版本只支持 2.0 版本的協議。(1.0 版本的協議已經過時了,不再被 libpq 支持。)

PQerrorMessage

返回連接中操作產生的最近的錯誤信息。

char *PQerrorMessage(const PGconn* conn);

幾乎所有libpq函數在失敗時都會為 PQerrorMessage 設置一個信息。 注意libpq的傳統是,一個非空的PQerrorMessage 將在結尾包含一個新行。

PQsocket

獲取與服務器連接的套接字的文件描述符編號。 一個有效的描述符應該是大于或等于 0;結果為 -1 表示當前沒有與服務器的連接打開。 (在正常的操作中,這個結果不會改變,但是可能在啟動或者重置的過程中變化。)

int PQsocket(const PGconn *conn);

PQbackendPID

返回處理此連接的服務器服務器的進程號ID(PID)

int PQbackendPID(const PGconn *conn);

這個服務器PID 在調試和對比NOTIFY信息 (包含發出通知的服務器進程的 PID )時很有用。 注意該PID 屬于運行數據庫服務器的主機的進程,而不是本地主機!

PQgetssl

返回連接使用的 SSL 結構,或者如果沒有使用 SSL 的話返回 NULL。

SSL *PQgetssl(const PGconn *conn);

這個結構可以用于核實加密級別,檢查服務器認證等信息。參考 OpenSSL 文檔獲取關于這個結構的更多信息。

為了獲取這個函數的原形,你必須定義 USE_SSL。 這樣做會自動包含來自OpenSSLssl.h