-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlibpq.sgml
4870 lines (4408 loc) · 175 KB
/
libpq.sgml
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
<!--
$PostgreSQL: pgsql/doc/src/sgml/libpq.sgml,v 1.178 2005/01/14 00:23:21 momjian Exp $
-->
<chapter id="libpq">
<title>libpq - Biblioteca C</title>
<indexterm zone="libpq">
<primary>libpq</primary>
</indexterm>
<indexterm zone="libpq">
<primary>C</primary>
</indexterm>
<para>
A <application>libpq</application> é a interface do programador de aplicativo
<acronym>C</acronym> com o <productname>PostgreSQL</>.
A <application>libpq</> é um conjunto de funções de biblioteca que permitem
os programas clientes passar comandos para o servidor
<productname>PostgreSQL</productname>, e receber os resultados destes
comandos.
</para>
<para>
A <application>libpq</> também é o mecanismo subjacente de várias outras
interfaces de aplicativo do <productname>PostgreSQL</>, incluindo as escritas
para C++, Perl, Python, Tcl e <application>ECPG</>.
Portanto, alguns aspectos do comportamento da <application>libpq</> são
importantes para aqueles que utilizam um destes pacotes. Em particular,
a <xref linkend="libpq-envars">,
a <xref linkend="libpq-pgpass"> e
a <xref linkend="libpq-ssl">
descrevem o comportamento visível aos usuários de qualquer aplicativo que
utiliza a <application>libpq</>.
</para>
<para>
No final deste capítulo são incluídos alguns programas curtos
(<xref linkend="libpq-example">) para mostrar como se escreve programas que
utilizam a <application>libpq</application>. Também existem vários exemplos
completos de aplicativos <application>libpq</application> no diretório
<filename>src/test/examples</filename> da distribuição do código fonte.
</para>
<para>
Os programas cliente que utilizam a <application>libpq</application> devem
incluir o arquivo de cabeçalho <filename>libpq-fe.h</filename>,
<indexterm><primary>libpq-fe.h</></>
e devem ligar com a biblioteca <application>libpq</application>.
</para>
<sect1 id="libpq-connect">
<title>Funções de controle da conexão com o banco de dados</title>
<para>
As funções a seguir lidam com o estabelecimento da conexão com o servidor
<productname>PostgreSQL</productname>. Um programa aplicativo pode manter
várias conexões abertas ao mesmo tempo (um motivo para isso ser feito é
o acesso a mais de um banco de dados). Cada conexão é representada por um
objeto <structname>PGconn</structname>,
<indexterm><primary>PGconn</primary></indexterm>
obtido a partir da função <function>PQconnectdb</function> ou
<function>PQsetdbLogin</>. Deve ser observado que estas funções sempre
retornam um ponteiro de objeto não nulo, a menos que não haja memória
suficiente para alocar o objeto <structname>PGconn</structname>.
Antes de enviar comandos pelo objeto de conexão, deve ser chamada a função
<function>PQstatus</> para verificar se a conexão foi bem-sucedida.
<variablelist>
<varlistentry>
<term><function>PQconnectdb</function><indexterm><primary>PQconnectdb</></></term>
<listitem>
<para>
Estabelece uma nova conexão com o servidor de banco de dados.
<synopsis>
PGconn *PQconnectdb(const char *conninfo);
</synopsis>
</para>
<para>
Esta função abre uma nova conexão com o servidor de banco de dados utilizando
os parâmetros presentes da cadeia de caracteres <literal>conninfo</literal>.
Diferentemente de <function>PQsetdbLogin</> mostrada abaixo, o conjunto de
parâmetros pode ser estendido sem mudar a assinatura da função, portanto
deve-se dar preferência na programação de novos aplicativos ao uso desta
função (ou de suas análogas não bloqueantes <function>PQconnectStart</> e
<function>PQconnectPoll</function>).
</para>
<para>
A cadeia de caracteres passada pode estar vazia, caso em que será utilizado o
valor padrão de todos os parâmetros, ou pode conter a definição de um ou mais
parâmetros separados por espaço em branco.
Cada definição de parâmetro tem a forma <literal>palavra_chave = valor</>.
Os espaços em torno do sinal de igual são opcionais.
Para escrever um valor vazio, ou um valor contendo espaços, o valor deve ser
colocado entre apóstrofos como, por exemplo,
<literal>palavra_chave = 'um valor'</literal>.
Apóstrofos e contra-barras dentro do valor devem receber escape de
contra-barra, ou seja, <literal>\'</literal> e <literal>\\</literal>.
</para>
<para>
As palavras chave de parâmetro reconhecidas no momento são:
<variablelist>
<varlistentry>
<term><literal>host</literal></term>
<listitem>
<para>
Nome do hospedeiro para se conectar.
<indexterm><primary>nome do hospedeiro</primary></>
Se o nome começar por uma barra, especifica a comunicação com um
domínio-Unix, em vez de uma comunicação TCP/IP; neste caso, valor é o
nome do diretório onde o arquivo de soquete será armazenado.
O comportamento padrão quando não se especifica o parâmetro
<literal>host</literal> é conectar a um soquete do domínio-Unix
<indexterm><primary>soquete do domínio Unix</></>
no diretório <filename>/tmp</filename> (ou qualquer que tenha sido o
diretório de soquete especificado quando o <productname>PostgreSQL</> foi
construído).
Nas máquinas sem soquete de domínio-Unix, o padrão é conectar ao
<literal>localhost</>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>hostaddr</literal></term>
<listitem>
<para>
Endereço numérico de IP do hospedeiro a ser feita a conexão.
Deve estar no formato padrão de endereço IPv4 como, por exemplo,
<literal>172.28.40.9</>.
Havendo suporte a IPv6 na máquina, então estes endereços também podem ser
utilizados.
Quando se especifica para este parâmetro uma cadeia de caracteres não
vazia, é sempre utilizada uma comunicação TCP/IP.
</para>
<para>
A utilização de <literal>hostaddr</> em vez de <literal>host</> permite
o aplicativo evitar a procura do hospedeiro pelo nome, que pode ser
importante nos aplicativos com restrição de tempo.
Entretanto, a autenticação Kerberos requer o nome do hospedeiro.
Portanto, o que vem a seguir se aplica:
Quando se especifica <literal>host</> e não se especifica
<literal>hostaddr</>, ocorre a procura do hospedeiro pelo nome.
Quando se especifica <literal>hostaddr</> e não se especifica
<literal>host</>, o valor de <literal>hostaddr</> fornece o endereço
remoto.
Quando se utiliza o Kerberos, ocorre uma procura pelo nome reversa, para
obter o nome do hospedeiro para o Kerberos.
Quando se especifica tanto <literal>host</> quanto <literal>hostaddr</>,
o valor de <literal>hostaddr</> fornece o endereço remoto; o valor de
<literal>host</> é ignorado, a menos que se utilize o Kerberos, quando o
valor é utilizado para autenticação pelo Kerberos (Deve ser observado que
a autenticação não deverá ser bem-sucedida se for passado para a
<application>libpq</application> um nome de hospedeiro que não corresponde
ao nome da máquina em <literal>hostaddr</>).
Além disso, é utilizado <literal>host</> para identificar a conexão,
em vez de <literal>hostaddr</>, no arquivo <filename>~/.pgpass</>
(consulte a <xref linkend="libpq-pgpass">).
</para>
<para>
Se não for especificado o nome do hospedeiro, nem o endereço do
hospedeiro, a <application>libpq</application> faz a conexão usando um
soquete do domínio-Unix local; nas máquinas sem soquetes do domínio-Unix
é feita uma tentativa de conexão com <literal>localhost</>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>port</literal></term>
<listitem>
<para>
Número da porta para se conectar no hospedeiro servidor, ou a extensão do
nome do arquivo de soquete para as conexões com o domínio-Unix.
<indexterm><primary>porta</></>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>dbname</literal></term>
<listitem>
<para>
O nome do banco de dados. Por padrão o mesmo nome do usuário.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>user</literal></term>
<listitem>
<para>
O nome do usuário do <productname>PostgreSQL</> para se conectar.
Por padrão o mesmo nome do usuário do sistema operacional que está
executando o aplicativo.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>password</literal></term>
<listitem>
<para>
A senha a ser utilizada se o servidor requerer autenticação por senha.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>connect_timeout</literal></term>
<listitem>
<para>
Tempo máximo para aguardar pela conexão, em segundos (escrito como uma
cadeia de caracteres contendo um número inteiro decimal). Zero, ou não
especificado, significa aguardar indefinidamente. Não se recomenda
utilizar um tempo limite inferior a 2 segundos.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>options</literal></term>
<listitem>
<para>
Opções de linha de comando a serem passadas para o servidor.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>tty</literal></term>
<listitem>
<para>
Ignorado (no passado especificava para onde enviar a saída de depuração
do servidor).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>sslmode</literal></term>
<listitem>
<para>
Esta opção determina se, ou com que prioridade, será negociada uma
conexão <acronym>SSL</> com o servidor.
Existem quatro modos:
<literal>disable</> (desabilitado) tenta apenas uma conexão
<acronym>SSL</> não criptografada;
<literal>allow</> (permitido) negocia, tentando primeiro uma conexão
não-<acronym>SSL</>, depois, se não for bem-sucedido, tenta uma conexão
<acronym>SSL</>;
<literal>prefer</> (preferido) (o padrão) negocia, tentando primeiro uma
conexão <acronym>SSL</>, depois, se não for bem-sucedido, tenta uma
conexão não <acronym>SSL</> regular;
<literal>require</> (requerido) tenta apenas uma conexão <acronym>SSL</>.
</para>
<para>
Quando o <productname>PostgreSQL</> é compilado sem suporte a SSL a
utilização da opção <literal>require</> causa um erro, enquanto as
opções <literal>allow</> e <literal>prefer</> serão aceitas, mas a
<application>libpq</> não vai tentar de fato uma conexão
<acronym>SSL</>.
<indexterm><primary>SSL</><secondary sortas="libpq">com libpq</></indexterm>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>requiressl</literal></term>
<listitem>
<para>
Esta opção está em obsolescência em favor da definição de
<literal>sslmode</>.
</para>
<para>
Se for definido como 1, é requerida uma conexão <acronym>SSL</acronym>
com o servidor (equivale ao modo <literal>require</> de
<literal>sslmode</>). A <application>libpq</> recusa se conectar se o
servidor não aceitar uma conexão <acronym>SSL</acronym>. Se for definido
como 0 (o padrão), a <application>libpq</> negocia o tipo de conexão com
o servidor (equivale ao modo <literal>prefer</> de <literal>sslmode</>).
O <productname>PostgreSQL</> é compilado com suporte a SSL.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>service</literal></term>
<listitem>
<para>
Nome do serviço
<footnote>
<para>
serviço — arquivo de configuração de conexão —
Um serviço é um conjunto de parâmetros de conexão com nome.
Podem ser especificados vários serviços no arquivo.
Cada serviço começa pelo nome do serviço entre colchetes.
As linhas seguintes contêm parâmetros de configuração de conexão com a
forma "parâmetro=valor". As linhas que começam por '#' são comentários.
(N. do T.)
</para>
</footnote>
a ser utilizado para obter parâmetros adicionais.
Especifica um nome de serviço no arquivo <filename>pg_service.conf</>,
que reúne parâmetros de conexão adicionais.
Permite que os aplicativos especifiquem somente o nome do serviço, para que
a manutenção dos parâmetros de conexão seja feita de forma centralizada.
Para obter informações sobre como configurar este arquivo deve ser visto o
arquivo <filename>share/pg_service.conf.sample</> no diretório de
instalação.
</para>
</listitem>
</varlistentry>
</variablelist>
Se algum dos parâmetros não for especificado, então será verificada a
variável de ambiente correspondente (consulte a <xref linkend="libpq-envars">).
Se a variável de ambiente também não estiver especificada, então são
utilizados os padrões nativos.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQsetdbLogin</function><indexterm><primary>PQsetdbLogin</></></term>
<listitem>
<para>
Estabelece uma nova conexão com o servidor de banco de dados.
<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>
É a função antecessora de <function>PQconnectdb</function> com um número
fixo de parâmetros. Possui a mesma funcionalidade, exceto que os parâmetros
que faltam sempre recebem os valores padrão. Deve ser escrito
<symbol>NULL</symbol>, ou uma cadeia de caracteres vazia, em qualquer um
dos parâmetros fixos que vai receber o valor padrão.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQsetdb</function><indexterm><primary>PQsetdb</></></term>
<listitem>
<para>
Estabelece uma nova conexão com o servidor de banco de dados.
<synopsis>
PGconn *PQsetdb(char *pghost,
char *pgport,
char *pgoptions,
char *pgtty,
char *dbName);
</synopsis>
</para>
<para>
Esta é uma macro que chama <function>PQsetdbLogin</function> com ponteiros
nulos para os parâmetros <parameter>login</> e <parameter>pwd</>.
É fornecida para manter a compatibilidade com programas muito antigos.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQconnectStart</function><indexterm><primary>PQconnectStart</></></term>
<term><function>PQconnectPoll</function><indexterm><primary>PQconnectPoll</></></term>
<listitem>
<para>
<indexterm><primary>conexão não-bloqueante</primary></indexterm>
Estabelece uma conexão com o servidor de banco de dados de uma forma
não-bloqueante.
<synopsis>
PGconn *PQconnectStart(const char *conninfo);
</synopsis>
<synopsis>
PostgresPollingStatusType PQconnectPoll(PGconn *conn);
</synopsis>
</para>
<para>
Estas duas funções são utilizadas para abrir uma conexão com o servidor de
banco de dados, de uma maneira que o fluxo de execução do aplicativo não
fica bloqueado devido a E/S remota enquanto esta operação é realizada.
O ponto central desta abordagem é que o aguardo pelo término da operação de
E/S pode ocorrer dentro do laço principal do aplicativo, em vez de dentro
da função <function>PQconnectdb</>, de forma que o aplicativo possa
gerenciar esta operação em paralelo com outras atividades.
</para>
<para>
A conexão com o banco de dados é feita utilizando os parâmetros encontrados
na cadeia de caracteres <literal>conninfo</literal>, passada para a função
<function>PQconnectStart</function>. Esta cadeia de caracteres possui o mesmo
formato descrito acima para <function>PQconnectdb</function>.
</para>
<para>
Nem <function>PQconnectStart</> nem <function>PQconnectPoll</> bloqueiam,
desde que certas condições sejam respeitadas:
<itemizedlist>
<listitem>
<para>
Utilização dos parâmetros <literal>hostaddr</> e <literal>host</> de uma
forma apropriada para garantir que não sejam realizadas procura pelo nome,
nem procura pelo nome reversa. Para obter detalhes deve-se ver a
documentação destes parâmetros sob <function>PQconnectdb</function> acima.
</para>
</listitem>
<listitem>
<para>
Se for chamada a função <function>PQtrace</function>, deve-se garantir
que o objeto de fluxo, para onde é feita a depuração, não bloqueie.
</para>
</listitem>
<listitem>
<para>
Deve-se garantir que o soquete está no status apropriado antes de chamar
a função <function>PQconnectPoll</function>, conforme descrito abaixo.
</para>
</listitem>
</itemizedlist>
</para>
<para>
Para iniciar uma solicitação de conexão não bloqueante, deve-se executar
<literal>conn = PQconnectStart("<replaceable>connection_info_string</>")</>.
Se <varname>conn</varname> for nulo, então a <application>libpq</> não foi
capaz de alocar uma nova estrutura <structname>PGconn</>.
Senão é retornado um ponteiro para <structname>PGconn</> válido (embora ainda
não represente uma conexão válida com o banco de dados). Após retornar da
função <function>PQconnectStart</function>, deve-se executar
<literal>status = PQstatus(conn)</literal>. Se <varname>status</varname> for
igual a <symbol>CONNECTION_BAD</symbol>, então a função
<function>PQconnectStart</> não foi bem-sucedida.
</para>
<para>
Se a função <function>PQconnectStart</> for bem-sucedida, o próximo estágio
é uma verificação cíclica da <application>libpq</> para prosseguir com a
seqüência de conexão.
Deve ser utilizada a função <function>PQsocket(conn)</function> para obter o
descritor do soquete subjacente à conexão com o banco de dados.
Ciclo: Se a função <function>PQconnectPoll(conn)</function> retornar
<symbol>PGRES_POLLING_READING</symbol>, aguardar até o soquete ficar pronto
para ser lido (conforme indicado por <function>select()</>,
<function>poll()</>, ou uma função do sistema semelhante).
Em seguida chamar <function>PQconnectPoll(conn)</function> novamente.
Caso contrário, se <function>PQconnectPoll(conn)</function> retornar
<symbol>PGRES_POLLING_WRITING</symbol>, aguardar até o soquete ficar pronto
para escrita, em seguida chamar <function>PQconnectPoll(conn)</function>
novamente.
Caso ainda seja necessário chamar <function>PQconnectPoll</function>, isto é,
logo após chamar <function>PQconnectStart</function>, o comportamento deve
ser o mesmo como se esta função tivesse retornado da última vez
<symbol>PGRES_POLLING_WRITING</symbol>.
Este ciclo deve continuar até que <function>PQconnectPoll(conn)</function>
retorne <symbol>PGRES_POLLING_FAILED</symbol>, indicando que o procedimento
de conexão falhou, ou <symbol>PGRES_POLLING_OK</symbol>, indicando que a
conexão foi bem sucedida.
</para>
<para>
O status da conexão pode ser verificado a qualquer momento chamando
<function>PQstatus</>. Se retornar <symbol>CONNECTION_BAD</>, então o
procedimento de conexão falhou; se retornar <function>CONNECTION_OK</>,
então a conexão está pronta. Estes dois status podem ser detectados
igualmente a partir do valor retornado por <function>PQconnectPoll</>,
descrita acima. Também podem ocorrer outros status durante (e apenas
durante) o procedimento de conexão assíncrona. Estes status indicam o
estágio corrente do procedimento de conexão, podendo ser útil para fornecer
informações para o usuário, por exemplo. Estes status são:
<variablelist>
<varlistentry>
<term><symbol>CONNECTION_STARTED</symbol></term>
<listitem>
<para>
Aguardando a conexão ser estabelecida.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_MADE</symbol></term>
<listitem>
<para>
Conexão OK; aguardando para enviar.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_AWAITING_RESPONSE</symbol></term>
<listitem>
<para>
Aguardando resposta do servidor.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_AUTH_OK</symbol></term>
<listitem>
<para>
Autenticação recebida; aguardando a inicialização do servidor terminar.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_SSL_STARTUP</symbol></term>
<listitem>
<para>
Negociando criptografia SSL.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><symbol>CONNECTION_SETENV</symbol></term>
<listitem>
<para>
Negociando definições de parâmetro dirigida pelo ambiente.
</para>
</listitem>
</varlistentry>
</variablelist>
Deve ser observado que embora estas constantes continuarão existindo
(para manter a compatibilidade), um aplicativo nunca deve depender de suas
ocorrências em uma determinada ordem, ou mesmo que aconteçam, ou que o
status sempre seja um destes valores documentados. O aplicativo deve
proceder de forma parecida com a mostrada abaixo:
<programlisting>
switch(PQstatus(conn))
{
case CONNECTION_STARTED:
status = "Conectando...";
break;
case CONNECTION_MADE:
status = "Conectado ao servidor...";
break;
.
.
.
default:
status = "Conectando...";
}
</programlisting>
</para>
<para>
O parâmetro de conexão <literal>connect_timeout</literal> é ignorado quando
se utiliza <function>PQconnectPoll</function>; o aplicativo é responsável por
decidir quando decorreu uma quantidade excessiva de tempo.
Caso contrário, a função <function>PQconnectStart</function> seguida por
<function>PQconnectPoll</function> seria equivalente à função
<function>PQconnectdb</function>.
</para>
<para>
Deve ser observado que quando a função <function>PQconnectStart</function>
retorna um ponteiro não nulo, deve-se chamar a função
<function>PQfinish</function> ao se terminar de utilizá-la, para que seja
liberada a estrutura e todos os blocos de memória associados. Isto deve ser
feito mesmo que a tentativa de conexão falhe ou seja abandonada.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQconndefaults</function><indexterm><primary>PQconndefaults</></></term>
<listitem>
<para>
Retorna as opções de conexão padrão.
<synopsis>
PQconninfoOption *PQconndefaults(void);
typedef struct
{
char *keyword; /* A palavra chave da opção */
char *envvar; /* O nome da variável de ambiente alternativa de falha */
char *compiled; /* O nome do valor padrão compilado alternativo de falha */
char *val; /* Valor corrente da opção, ou NULL */
char *label; /* Rótulo para o campo no diálogo de conexão */
char *dispchar; /* Caractere a ser mostrado para este campo
no diálogo de conexão. Os valores são:
"" Mostrar o valor entrado como ele é
"*" Campo de senha - esconder o valor
"D" Opção de depuração - não mostrar por padrão */
int dispsize; /* Tamanho do campo em caracteres para o diálogo */
} PQconninfoOption;
</synopsis>
</para>
<para>
Retorna uma matriz de opções de conexão. Pode ser utilizado para determinar
todas as opções possíveis de <function>PQconnectdb</function> e seus valores
padrão corrente. O valor retornado aponta para uma matriz de estruturas
<structname>PQconninfoOption</structname>, que termina por uma entrada
possuindo um ponteiro nulo para <structfield>keyword</>. Deve ser observado
que os valores padrão corrente (campos <structfield>val</structfield>)
dependem das variáveis de ambiente e outro contexto. A chamada deve tratar
os dados das opções de conexão como somente para leitura.
</para>
<para>
Após a matriz de opções ser processada, esta deve ser liberada passando-a
para <function>PQconninfoFree</function>. Caso não seja feito, haverá um
pequeno vazamento de memória (<literal>memory leak</literal>) em cada
chamada à função <function>PQconndefaults</function>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQfinish</function><indexterm><primary>PQfinish</></></term>
<listitem>
<para>
Fecha a conexão com o servidor. Também libera a memória utilizada pelo
objeto <structname>PGconn</structname>.
<synopsis>
void PQfinish(PGconn *conn);
</synopsis>
</para>
<para>
Deve ser observado que mesmo quando a tentativa de conexão com o servidor
falha (conforme indicado por <function>PQstatus</function>), o aplicativo
deve chamar a função <function>PQfinish</function> para liberar a memória
utilizada pelo objeto <structname>PGconn</structname>. O ponteiro para
<structname>PGconn</> não deve ser utilizado novamente após a função
<function>PQfinish</function> ter sido chamada.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQreset</function><indexterm><primary>PQreset</></></term>
<listitem>
<para>
Reinicia o canal de comunicação com o servidor.
<synopsis>
void PQreset(PGconn *conn);
</synopsis>
</para>
<para>
Esta função fecha a conexão com o servidor e tenta restabelecer uma nova
conexão com o mesmo servidor, usando exatamente os mesmos parâmetros
utilizados anteriormente. Pode ser útil para recuperação de erro quando a
conexão de trabalho é perdida.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQresetStart</function><indexterm><primary>PQresetStart</></></term>
<term><function>PQresetPoll</function><indexterm><primary>PQresetPoll</></></term>
<listitem>
<para>
Reinicia o canal de comunicação com o servidor, de uma maneira não
bloqueante.
<synopsis>
int PQresetStart(PGconn *conn);
</synopsis>
<synopsis>
PostgresPollingStatusType PQresetPoll(PGconn *conn);
</synopsis>
</para>
<para>
Estas funções fecham a conexão com o servidor e tentam restabelecer uma nova
conexão com o mesmo servidor, usando exatamente os mesmos parâmetros
utilizados anteriormente. Pode ser útil para recuperação de erro quando a
conexão de trabalho é perdida. Diferem da função <function>PQreset</>
(acima) por atuarem de uma maneira não bloqueante. Estas funções sofrem as
mesmas restrições das funções <function>PQconnectStart</> e
<function>PQconnectPoll</>.
</para>
<para>
Para começar o reinício de conexão deve ser chamada a função
<function>PQresetStart</function>. Se retornar 0, o reinício falhou. Se
retornar 1 verificar ciclicamente o reinício utilizando a função
<function>PQresetPoll</function> exatamente da mesma maneira como seria
criada a conexão utilizando <function>PQconnectPoll</function>.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect1>
<sect1 id="libpq-status">
<title>Funções de status da conexão</title>
<para>
Estas funções podem ser utilizadas para indagar o status de um
objeto de conexão com banco de dados existente.
</para>
<tip>
<para>
<indexterm><primary>libpq-fe.h</></>
<indexterm><primary>libpq-int.h</></>
Os programadores de aplicativos <application>libpq</application> devem tomar o
cuidado de manter a abstração da <structname>PGconn</structname>.
Devem ser utilizadas as funções de acesso descritas abaixo para obter o
conteúdo de <structname>PGconn</structname>.
Deve-se evitar a referência direta aos campos da estrutura
<structname>PGconn</structname>, porque estão sujeitos a mudanças futuras
(A partir da versão 6.4 do <productname>PostgreSQL</productname>, a definição
da <type>struct</type> por trás de <structname>PGconn</> não é fornecida nem
mesmo em <filename>libpq-fe.h</filename>.
Caso exista um código antigo acessando diretamente os campos de
<structname>PGconn</structname>, pode-se continuar usando esta forma
incluindo também <filename>libpq-int.h</filename>, mas encoraja-se que o código
seja corrigido em breve).
</para>
</tip>
<para>
As funções abaixo retornam valores dos parâmetros estabelecidos durante a
conexão. Estes valores são fixos durante a vida do objeto
<structname>PGconn</structname>.
<variablelist>
<varlistentry>
<term><function>PQdb</function><indexterm><primary>PQdb</></></term>
<listitem>
<para>
Retorna o nome do banco de dados da conexão.
<synopsis>
char *PQdb(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQuser</function><indexterm><primary>PQuser</></></term>
<listitem>
<para>
Retorna o nome do usuário da conexão.
<synopsis>
char *PQuser(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQpass</function><indexterm><primary>PQpass</></></term>
<listitem>
<para>
Retorna a senha da conexão.
<synopsis>
char *PQpass(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQhost</function><indexterm><primary>PQhost</></></term>
<listitem>
<para>
Retorna o nome do hospedeiro servidor da conexão.
<synopsis>
char *PQhost(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQport</function><indexterm><primary>PQport</></></term>
<listitem>
<para>
Retorna a porta da conexão.
<synopsis>
char *PQport(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQtty</function><indexterm><primary>PQtty</></></term>
<listitem>
<para>
Retorna o <acronym>TTY</acronym> de depuração da conexão
(Está obsoleto, uma vez que o servidor não presta mais atenção
na definição de <acronym>TTY</acronym>, mas a função permanece
para manter a compatibilidade com as versões anteriores).
<synopsis>
char *PQtty(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQoptions</function><indexterm><primary>PQoptions</></></term>
<listitem>
<para>
Retorna as opções de linha de comando passadas no pedido de conexão.
<synopsis>
char *PQoptions(const PGconn *conn);
</synopsis>
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
As funções abaixo retornam informações de status que podem mudar devido a
operações executadas no objeto <structname>PGconn</structname>.
<variablelist>
<varlistentry>
<term><function>PQstatus</function><indexterm><primary>PQstatus</></></term>
<listitem>
<para>
Retorna o status da conexão.
<synopsis>
ConnStatusType PQstatus(const PGconn *conn);
</synopsis>
</para>
<para>
O status pode ser um entre um conjunto de valores.
Entretanto, somente dois destes valores são vistos fora de um
procedimento de conexão assíncrono:
<literal>CONNECTION_OK</literal> e <literal>CONNECTION_BAD</literal>.
Uma conexão bem-sucedida com o banco de dados possui o status
<literal>CONNECTION_OK</literal>.
Uma tentativa de conexão com o banco de dados mal-sucedida possui o
status <literal>CONNECTION_BAD</literal>.
Normalmente, um status OK permanece assim até
<function>PQfinish</function>, mas uma falha na conexão pode resultar
em uma mudança prematura para o status <literal>CONNECTION_BAD</literal>.
Neste caso, o aplicativo pode tentar a recuperação chamando
<function>PQreset</function>.
</para>
<para>
Com relação aos outros códigos de status que podem ser encontrados, devem
ser vistas as descrições de <function>PQconnectStart</> e
<function>PQconnectPoll</>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQtransactionStatus</function><indexterm><primary>PQtransactionStatus</></></term>
<listitem>
<para>
Retorna o status corrente da transação no servidor.
<synopsis>
PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
</synopsis>
O status pode ser <literal>PQTRANS_IDLE</literal> (ocioso no momento),
<literal>PQTRANS_ACTIVE</literal> (o comando está sendo executado),
<literal>PQTRANS_INTRANS</literal> (ocioso, em um bloco de transação válido),
ou <literal>PQTRANS_INERROR</literal> (ocioso, em um bloco de transação que
falhou).
Se a conexão estiver ruim é relatado <literal>PQTRANS_UNKNOWN</literal>.
Somente é relatado <literal>PQTRANS_ACTIVE</literal> quando tiver sido enviado
para o servidor um comando que ainda não está completo.
</para>
<caution>
<para>
A função <function>PQtransactionStatus</> retorna resultados incorretos quando
é utilizada em um servidor <productname>PostgreSQL</productname> 7.3 com o
parâmetro <literal>autocommit</> definido como desabilitado.
A funcionalidade de auto-efetivação do lado servidor entrou em obsolescência,
não existindo mais em versões posteriores do servidor.
</para>
</caution>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQparameterStatus</function><indexterm><primary>PQparameterStatus</></></term>
<listitem>
<para>
Procura a definição corrente do parâmetro no servidor.
<synopsis>
const char *PQparameterStatus(const PGconn *conn, const char *paramName);
</synopsis>
Certos valores de parâmetros são relatados pelo servidor automaticamente no
início da conexão, ou sempre que seus valores mudam.
A função <function>PQparameterStatus</> pode ser utilizada para indagar
estas definições.
Retorna o valor corrente do parâmetro caso este seja conhecido, ou
<symbol>NULL</symbol> se o parâmetro não for conhecido.
</para>
<para>
Os parâmetros relatados na versão corrente incluem
<literal>server_version</>,
<literal>server_encoding</>,
<literal>client_encoding</>,
<literal>is_superuser</>,
<literal>session_authorization</>,
<literal>DateStyle</>,
<literal>TimeZone</> e
<literal>integer_datetimes</>
(<literal>server_encoding</>, <literal>TimeZone</> e
<literal>integer_datetimes</> não eram relatados nas versões anteriores a 8.0).
Deve ser observado que
<literal>server_version</>,
<literal>server_encoding</> e
<literal>integer_datetimes</>
não podem mudar após a inicialização.
</para>
<para>
Os servidores com protocolo pré-3.0 não relatam as definições dos parâmetros,
mas, de qualquer forma, a <application>libpq</> inclui lógica para obter os
valores de <literal>server_version</> e <literal>client_encoding</>.
Encoraja-se que os aplicativos utilizem a função <function>PQparameterStatus</>,
em vez de código <foreignphrase>ad hoc</foreignphrase>
<footnote>
<simpara>
<literal>ad hoc</literal> — para isso, para esse caso.
Novo Dicionário Aurélio da Língua Portuguesa. (N. do T.)
</simpara>
</footnote>
para determinar estes valores (Entretanto, deve-se estar ciente que, em uma
conexão pré-3.0, quando se muda <literal>client_encoding</> através de
<command>SET</> após o início da conexão, isto não é refletido pela função
<function>PQparameterStatus</>). Para <literal>server_version</> deve ser vista
também a função <function>PQserverVersion</>, que retorna a informação de uma
forma numérica muito mais fácil para fazer a comparação.
</para>
<para>
Embora o ponteiro retornado seja declarado como <literal>const</>, na verdade
aponta para um armazenamento mutável associado à estrutura
<literal>PGconn</literal>.
Não é prudente assumir que o ponteiro permaneça válido entre os comandos.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQprotocolVersion</function><indexterm><primary>PQprotocolVersion</></></term>
<listitem>
<para>
Indaga o protocolo cliente/servidor sendo utilizado.
<synopsis>
int PQprotocolVersion(const PGconn *conn);
</synopsis>
Os aplicativos podem fazer uso desta função para determinar se certas
funcionalidades são suportadas.
Atualmente os valores possíveis são 2 (protocolo 2.0), 3 (protocolo 3.0),
ou zero (conexão mal-sucedida). Isto não muda após a conexão ser completada,
mas teoricamente pode mudar durante um reinício de conexão.
Normalmente, é utilizado o protocolo 3.0 ao ser feita a comunicação com
servidores <productname>PostgreSQL</productname> 7.4 ou posteriores;
os servidores pré-7.4 suportam apenas o protocolo 2.0
(O protocolo 1.0 está obsoleto não sendo suportado pela
<application>libpq</application>).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><function>PQserverVersion</function><indexterm><primary>PQserverVersion</></></term>
<listitem>
<para>
Retorna um inteiro representando a versão do servidor.
<synopsis>
int PQserverVersion(const PGconn *conn);
</synopsis>
Os aplicativos podem utilizar esta função para determinar a versão do servidor
de banco de dados ao qual estão conectados. O número é formado convertendo o
número principal, secundário e de revisão (<literal>major</literal>,