forked from gleu/pgdocs_fr
/
libpq.xml
7782 lines (6968 loc) · 301 KB
/
libpq.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<!-- Dernière modification
le $Date$
par $Author$
révision $Revision$ -->
<chapter id="libpq">
<title><application>libpq</application> - Bibliothèque C</title>
<indexterm zone="libpq">
<primary>libpq</primary>
</indexterm>
<indexterm zone="libpq">
<primary>C</primary>
</indexterm>
<para>
<application>libpq</application> est l'interface de programmation pour les
applications <acronym>C</acronym> avec <productname>PostgreSQL</productname>.
<application>libpq</application> est un ensemble de fonctions permettant aux
programmes clients d'envoyer des requêtes au serveur
<productname>PostgreSQL</productname> et de recevoir les résultats de ces
requêtes.
</para>
<para>
<application>libpq</application> est aussi le
moteur sous-jacent de plusieurs autres interfaces de programmation de
<productname>PostgreSQL</productname>, comme ceux écrits pour C++, Perl,
Python, Tcl et <application>ECPG</application>. Donc, certains aspects du comportement
de <application>libpq</application> seront importants pour vous si vous utilisez un de
ces paquetages. En particulier, la <xref linkend="libpq-envars"/>, la
<xref linkend="libpq-pgpass"/> et la <xref linkend="libpq-ssl"/> décrivent le
comportement que verra l'utilisateur de toute application utilisant
<application>libpq</application>.
</para>
<para>
Quelques petits programmes sont inclus à la fin de ce chapitre (<xref
linkend="libpq-example"/>) pour montrer comment écrire des programmes
utilisant <application>libpq</application>. Il existe aussi quelques exemples
complets d'applications <application>libpq</application> dans le répertoire
<filename>src/test/examples</filename> venant avec la distribution des
sources.
</para>
<para>
Les programmes clients utilisant <application>libpq</application> doivent
inclure le fichier d'en-tête
<filename>libpq-fe.h</filename><indexterm><primary>libpq-fe.h</primary></indexterm> et
doivent être lié avec la bibliothèque <application>libpq</application>.
</para>
<sect1 id="libpq-connect">
<title>Fonctions de contrôle de connexion à la base de données</title>
<para>
Les fonctions suivantes concernent la réalisation d'une connexion avec un
serveur <productname>PostgreSQL</productname>. 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
<structname>PGconn</structname><indexterm><primary>PGconn</primary></indexterm>, obtenu avec la
fonction <function>PQconnectdb</function>,
<function>PQconnectdbParams</function>, ou <function>PQsetdbLogin</function>. 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
<structname>PGconn</structname>. La fonction <function>PQstatus</function>
doit être appelée pour vérifier le code retour pour une connexion réussie
avant de lancer des requêtes via l'objet de connexion.
<warning>
<para>
Sur Unix, la création d'un processus via l'appel système fork() avec des
connexions libpq ouvertes peut amener à des résultats imprévisibles car
les processus parent et enfants partagent les même sockets et les mêmes
ressources du système d'exploitation. Pour cette raison, un tel usage n'est
pas recommandé, alors qu'exécuter un <function>exec</function> à partir
du processus enfant pour charger un nouvel exécutable est sûr.
</para>
</warning>
<note>
<para>
Sur Windows, il existe un moyen pour améliorer les performances si une
connexion seule à la base de données est ouverte puis fermée de façon
répétée. En interne, libpq appelle <function>WSAStartup()</function> et
<function>WSACleanup()</function> respectivement pour le début et la fin
de la transaction. <function>WSAStartup()</function> incrémente un
compteur de référence interne à la bibliothèque Windows.
Ce compteur est décrémenté par <function>WSACleanup()</function>. Quand le compteur arrive à
un, appeler <function>WSACleanup()</function> libère toutes les ressources et toutes les DLL
associées. C'est une opération coûteuse. Pour éviter cela, une application
peut appeler manuellement <function>WSAStartup()</function> afin que les ressources ne soient
pas libérées quand la dernière connexion est fermée.
</para>
</note>
<variablelist>
<varlistentry id="libpq-pqconnectdbparams">
<term><function>PQconnectdbParams</function><indexterm><primary>PQconnectdbParams</primary></indexterm></term>
<listitem>
<para>
Établit une nouvelle connexion au serveur de base de données.
<synopsis>
PGconn *PQconnectdbParams(const char * const *keywords,
const char * const *values,
int expand_dbname);
</synopsis>
</para>
<para>
Cette fonction ouvre une nouvelle connexion à la base de données en
utilisant les paramètres à partir des deux tableaux terminés par un
<symbol>NULL</symbol>. Le premier, <literal>keywords</literal>, est
défini comme un tableau de chaînes, chacune étant un mot-clé. Le second,
<literal>values</literal>, donne la valeur pour chaque mot-clé.
Contrairement à <function>PQsetdbLogin</function> ci-dessous, l'ensemble
des paramètres peut être étendu sans changer la signature de la fonction
donc son utilisation (ou ses versions non bloquantes, à savoir
<function>PQconnectStartParams</function> et
<function>PQconnectPoll</function>) est recommendée pour les nouvelles
applications.
</para>
<para>
Les mots clés actuellement reconnus sont listés dans
<xref linkend="libpq-paramkeywords"/>.
</para>
<para>
Quand <literal>expand_dbname</literal> est différent de zéro, la valeur
du mot-clé <parameter>dbname</parameter> peut être reconnue comme une
chaîne de connexion. Les formats possibles sont disponibles dans
<xref linkend="libpq-connstring"/> avec de nombreux détails.
</para>
<para>
Les tableaux fournis peuvent être vides pour utiliser tous les
paramètres par défaut ou peuvent contenir un ou plusieurs paramètres.
Ils doivent avoir la même longueur. Le traitement stoppera au premier
élément <symbol>NULL</symbol> découvert dans le tableau
<literal>keywords</literal>.
</para>
<para>
Si un paramètre manque, alors la variable d'environnement correspondante
est vérifiée (voir la <xref linkend="libpq-envars"/>). Si elle n'est pas
disponible, alors la valeur par défaut indiquée est utilisée.
</para>
<para>
En général, les mots-clés sont traités à partir du début de ces
tableaux dans l'ordre de l'index. L'effet qui en découle est que,
quand les mots-clés sont répétés, la valeur correspondant au dernier
traitement est conservée. Du coup, via un placement attentionné du
mot-clé <parameter>dbname</parameter>, il est possible de déterminer
ce qui pourrait être surchargé par une chaîne
<parameter>conninfo</parameter> et ce qui ne le sera pas.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqconnectdb">
<term><function>PQconnectdb</function><indexterm><primary>PQconnectdb</primary></indexterm></term>
<listitem>
<para>
Établit une nouvelle connexion à un serveur de bases de données.
<synopsis>
PGconn *PQconnectdb(const char *conninfo);
</synopsis>
</para>
<para>
Cette fonction ouvre une nouvelle connexion à la base de données en
utilisant les paramètres pris à partir de la chaîne
<literal>conninfo</literal>.
</para>
<para>
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ètres, séparés par
des espaces blancs. Elle peut aussi contenir une <acronym>URI</acronym>.
Voir <xref linkend="libpq-connstring"/> pour les détails.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqsetdblogin">
<term><function>PQsetdbLogin</function><indexterm><primary>PQsetdbLogin</primary></indexterm></term>
<listitem>
<para>
Crée une nouvelle connexion sur le serveur de bases de données.
<synopsis>PGconn *PQsetdbLogin(const char *pghost,
const char *pgport,
const char *pgoptions,
const char *pgtty,
const char *dbName,
const char *login,
const char *pwd);
</synopsis>
</para>
<para>
C'est le prédécesseur de <function>PQconnectdb</function> 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 <symbol>NULL</symbol> ou une chaîne vide pour un de ces
paramètres fixes dont vous souhaitez utiliser la valeur par défaut.
</para>
<para>
Si <parameter>dbName</parameter> contient un signe <symbol>=</symbol> ou
a un préfixe <acronym>URI</acronym> de connexion valide,
il est pris pour une chaîne <parameter>conninfo</parameter> exactement
de la même façon que si elle était passée à
<function>PQconnectdb</function>, et le reste des paramètres est
ensuite appliqué as specified for <function>PQconnectdbParams</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqsetdb">
<term><function>PQsetdb</function><indexterm><primary>PQsetdb</primary></indexterm></term>
<listitem>
<para>
Crée une nouvelle connexion sur le serveur de bases de données.
<synopsis>PGconn *PQsetdb(char *pghost,
char *pgport,
char *pgoptions,
char *pgtty,
char *dbName);
</synopsis>
</para>
<para>
C'est une macro faisant appel à <function>PQsetdbLogin</function> avec des
pointeurs nuls pour les paramètres <parameter>login</parameter> et <parameter>pwd</parameter>.
Elle est fournie pour une compatibilité ascendante des très vieux programmes.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqconnectstartparams">
<term><function>PQconnectStartParams</function><indexterm><primary>PQconnectStartParams</primary></indexterm></term>
<term><function>PQconnectStart</function><indexterm><primary>PQconnectStart</primary></indexterm></term>
<term><function>PQconnectPoll</function><indexterm><primary>PQconnectPoll</primary></indexterm></term>
<listitem>
<para>
<indexterm><primary>connexion non bloquante</primary></indexterm>
Crée une connexion au serveur de bases de données d'une façon non bloquante.
<synopsis>PGconn *PQconnectStartParams(const char * const *keywords,
const char * const *values,
int expand_dbname);
PGconn *PQconnectStart(const char *conninfo);
PostgresPollingStatusType PQconnectPoll(PGconn *conn);
</synopsis>
</para>
<para>
Ces trois 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
<function>PQconnectdbParams</function> ou <function>PQconnectdb</function>, et donc l'application peut gérer des opérations en
parallèle à d'autres activités.
</para>
<para>
Avec <function>PQconnectStartParams</function>, la connexion à la base
de données est faite en utilisant les paramètres à partir des tableaux
<literal>keywords</literal> et <literal>values</literal>, et contrôlée
par <literal>expand_dbname</literal>, comme décrit dans
<xref linkend="libpq-paramkeywords"/>.
</para>
<para>
Avec <function>PQconnectStart</function>, la connexion à la base de
données est faite en utilisant les paramètres provenant de la chaîne
<literal>conninfo</literal> comme décrit ci-dessus pour
<function>PQconnectdb</function>.
</para>
<para>
<para>
Ni <function>PQconnectStartParams</function> ni
<function>PQconnectStart</function> ni <function>PQconnectPoll</function>
ne bloqueront, aussi longtemps qu'un certain nombre de restrictions est
respecté :
<itemizedlist>
<listitem>
<para>
Les paramètres <literal>hostaddr</literal> et <literal>host</literal> 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
<function>PQconnectdbParams</function> ci-dessus pour les détails.
</para>
</listitem>
<listitem>
<para>
Si vous appelez <function>PQtrace</function>, assurez-vous que l'objet de
flux dans lequel vous enregistrez les traces ne bloquera pas.
</para>
</listitem>
<listitem>
<para>
Assurez-vous que le socket soit dans l'état approprié avant d'appeler
<function>PQconnectPoll</function>, comme décrit ci-dessous.
</para>
</listitem>
</itemizedlist>
</para>
<para>
Note : l'utilisation de <function>PQconnectStartParams</function>
est analogue à <function>PQconnectStart</function> affichée ci-dessous.
</para>
<para>
Pour commencer une demande de connexion non bloquante, appelez <literal>conn
= PQconnectStart("<replaceable>connection_info_string</replaceable>")</literal>.
Si <varname>conn</varname> est nul, alors <application>libpq</application> a été
incapable d'allouer une nouvelle structure <structname>PGconn</structname>. Sinon, un
pointeur valide vers une structure <structname>PGconn</structname> est renvoyé (bien
qu'il ne représente pas encore une connexion valide vers la base de
données). Au retour de <function>PQconnectStart</function>, appelez
<literal>status = PQstatus(conn)</literal>. Si <varname>status</varname> vaut
<symbol>CONNECTION_BAD</symbol>, <function>PQconnectStart</function> a
échoué.
</para>
<para>
Si <function>PQconnectStart</function> réussit, la prochaine étape est d'appeler
souvent <application>libpq</application> de façon à ce qu'il continue la séquence de
connexion. Utilisez <function>PQsocket(conn)</function> pour obtenir le
descripteur de socket sous la connexion à la base de données. Du coup, une
boucle : si le dernier retour de
<function>PQconnectPoll(conn)</function> est
<symbol>PGRES_POLLING_READING</symbol>, attendez que la socket soit prête
pour lire (comme indiqué par <function>select()</function>, <function>poll()</function> ou
une fonction système similaire). Puis, appelez de nouveau
<function>PQconnectPoll(conn)</function>. En revanche, si le dernier retour de
<function>PQconnectPoll(conn)</function> est
<symbol>PGRES_POLLING_WRITING</symbol>, attendez que la socket soit prête
pour écrire, puis appelez de nouveau
<function>PQconnectPoll(conn)</function>. Si vous devez encore appeler
<function>PQconnectPoll</function>, c'est-à-dire juste après l'appel de
<function>PQconnectStart</function>, continuez comme s'il avait renvoyé
<symbol>PGRES_POLLING_WRITING</symbol>. Continuez cette boucle jusqu'à ce que
<function>PQconnectPoll(conn)</function> renvoie
<symbol>PGRES_POLLING_FAILED</symbol>, indiquant que la procédure de
connexion a échoué ou <symbol>PGRES_POLLING_OK</symbol>, indiquant le
succès de la procédure de connexion.
</para>
<para>
À tout moment pendant la connexion, le statut de cette connexion pourrait
être vérifié en appelant <function>PQstatus</function>. Si le résultat est
<symbol>CONNECTION_BAD</symbol>, alors la procédure de connexion a échoué ;
si, au contraire, elle renvoie <function>CONNECTION_OK</function>, alors la
connexion est prête. Ces deux états sont détectables à partir de la valeur
de retour de <function>PQconnectPoll</function>, 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 :
</para>
<variablelist>
<varlistentry id="libpq-connection-started">
<term><symbol>CONNECTION_STARTED</symbol></term>
<listitem>
<para>
Attente de la connexion à réaliser.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connection-made">
<term><symbol>CONNECTION_MADE</symbol></term>
<listitem>
<para>
Connexion OK ; attente d'un envoi.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connection-awaiting-response">
<term><symbol>CONNECTION_AWAITING_RESPONSE</symbol></term>
<listitem>
<para>
Attente d'une réponse du serveur.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connection-auth-ok">
<term><symbol>CONNECTION_AUTH_OK</symbol></term>
<listitem>
<para>
Authentification reçue ; attente de la fin du lancement du moteur.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connection-ssl-startup">
<term><symbol>CONNECTION_SSL_STARTUP</symbol></term>
<listitem>
<para>
Négociation du cryptage SSL.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connection-setenv">
<term><symbol>CONNECTION_SETENV</symbol></term>
<listitem>
<para>
Négociation des paramétrages de l'environnement.
</para>
</listitem>
</varlistentry>
</variablelist>
<para>
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 :
<programlisting>switch(PQstatus(conn))
{
case CONNECTION_STARTED:
feedback = "Connexion en cours...";
break;
case CONNECTION_MADE:
feedback = "Connecté au serveur...";
break;
.
.
.
default:
feedback = "Connexion...";
}
</programlisting>
</para>
<para>
Le paramètre de connexion <literal>connect_timeout</literal> est ignoré lors
de l'utilisation <function>PQconnectPoll</function> ; c'est de la
responsabilité de l'application de décider quand une période de temps
excessive s'est écoulée. Sinon, <function>PQconnectStart</function> suivi par
une boucle <function>PQconnectPoll</function> est équivalent à
<function>PQconnectdb</function>.
</para>
<para>
Notez que si <function>PQconnectStart</function> renvoie un pointeur non
nul, vous devez appeler <function>PQfinish</function> 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.
</para>
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqconndefaults">
<term><function>PQconndefaults</function><indexterm><primary>PQconndefaults</primary></indexterm></term>
<listitem>
<para>
Renvoie les options de connexion par défaut.
<synopsis>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; /* Indique comment afficher 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;
</synopsis>
</para>
<para>
Renvoie un tableau d'options de connexion. Ceci pourrait être utilisé pour
déterminer toutes les options possibles de <function>PQconnectdb</function>
et leur valeurs par défaut. La valeur de retour pointe vers un tableau de
structures <structname>PQconninfoOption</structname> qui se termine avec une
entrée utilisant un pointeur nul pour <structfield>keyword</structfield>. 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 <structfield>val</structfield>)
dépendront des variables d'environnement et d'autres contextes. Les
demandeurs doivent traiter les données des options de connexion en lecture
seule.
</para>
<para>
Après le traitement du tableau d'options, libérez-le en le passant à la
fonction <function>PQconninfoFree</function>. Si cela n'est pas fait, un
petit groupe de mémoire est perdu à chaque appel de
<function>PQconndefaults</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqconninfo">
<term><function>PQconninfo</function><indexterm><primary>PQconninfo</primary></indexterm></term>
<listitem>
<para>
Returns the connection options used by a live connection.
<synopsis>
PQconninfoOption *PQconninfo(PGconn *conn);
</synopsis>
</para>
<para>
Returns a connection options array. This can be used to determine
all possible <function>PQconnectdb</function> options and the
values that were used to connect to the server. The return
value points to an array of <structname>PQconninfoOption</structname>
structures, which ends with an entry having a null <structfield>keyword</structfield>
pointer. All notes above for <function>PQconndefaults</function> also
apply to the result of <function>PQconninfo</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqconninfoparse">
<term><function>PQconninfoParse</function><indexterm><primary>PQconninfoParse</primary></indexterm></term>
<listitem>
<para>
Renvoit les options de connexions analysées d'après la chaîne de
connexion fournie.
<synopsis>
PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
</synopsis>
</para>
<para>
Analyse une chaîne de connexion et renvoie les options résultantes
dans un tableau ; renvoit <symbol>NULL</symbol> si un problème a été détecté avec
la chaîne de connexion. Ceci peut être utilisé pour déterminer les
options de <function>PQconnectdb</function> dans la chaîne de connexion
fournie. La valeur de retour pointe vers un tableau de structures
<structname>PQconninfoOption</structname> et termine avec une entrée
ayant un pointeur <structfield>keyword</structfield> nul.
</para>
<para>
Toutes les options légales seront présentes dans le tableau en résultat
mais le <literal>PQconninfoOption</literal> pour toute option absente
de la chaîne de connexion aura sa valeur (<literal>val</literal>)
configurée à <literal>NULL</literal> ; les valeurs par défaut ne
sont pas utilisées.
</para>
<para>
Si <literal>errmsg</literal> n'est pas <symbol>NULL</symbol>, alors
<literal>*errmsg</literal> est configuré à <symbol>NULL</symbol> en cas de succès et sinon
à un message d'erreur (alloué via un appel à <function>malloc</function>) expliquant le
problèm. (Il est aussi possible pour <literal>*errmsg</literal> d'être
configuré à <symbol>NULL</symbol> et la fonction de renvoyer <symbol>NULL</symbol> ; cela indique un
cas de mémoire épuisée.)
</para>
<para>
Après avoir traité le tableau des options, libérez-le en le passant à
<function>PQconninfoFree</function>. Si ce n'est pas fait, de la mémoire
sera perdu à chaque appel à <function>PQconninfoParse</function>.
Réciproquement, si une erreur survient et que <literal>errmsg</literal>
n'est pas <symbol>NULL</symbol>, assurez-vous de libérer la chaîne d'erreur en utilisant
<function>PQfreemem</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqfinish">
<term><function>PQfinish</function><indexterm><primary>PQfinish</primary></indexterm></term>
<listitem>
<para>
Ferme la connexion au serveur. Libère aussi la mémoire utilisée par l'objet
<structname>PGconn</structname>.
<synopsis>void PQfinish(PGconn *conn);
</synopsis>
</para>
<para>
Notez que même si la connexion au serveur a échoué (d'après l'indication
de <function>PQstatus</function>), l'application devrait appeler
<function>PQfinish</function> pour libérer la mémoire utilisée par l'objet
<structname>PGconn</structname>. Le pointeur <structname>PGconn</structname> ne doit
pas être encore utilisé après l'appel à <function>PQfinish</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqreset">
<term><function>PQreset</function><indexterm><primary>PQreset</primary></indexterm></term>
<listitem>
<para>
Réinitialise le canal de communication avec le serveur.
<synopsis>void PQreset(PGconn *conn);
</synopsis>
</para>
<para>
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.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqresetstart">
<term><function>PQresetStart</function><indexterm><primary>PQresetStart</primary></indexterm></term>
<term><function>PQresetPoll</function><indexterm><primary>PQresetPoll</primary></indexterm></term>
<listitem>
<para>
Réinitialise le canal de communication avec le serveur d'une façon non
bloquante.
<synopsis>
int PQresetStart(PGconn *conn);
PostgresPollingStatusType PQresetPoll(PGconn *conn);
</synopsis>
</para>
<para>
Ces fonctions fermeront la connexion au serveur et tenteront de rétablir
une nouvelle connexion sur le même serveur, en utilisant tous les paramètres
précédemment utilisés. Ceci peut être utile pour revenir à un état normal
après une erreur si une connexion est perdue. Ces fonctions diffèrent de
<function>PQreset</function> (ci-dessus) dans le fait qu'elles agissent
d'une façon non bloquante. Ces fonctions souffrent des mêmes restrictions
que <function>PQconnectStartParams</function>, <function>PQconnectStart</function>
et <function>PQconnectPoll</function>.
</para>
<para>
Pour lancer une réinitialisation de la connexion, exécutez
<function>PQresetStart</function>. Si cette fonction 0, la réinitialisation
a échoué. Si elle renvoie 1, récupérez le résultat de la réinitialisation
en utilisant <function>PQresetPoll</function> exactement de la même
façon que vous auriez créé la connexion en utilisant
<function>PQconnectPoll</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqpingparams">
<term><function>PQpingParams</function><indexterm><primary>PQpingParams</primary></indexterm></term>
<listitem>
<para>
<function>PQpingParams</function> renvoie le statut du serveur. Elle
accepte les mêmes paramètres de connexion que ceux de la fonction
<function>PQconnectdbParams</function>, décrite ci-dessus. Néanmoins,
il n'est pas nécessaire de fournir les bons nom d'utilisateur, mot de
passe, ou nom de base de données pour obtenir le statut du serveur.
however, if incorrect values
are provided, the server will log a failed connection attempt.
<synopsis>
PGPing PQpingParams(const char * const *keywords,
const char * const *values,
int expand_dbname);
</synopsis>
La fonction renvoie une des valeurs suivantes :
<variablelist>
<varlistentry id="libpq-pqpingparams-pqping-ok">
<term><literal>PQPING_OK</literal></term>
<listitem>
<para>
Le serveur est en cours d'exécution et semble accepter les
connexions.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqpingparams-pqping-reject">
<term><literal>PQPING_REJECT</literal></term>
<listitem>
<para>
Le serveur est en cours d'exécution mais est dans un état qui
interdit les connexions (démarrage, arrêt, restauration après
crash).
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqpingparams-pqping-no-response">
<term><literal>PQPING_NO_RESPONSE</literal></term>
<listitem>
<para>
Le serveur n'a pas pu être contacté. Cela pourrait indiquer que
le serveur n'est pas en cours d'exécution ou qu'il y a un problème
avec les paramètres de connexion donnés (par exemple un mauvais
numéro de port). Cela peut aussi indiquer un problème de connexion
réseau (par exemple un pare-feu qui bloque la demande de connexion).
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqpingparams-pqping-no-attempt">
<term><literal>PQPING_NO_ATTEMPT</literal></term>
<listitem>
<para>
Aucune tentative n'a été faite pour contacter le serveur à cause des
paramètres fournis erronnés ou à cause d'un problème au niveau client
(par exemple un manque mémoire).
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-pqping">
<term><function>PQping</function><indexterm><primary>PQping</primary></indexterm></term>
<listitem>
<para>
<function>PQping</function> renvoie l'état du serveur. Elle
accepte les mêmes paramètres de connexion que ceux de la fonction
<function>PQconnectdb</function>, décrite ci-dessus. Néanmoins,
il n'est pas nécessaire de fournir les bons nom d'utilisateur, mot de
passe, ou nom de base de données pour obtenir le statut du serveur; however, if incorrect values
are provided, the server will log a failed connection attempt.
<synopsis>
PGPing PQping(const char *conninfo);
</synopsis>
</para>
<para>
Les valeurs de retour sont les mêmes que pour <function>PQpingParams</function>.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<sect2 id="libpq-connstring">
<title>Chaînes de connexion</title>
<indexterm zone="libpq-connstring">
<primary><literal>conninfo</literal></primary>
</indexterm>
<indexterm zone="libpq-connstring">
<primary><literal>URI</literal></primary>
</indexterm>
<para>
Plusieurs fonctions de la bibliothèque <application>libpq</application>
analysent une chaîne donnée par l'utilisateur pour obtenir les paramètres
de connexion. Deux formats sont acceptés pour ces chaînes :
le format régulier <literal>keyword = value</literal> et le format des
URI <ulink url="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</ulink>.
</para>
<sect3>
<title>Chaînes de connexion clé/valeur</title>
<para>
Dans le premier format, chaque configuration de paramètre se présente sous
la forme <literal>clé = valeur</literal>. Les espaces autour du signe égal
sont optionnels. Pour écrire une valeur vide ou une valeur contenant des
espaces, il est nécessaires de l'entourer de guillemets simples, par
exemple <literal>clé = 'une valeur'</literal>. Les guillemets simples et
les antislashs compris dans une valeur doivent être échappés par un
antislash, comme ceci <literal>\'</literal> et ceci <literal>\\</literal>.
</para>
<para>
Example:
<programlisting>
host=localhost port=5432 dbname=mabase connect_timeout=10
</programlisting>
</para>
<para>
Les mots clés reconnus pour les paramètres sont listés dans <xref
linkend="libpq-paramkeywords"/>.
</para>
</sect3>
<sect3>
<title>URI de connexion</title>
<para>
La forme générale pour une <acronym>URI</acronym> de connexion est :
<synopsis>
postgresql://[utilisateur[:mot_de_passe]@][alias_ou_ip][:port][/nom_base][?param1=valeur1&...]
</synopsis>
</para>
<para>
Le désignateur d<acronym>URI</acronym> peut être soit
<literal>postgresql://</literal> soit <literal>postgres://</literal>.
Chacune des parties de l'<acronym>URI</acronym> est optionnelle. Les
exemples suivants montrent des syntaxes valides pour
l'<acronym>URI</acronym> :
<programlisting>
postgresql://
postgresql://localhost
postgresql://localhost:5433
postgresql://localhost/ma_base
postgresql://utilisateur@localhost
postgresql://utilisateur:secret@localhost
postgresql://autre@localhost/autre_base?connect_timeout=10&application_name=mon_appli
</programlisting>
Les composants de la partie hiérarchique de l'<acronym>URI</acronym> peuvent
aussi être donnés comme paramètres. Par exemple :
<programlisting>
postgresql:///ma_base?host=localhost&port=5433
</programlisting>
</para>
<para>
L'encodage du signe pourcent peut être utilisé pour inclure des symboles
dotés d'une signification spéciale dans toutes les parties de
l'<acronym>URI</acronym>.
</para>
<para>
Tout paramètre de connexion ne correspondant pas aux mots clés listés dans
<xref linkend="libpq-paramkeywords"/> est ignoré et un message d'avertissement
les concernant est envoyé sur la sortie des erreurs (<filename>stderr</filename>).
</para>
<para>
Pour améliorer la compatibilité avec les <acronym>URI</acronym> des
connexions, les instances du paramètre <literal>ssl=true</literal> sont
traduites en <literal>sslmode=require</literal>.
</para>
<para>
La partie host peut être soit un nom d'hôte soit une adresse IP. Pour
indiquer une adresse IPv6, il est nécessaire de l'englober dans des
crochets :
<synopsis>
postgresql://[2001:db8::1234]/database
</synopsis>
</para>
<para>
Le composant host est interprété de la façon décrite pour le paramètre
<xref linkend="libpq-connect-host"/>. En particulier, une connexion par
socket de domaine Unix est choisi si la partie host est vide ou commence
par un slash. Dans tous les autres cas, une connexion TCP/IP est
démarrée. Cependant, notez que le slash est un caractère réservé dans la
partie hiérarchique de l'URI. Donc, pour indiquer un répertoire non standard
pour la socket de domaine Unix, il faut soit omettre d'indiquer le paramètre
host dans l'URI, soit l'indiquer en tant que paramètre, soit encoder le
chemin dans le composant host de l'URI :
<programlisting>
postgresql:///dbname?host=/var/lib/postgresql
postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
</programlisting>
</para>
</sect3>
</sect2>
<sect2 id="libpq-paramkeywords">
<title>Mots clés de la chaîne de connexion</title>
<para>
Les mots clés actuellement reconnus sont :
<variablelist>
<varlistentry id="libpq-connect-host" xreflabel="host">
<term><literal>host</literal></term>
<listitem>
<para>
Nom de l'hôte sur lequel se connecter.<indexterm><primary>host name</primary></indexterm>
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
<literal>host</literal> n'est pas spécifié, il s'agit d'une communication par
socket de domaine Unix<indexterm><primary>socket de domaine Unix</primary></indexterm>
dans <filename>/tmp</filename> (ou tout autre répertoire de socket spécifié
lors de la construction de <productname>PostgreSQL</productname>). Sur les machines
sans sockets de domaine Unix, la valeur par défaut est de se connecter
à <literal>localhost</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connect-hostaddr" xreflabel="hostaddr">
<term><literal>hostaddr</literal></term>
<listitem>
<para>
Adresse IP numérique de l'hôte de connexion. Elle devrait être au format
d'adresse standard IPv4, c'est-à-dire <literal>172.28.40.9</literal>. 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.
</para>
<para>
Utiliser <literal>hostaddr</literal> au lieu de <literal>host</literal>
permet à l'application d'éviter une recherche de nom d'hôte, qui
pourrait être importante pour les applications ayant des
contraintes de temps. Un nom d'hôte est requis pour les méthodes
d'authentification Kerberos, GSSAPI ou SSPI, ainsi que pour la
vérification de certificat SSL en <literal>verify-full</literal>.
Les règles suivantes sont observées :
<itemizedlist>
<listitem>
<para>
Si <literal>host</literal> est indiqué sans
<literal>hostaddr</literal>, une recherche du nom de l'hôte
est lancée.
</para>
</listitem>
<listitem>
<para>
Si <literal>hostaddr</literal> est indiqué sans
<literal>host</literal>, la valeur de
<literal>hostaddr</literal> donne l'adresse réseau de
l'hôte. La tentative de connexion échouera si la méthode
d'authentification nécessite un nom d'hôte.
</para>
</listitem>
<listitem>
<para>
Si <literal>host</literal> et <literal>hostaddr</literal>
sont indiqués, la valeur de <literal>hostaddr</literal>
donne l'adresse réseau de l'hôte. La valeur de
<literal>host</literal> est ignorée sauf si la méthode
d'authentification la réclame, auquel cas elle sera
utilisée comme nom d'hôte.
</para>
</listitem>
</itemizedlist>
Notez que l'authentification a de grandes chances d'échouer si
<literal>host</literal> n'est pas identique au nom du serveur
pour l'adresse réseau <literal>hostaddr</literal>.
De même, <literal>host</literal> plutôt
que <literal>hostaddr</literal> est utilisé pour identifier la connexion
dans <filename>~/.pgpass</filename> (voir la <xref
linkend="libpq-pgpass"/>).
</para>
<para>
Sans un nom ou une adresse d'hôte, <application>libpq</application> se
connectera en utilisant un socket local de domaine Unix. Sur des machines
sans sockets de domaine Unix, il tentera une connexion sur
<literal>localhost</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connect-port" xreflabel="port">
<term><literal>port</literal></term>
<listitem>
<para>
Numéro de port pour la connexion au serveur ou extension du nom de
fichier pour des connexions de domaine Unix.<indexterm><primary>port</primary></indexterm>
</para>
</listitem>
</varlistentry>
<varlistentry id="libpq-connect-dbname" xreflabel="dbname">
<term><literal>dbname</literal></term>
<listitem>
<para>
Nom de la base de données. Par défaut, la même que le nom utilisateur.
Dans certains contextes, la valeur est vérifiée pour les formats
étendues ; voir <xref linkend="libpq-connstring"/> pour plus
d'informations.
</para>