33.7. 快速路徑接口
PostgreSQL提供一種快速路徑接口來向伺服器發送簡單的函數調用。
提示
這個接口在某種程度上已被廢棄,因為我們可以通過建立一個定義該函數調用的預備語句來達到類似或者更強大的功能。然後,用參數和結果的二進制傳輸執行該語句,進而取代快速函數調用。
函數
PQfn
請求通過快速路徑接口執行伺服器函數。
PGresult *PQfn(PGconn *conn,
int fnid,
int *result_buf,
int *result_len,
int result_is_int,
const PQArgBlock *args,
int nargs);
typedef struct
{
int len;
int isint;
union
{
int *ptr;
int integer;
} u;
} PQArgBlock;
fnid
參數是要被執行的函數的 OID。
args
和
nargs
定義了要傳遞給函數的參數;它們必須比對已聲明的函數 參數清單。當一個參數結構的
isint
域為真時,
u.integer
值被以指定長度(必須是 2 或者 4 位元組)整數的 形式發送給伺服器;這時候會發生恰當的位元組交換。當
isint
為 假時,
*u.ptr
中指定數量的位元組将不做任何處理被發送出去; 這些資料必須是伺服器 預期的用于該函數參數資料類型的二進制傳輸的格式(由于 曆史原因
u.ptr
被聲明為類型
int *
,其實把它考慮成
void *
會更好)。
result_buf
是放置該函 數傳回值的緩沖區。調用者必須已經配置設定了足夠的空間來存儲傳回值(這裡沒有檢 查!)。實際的結果長度将被放在
result_len
指向的 整數中傳回。如果預期結果是 2 或 4 位元組整數,把
result_is_int
設為 1;否則設為 0。把
result_is_int
設為 1 導緻libpq 在必要時對值進行交換位元組,這樣它就作為對用戶端機器正确的
int
值被傳輸,注意對任一種允許的結果大小都會傳遞一個 4 位元組到
*result_buf
。當
result_is_int
是 0 時,服務 器發送的二進制格式位元組将不做修改直接傳回(在這種情況下,把
result_buf
考慮為類型
void *
更好)。
PQfn
總是傳回一個有效的
PGresult
指針。在使用結果之前應該檢查結果狀态。當結果不再使用後,調用者有義務使用
PQclear
釋放
PGresult
。
注意我們沒辦法處理空參數、空結果,也沒辦法在使用這個接口時處理集值結果。
本文轉自PostgreSQL中文社群,原文連結: