33.7. 快速路径界面

PostgreSQL 提供了一个快速路径接口来将简单的函数调用发送到服务器。

Tip

该接口有些过时了,因为可以通过构建准备好的语句来定义函数调用来达到类似的性能和更大的功能。然后,使用参数和结果的二进制传输来执行该语句,从而替代了快速路径函数调用。

函数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 *字段为 true 时,会将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 会在必要时对值进行字节交换,以便将其作为 aClient 端计算机的正确int值;请注意,对于任一允许的结果大小,会将一个 4 个字节的整数传送到 *result_buf 中。当 result_is_int 为 0 时,服务器发送的二进制格式的字节字符串将不做任何修改就返回。 (在这种情况下,最好将 result_buf *视为void *类型.)

PQfn始终返回有效的PGresult指针。在使用结果之前,应检查结果状态。调用方负责在不再需要PGresultPQclear时将其释放。

请注意,使用此接口时,无法处理空参数,空结果或设置值的结果。