支援的版本:目前 (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-256onoff 也被接受作為 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 相同,但更方便,因為它會為您建構和執行指令。PQencryptPasswordConn 傳遞 NULL 作為演算法參數,因此加密會根據伺服器的 password_encryption 設定來完成。

PQencryptPassword #

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

PQmakeEmptyPGresult #

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

PQfireResultCreateEvents #

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

PQcopyResult #

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

PQsetResultAttrs #

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

PQsetvalue #

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

PQresultAlloc #

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

PQresultMemorySize #

size_t PQresultMemorySize(const PGresult *res);

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 乘以 100 萬)。

pg_usec_time_t PQgetCurrentTimeUSec(void);

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

提交更正

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