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_versionserver_encodingclient_encodingsession_authorizationDateStyleTimeZoneinteger_datetimes。 (版本 8.0 之前沒有報告 server_encodingTimeZoneinteger_datetimes。) 請注意 server_versionserver_encodinginteger_datetimes 不能在啟動後修改。

協議版本 3.0 之前的伺服器不會報告參數設置,但是 libpq 裡包含一些邏輯用於獲取 server_versionclient_encoding 的數值。 我們鼓勵應用裡面使用 PQparameterStatus,而不是使用特殊的代碼來檢測這些值。 (不過要注意,在 3.0 之前的連接協議裡,啟動後透過 SET 改變了 client_encoding 將不會被 PQparameterStatus 反映出來。) 對於 server_version,又見 PQserverVersion,它返回數值形式, 更容易進行比較。

儘管返回的指針聲明為 const,它實際上指向一個和 PGconn 結構關聯的可變的儲存區。因此假設這個指針跨查詢保持有效是不明智的。

PQprotocolVersion

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

int PQprotocolVersion(const PGconn *conn);

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

PQserverVersion

Returns an integer representing the backend version.

int PQserverVersion(const PGconn *conn);

應用可以使用這個函數判斷它們連接的資料庫伺服器的版本。 數字是透過把主、次、以及發佈版本好轉換成兩位十進制數並且把它們連接在一起組成的。 比如,版本 7.4.2將轉換為 70402,而 8.1 將轉換為 80100(不顯示前導的零)。 如果連接失敗,則返回零。

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 屬於執行資料庫伺服器的主機的進程,而不是本地主機!

PQgetssl

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

SSL *PQgetssl(const PGconn *conn);

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

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