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
, что может нарушить текущую операцию на соединении.