31.7. Отмена выполняющихся запросов#
31.7. Отмена выполняющихся запросов #
Клиентское приложение может запросить отмену команды, которая все еще обрабатывается сервером, используя функции, описанные в этом разделе.
PQgetCancel#Создает структуру данных, содержащую информацию, необходимую для отмены команды, выполняемой через определенное соединение с базой данных.
PGcancel *PQgetCancel(PGconn *conn);
PQgetCancelсоздает структуруPGcancelobject дан объект соединения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, что может нарушить текущую операцию на соединении.