2025年9月25日: PostgreSQL 18 釋出!
支援版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

32.2. 連線狀態函式 #

這些函式可用於查詢現有資料庫連線物件的狀態。

提示

libpq 應用程式開發者應該小心維護 PGconn 抽象。使用下面描述的訪問器函式來獲取 PGconn 的內容。不推薦使用 libpq-int.h 來引用內部 PGconn 欄位,因為它們將來可能會被更改。

以下函式返回在連線時建立的引數值。這些值在連線的生命週期內是固定的。如果使用了多主機連線字串,PQhostPQportPQpass 的值可能會在使用相同的 PGconn 物件建立新連線時發生更改。其他值在 PGconn 物件的生命週期內是固定的。

PQdb #

返回連線的資料庫名稱。

char *PQdb(const PGconn *conn);
PQuser #

返回連線的使用者名稱稱。

char *PQuser(const PGconn *conn);
PQpass #

返回連線的密碼。

char *PQpass(const PGconn *conn);

PQpass 將返回在連線引數中指定的密碼,或者如果沒有指定密碼且密碼是從 密碼檔案 獲取的,它將返回該密碼。在後一種情況下,如果連線引數中指定了多個主機,則在連線建立之前無法依賴 PQpass 的結果。可以使用 PQstatus 函式檢查連線狀態。

PQhost #

返回活動連線的伺服器主機名。這可以是主機名、IP 地址,或者如果連線是透過 Unix 套接字,則為目錄路徑。(路徑情況可以透過它總是以 / 開頭的絕對路徑來區分。)

char *PQhost(const PGconn *conn);

如果連線引數同時指定了 hosthostaddr,則 PQhost 將返回 host 資訊。如果僅指定了 hostaddr,則返回該地址。如果連線引數中指定了多個主機,PQhost 返回實際連線到的主機。

PQhost 如果 conn 引數為 NULL,則返回 NULL。否則,如果在生成主機資訊時發生錯誤(可能因為連線尚未完全建立或發生錯誤),它將返回一個空字串。

如果連線引數中指定了多個主機,則在連線建立之前無法依賴 PQhost 的結果。可以使用 PQstatus 函式檢查連線狀態。

PQhostaddr #

返回活動連線的伺服器 IP 地址。這可以是主機名解析到的地址,或者透過 hostaddr 引數提供的 IP 地址。

char *PQhostaddr(const PGconn *conn);

PQhostaddr 如果 conn 引數為 NULL,則返回 NULL。否則,如果在生成主機資訊時發生錯誤(可能因為連線尚未完全建立或發生錯誤),它將返回一個空字串。

PQport #

返回活動連線的埠。

char *PQport(const PGconn *conn);

如果連線引數中指定了多個埠,PQport 返回實際連線到的埠。

PQport 如果 conn 引數為 NULL,則返回 NULL。否則,如果在生成埠資訊時發生錯誤(可能因為連線尚未完全建立或發生錯誤),它將返回一個空字串。

如果連線引數中指定了多個埠,則在連線建立之前無法依賴 PQport 的結果。可以使用 PQstatus 函式檢查連線狀態。

PQtty #

此函式不再執行任何操作,但為向後相容而保留。該函式始終返回一個空字串,或者如果 conn 引數為 NULL,則返回 NULL

char *PQtty(const PGconn *conn);
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 來恢復。

有關可能返回的其他狀態程式碼,請參閱 PQconnectStartParamsPQconnectStartPQconnectPoll 的條目。

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

當前版本報告的引數包括

application_name scram_iterations
client_encoding search_path
DateStyle server_encoding
default_transaction_read_only server_version
in_hot_standby session_authorization
integer_datetimes standard_conforming_strings
IntervalStyle TimeZone
is_superuser  

(default_transaction_read_onlyin_hot_standby 在 14 版之前不被報告;scram_iterations 在 16 版之前不被報告;search_path 在 18 版之前不被報告。) 請注意,server_versionserver_encodinginteger_datetimes 在啟動後不會改變。

如果沒有報告 standard_conforming_strings 的值,應用程式可以假定它為 off,即反斜槓在字串字面量中被視為跳脫字元。此外,此引數的存在可以被視為指示接受跳脫字元串語法 (E'...')。

雖然返回的指標被宣告為 const,但它實際上指向與 PGconn 結構關聯的可變儲存。不應假定指標在查詢之間保持有效。

PQfullProtocolVersion #

查詢正在使用的客戶端/後端協議。

int PQfullProtocolVersion(const PGconn *conn);

應用程式可能希望使用此函式來確定是否支援某些功能。結果是透過將伺服器的主版本號乘以 10000 並加上次版本號形成的。例如,版本 3.2 將返回 30002,版本 4.0 將返回 40000。如果連線有問題,則返回零。3.0 協議由 PostgreSQL 伺服器版本 7.4 及以上版本支援。

協議版本在連線啟動完成後不會改變,但理論上在連線重置期間可能會改變。

PQprotocolVersion #

查詢客戶端/後端協議的主版本。

int PQprotocolVersion(const PGconn *conn);

PQfullProtocolVersion 不同,此函式僅返回正在使用的主要協議版本,但它得到更廣泛的 libpq 版本支援,可以追溯到 7.4 版本。目前,可能的值是 3(3.0 協議)或零(連線有問題)。在 14.0 版本之前,libpq 還可以返回 2(2.0 協議)。

PQserverVersion #

返回一個整數,表示伺服器版本。

int PQserverVersion(const PGconn *conn);

應用程式可以使用此函式來確定它們所連線的資料庫伺服器的版本。結果是透過將伺服器的主版本號乘以 10000 並加上次版本號形成的。例如,版本 10.1 將返回 100001,版本 11.0 將返回 110000。如果連線有問題,則返回零。

在主版本 10 之前,PostgreSQL 使用三部分版本號,其中前兩部分組合起來表示主版本。對於這些版本,PQserverVersion 為每個部分使用兩位數字;例如,版本 9.1.5 將返回 90105,版本 9.2.0 將返回 90200。

因此,為了確定功能相容性,應用程式應該將 PQserverVersion 的結果除以 100 而不是 10000 來確定邏輯主版本號。在所有發行系列中,只有最後兩位數字在次版本(錯誤修復版本)之間有所不同。

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);

後端PIDPID 有助於除錯,並且可以與 NOTIFY 訊息進行比較(NOTIFY 訊息包含通知後端程序的PIDPID)。請注意,PIDPID 屬於在資料庫伺服器主機上執行的程序,而不是本地主機!

PQconnectionNeedsPassword #

如果連線的認證方法需要密碼但沒有可用密碼,則返回 true (1)。否則返回 false (0)。

int PQconnectionNeedsPassword(const PGconn *conn);

此函式可以在連線嘗試失敗後應用,以決定是否提示使用者輸入密碼。

PQconnectionUsedPassword #

如果連線的認證方法使用了密碼,則返回 true (1)。否則返回 false (0)。

int PQconnectionUsedPassword(const PGconn *conn);

此函式可以在連線嘗試失敗或成功後應用,以檢測伺服器是否要求提供密碼。

PQconnectionUsedGSSAPI #

如果連線的認證方法使用了 GSSAPI,則返回 true (1)。否則返回 false (0)。

int PQconnectionUsedGSSAPI(const PGconn *conn);

此函式可用於檢測連線是否已透過 GSSAPI 進行身份驗證。

以下函式返回與 SSL 相關的資訊。這些資訊通常在連線建立後不會改變。

PQsslInUse #

如果連線使用 SSL,則返回 true (1);否則返回 false (0)。

int PQsslInUse(const PGconn *conn);
PQsslAttribute #

返回與 SSL 相關的連線資訊。

const char *PQsslAttribute(const PGconn *conn, const char *attribute_name);

可用屬性列表因使用的 SSL 庫和連線型別而異。如果連線不使用 SSL 或指定的屬性名稱在所使用的庫中未定義,則返回 NULL。

常用的屬性包括

library

正在使用的 SSL 實現的名稱。(目前僅實現了 "OpenSSL"

protocol

正在使用的 SSL/TLS 版本。常見值為 "TLSv1""TLSv1.1""TLSv1.2",但如果使用了其他協議,實現可能會返回其他字串。

key_bits

加密演算法使用的金鑰位數。

cipher

使用的密碼套件的簡短名稱,例如 "DHE-RSA-DES-CBC3-SHA"。名稱特定於每個 SSL 實現。

compression

如果使用 SSL 壓縮,則返回 "on",否則返回 "off"。

alpn

TLS 應用層協議協商 (ALPN) 擴充套件選擇的應用協議。libpq 支援的唯一協議是 postgresql,因此這主要用於檢查伺服器是否支援 ALPN。如果未使用 ALPN,則為空字串。

特殊情況下,可以透過將 NULL 作為 conn 引數傳遞來在沒有連線的情況下查詢 library 屬性。結果將是預設 SSL 庫的名稱,或者如果 libpq 未使用任何 SSL 支援進行編譯,則為 NULL。(在 PostgreSQL 版本 15 之前,將 NULL 作為 conn 引數傳遞始終導致 NULL。需要區分此情況的新舊實現的客戶端程式可以檢查 LIBPQ_HAS_SSL_LIBRARY_DETECTION 功能宏。)

PQsslAttributeNames #

返回一個 SSL 屬性名稱陣列,這些名稱可用於 PQsslAttribute()。陣列以 NULL 指標終止。

const char * const * PQsslAttributeNames(const PGconn *conn);

如果 conn 為 NULL,則返回預設 SSL 庫的可用屬性;如果 libpq 未使用任何 SSL 支援進行編譯,則返回空列表。如果 conn 不為 NULL,則返回連線所使用的 SSL 庫的可用屬性;如果連線未加密,則返回空列表。

PQsslStruct #

返回一個指向 SSL 實現特定物件(描述連線)的指標。如果連線未加密或所請求的物件型別無法從連線的 SSL 實現中獲得,則返回 NULL。

void *PQsslStruct(const PGconn *conn, const char *struct_name);

可用結構取決於所使用的 SSL 實現。對於 OpenSSL,有一個結構,可用名稱為 OpenSSL,它返回指向 OpenSSLSSL 結構的指標。要使用此函式,可以使用類似以下的程式碼:

#include <libpq-fe.h>
#include <openssl/ssl.h>

...

    SSL *ssl;

    dbconn = PQconnectdb(...);
    ...

    ssl = PQsslStruct(dbconn, "OpenSSL");
    if (ssl)
    {
        /* use OpenSSL functions to access ssl */
    }

此結構可用於驗證加密級別、檢查伺服器證書等。有關此結構的資訊,請參閱 OpenSSL 文件。

PQgetssl #

返回連線中使用的 SSL 結構,如果未使用 SSL,則返回 NULL。

void *PQgetssl(const PGconn *conn);

此函式等同於 PQsslStruct(conn, "OpenSSL")。不應在新應用程式中使用,因為返回的結構特定於 OpenSSL,如果使用了其他SSL實現,則不可用。要檢查連線是否使用 SSL,請改用 PQsslInUse,有關連線的更多詳細資訊,請使用 PQsslAttribute

提交更正

如果您在文件中發現任何不正確之處、與您在使用特定功能時的經驗不符之處或需要進一步澄清之處,請使用 此表單 報告文件問題。