Postgres は, バックエンドへの関数呼び出しインターフェースに近道を用意しています. これはシステム内部への抜け穴であると同時に, 潜在的なセキュリティホールにもなり得ます. 大多数のユーザの人はこの機能を必要とはしないでしょう.
PQfn 「近道」を使ってバックエンドの関数実行を要求します.
PGresult* PQfn(PGconn* conn,
int fnid,
int *result_buf,
int *result_len,
int result_is_int,
PQArgBlock *args,
int nargs);
このうち fnid 引数は,実行する関数のオブジェクト識別子,
result_buf は戻り値を格納するバッファです.
呼び出し側は戻り値を格納するのに十分な領域を確保しておかなければなりません.
(このチェックは(ライブラリ側では)していません!)
結果の実データ長は result_len が指す整数で返されます.
結果が 4 バイト整数だと想定できるなら result_is_int を 1 に,
そうでなければ 0 を設定します.
(result_is_int を 1 にすれば,必要に応じて値のバイト順を入れ換えるよう
libpq に指示することになります.
そしてクライアントマシン上で正しい整数値となるように転送します.
result_is_int が 0 の場合は,
バックエンドが送ったバイト列を何も修正せずに返します)
args と nargs は関数に渡す引数を指定します.
typedef struct {
int len;
int isint;
union {
int *ptr;
int integer;
} u;
} PQArgBlock;
PQfn は常に有効な PGresult ポインタを返します.
結果を使う前にはまず,resultStatus を調べておくべきでしょう.
結果が必要なくなった時点で,
PQclear によって PGresult を開放するのは呼び出し側の責任です.