一如既往,有些函式就是無處可歸。
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 設定進行。
名為 user
和 passwd
的引數分別是目標使用者的 SQL 名稱和新的明文密碼。
返回一個 PGresult
指標,表示 ALTER USER
命令的結果,如果該例程在發出任何命令之前失敗,則返回一個空指標。應呼叫 PQresultStatus
函式來檢查返回值中是否存在任何錯誤(包括空指標值,在這種情況下它將返回 PGRES_FATAL_ERROR
)。使用 PQerrorMessage
獲取有關此類錯誤的更多資訊。
PQencryptPassword
#準備 PostgreSQL 密碼的 md5 加密形式。
char *PQencryptPassword(const char *passwd, const char *user);
PQencryptPassword
是 PQencryptPasswordConn
的舊版、已棄用的版本。區別在於 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_RESULTCREATE
或 PGEVT_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 或 value
為 NULL
,則欄位值將設定為 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
一起使用的超時值。
如果您在文件中看到任何不正確、與您的實際經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。