31.8. Интерфейс Fast-Path#

31.8. Интерфейс Fast-Path

31.8. Интерфейс Fast-Path #

Tantor BE предоставляет интерфейс быстрого доступа к серверу для отправки простых вызовов функций.

Подсказка

Этот интерфейс является устаревшим, так как можно достичь аналогичной производительности и большей функциональности, настроив подготовленный оператор для определения вызова функции. Затем выполнение оператора с двоичной передачей параметров и результатов заменяет вызов функции быстрого пути.

Функция 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 равно false, указанное количество байтов в *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, с статусом PGRES_COMMAND_OK в случае успеха или PGRES_FATAL_ERROR, если возникла проблема. Статус результата должен быть проверен перед использованием результата. Звонящий обязан освободить PGresult с помощью PQclear, когда он больше не нужен.

Чтобы передать NULL-аргумент в функцию, установите поле len этой структуры параметров в значение -1; поля isint и u в этом случае не имеют значения.

Если функция возвращает NULL, *result_len устанавливается в -1, а *result_buf не изменяется.

Обратите внимание, что невозможно обрабатывать результаты, имеющие множественные значения, при использовании этого интерфейса. Кроме того, функция должна быть обычной функцией, а не агрегатной, оконной функцией или процедурой.