forked from gleu/pgdocs_fr
/
libpq.xml
5390 lines (4853 loc) · 208 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> 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 si la connexion s'est bien effectuée avant de lancer des
requêtes via l'objet de connexion.
<variablelist>
<varlistentry>
<term><function>PQconnectdb</function><indexterm><primary>PQconnectdb</primary></indexterm></term>
<listitem>
<para>
Crée une nouvelle connexion au 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 à partir de la chaîne <literal>conninfo</literal>.
Contrairement à <function>PQsetdbLogin</function> 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,
<function>PQconnectStart</function> et <function>PQconnectPoll</function>) est
préférée pour la programmation de nouvelles applications.
</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étrages séparés par des espaces
blancs. Chaque paramètre est de la forme <literal>motclé = valeur</literal>.
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 <literal>motclé = 'une valeur'</literal>. À l'intérieur de la
valeur, des guillemets simples et des antislashs peuvent être échappés
avec un antislash, par exemple
<literal>\'</literal> et <literal>\\</literal>.
</para>
<para>
Les mots clés actuellement reconnus sont :
<variablelist>
<varlistentry>
<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>
<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.
Néanmoins, les authentifications Kerberos et GSSAPI requièrent un nom
d'hôte. Du coup, ce
qui suit s'applique : si <literal>host</literal> est spécifié sans
<literal>hostaddr</literal>, une recherche de nom d'hôte a lieu. Si
<literal>hostaddr</literal> est spécifié sans <literal>host</literal>, la valeur de
<literal>hostaddr</literal> 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 <literal>host</literal> et
<literal>hostaddr</literal> sont spécifiés, la valeur de <literal>hostaddr</literal>
donne l'adresse distante ; la valeur de <literal>host</literal> 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 <application>libpq</application> se voit donner un
nom qui n'est pas le nom de la machine sur <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>
<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>
<term><literal>dbname</literal></term>
<listitem>
<para>
Nom de la base de données. Par défaut, la même que le nom utilisateur.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>user</literal></term>
<listitem>
<para>
Nom de l'utilisateur <productname>PostgreSQL</productname> qui se
connecte.
Par défaut, il s'agit du nom de l'utilisateur ayant lancé l'application.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>password</literal></term>
<listitem>
<para>
Mot de passe à utiliser si le serveur demande une authentification par
mot de passe.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>connect_timeout</literal></term>
<listitem>
<para>
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é.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>options</literal></term>
<listitem>
<para>
Options en ligne de commande à envoyer au serveur.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>tty</literal></term>
<listitem>
<para>
Ignoré (auparavant, ceci indiquait où envoyer les traces de débogage du
serveur).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>sslmode</literal></term>
<listitem>
<para>
Cette option détermine si ou avec quelle priorité une connexion
TCP/IP <acronym>SSL</acronym> sera négociée avec le serveur. Il existe quatre
modes : <literal>disable</literal> essaiera uniquement une connexion non
cryptée <acronym>SSL</acronym> ; <literal>allow</literal> négociera en essayant
tout d'abord une connexion sans <acronym>SSL</acronym> puis, si cela échoue, une
connexion <acronym>SSL</acronym> ; <literal>prefer</literal> (la valeur par
défaut) négociera en essayant d'abord une connexion <acronym>SSL</acronym> puis,
en cas d'échec, une connexion non <acronym>SSL</acronym> ;
<literal>require</literal> essaiera uniquement une connexion <acronym>SSL</acronym>.
<literal>sslmode</literal> est ignoré pour la communication avec des sockets de
domaine Unix.
</para>
<para>
Si <productname>PostgreSQL</productname> est compilé sans le support de SSL,
l'utilisation de l'option <literal>require</literal> causera une erreur alors
que les options <literal>allow</literal> et <literal>prefer</literal> seront acceptées
mais <application>libpq</application> ne sera pas capable de négocier une connexion
<acronym>SSL</acronym>.<indexterm><primary>SSL</primary><secondary
sortas="libpq">avec libpq</secondary></indexterm>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>requiressl</literal></term>
<listitem>
<para>
Cette option est obsolète et remplacée par l'option <literal>sslmode</literal>.
</para>
<para>
Si initialisée à 1, une connexion <acronym>SSL</acronym> au serveur est
requise (ce qui est équivalent à un <literal>sslmode</literal>
<literal>require</literal>). <application>libpq</application> refusera alors de se
connecter si le serveur n'accepte pas une connexion
<acronym>SSL</acronym>. Si initialisée à 0 (la valeur par défaut),
<application>libpq</application> négociera le type de connexion avec le serveur
(équivalent à un <literal>sslmode</literal> <literal>prefer</literal>). Cette option
est seulement disponible si <productname>PostgreSQL</productname> est compilé avec
le support SSL.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>krbsrvname</literal></term>
<listitem>
<para>
Nom du service Kerberos à utiliser lors de l'authentification avec
Kerberos 5 et GSSAPI. 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 <xref linkend="kerberos-auth"/> and <xref linkend="gssapi-auth"/>.)
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>gsslib</literal></term>
<listitem>
<para>
Bibliothèque GSS à utiliser pour l'authentification GSSAPI. Utilisée
seulement sur Windows.
Configurer à <literal>gssapi</literal> pour forcer libpq à utiliser
la bibliothèque GSSAPI pour l'authentification au lieu de SSPI par
défaut.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>service</literal></term>
<listitem>
<para>
Nom du service à utiliser pour des paramètres supplémentaires. Il spécifie
un nom de service dans <filename>pg_service.conf</filename> 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
<xref linkend="libpq-pgservice"/>.
</para>
</listitem>
</varlistentry>
</variablelist>
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>
</listitem>
</varlistentry>
<varlistentry>
<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>,
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é comme ci-dessus.
</para>
</listitem>
</varlistentry>
<varlistentry>
<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>
<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 *PQconnectStart(const char *conninfo);
</synopsis>
<synopsis>PostgresPollingStatusType PQconnectPoll(PGconn *conn);
</synopsis>
</para>
<para>
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
<function>PQconnectdb</function>, et donc l'application peut gérer des opérations en
parallèle à d'autres activités.
</para>
<para>
La connexion à la base de données est faite en utilisant les paramètres pris
dans la chaîne <literal>conninfo</literal>, passée à
<function>PQconnectStart</function>. Cette chaîne est du même format que
celle décrite pour <function>PQconnectdb</function>.
</para>
<para>
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>PQconnectdb</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>
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 :
<variablelist>
<varlistentry>
<term><symbol>CONNECTION_STARTED</symbol></term>
<listitem>
<para>
Attente de la connexion à réaliser.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_MADE</symbol></term>
<listitem>
<para>
Connexion OK ; attente d'un envoi.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_AWAITING_RESPONSE</symbol></term>
<listitem>
<para>
Attente d'une réponse du serveur.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_AUTH_OK</symbol></term>
<listitem>
<para>
Authentification reçue ; attente de la fin du lancement du moteur.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_SSL_STARTUP</symbol></term>
<listitem>
<para>
Négociation du cryptage SSL.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_SETENV</symbol></term>
<listitem>
<para>
Négociation des paramétrages de l'environnement.
</para>
</listitem>
</varlistentry>
</variablelist>
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>
</listitem>
</varlistentry>
<varlistentry>
<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; /* 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;
</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>
<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>
<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>
<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);
</synopsis>
<synopsis>PostgresPollingStatusType PQresetPoll(PGconn *conn);
</synopsis>
</para>
<para>
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
<function>PQreset</function> (ci-dessus) car elles agissent d'une façon non
bloquante. Ces fonctions souffrent des mêmes restrictions que
<function>PQconnectStart</function> et <function>PQconnectPoll</function>.
</para>
<para>
Pour initier une réinitialisation de la connexion, appelez
<function>PQresetStart</function>. S'il renvoie 0, la réinitialisation a
échoué. S'il renvoie 1, activez la réinitialisation en utilisant
<function>PQresetPoll</function> exactement de la même façon que vous
créeriez la connexion en utilisant <function>PQconnectPoll</function>.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect1>
<sect1 id="libpq-status">
<title>Fonctions de statut de connexion</title>
<para>
Ces fonctions sont utilisées pour interroger le statut d'un objet de
connexion existant.
</para>
<tip>
<para>
<indexterm><primary>libpq-fe.h</primary></indexterm>
<indexterm><primary>libpq-int.h</primary></indexterm>
Les développeurs d'application <application>libpq</application> devraient être
attentif au maintien de leur abstraction <structname>PGconn</structname>.
Utilisez les fonctions d'accès décrites ci-dessous pour obtenir le
contenu de <structname>PGconn</structname>.
Référence les champs internes de <structname>PGconn</structname> en utilisant
<filename>libpq-int.h</filename> n'est pas recommandé parce qu'ils sont sujets
à modification dans le futur.
</para>
</tip>
<para>
Les fonctions suivantes renvoient les valeurs des paramètres utilisés
pour la connexion. Ces valeurs sont fixes pour la durée de vie de l'objet
<structname>PGconn</structname>.
<variablelist>
<varlistentry>
<term><function>PQdb</function><indexterm><primary>PQdb</primary></indexterm></term>
<listitem>
<para>
Renvoie le nom de la base de données de la connexion.
<synopsis>char *PQdb(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQuser</function><indexterm><primary>PQuser</primary></indexterm></term>
<listitem>
<para>
Renvoie le nom d'utilisateur utilisé pour la connexion.
<synopsis>char *PQuser(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQpass</function><indexterm><primary>PQpass</primary></indexterm></term>
<listitem>
<para>
Renvoie le mot de passe utilisé pour la connexion.
<synopsis>char *PQpass(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQhost</function><indexterm><primary>PQhost</primary></indexterm></term>
<listitem>
<para>
Renvoie le nom d'hôte du serveur utilisé pour la connexion.
<synopsis>char *PQhost(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQport</function><indexterm><primary>PQport</primary></indexterm></term>
<listitem>
<para>
Renvoie le numéro de port utilisé pour la connexion.
<synopsis>char *PQport(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQtty</function><indexterm><primary>PQtty</primary></indexterm></term>
<listitem>
<para>
Renvoie le <acronym>TTY</acronym> de débogage pour la connexion
(ceci est obsolète car le serveur ne fait plus attention au
paramétrage du <acronym>TTY</acronym> mais les fonctions restent pour
des raisons de compatibilité ascendante).
<synopsis>char *PQtty(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQoptions</function><indexterm><primary>PQoptions</primary></indexterm></term>
<listitem>
<para>
Renvoie les options en ligne de commande passées lors de la demande de
connexion.
<synopsis>char *PQoptions(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Les fonctions suivantes renvoient le statut car il peut changer suite à
l'exécution d'opérations sur l'objet <structname>PGconn</structname>.
<variablelist>
<varlistentry>
<term><function>PQstatus</function><indexterm><primary>PQstatus</primary></indexterm></term>
<listitem>
<para>
Renvoie l'état de la connexion.
<synopsis>ConnStatusType PQstatus(const PGconn *conn);
</synopsis>
</para>
<para>
Le statut peut faire partie d'un certain nombre de valeurs. Néanmoins,
seules deux ne concernent pas les procédures de connexion
asynchrone : <literal>CONNECTION_OK</literal> et
<literal>CONNECTION_BAD</literal>. Une bonne connexion de la base de
données a l'état <literal>CONNECTION_OK</literal>. Une tentative échouée
de connexion est signalée par le statut
<literal>CONNECTION_BAD</literal>. D'habitude, un état OK restera ainsi
jusqu'à <function>PQfinish</function> mais un échec de communications
pourrait résulter en un statut changeant prématurément
<literal>CONNECTION_BAD</literal>. Dans ce cas, l'application pourrait
essayer de récupérer en appelant <function>PQreset</function>.
</para>
<para>
Voir l'entrée de <function>PQconnectStart</function> et de
<function>PQconnectPoll</function> en regard aux autres codes de statut, qui
pourraient être vus.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQtransactionStatus</function><indexterm><primary>PQtransactionStatus</primary></indexterm></term>
<listitem>
<para>
Renvoie l'état actuel de la transaction du serveur.
<synopsis>PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
</synopsis>
Le statut peut être <literal>PQTRANS_IDLE</literal> (actuellement inactif),
<literal>PQTRANS_ACTIVE</literal> (une commande est en cours),
<literal>PQTRANS_INTRANS</literal> (inactif, dans un bloc valide de
transaction) ou <literal>PQTRANS_INERROR</literal> (inactif, dans un bloc de
transaction échoué). <literal>PQTRANS_UNKNOWN</literal> est reporté si la
connexion est mauvaise. <literal>PQTRANS_ACTIVE</literal> est reporté seulement
quand une requête a été envoyée au serveur mais qu'elle n'est pas terminée.
</para>
<caution>
<para>
<function>PQtransactionStatus</function> donnera des résultats incorrects lors de
l'utilisation d'un serveur <productname>PostgreSQL</productname> 7.3 qui a désactivé le
paramètre <literal>autocommit</literal>. La fonctionnalité autocommit, côté serveur,
est obsolète et n'existe pas dans les versions serveur ultérieures.
</para>
</caution>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQparameterStatus</function><indexterm><primary>PQparameterStatus</primary></indexterm></term>
<listitem>
<para>
Recherche un paramétrage actuel du serveur.
<synopsis>const char *PQparameterStatus(const PGconn *conn, const char *paramName);
</synopsis>
Certaines valeurs de paramètres sont reportées par le serveur automatiquement ou
lorsque leur valeurs changent. <function>PQparameterStatus</function> peut être utilisé
pour interroger ces paramétrages. Il renvoie la valeur actuelle d'un
paramètre s'il est connu et <symbol>NULL</symbol> si le paramètre est inconnu.
</para>
<para>
Les paramètres reportés pour la version actuelle incluent
<literal>server_version</literal>,
<literal>server_encoding</literal>,
<literal>client_encoding</literal>,
<literal>is_superuser</literal>,
<literal>session_authorization</literal>,
<literal>datestyle</literal>,
<literal>TimeZone</literal>,
<literal>integer_datetimes</literal> et
<literal>standard_conforming_strings</literal>.
(<literal>server_encoding</literal>, <literal>TimeZone</literal> et
<literal>integer_datetimes</literal> n'étaient pas rapportés dans les versions
antérieures à la 8.0 ;
<literal>standard_conforming_strings</literal> n'était pas rapporté dans les versions
antérieures à la 8.1).
Notez que
<literal>server_version</literal>,
<literal>server_encoding</literal> et
<literal>integer_datetimes</literal>
ne peuvent pas changer après le lancement du
serveur.
</para>
<para>
Les serveurs utilisant un protocole antérieur à la 3.0 ne reportent pas la
configuration des paramètres mais <application>libpq</application> inclut la logique pour
obtenir des valeurs pour <literal>server_version</literal> et
<literal>client_encoding</literal>. Les applications sont encouragées à utiliser
<function>PQparameterStatus</function> plutôt qu'un code
<foreignphrase>ad-hoc</foreignphrase> modifiant ces valeurs
(néanmoins, attention, les connexions pré-3.0, changeant
<literal>client_encoding</literal> via <command>SET</command> après le lancement de la
connexion, ne seront pas reflétées par <function>PQparameterStatus</function>). Pour
<literal>server_version</literal>, voir aussi <function>PQserverVersion</function>, qui renvoie
l'information dans un format numérique qui est plus facile à comparer.
</para>
<para>
Si aucune valeur n'est indiquée pour <literal>standard_conforming_strings</literal>,
les applications pourraient supposer qu'elle vaut <literal>off</literal>,
c'est-à-dire que les antislashs sont traités comme des échappements dans les
chaînes littérales. De plus, la présence de ce paramètre pourrait être pris
comme une indication que la syntaxe d'échappement d'une chaîne
(<literal>E'...'</literal>) est acceptée.
</para>
<para>
Bien que le pointeur renvoyé est déclaré <literal>const</literal>, il pointe en fait
vers un stockage mutable associé avec la structure <literal>PGconn</literal>. Il est
déconseillé de supposer que le pointeur restera valide pour toutes les
requêtes.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQprotocolVersion</function><indexterm><primary>PQprotocolVersion</primary></indexterm></term>
<listitem>
<para>
Interroge le protocole interface/moteur lors de son utilisation.
<synopsis>int PQprotocolVersion(const PGconn *conn);
</synopsis>
Les applications souhaitent utiliser ceci pour déterminer si certaines
fonctionnalités sont supportées. Actuellement, les seules valeurs possible sont
2 (protocole 2.0), 3 (protocole 3.0) ou zéro (mauvaise connexion). Ceci ne
changera pas après la fin du lancement de la connexion mais cela pourrait être
changé théoriquement avec une réinitialisation de la connexion. Le protocole
3.0 sera normalement utilisé lors de la communication avec les serveurs
<productname>PostgreSQL</productname> 7.4 ou ultérieures ; les serveurs
antérieurs à la 7.4 supportent uniquement le protocole 2.0 (le protocole 1.0
est obsolète et non supporté par <application>libpq</application>).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQserverVersion</function><indexterm><primary>PQserverVersion</primary></indexterm></term>
<listitem>
<para>
Renvoie un entier représentant la version du moteur.
<synopsis>int PQserverVersion(const PGconn *conn);</synopsis>
Les applications pourraient utiliser ceci pour déterminer la version du
serveur de la base de données auquel ils sont connectés. Le numéro est formé
en convertissant les nombres majeur, mineur et de révision en un nombre à
deux chiffres décimaux et en leur assemblant. Par exemple, la version 8.1.5
sera renvoyée en tant que 80105 et la version 8.2 sera renvoyée en tant que
80200 (les zéros au début ne sont pas affichés). Zéro est renvoyée si la
connexion est mauvaise.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQerrorMessage</function><indexterm><primary>PQerrorMessage</primary></indexterm></term>
<listitem>
<para>
<indexterm><primary>error message</primary></indexterm>
Renvoie le dernier message d'erreur généré par une opération sur la
connexion.