30.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, может помешать ходу операции, выполняемой через данное подключение.