29. libpq - Bibliothèque C
libpq est l'interface de
programmation pour les applications C avec PostgreSQL™. libpq est un ensemble de fonctions permettant
aux programmes clients d'envoyer des requêtes au serveur PostgreSQL™ et de recevoir les résultats
de ces requêtes.
libpq est aussi le moteur
sous-jacent de plusieurs autres interfaces de programmation de
PostgreSQL™, comme ceux écrits
pour C++, Perl, Python, Tcl et ECPG.
Donc, certains aspects du comportement de libpq seront importants pour vous si vous
utilisez un de ces paquetages. En particulier, la Section 29.12,
« Variables d'environnement », la Section 29.13,
« Fichier de mots de passe » et la Section 29.16, « Support de
SSL » décrivent le comportement que verra l'utilisateur de
toute application utilisant libpq.
Quelques petits programmes sont inclus à la fin de ce chapitre
(Section 29.19,
« Exemples de programmes ») pour montrer comment écrire
des programmes utilisant libpq. Il
existe aussi quelques exemples complets d'applications libpq dans le répertoire src/test/examples venant avec la distribution des
sources.
Les programmes clients utilisant libpq doivent inclure le fichier d'en-tête
libpq-fe.h et doivent être lié avec la
bibliothèque libpq.
29.1. Fonctions de contrôle de connexion à la base de données
Les fonctions suivantes concernent la réalisation d'une connexion
avec un serveur PostgreSQL™.
Un programme peut avoir plusieurs connexions ouvertes sur des
serveurs à un même moment (une raison de la faire est d'accéder à
plusieurs bases de données). Chaque connexion est représentée par
un objet PGconn, obtenu avec la
fonction PQconnectdb ou PQsetdbLogin. Notez que ces fonctions renverront
toujours un pointeur d'objet non nul, sauf peut-être dans un cas de
manque de mémoire pour l'allocation de l'objet PGconn. La fonction PQstatus doit être appelée pour vérifier si la
connexion s'est bien effectuée avant de lancer des requêtes via
l'objet de connexion.
-
PQconnectdb
-
Crée une nouvelle connexion au serveur de bases de données.
PGconn *PQconnectdb(const char *conninfo);
Cette fonction ouvre une nouvelle connexion à la base de
données en utilisant les paramètres à partir de la chaîne
conninfo. Contrairement à PQsetdbLogin ci-dessous, l'ensemble des
paramètres peut être étendu sans changer la signature de la
fonction, donc utiliser cette fonction (ou son analogue non
bloquant, PQconnectStart et
PQconnectPoll) est préférée pour la
programmation de nouvelles applications.
La chaîne passée peut être vide pour utiliser tous les
paramètres par défaut ou elle peut contenir un ou plusieurs
paramétrages séparés par des espaces blancs. Chaque paramètre
est de la forme motclé = valeur. Les
espaces autour du signe égal sont optionnels. Pour écrire une
valeur vide ou une valeur contenant des espaces, entourez-les
de guillemets simples, c'est-à-dire motclé = 'une valeur'. À l'intérieur de la
valeur, des guillemets simples et des antislashs peuvent être
échappés avec un antislash, par exemple \' et \\.
Les mots clés actuellement reconnus sont :
-
host
-
Nom de l'hôte sur lequel se connecter. S'il commence
avec un slash, il spécifie une communication par
domaine Unix plutôt qu'une communication TCP/IP ; la
valeur est le nom du répertoire où le fichier socket
est stocké. Par défaut, quand host n'est pas spécifié, il s'agit d'une
communication par socket de domaine Unix dans
/tmp (ou tout autre
répertoire de socket spécifié lors de la construction
de PostgreSQL™).
Sur les machines sans sockets de domaine Unix, la
valeur par défaut est de se connecter à localhost.
-
hostaddr
-
Adresse IP numérique de l'hôte de connexion. Elle
devrait être au format d'adresse standard IPv4,
c'est-à-dire 172.28.40.9. Si
votre machine supporte IPv6, vous pouvez aussi utiliser
ces adresses. La communication TCP/IP est toujours
utilisée lorsqu'une chaîne non vide est spécifiée pour
ce paramètre.
Utiliser hostaddr au lieu de
host permet à l'application
d'éviter une recherche de nom d'hôte, qui pourrait être
importante pour les applications ayant des contraintes
de temps. Néanmoins, l'authentification Kerberos
requiert un nom d'hôte. Du coup, ce qui suit s'applique
: si host est spécifié sans
hostaddr, une recherche de nom
d'hôte a lieu. Si hostaddr est
spécifié sans host, la valeur
de hostaddr donne l'adresse
distante. Lorsque Kerberos est utilisée, une recherche
de nom inverse est effectuée pour obtenir le nom d'hôte
pour Kerberos. Si à la fois host et hostaddr sont spécifiés, la valeur de
hostaddr donne l'adresse
distante ; la valeur de host
est ignorée sauf si Kerberos est utilisé, auquel cas il
s'agit de la valeur utilisée pour l'authentification
Kerberos (notez que l'authentification a des risques
d'échouer si libpq se
voit donner un nom qui n'est pas le nom de la machine
sur hostaddr). De même,
host plutôt que hostaddr est utilisé pour identifier la
connexion dans ~/.pgpass
(voir la Section 29.13,
« Fichier de mots de passe »).
Sans un nom ou une adresse d'hôte, libpq se connectera en utilisant
un socket local de domaine Unix. Sur des machines sans
sockets de domaine Unix, il tentera une connexion sur
localhost.
-
port
-
Numéro de port pour la connexion au serveur ou
extension du nom de fichier pour des connexions de
domaine Unix.
-
dbname
-
Nom de la base de données. Par défaut, la même que le
nom utilisateur.
-
user
-
Nom de l'utilisateur PostgreSQL™ qui se connecte.
Par défaut, il s'agit du nom de l'utilisateur ayant
lancé l'application.
-
password
-
Mot de passe à utiliser si le serveur demande une
authentification par mot de passe.
-
connect_timeout
-
Attente maximum pour une connexion, en secondes (saisie
comme une chaîne d'entier décimaux). Zéro ou non
spécifié signifie une attente indéfinie. Utiliser un
décompte de moins de deux secondes n'est pas
recommandé.
-
options
-
Options en ligne de commande à envoyer au serveur.
-
tty
-
Ignoré (auparavant, ceci indiquait où envoyer les
traces de débogage du serveur).
-
sslmode
-
Cette option détermine si ou avec quelle priorité une
connexion SSL sera
négociée avec le serveur. Il existe quatre modes :
disable essaiera uniquement
une connexion non cryptée SSL ; allow négociera en essayant tout d'abord
une connexion sans SSL puis, si cela échoue, une
connexion SSL ;
prefer (la valeur par défaut)
négociera en essayant d'abord une connexion
SSL puis, en cas
d'échec, une connexion non SSL ; require essaiera uniquement une
connexion SSL.
Si PostgreSQL™
est compilé sans le support de SSL, l'utilisation de
l'option require causera une
erreur alors que les options allow et prefer
seront acceptées mais libpq ne sera pas capable de
négocier une connexion SSL.
-
requiressl
-
Cette option est obsolète et remplacée par l'option
sslmode.
Si initialisée à 1, une connexion SSL au serveur est requise (ce qui
est équivalent à un sslmode
require). libpq refusera alors de se
connecter si le serveur n'accepte pas une connexion
SSL. Si initialisée
à 0 (la valeur par défaut), libpq négociera le type de
connexion avec le serveur (équivalent à un sslmode
prefer). Cette option est seulement
disponible si PostgreSQL™ est compilé avec
le support SSL.
-
krbsrvname
-
Nom du service Kerberos à utiliser lors de
l'authentification avec Kerberos 5. Il doit
correspondre avec le nom du service spécifié dans la
configuration du serveur pour que l'authentification
Kerberos puisse réussir (voir aussi la Section 20.2.3,
« Authentification Kerberos »).
-
service
-
Nom du service à utiliser pour des paramètres
supplémentaires. Il spécifie un nom de service dans
pg_service.conf contenant des
paramètres de connexion supplémentaires. Ceci permet
aux applications de spécifier uniquement un nom de
service, donc les paramètres de connexion peuvent être
maintenus de façon centrale. Voir Section 29.14,
« Fichier des connexions de service ».
Si un paramètre manque, alors la variable d'environnement
correspondante est vérifiée (voir la Section 29.12,
« Variables d'environnement »). Si elle n'est
pas disponible, alors la valeur par défaut indiquée est
utilisée.
-
PQsetdbLogin
-
Crée une nouvelle connexion sur le serveur de bases de
données.
PGconn *PQsetdbLogin(const char *pghost,
const char *pgport,
const char *pgoptions,
const char *pgtty,
const char *dbName,
const char *login,
const char *pwd);
C'est le prédécesseur de PQconnectdb avec un ensemble fixe de
paramètres. Cette fonction a les mêmes fonctionnalités sauf
que les paramètres manquants seront toujours initialisés avec
leur valeurs par défaut. Écrire NULL ou une chaîne vide pour un de ces
paramètres fixes dont vous souhaitez utiliser la valeur par
défaut.
-
PQsetdb
-
Crée une nouvelle connexion sur le serveur de bases de
données.
PGconn *PQsetdb(char *pghost,
char *pgport,
char *pgoptions,
char *pgtty,
char *dbName);
C'est une macro faisant appel à PQsetdbLogin avec des pointeurs nuls pour les
paramètres
login
et
pwd
. Elle est fournie
pour une compatibilité ascendante des très vieux programmes.
-
PQconnectStart,
PQconnectPoll
-
Crée une connexion au serveur de bases de données d'une façon
non bloquante.
PGconn *PQconnectStart(const char *conninfo);
PostgresPollingStatusType PQconnectPoll(PGconn *conn);
Ces deux fonctions sont utilisées pour ouvrir une connexion
au serveur de bases de données d'une façon telle que le
thread de votre application n'est pas bloqué sur les
entrées/sorties distantes en demandant la connexion. Le but
de cette approche est que l'attente de la fin des
entrées/sorties peut se faire dans la boucle principale de
l'application plutôt qu'à l'intérieur de PQconnectdb, et donc l'application peut gérer
des opérations en parallèle à d'autres activités.
La connexion à la base de données est faite en utilisant les
paramètres pris dans la chaîne conninfo, passée à PQconnectStart. Cette chaîne est du même
format que celle décrite pour PQconnectdb.
Ni PQconnectStart ni PQconnectPoll ne bloqueront, aussi longtemps
qu'un certain nombre de restrictions est respecté :
-
Les paramètres hostaddr et
host sont utilisés de façon
appropriée pour vous assurer que la requête de nom et
la requête inverse ne soient pas lancées. Voir la
documentation de ces paramètres avec PQconnectdb ci-dessus pour les détails.
-
Si vous appelez PQtrace,
assurez-vous que l'objet de flux dans lequel vous
enregistrez les traces ne bloquera pas.
-
Assurez-vous que le socket soit dans l'état approprié
avant d'appeler PQconnectPoll, comme décrit ci-dessous.
Pour commencer une demande de connexion non bloquante,
appelez conn = PQconnectStart("
connection_info_string
"). Si
conn est nul, alors libpq a été incapable d'allouer une
nouvelle structure PGconn.
Sinon, un pointeur valide vers une structure PGconn est renvoyé (bien qu'il ne
représente pas encore une connexion valide vers la base de
données). Au retour de PQconnectStart, appelez status = PQstatus(conn). Si status vaut CONNECTION_BAD, PQconnectStart a échoué.
Si PQconnectStart réussit, la
prochaine étape est d'appeler souvent libpq de façon à ce qu'il continue la
séquence de connexion. Utilisez PQsocket(conn) pour obtenir le descripteur de
socket sous la connexion à la base de données. Du coup, une
boucle : si le dernier retour de PQconnectPoll(conn) est PGRES_POLLING_READING, attendez que la socket
soit prête pour lire (comme indiqué par select(), poll() ou
une fonction système similaire). Puis, appelez de nouveau
PQconnectPoll(conn). En revanche,
si le dernier retour de PQconnectPoll(conn) est PGRES_POLLING_WRITING, attendez que la socket
soit prête pour écrire, puis appelez de nouveau PQconnectPoll(conn). Si vous devez encore
appeler PQconnectPoll, c'est-à-dire
juste après l'appel de PQconnectStart, continuez comme s'il avait
renvoyé PGRES_POLLING_WRITING.
Continuez cette boucle jusqu'à ce que PQconnectPoll(conn) renvoie PGRES_POLLING_FAILED, indiquant que la
procédure de connexion a échoué ou PGRES_POLLING_OK, indiquant le succès de la
procédure de connexion.
À tout moment pendant la connexion, le statut de cette
connexion pourrait être vérifié en appelant PQstatus. Si le résultat est CONNECTION_BAD, alors la procédure de
connexion a échoué ; si, au contraire, elle renvoie
CONNECTION_OK, alors la connexion
est prête. Ces deux états sont détectables à partir de la
valeur de retour de PQconnectPoll,
décrite ci-dessus. D'autres états pourraient survenir lors
(et seulement dans ce cas) d'une procédure de connexion
asynchrone. Ils indiquent l'état actuel de la procédure de
connexion et pourraient être utile pour fournir un retour à
l'utilisateur. Ces statuts sont :
-
CONNECTION_STARTED
-
Attente de la connexion à réaliser.
-
CONNECTION_MADE
-
Connexion OK ; attente d'un envoi.
-
CONNECTION_AWAITING_RESPONSE
-
Attente d'une réponse du serveur.
-
CONNECTION_AUTH_OK
-
Authentification reçue ; attente de la fin du lancement
du moteur.
-
CONNECTION_SSL_STARTUP
-
Négociation du cryptage SSL.
-
CONNECTION_SETENV
-
Négociation des paramétrages de l'environnement.
Notez que, bien que ces constantes resteront (pour maintenir
une compatibilité), une application ne devrait jamais se
baser sur un ordre pour celles-ci ou sur tout ou sur le fait
que le statut fait partie de ces valeurs documentés. Une
application pourrait faire quelque chose comme ça :
switch(PQstatus(conn))
{
case CONNECTION_STARTED:
feedback = "Connexion en cours...";
break;
case CONNECTION_MADE:
feedback = "Connecté au serveur...";
break;
.
.
.
default:
feedback = "Connexion...";
}
Le paramètre de connexion connect_timeout est ignoré lors de
l'utilisation PQconnectPoll ; c'est
de la responsabilité de l'application de décider quand une
période de temps excessive s'est écoulée. Sinon, PQconnectStart suivi par une boucle
PQconnectPoll est équivalent à
PQconnectdb.
Notez que si PQconnectStart renvoie
un pointeur non nul, vous devez appeler PQfinish lorsque vous en avez terminé avec
lui, pour supprimer la structure et tous les blocs mémoires
qui lui sont associés. Ceci doit être fait même si la
tentative de connexion échoue ou est abandonnée.
-
PQconndefaults
-
Renvoie les options de connexion par défaut.
PQconninfoOption *PQconndefaults(void);
typedef struct
{
char *keyword; /* Mot clé de l'option */
char *envvar; /* Nom de la variable d'environnement équivalente */
char *compiled; /* Valeur par défaut interne */
char *val; /* Valeur actuelle de l'option ou NULL */
char *label; /* Label du champ pour le dialogue de connexion */
char *dispchar; /* Caractère à afficher pour ce champ
dans un dialogue de connexion. Les valeurs sont :
"" Affiche la valeur entrée sans modification
"*" Champ de mot de passe - cache la valeur
"D" Option de débogage - non affiché par défaut
*/
int dispsize; /* Taille du champ en caractère pour le dialogue */
} PQconninfoOption;
Renvoie un tableau d'options de connexion. Ceci pourrait être
utilisé pour déterminer toutes les options possibles de
PQconnectdb et leur valeurs par
défaut. La valeur de retour pointe vers un tableau de
structures PQconninfoOption
qui se termine avec une entrée utilisant un pointeur nul pour
keyword
. Le pointeur
null est renvoyé si la mémoire n'a pas pu être allouée. Notez
que les valeurs par défaut actuelles (champs
val
) dépendront des variables
d'environnement et d'autres contextes. Les demandeurs doivent
traiter les données des options de connexion en lecture
seule.
Après le traitement du tableau d'options, libérez-le en le
passant à la fonction PQconninfoFree. Si cela n'est pas fait, un
petit groupe de mémoire est perdu à chaque appel de
PQconndefaults.
-
PQfinish
-
Ferme la connexion au serveur. Libère aussi la mémoire
utilisée par l'objet PGconn.
void PQfinish(PGconn *conn);
Notez que même si la connexion au serveur a échoué (d'après
l'indication de PQstatus),
l'application devrait appeler PQfinish pour libérer la mémoire utilisée par
l'objet PGconn. Le pointeur
PGconn ne doit pas être
encore utilisé après l'appel à PQfinish.
-
PQreset
-
Réinitialise le canal de communication avec le serveur.
void PQreset(PGconn *conn);
Cette fonction fermera la connexion au serveur et tentera le
rétablissement d'une nouvelle connexion au même serveur en
utilisant tous les paramètres utilisés précédemment. Ceci
pourrait être utile en cas de récupération après une perte de
connexion.
-
PQresetStart,
PQresetPoll
-
Réinitialise le canal de communication avec le serveur d'une
façon non bloquante.
int PQresetStart(PGconn *conn);
PostgresPollingStatusType PQresetPoll(PGconn *conn);
Ces fonctions fermeront la connexion au serveur et tenteront
de rétablir une nouvelle connexion au même serveur en
utilisant les mêmes paramètres que précédemment. Ceci
pourrait être utile en cas de récupération après une erreur
si une connexion est perdue. Elles diffèrent de PQreset (ci-dessus) car elles agissent d'une
façon non bloquante. Ces fonctions souffrent des mêmes
restrictions que PQconnectStart et
PQconnectPoll.
Pour initier une réinitialisation de la connexion, appelez
PQresetStart. S'il renvoie 0, la
réinitialisation a échoué. S'il renvoie 1, activez la
réinitialisation en utilisant PQresetPoll exactement de la même façon que
vous créeriez la connexion en utilisant PQconnectPoll.
|