一如既往,有些函數就是不適合放在任何地方。
PQfreemem
#釋放 libpq 分配的記憶體。
void PQfreemem(void *ptr);
釋放 libpq 分配的記憶體,特別是 PQescapeByteaConn
、PQescapeBytea
、PQunescapeBytea
和 PQnotifies
。特別重要的是,在 Microsoft Windows 上使用此函數,而不是 free()
。這是因為在 DLL 中分配記憶體並在應用程式中釋放它,只有在多執行緒/單執行緒、發布/偵錯和靜態/動態旗標對於 DLL 和應用程式都相同時才有效。在非 Microsoft Windows 平台上,此函數與標準程式庫函數 free()
相同。
PQconninfoFree
#釋放 PQconndefaults
或 PQconninfoParse
分配的資料結構。
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'
指令的用戶端應用程式使用。最好不要在此類指令中傳送原始明文密碼,因為它可能會暴露在指令日誌、活動顯示等中。請改為使用此函數將密碼轉換為加密形式,然後再傳送。
passwd
和 user
參數是明文密碼,以及它所針對的用戶的 SQL 名稱。algorithm
指定用於加密密碼的加密演算法。目前支援的演算法是 md5
和 scram-sha-256
(on
和 off
也被接受作為 md5
的別名,以便與舊版伺服器相容)。請注意,對 scram-sha-256
的支援是在 PostgreSQL 10 版中引入的,並且無法與舊版伺服器正確運作。如果 algorithm
是 NULL
,此函數將查詢伺服器以取得 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
一起使用的逾時值。
如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。