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

32.12. 雜項函式 #

一如既往,有些函式就是無處可歸。

PQfreemem #

釋放 libpq 分配的記憶體。

void PQfreemem(void *ptr);

釋放 libpq 分配的記憶體,特別是 PQescapeByteaConnPQescapeByteaPQunescapeByteaPQnotifies 分配的記憶體。特別重要的是,在 Microsoft Windows 上,必須使用此函式而不是 free()。這是因為在 DLL 中分配記憶體並在應用程式中釋放記憶體,只有在 DLL 和應用程式的多執行緒/單執行緒、釋出/除錯以及靜態/動態標誌相同時才有效。在非 Microsoft Windows 平臺上,此函式與標準庫函式 free() 相同。

PQconninfoFree #

釋放由 PQconndefaultsPQconninfoParse 分配的資料結構。

void PQconninfoFree(PQconninfoOption *connOptions);

如果引數是指向 NULL 的指標,則不執行任何操作。

簡單的 PQfreemem 對此無效,因為陣列包含指向輔助字串的引用。

PQencryptPasswordConn #

準備 PostgreSQL 密碼的加密形式。

char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm);

此函式旨在供希望傳送諸如 ALTER USER joe PASSWORD 'pwd' 之類的命令的客戶端應用程式使用。不建議在此類命令中傳送原始明文密碼,因為它們可能會暴露在命令日誌、活動顯示等地方。相反,請在此函式將密碼轉換為加密形式後再發送。

名為 passwduser 的引數分別是明文密碼,以及它所屬使用者的 SQL 名稱。algorithm 指定用於加密密碼的加密演算法。目前支援的演算法有 md5scram-sha-256(為了相容舊版伺服器,也接受 onoff 作為 md5 的別名)。請注意,對 scram-sha-256 的支援是在 PostgreSQL 版本 10 中引入的,並且與舊版伺服器不相容。如果 algorithmNULL,此函式將查詢伺服器以獲取 password_encryption 設定的當前值。這可能會阻塞,並且如果在當前事務被中止或連線正忙於執行另一個查詢時失敗。如果您想使用伺服器的預設演算法但又想避免阻塞,請在呼叫 PQencryptPasswordConn 之前自行查詢 password_encryption,並將該值作為 algorithm 傳遞。

返回值是一個由 malloc 分配的字串。呼叫者可以假定字串不包含任何需要轉義的特殊字元。完成後使用 PQfreemem 來釋放結果。發生錯誤時,返回 NULL,並將適當的訊息儲存在連線物件中。

PQchangePassword #

更改 PostgreSQL 密碼。

PGresult *PQchangePassword(PGconn *conn, const char *user, const char *passwd);

此函式使用 PQencryptPasswordConn 來構建和執行 ALTER USER ... PASSWORD '...' 命令,從而更改使用者的密碼。它存在的原因與 PQencryptPasswordConn 相同,但更方便,因為它會為您構建和執行命令。PQencryptPasswordConnNULL 傳遞給演算法引數,因此加密將根據伺服器的 password_encryption 設定進行。

名為 userpasswd 的引數分別是目標使用者的 SQL 名稱和新的明文密碼。

返回一個 PGresult 指標,表示 ALTER USER 命令的結果,如果該例程在發出任何命令之前失敗,則返回一個空指標。應呼叫 PQresultStatus 函式來檢查返回值中是否存在任何錯誤(包括空指標值,在這種情況下它將返回 PGRES_FATAL_ERROR)。使用 PQerrorMessage 獲取有關此類錯誤的更多資訊。

PQencryptPassword #

準備 PostgreSQL 密碼的 md5 加密形式。

char *PQencryptPassword(const char *passwd, const char *user);

PQencryptPasswordPQencryptPasswordConn 的舊版、已棄用的版本。區別在於 PQencryptPassword 不需要連線物件,並且始終使用 md5 作為加密演算法。

PQmakeEmptyPGresult #

使用給定的狀態構建一個空的 PGresult 物件。

PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);

這是 libpq 內部函式,用於分配和初始化一個空的 PGresult 物件。如果記憶體分配失敗,此函式將返回 NULL。它被匯出是因為有些應用程式發現生成結果物件(特別是具有錯誤狀態的物件)很有用。如果 conn 不為 null 且 status 指示錯誤,則將指定連線的當前錯誤訊息複製到 PGresult 中。此外,如果 conn 不為 null,則會將其註冊到連線中的任何事件過程複製到 PGresult 中。(它們不會收到 PGEVT_RESULTCREATE 呼叫,但請參閱 PQfireResultCreateEvents。)請注意,最終應使用 PQclear 來清理該物件,就像清理 libpq 本身返回的 PGresult 一樣。

PQfireResultCreateEvents #

PGresult 物件中註冊的每個事件過程觸發一個 PGEVT_RESULTCREATE 事件(請參閱 第 32.14 節)。如果所有事件過程都失敗,則返回非零表示成功,零表示失敗。

int PQfireResultCreateEvents(PGconn *conn, PGresult *res);

conn 引數會被傳遞給事件過程,但不會直接使用。如果事件過程不使用它,則可以為 NULL

已為此物件收到 PGEVT_RESULTCREATEPGEVT_RESULTCOPY 事件的事件過程將不會再次觸發。

此函式獨立於 PQmakeEmptyPGresult 的主要原因是,通常在呼叫事件過程之前建立 PGresult 物件並填充資料是合適的。

PQcopyResult #

複製一個 PGresult 物件。複製品與源結果沒有任何關聯,並且在不再需要複製品時必須呼叫 PQclear。如果函式失敗,則返回 NULL

PGresult *PQcopyResult(const PGresult *src, int flags);

這不是為了進行精確複製。返回的結果始終處於 PGRES_TUPLES_OK 狀態,並且不復制源中的任何錯誤訊息。(但它會複製命令狀態字串。)flags 引數決定了複製的其他內容。它是一個多個標誌的按位或。PG_COPYRES_ATTRS 指定複製源結果的屬性(列定義)。PG_COPYRES_TUPLES 指定複製源結果的元組。(這隱含了複製屬性。)PG_COPYRES_NOTICEHOOKS 指定複製源結果的通知鉤子。PG_COPYRES_EVENTS 指定複製源結果的事件。(但源的任何例項資料都不會被複制。)事件過程會收到 PGEVT_RESULTCOPY 事件。

PQsetResultAttrs #

設定 PGresult 物件的屬性。

int PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs);

提供的 attDescs 會被複制到結果中。如果 attDescs 指標為 NULL 或者 numAttributes 小於一,則請求將被忽略,函式將成功。如果 res 已包含屬性,則函式將失敗。如果函式失敗,返回值為零。如果函式成功,返回值非零。

PQsetvalue #

設定 PGresult 物件的元組欄位值。

int PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len);

該函式將根據需要自動擴充套件結果的內部元組陣列。但是,tup_num 引數必須小於或等於 PQntuples,這意味著此函式只能一次增長一個元組的元組陣列。但是,任何現有元組的任何欄位都可以按任何順序修改。如果 field_num 處的欄位值已存在,則會被覆蓋。如果 len 為 -1 或 valueNULL,則欄位值將設定為 SQL null 值。value 會被複制到結果的私有儲存中,因此函式返回後不再需要它。如果函式失敗,返回值將為零。如果函式成功,返回值將為非零。

PQresultAlloc #

PGresult 物件分配輔助儲存。

void *PQresultAlloc(PGresult *res, size_t nBytes);

使用此函式分配的任何記憶體將在清除 res 時被釋放。如果函式失敗,返回值是 NULL。結果保證與 malloc 一樣,對任何型別的資料都進行了充分的對齊。

PQresultMemorySize #

檢索為 PGresult 物件分配的位元組數。

size_t PQresultMemorySize(const PGresult *res);

此值是與 PGresult 物件相關的所有 malloc 請求的總和,即所有將由 PQclear 釋放的記憶體。此資訊對於管理記憶體消耗很有用。

PQlibVersion #

返回正在使用的 libpq 的版本。

int PQlibVersion(void);

此函式的結果可用於在執行時確定當前載入的 libpq 版本中是否可用特定功能。例如,該函式可用於確定 PQconnectdb 中可用的連線選項。

結果透過將庫的主版本號乘以 10000 並加上次版本號形成。例如,版本 10.1 將返回 100001,版本 11.0 將返回 110000。

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

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

注意

此函數出現在 PostgreSQL 版本 9.1 中,因此不能用於檢測早期版本中所需的功能,因為呼叫它將產生對版本 9.1 或更高版本的連結依賴。

PQgetCurrentTimeUSec #

檢索當前時間,表示自 Unix 紀元以來的微秒數(即 time_t 乘以一百萬)。

pg_usec_time_t PQgetCurrentTimeUSec(void);

這主要用於計算要與 PQsocketPoll 一起使用的超時值。

提交更正

如果您在文件中看到任何不正確、與您的實際經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。