31.7. Отмена выполняющихся запросов#

31.7. Отмена выполняющихся запросов

31.7. Отмена выполняющихся запросов #

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

PQgetCancel #

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

PGcancel *PQgetCancel(PGconn *conn);

PQgetCancel создает структуру PGcancel object дан объект соединения 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 является локальной переменной в обработчике сигнала. Объект PGcancel является только для чтения в контексте PQcancel, поэтому его также можно вызывать из потока, отличного от потока, который обрабатывает объект PGconn.

PQrequestCancel #

PQrequestCancel - устаревший вариант функции, PQcancel.

int PQrequestCancel(PGconn *conn);

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