Documentation PostgreSQL 8.0.25 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Avance rapide | Suivant |
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 27.11, la Section 27.12 et la Section 27.13 décrivent le comportement que verra l'utilisateur de toute application utilisant libpq.
Quelques petits programmes sont inclus à la fin de ce chapitre (Section 27.16) 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.
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 :
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.
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 27.12).
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.
Numéro de port pour la connexion au serveur ou extension du nom de fichier pour des connexions de domaine Unix.
Nom de la base de données. Par défaut, la même que le nom utilisateur.
Nom de l'utilisateur PostgreSQL qui se connecte. Par défaut, il s'agit du nom de l'utilisateur ayant lancé l'application.
Mot de passe à utiliser si le serveur demande une authentification par mot de passe.
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 en ligne de commande à envoyer au serveur.
Ignoré (auparavant, ceci indiquait où envoyer les traces de débogage du serveur).
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.
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.
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 share/pg_service.conf.sample dans le répertoire d'installation pour plus d'informations sur la configuration de ce fichier.
Si un paramètre manque, alors la variable d'environnement correspondante est vérifiée (voir la Section 27.11). 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)
. Par contre, 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 :
Attente de la connexion à réaliser.
Connexion OK ; attente d'un envoi.
Attente d'une réponse du serveur.
Authentification reçue ; attente de la fin du lancement du moteur.
Négociation du cryptage SSL.
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. 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
.
Précédent | Sommaire | Suivant |
Les interfaces clientes | Niveau supérieur | Fonctions de statut de connexion |