天天看点

PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.7. 快速路径接口

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中文社区,原文链接: