Отмена запросов в процессе выполнения

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

PQgetCancel

Создает структуру данных, содержащую информацию, необходимую для отмены команды, запущенной через конкретное соединение с базой данных.

PGcancel *PQgetCancel(PGconn *conn);

Функция PQgetCancel создает объект PGcancel, получив объект PGconn, описывающий соединение. Она вернет NULL, если параметр conn равен NULL или в нем задано нерабочее соединение. Объект PGcancel является непрозрачной структурой, которая не предназначена для того, чтобы приложение обращалось к ней напрямую; ее можно только передать функции PQcancel или PQfreeCancel.

PQfreeCancel

Освобождает память, занятую структурой данных, созданную функцией PQgetCancel.

void PQfreeCancel(PGcancel *cancel);

Функция PQfreeCancel освобождает память, занятую объектом данных, ранее созданным функцией PQgetCancel.

PQcancel

Требует, чтобы сервер прекратил обработку текущей команды.

int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);

Возвращаемое значение равно 1, если запрос на отмену был успешно отправлен, и 0, если этого не произошло. В случае неудачной отправки errbuf заполняется пояснительным сообщением об ошибке. Аргумент errbuf должен быть массивом символов с размером errbufsize (рекомендуемый размер — 256 байт).

Однако успешная отправка не гарантирует, что запрос как-то подействует. Если отмена сработает, текущая команда завершится досрочно и вернет в качестве результата ошибку. Если отмена провалится (скажем, потому что сервер уже закончил обрабатывать команду), тогда вообще не будет видимого результата.

Функцию PQcancel можно безопасно вызывать из обработчика сигнала, если errbuf является в нем локальной переменной. Относительно PQcancel объект PGcancel доступен только для чтения, поэтому ее также можно вызвать из потока, отдельного от того, который управляет объектом PGconn.

PQrequestCancel

Функция PQrequestCancel является устаревшим вариантом функции PQcancel.

int PQrequestCancel(PGconn *conn);

Требует, чтобы сервер прекратил обработку текущей команды. Эта функция работает непосредственно с объектом PGconn и в случае сбоя сохраняет сообщение об ошибке в объекте PGconn (откуда его можно получить с помощью функции PQerrorMessage). Хотя функциональность одинакова, этот подход создает риски для многопоточных программ и обработчиков сигналов, поскольку, перезапись сообщения об ошибке в объекте PGconn может помешать операции, которая в текущий момент выполняется через данное соединение.