31.6. Отмена запросов в процессе выполнения
Клиентское приложение может запросить отмену команды, которая ещё обрабатывается сервером, используя функции, описанные в этом разделе.
-
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является локальной переменной в обработчике сигнала. ОбъектPGcancelдоступен только в режиме чтения, пока речь идёт о функцииPQcancel, поэтому её можно также вызывать из потока, отдельного от того, который управляет объектомPGconn.
-
PQrequestCancel PQrequestCancelявляется нерекомендуемым вариантом функцииPQcancel.int PQrequestCancel(PGconn *conn);
Выдаёт запрос на то, чтобы сервер прекратил обработку текущей команды. Функция работает напрямую с объектом
PGconnи в случае сбоя сохраняет сообщение об ошибке в объектеPGconn(откуда его можно извлечь с помощьюPQerrorMessage). Хотя функциональность та же самая, этот подход создаёт риски для многопоточных программ и обработчиков сигналов, поскольку перезапись сообщения об ошибке, хранящегося в объектеPGconn, может помешать ходу операции, выполняемой через данное подключение.