Une application client peut demander l'annulation d'une commande qui est toujours en cours d'exécution par le serveur en utilisant les fonctions décrites dans cette section.
PQgetCancel
#Crée une structure de données contenant les informations nécessaires à l'annulation d'une commande lancée sur une connexion particulière à la base de données.
PGcancel *PQgetCancel(PGconn *conn);
PQgetCancel
crée un objet
PGcancel
à partir d'un objet connexion PGconn
. Il renverra
NULL
si le paramètre conn
donné est NULL
ou est une connexion
invalide. L'objet PGcancel
est une structure opaque
qui n'a pas pour but d'être accédé directement par
l'application ; elle peut seulement être passée à
PQcancel
ou PQfreeCancel
.
PQfreeCancel
#
Libère une structure de données créée par
PQgetCancel
.
void PQfreeCancel(PGcancel *cancel);
PQfreeCancel
libère un objet donné par
PQgetCancel
.
PQcancel
#Demande que le serveur abandonne l'exécution de la commande en cours.
int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);
La valeur renvoyée est 1 si la demande d'annulation a été
correctement envoyée et 0 sinon. Si non, errbuf
contient un message d'erreur expliquant pourquoi.
errbuf
doit être un tableau de caractères d'une
taille de errbufsize
octets (la taille
recommandée est de 256 octets).
Un envoi réussi ne garantit pas que la demande aura un quelconque effet. Si l'annulation est réelle, la commande en cours terminera plus tôt et renverra une erreur. Si l'annulation échoue (disons, parce que le serveur a déjà exécuté la commande), alors il n'y aura aucun résultat visible.
PQcancel
peut être invoqué de façon sûre
par le gestionnaire de signaux si errbuf
est une
variable locale dans le gestionnaire de signaux. L'objet
PGcancel
est en lecture seule en ce qui
concerne PQcancel
, pour qu'il puisse aussi
être appelé à partir d'un thread séparé de celui manipulant
l'objet PGconn
.
PQrequestCancel
#
PQrequestCancel
est une variante obsolète de
PQcancel
.
int PQrequestCancel(PGconn *conn);
Demande au serveur l'abandon du traitement de la commande en cours
d'exécution. Elle opère directement sur l'objet
PGconn
et, en cas d'échec, stocke le message d'erreur
dans l'objet PGconn
(d'où il peut être récupéré avec
PQerrorMessage
). Bien qu'il s'agisse de la même
fonctionnalité, cette approche n'est pas sûre dans les programmes
multi-threads et les gestionnaires de
signaux car il est possible que la surcharge du message d'erreur de
PGconn
gênera l'opération en cours sur la connexion.