27.5. 捷徑接口

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)。 argsnargs 定義了要傳遞給函數的參數; 它們必須匹配已經聲明了的函數參數列表。 如果某個參數結構的 isint 字段是真,那麼 u.integer 值以指定長度(必須是1,2,或者 4 字節) 的整數發送給服務器;這時候會進行恰當的字節序交換(byte-swapping)。 如果 isint 為假,那麼在 *u.ptr 裡面的指定字節數的數據將不做任何處理發送出去; 這些數據必須是服務器預期的該函數參數類型的二進制傳輸格式。 result_buf是放置返回值的緩衝區。 調用者必須為返回值分配足夠的空間(這裡沒有檢查!)。 實際的返回值長度將被放在result_len指向的整數裡返回。 如果預期返回值是 1,2,或 4 字節整數,把result_is_int設為 1; 否則設為 0。把result_is_int設為 1 告訴 libpq必要時交換數值字節序,這樣就可以正確地傳輸成客戶機上的整數值。 當 result_is_int 是 0 時,服務器發送回來的字節串不做修改直接返回。

PQfn 總是返回一個有效的PGresult指針。 在使用結果之前應該檢查結果狀態。 當結果不再使用後,調用者有義務使用 PQclear 釋放PGresult

請注意我們沒辦法處理空值的參數,空的結果,也沒辦法在使用這個接口的時候設置有值的結果。