libpq.sgml 60.2 KB
Newer Older
T
Thomas G. Lockhart 已提交
1
<Chapter Id="libpq-chapter">
2
<Title id="libpq">libpq</Title>
3 4

<Para>
T
Tom Lane 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

<FileName>libpq</FileName> is the C application programmer's interface to
<ProductName>Postgres</ProductName>.  <FileName>libpq</FileName> is a set
of library routines that allow client programs to pass queries to the
<ProductName>Postgres</ProductName> backend server and to receive the
results of these queries.  <FileName>libpq</FileName> is also the
underlying engine for several other <ProductName>Postgres</ProductName>
application interfaces, including <FileName>libpq++</FileName> (C++),
<FileName>libpgtcl</FileName> (Tcl), <FileName>perl5</FileName>, and
<FileName>ecpg</FileName>.  So some aspects of libpq's behavior will be
important to you if you use one of those packages.

Three short programs are included at the end of this section to show how
to write programs that use <FileName>libpq</FileName>.  There are several
complete examples of <FileName>libpq</FileName> applications in the
following directories:
21 22

<ProgramListing>
T
Thomas G. Lockhart 已提交
23 24 25
    ../src/test/regress
    ../src/test/examples
    ../src/bin/psql
26
</ProgramListing>
27
</Para>
28 29

<Para>
T
Tom Lane 已提交
30 31 32
Frontend programs which use <FileName>libpq</FileName> must include the
header file <FileName>libpq-fe.h</FileName> and must link with the
<FileName>libpq</FileName> library.
33 34 35
</Para>

<Sect1>
T
Tom Lane 已提交
36
<Title>Database Connection Functions</Title>
37 38

<Para>
T
Tom Lane 已提交
39 40 41 42 43 44 45 46 47 48 49
     The following routines deal with making a connection to
     a <ProductName>Postgres</ProductName> backend server.  The application
     program can have several backend connections open at one time.
     (One reason to do that is to access more than one database.)
     Each connection is represented by a PGconn object which is obtained
     from PQconnectdb() or PQsetdbLogin().  NOTE that these functions
     will always return a non-null object pointer, unless perhaps
     there is too little memory even to allocate the PGconn object.
     The  PQstatus function should be called
     to check whether  a  connection  was  successfully made
     before queries are sent via the connection object.
50 51 52
<ItemizedList>
<ListItem>
<Para>
T
Tom Lane 已提交
53 54
<Function>PQsetdbLogin</Function> 
          Makes a new connection to a backend.
T
Thomas G. Lockhart 已提交
55
<synopsis>
T
Tom Lane 已提交
56 57 58 59 60 61 62
PGconn *PQsetdbLogin(const char *pghost,
                const char *pgport,
                const char *pgoptions,
                const char *pgtty,
                const char *dbName,
                const char *login,
                const char *pwd)
T
Thomas G. Lockhart 已提交
63
</synopsis>
T
Tom Lane 已提交
64 65 66 67 68 69
          If  any  argument  is NULL, then the corresponding
          environment variable (see "Environment Variables" section)
          is checked. If the  environment  variable
	  is  also  not  set, then hardwired defaults are used.
          The return value is a pointer to an abstract struct
          representing the connection to the backend.
70 71
</Para>
</ListItem>
T
Tom Lane 已提交
72

73 74
<ListItem>
<Para>
T
Tom Lane 已提交
75 76
<Function>PQsetdb</Function> 
          Makes a new connection to a backend.
T
Thomas G. Lockhart 已提交
77
<synopsis>
T
Tom Lane 已提交
78 79 80 81 82
PGconn *PQsetdb(char *pghost,
                char *pgport,
                char *pgoptions,
                char *pgtty,
                char *dbName)
T
Thomas G. Lockhart 已提交
83
</synopsis>
T
Tom Lane 已提交
84 85 86
          This is a macro that calls PQsetdbLogin() with null pointers
          for the login and pwd parameters.  It is provided primarily
	  for backward compatibility with old programs.
87 88
</Para>
</ListItem>
T
Tom Lane 已提交
89

90 91
<ListItem>
<Para>
T
Tom Lane 已提交
92 93
<Function>PQconnectdb</Function> 
          Makes a new connection to a backend.
T
Thomas G. Lockhart 已提交
94
<synopsis>
T
Tom Lane 已提交
95
PGconn *PQconnectdb(const char *conninfo)
T
Thomas G. Lockhart 已提交
96
</synopsis>
T
Tom Lane 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109
          This routine opens a new database connection using parameters
          taken from a string.  Unlike PQsetdbLogin(), the parameter set
          can be extended without changing the function signature, so use
          of this routine is encouraged for new application
	  programming.  The passed string can be empty to use all default
          parameters, or it can contain one or more parameter settings
          separated by whitespace.  Each parameter setting is in the form
          keyword = value.  (To write a null value or a value containing
          spaces, surround it with single quotes, eg, keyword = 'a value'.
          Single quotes within the value must be written as \'.  Spaces
          around the equal sign are optional.)  The currently recognized
          parameter keywords are:
<ItemizedList>
110 111
<ListItem>
<Para>
T
Tom Lane 已提交
112 113 114
<Acronym>host</Acronym> -- host to connect to.
If a non-zero-length string is specified, TCP/IP communication is used.
Without a host name, libpq will connect using a local Unix domain socket.
115 116 117 118
</Para>
</ListItem>
<ListItem>
<Para>
T
Tom Lane 已提交
119 120
<Acronym>port</Acronym> -- port number to connect to at the server host,
or socket filename extension for Unix-domain connections.
121 122 123 124
</Para>
</ListItem>
<ListItem>
<Para>
T
Tom Lane 已提交
125
<Acronym>dbname</Acronym> -- database name.
126 127
</Para>
</ListItem>
M
 
Marc G. Fournier 已提交
128 129
<ListItem>
<Para>
T
Tom Lane 已提交
130
<Acronym>user</Acronym> -- user name for authentication.
M
 
Marc G. Fournier 已提交
131 132 133 134
</Para>
</ListItem>
<ListItem>
<Para>
T
Tom Lane 已提交
135 136
<Acronym>password</Acronym> -- 
password used if the backend demands password authentication.
M
 
Marc G. Fournier 已提交
137 138 139 140
</Para>
</ListItem>
<ListItem>
<Para>
T
Tom Lane 已提交
141 142 143
<Acronym>authtype</Acronym> -- authorization type.  (No longer used,
since the backend now chooses how to authenticate users.  libpq still
accepts and ignores this keyword for backward compatibility.)
M
 
Marc G. Fournier 已提交
144 145 146 147
</Para>
</ListItem>
<ListItem>
<Para>
T
Tom Lane 已提交
148
<Acronym>options</Acronym> -- trace/debug options to send to backend.
M
 
Marc G. Fournier 已提交
149 150 151 152
</Para>
</ListItem>
<ListItem>
<Para>
153
<Acronym>tty</Acronym> -- file or tty for optional debug output from backend.
M
 
Marc G. Fournier 已提交
154 155 156
</Para>
</ListItem>
</ItemizedList>
T
Tom Lane 已提交
157 158
Like PQsetdbLogin, PQconnectdb uses environment variables or built-in
default values for unspecified options.
T
Thomas G. Lockhart 已提交
159 160 161 162 163 164
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQconndefaults</Function>  
B
Bruce Momjian 已提交
165
         Returns the default connection options.
T
Thomas G. Lockhart 已提交
166
<synopsis>
T
Thomas G. Lockhart 已提交
167 168 169
PQconninfoOption *PQconndefaults(void)

struct PQconninfoOption
170 171 172 173 174 175 176 177 178 179 180 181 182 183
        {
                char   *keyword;   /* The keyword of the option */
                char   *envvar;    /* Fallback environment variable name */
                char   *compiled;  /* Fallback compiled in default value */
                char   *val;       /* Option's value */
                char   *label;     /* Label for field in connect dialog */
                char   *dispchar;  /* Character to display for this field
                                      in a connect dialog. Values are:
                                      ""        Display entered value as is
                                      "*"       Password field - hide value
                                      "D"       Debug options - don't
                                      create a field by default */
                int     dispsize;  /* Field size in characters for dialog */
        };
T
Thomas G. Lockhart 已提交
184

T
Thomas G. Lockhart 已提交
185
</synopsis>
T
Thomas G. Lockhart 已提交
186
	Returns the address of the connection options structure.  This may
T
Tom Lane 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200
	be used to determine all possible PQconnectdb options and their
	current default values.  The return value points to an array of
	PQconninfoOption structs, which ends with an entry having a NULL
	keyword pointer.  Note that the default values ("val" fields)
        will depend on environment variables and other context.
        Callers must treat the connection options data as read-only.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQfinish</Function>
          Close  the  connection to the backend.  Also frees
          memory used by the PGconn object.
T
Thomas G. Lockhart 已提交
201
<synopsis>
T
Tom Lane 已提交
202
void PQfinish(PGconn *conn)
T
Thomas G. Lockhart 已提交
203
</synopsis>
T
Tom Lane 已提交
204 205 206 207 208 209 210 211 212 213 214
Note that even if the backend connection attempt fails (as
indicated by PQstatus), the application should call PQfinish
to free the memory used by the PGconn object.
The PGconn pointer should not be used after PQfinish has been called.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQreset</Function>
          Reset the communication  port  with  the  backend.
T
Thomas G. Lockhart 已提交
215
<synopsis>
T
Tom Lane 已提交
216
void PQreset(PGconn *conn)
T
Thomas G. Lockhart 已提交
217
</synopsis>
T
Tom Lane 已提交
218 219 220 221 222
          This function will close the connection
          to the backend and attempt to  reestablish  a  new
          connection to the same postmaster, using all the same
	  parameters previously used.  This may be useful for
	  error recovery if a working connection is lost.
T
Thomas G. Lockhart 已提交
223 224 225
</Para>
</ListItem>

T
Tom Lane 已提交
226 227 228 229 230 231 232 233 234 235 236 237 238 239
</ItemizedList>
</Para>

<Para>
<FileName>libpq</FileName> application programmers should be careful to
maintain the PGconn abstraction.  Use the accessor functions below to get
at the contents of PGconn.  Avoid directly referencing the fields of the
PGconn structure because they are subject to change in the future.
(Beginning in <ProductName>Postgres</ProductName> release 6.4, the
definition of struct PGconn is not even provided in libpq-fe.h.  If you
have old code that accesses PGconn fields directly, you can keep using it
by including libpq-int.h too, but you are encouraged to fix the code
soon.)
<ItemizedList>
240 241 242 243
<ListItem>
<Para>
<Function>PQdb</Function>  
         Returns the database name of the connection.
T
Thomas G. Lockhart 已提交
244
<synopsis>
245
char *PQdb(PGconn *conn)
T
Thomas G. Lockhart 已提交
246
</synopsis>
T
Tom Lane 已提交
247 248 249
PQdb and the next several functions return the values established
at connection.  These values are fixed for the life of the PGconn
object.
250 251 252 253 254
</Para>
</ListItem>

<ListItem>
<Para>
T
Tom Lane 已提交
255 256
<Function>PQuser</Function>
         Returns the user name of the connection.
T
Thomas G. Lockhart 已提交
257
<synopsis>
T
Tom Lane 已提交
258
char *PQuser(PGconn *conn)
T
Thomas G. Lockhart 已提交
259
</synopsis>
260 261 262 263 264
</Para>
</ListItem>

<ListItem>
<Para>
T
Tom Lane 已提交
265 266
<Function>PQpass</Function>
         Returns the password of the connection.
T
Thomas G. Lockhart 已提交
267
<synopsis>
T
Tom Lane 已提交
268
char *PQpass(PGconn *conn)
T
Thomas G. Lockhart 已提交
269
</synopsis>
T
Tom Lane 已提交
270 271 272 273 274 275 276
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQhost</Function>
         Returns the server host name of the connection.
T
Thomas G. Lockhart 已提交
277
<synopsis>
T
Tom Lane 已提交
278
char *PQhost(PGconn *conn)
T
Thomas G. Lockhart 已提交
279
</synopsis>
280 281 282 283 284 285
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQport</Function>
T
Tom Lane 已提交
286
         Returns the port of the connection.
T
Thomas G. Lockhart 已提交
287
<synopsis>
288
char *PQport(PGconn *conn)
T
Thomas G. Lockhart 已提交
289
</synopsis>
290 291 292 293 294 295
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQtty</Function>
T
Tom Lane 已提交
296
         Returns the debug tty of the connection.
T
Thomas G. Lockhart 已提交
297
<synopsis>
298
char *PQtty(PGconn *conn)
T
Thomas G. Lockhart 已提交
299
</synopsis>
300 301 302 303 304
</Para>
</ListItem>

<ListItem>
<Para>
T
Tom Lane 已提交
305 306
<Function>PQoptions</Function>
       Returns the backend options used in  the  connection.
T
Thomas G. Lockhart 已提交
307
<synopsis>
T
Tom Lane 已提交
308
char *PQoptions(PGconn *conn)
T
Thomas G. Lockhart 已提交
309
</synopsis>
310 311 312 313 314
</Para>
</ListItem>

<ListItem>
<Para>
T
Tom Lane 已提交
315 316 317
<Function>PQstatus</Function>
         Returns the status of the connection. 
         The status can be CONNECTION_OK or CONNECTION_BAD.
T
Thomas G. Lockhart 已提交
318
<synopsis>
T
Tom Lane 已提交
319
ConnStatusType *PQstatus(PGconn *conn)
T
Thomas G. Lockhart 已提交
320
</synopsis>
321
</Para>
T
Thomas G. Lockhart 已提交
322 323

<Para>
T
Tom Lane 已提交
324 325 326 327 328
A failed connection attempt is signaled by status CONNECTION_BAD.
Ordinarily, an OK status will remain so until PQfinish, but a
communications failure might result in the status changing to
CONNECTION_BAD prematurely.  In that case the application could
try to recover by calling PQreset.
329
</Para>
330 331 332 333
</ListItem>

<ListItem>
<Para>
T
Tom Lane 已提交
334 335 336
<Function>PQerrorMessage</Function>
         Returns the error message most recently generated by
         an operation on the connection.
T
Thomas G. Lockhart 已提交
337
<synopsis>
T
Tom Lane 已提交
338
char *PQerrorMessage(PGconn* conn);
T
Thomas G. Lockhart 已提交
339
</synopsis>
340
</Para>
T
Thomas G. Lockhart 已提交
341 342

<Para>
T
Tom Lane 已提交
343 344 345
Nearly all libpq functions will set PQerrorMessage if they fail.
Note that by libpq convention, a non-empty PQerrorMessage will
include a trailing newline.
346
</Para>
347 348 349 350
</ListItem>

<ListItem>
<Para>
T
Tom Lane 已提交
351 352 353
<Function>PQbackendPID</Function>
         Returns the process ID of the backend server handling this
	 connection.
T
Thomas G. Lockhart 已提交
354
<synopsis>
T
Tom Lane 已提交
355
int PQbackendPID(PGconn *conn);
T
Thomas G. Lockhart 已提交
356
</synopsis>
T
Tom Lane 已提交
357 358 359 360
The backend PID is useful for debugging purposes and for comparison
to NOTIFY messages (which include the PID of the notifying backend).
Note that the PID belongs to a process executing on the database
server host, not the local host!
361 362
</Para>
</ListItem>
T
Tom Lane 已提交
363

364 365 366 367 368 369 370 371
</ItemizedList>
</Para>
</Sect1>

<Sect1>
<Title>Query Execution Functions</Title>

<Para>
T
Tom Lane 已提交
372 373 374
Once a connection to a database server has been successfully
established, the functions described here are used to perform
SQL queries and commands.
375 376 377 378
<ItemizedList>
<ListItem>
<Para>
<Function>PQexec</Function>
T
Tom Lane 已提交
379 380
          Submit a query to <ProductName>Postgres</ProductName>
          and wait for the result.
T
Thomas G. Lockhart 已提交
381
<synopsis>
382
PGresult *PQexec(PGconn *conn,
B
Bruce Momjian 已提交
383
                 const char *query);
T
Thomas G. Lockhart 已提交
384
</synopsis>
T
Tom Lane 已提交
385 386 387 388 389 390 391
          Returns  a  PGresult pointer or possibly a NULL pointer.
          A non-NULL pointer will generally be returned except in
          out-of-memory conditions or serious errors such as inability
          to send the query to the backend.
          If a NULL is returned, it
	  should be treated like a PGRES_FATAL_ERROR result.  Use
	  PQerrorMessage to get more information about the error.
392 393
</Para>
</ListItem>
T
Tom Lane 已提交
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
</ItemizedList>
</Para>

<Para>
The <Function>PGresult</Function> structure encapsulates the query result
returned by the backend.
<FileName>libpq</FileName> application programmers should be careful to
maintain the PGresult abstraction.  Use the accessor functions below to get
at the contents of PGresult.  Avoid directly referencing the fields of the
PGresult structure because they are subject to change in the future.
(Beginning in <ProductName>Postgres</ProductName> release 6.4, the
definition of struct PGresult is not even provided in libpq-fe.h.  If you
have old code that accesses PGresult fields directly, you can keep using it
by including libpq-int.h too, but you are encouraged to fix the code
soon.)
409

T
Tom Lane 已提交
410
<ItemizedList>
411 412 413 414
<ListItem>
<Para>
<Function>PQresultStatus</Function>
          Returns the result status of the query.  PQresultStatus can return one of the following values:
T
Thomas G. Lockhart 已提交
415
<synopsis>
416
PGRES_EMPTY_QUERY,
417 418 419 420 421
PGRES_COMMAND_OK,       /* the query was a command returning no data */
PGRES_TUPLES_OK,        /* the query successfully returned tuples */
PGRES_COPY_OUT,         /* Copy Out (from server) data transfer started */
PGRES_COPY_IN,          /* Copy In (to server) data transfer started */
PGRES_BAD_RESPONSE,     /* an unexpected response was received */
422 423
PGRES_NONFATAL_ERROR,
PGRES_FATAL_ERROR
T
Thomas G. Lockhart 已提交
424
</synopsis>
425
          If  the result status is PGRES_TUPLES_OK, then the
T
Tom Lane 已提交
426 427
          routines described below can be  used  to  retrieve  the
          tuples returned by the query.  Note that a SELECT that
428
	  happens to retrieve zero tuples still shows PGRES_TUPLES_OK.
T
Tom Lane 已提交
429 430 431 432 433 434 435 436 437
	  PGRES_COMMAND_OK is for commands that can never return tuples.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQresultErrorMessage</Function>
returns the error message associated with the query, or an empty string
if there was no error.
T
Thomas G. Lockhart 已提交
438
<synopsis>
T
Tom Lane 已提交
439
const char *PQresultErrorMessage(PGresult *res);
T
Thomas G. Lockhart 已提交
440
</synopsis>
T
Tom Lane 已提交
441 442 443 444 445 446 447
Immediately following a PQexec or PQgetResult call, PQerrorMessage
(on the connection) will return the same string as PQresultErrorMessage
(on the result).  However, a PGresult will retain its error message
until destroyed, whereas the connection's error message will change when
subsequent operations are done.  Use PQresultErrorMessage when you want to
know the status associated with a particular PGresult; use PQerrorMessage
when you want to know the status from the latest operation on the connection.
448 449 450 451 452
</Para>
</ListItem>

<ListItem>
<Para>
T
Tom Lane 已提交
453 454
<Function>PQntuples</Function>
          Returns the number of tuples (instances)
455
          in the query result.
T
Thomas G. Lockhart 已提交
456
<synopsis>
457
int PQntuples(PGresult *res);
T
Thomas G. Lockhart 已提交
458
</synopsis>
459 460 461 462 463 464 465
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQnfields</Function>
          Returns   the   number    of    fields
T
Tom Lane 已提交
466
          (attributes) in each tuple of the query result.
T
Thomas G. Lockhart 已提交
467
<synopsis>
468
int PQnfields(PGresult *res);
T
Thomas G. Lockhart 已提交
469
</synopsis>
470 471 472
</Para>
</ListItem>

T
Tom Lane 已提交
473 474 475 476 477
<ListItem>
<Para>
<Function>PQbinaryTuples</Function>
          Returns 1 if the PGresult contains binary tuple data,
	  0 if it contains ASCII data.
T
Thomas G. Lockhart 已提交
478
<synopsis>
T
Tom Lane 已提交
479
int PQbinaryTuples(PGresult *res);
T
Thomas G. Lockhart 已提交
480
</synopsis>
T
Tom Lane 已提交
481 482 483 484 485
Currently, binary tuple data can only be returned by a query that
extracts data from a <Acronym>BINARY</Acronym> cursor.
</Para>
</ListItem>

486 487 488
<ListItem>
<Para>
<Function>PQfname</Function>
T
Thomas G. Lockhart 已提交
489 490 491
 Returns the field (attribute) name associated with the given field  index.
 Field  indices start at 0.
<synopsis>
492 493
char *PQfname(PGresult *res,
              int field_index);
T
Thomas G. Lockhart 已提交
494
</synopsis>
495 496 497 498 499 500 501 502
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQfnumber</Function>
            Returns  the  field  (attribute)  index
          associated with the given field name.
T
Thomas G. Lockhart 已提交
503
<synopsis>
504 505
int PQfnumber(PGresult *res,
              char* field_name);
T
Thomas G. Lockhart 已提交
506
</synopsis>
507
</Para>
T
Thomas G. Lockhart 已提交
508 509

<Para>
T
Tom Lane 已提交
510
        -1 is returned if the given name does not match any field.
511
</Para>
512 513 514 515 516 517 518 519 520
</ListItem>

<ListItem>
<Para>
<Function>PQftype</Function>
            Returns the field type associated with the
          given  field  index.  The  integer  returned is an
          internal coding of the type.  Field indices  start
          at 0.
T
Thomas G. Lockhart 已提交
521
<synopsis>
522 523
Oid PQftype(PGresult *res,
            int field_num);
T
Thomas G. Lockhart 已提交
524
</synopsis>
525 526 527 528 529 530
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQfsize</Function>
T
Tom Lane 已提交
531
          Returns  the  size  in bytes of the field
532 533
          associated with the given field index.
          Field indices start at 0.
T
Thomas G. Lockhart 已提交
534
<synopsis>
T
Tom Lane 已提交
535 536
int PQfsize(PGresult *res,
            int field_index);
T
Thomas G. Lockhart 已提交
537
</synopsis>
538 539 540
	PQfsize returns the space allocated for this field in a database
	tuple, in other words the size of the server's binary representation
	of the data type.  -1 is returned if the field is variable size.
B
Bruce Momjian 已提交
541 542 543 544 545 546 547 548 549
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQfmod</Function>
          Returns  the type-specific modification data of the field
          associated with the given field index.
          Field indices start at 0.
T
Thomas G. Lockhart 已提交
550
<synopsis>
551 552
int PQfmod(PGresult *res,
           int field_index);
T
Thomas G. Lockhart 已提交
553
</synopsis>
554 555 556 557 558 559
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQgetvalue</Function>
T
Tom Lane 已提交
560 561 562
            Returns a single field  (attribute)  value of one tuple
	    of a PGresult.
	    Tuple and field indices start at 0.
T
Thomas G. Lockhart 已提交
563
<synopsis>
T
Tom Lane 已提交
564 565 566
char* PQgetvalue(PGresult *res,
                 int tup_num,
                 int field_num);
T
Thomas G. Lockhart 已提交
567
</synopsis>
568 569
          For most queries, the value returned by PQgetvalue
          is a null-terminated ASCII  string  representation
570 571
          of the attribute value.  But if PQbinaryTuples() is TRUE,
          the  value  returned  by
572
          PQgetvalue  is  the  binary  representation of the
573 574 575
          type in the internal format of the backend server
	  (but not including the size word, if the field is variable-length).
          It  is then the programmer's responsibility to cast and
T
Tom Lane 已提交
576
          convert the data to the correct C type.  The pointer
577
          returned  by  PQgetvalue points to storage that is
T
Tom Lane 已提交
578 579
          part of the PGresult structure.  One should not modify it,
          and one must explicitly 
580 581 582 583 584
          copy the value into other storage if it is to
          be used past the lifetime of the  PGresult  structure itself.
</Para>
</ListItem>

T
Thomas G. Lockhart 已提交
585 586
<ListItem>
<Para>
587 588 589
<Function>PQgetlength</Function>
          Returns   the   length  of  a  field (attribute) in bytes.
          Tuple and field indices start at 0.
T
Thomas G. Lockhart 已提交
590
<synopsis>
591
int PQgetlength(PGresult *res,
T
Thomas G. Lockhart 已提交
592 593
                int tup_num,
                int field_num);
T
Thomas G. Lockhart 已提交
594
</synopsis>
595 596 597
This is the actual data length for the particular data value, that is the
size of the object pointed to by PQgetvalue.  Note that for ASCII-represented
values, this size has little to do with the binary size reported by PQfsize.
T
Thomas G. Lockhart 已提交
598 599 600
</Para>
</ListItem>

601 602
<ListItem>
<Para>
603 604 605
<Function>PQgetisnull</Function>
           Tests a field for a NULL entry.
           Tuple and field indices start at 0.
T
Thomas G. Lockhart 已提交
606
<synopsis>
607
int PQgetisnull(PGresult *res,
T
Thomas G. Lockhart 已提交
608 609
                int tup_num,
                int field_num);
T
Thomas G. Lockhart 已提交
610
</synopsis>
611 612 613 614
            This function returns  1 if the field contains a NULL, 0 if
            it contains a non-null value.  (Note that PQgetvalue
            will return an empty string, not a null pointer, for a NULL
            field.)
615 616 617 618 619 620
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQcmdStatus</Function>
T
Tom Lane 已提交
621 622
          Returns the command status string from the SQL command that
	  generated the PGresult.
T
Thomas G. Lockhart 已提交
623
<synopsis>
624
char *PQcmdStatus(PGresult *res);
T
Thomas G. Lockhart 已提交
625
</synopsis>
626 627 628
</Para>
</ListItem>

T
Thomas G. Lockhart 已提交
629 630 631
<ListItem>
<Para>
<Function>PQcmdTuples</Function>
T
Tom Lane 已提交
632
	  Returns the number of rows affected by the SQL command.
T
Thomas G. Lockhart 已提交
633
<synopsis>
T
Thomas G. Lockhart 已提交
634
const char *PQcmdTuples(PGresult *res);
T
Thomas G. Lockhart 已提交
635
</synopsis>
T
Tom Lane 已提交
636 637 638
          If the SQL command that generated the
	  PGresult was INSERT, UPDATE or DELETE, this returns a
	  string containing the number of rows affected.  If the
T
Thomas G. Lockhart 已提交
639 640 641 642
          command was anything else, it returns the empty string.
</Para>
</ListItem>

643 644 645 646
<ListItem>
<Para>
<Function>PQoidStatus</Function>
          Returns a string with the object id of  the  tuple
T
Tom Lane 已提交
647
          inserted,  if  the SQL command was an INSERT.
648
          Otherwise, returns an empty string.
T
Thomas G. Lockhart 已提交
649
<synopsis>
650
char* PQoidStatus(PGresult *res);
T
Thomas G. Lockhart 已提交
651
</synopsis>
652 653 654
</Para>
</ListItem>

T
Thomas G. Lockhart 已提交
655 656 657 658 659
<ListItem>
<Para>
<Function>PQprint</Function>
          Prints out all the  tuples  and,  optionally,  the
          attribute  names  to  the specified output stream.
T
Thomas G. Lockhart 已提交
660
<synopsis>
T
Thomas G. Lockhart 已提交
661 662 663 664 665
void PQprint(FILE* fout,      /* output stream */
             PGresult* res,
             PQprintOpt* po);

struct _PQprintOpt
666 667 668 669 670 671 672 673 674 675 676 677
        {
                pqbool  header;      /* print output field headings and row count */
                pqbool  align;       /* fill align the fields */
                pqbool  standard;    /* old brain dead format */
                pqbool  html3;       /* output html tables */
                pqbool  expanded;    /* expand tables */
                pqbool  pager;       /* use pager for output if needed */
                char    *fieldSep;   /* field separator */
                char    *tableOpt;   /* insert to HTML &lt;table ...&gt; */
                char    *caption;    /* HTML &lt;caption&gt; */
                char    **fieldName; /* null terminated array of replacement field names */
        };
T
Thomas G. Lockhart 已提交
678
</synopsis>
T
Tom Lane 已提交
679 680 681
	This function is intended to replace PQprintTuples(), which is
	now obsolete.  The <FileName>psql</FileName> program uses
	PQprint() to display query results.
T
Thomas G. Lockhart 已提交
682 683 684
</Para>
</ListItem>

685 686 687 688 689
<ListItem>
<Para>
<Function>PQprintTuples</Function>
          Prints out all the  tuples  and,  optionally,  the
          attribute  names  to  the specified output stream.
T
Thomas G. Lockhart 已提交
690
<synopsis>
T
Thomas G. Lockhart 已提交
691 692 693 694 695
void PQprintTuples(PGresult* res,
                   FILE* fout,      /* output stream */
                   int printAttName,/* print attribute names or not*/
                   int terseOutput, /* delimiter bars or not?*/
                   int width);      /* width of column, variable width if 0*/
T
Thomas G. Lockhart 已提交
696
</synopsis>
T
Thomas G. Lockhart 已提交
697 698 699 700 701 702 703 704
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQdisplayTuples</Function>
          Prints out all the  tuples  and,  optionally,  the
          attribute  names  to  the specified output stream.
T
Thomas G. Lockhart 已提交
705
<synopsis>
T
Tom Lane 已提交
706
void PQdisplayTuples(PGresult* res,
T
Thomas G. Lockhart 已提交
707 708 709
                     FILE* fout,           /* output stream */
                     int fillAlign,        /* space fill to align columns */
                     const char *fieldSep, /* field separator */
T
Tom Lane 已提交
710 711
                     int printHeader,      /* display headers? */
                     int quiet);           /* suppress print of row count at end */
T
Thomas G. Lockhart 已提交
712
</synopsis>
T
Thomas G. Lockhart 已提交
713 714
          PQdisplayTuples() was intended to supersede PQprintTuples(), and
          is in turn superseded by PQprint().
715 716 717 718 719 720
</Para>
</ListItem>
<ListItem>
<Para>
<Function>PQclear</Function>
          Frees  the  storage  associated with the PGresult.
T
Tom Lane 已提交
721 722
          Every query result should be freed via PQclear  when
          it  is  no  longer needed.
T
Thomas G. Lockhart 已提交
723
<synopsis>
724
void PQclear(PQresult *res);
T
Thomas G. Lockhart 已提交
725
</synopsis>
T
Tom Lane 已提交
726 727 728 729 730
          You can keep a PGresult object around for as long as you
          need it; it does not go away when you issue a new query,
          nor even if you close the connection.  To get rid of it,
          you must call PQclear.  Failure to do this will
          result in memory leaks in  the  frontend  application.
731 732
</Para>
</ListItem>
T
Tom Lane 已提交
733 734 735 736 737

<ListItem>
<Para>
<Function>PQmakeEmptyPGresult</Function>
          Constructs an empty PGresult object with the given status.
T
Thomas G. Lockhart 已提交
738
<synopsis>
T
Tom Lane 已提交
739
PGresult* PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
T
Thomas G. Lockhart 已提交
740
</synopsis>
T
Tom Lane 已提交
741 742 743 744 745 746 747 748 749 750
This is libpq's internal routine to allocate and initialize an empty
PGresult object.  It is exported because some applications find it
useful to generate result objects (particularly objects with error
status) themselves.  If conn is not NULL and status indicates an error,
the connection's current errorMessage is copied into the PGresult.
Note that PQclear should eventually be called on the object, just
as with a PGresult returned by libpq itself.
</Para>
</ListItem>

751 752 753 754
</ItemizedList>
</Para>
</Sect1>

B
Bruce Momjian 已提交
755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
<Sect1>
<Title>Asynchronous Query Processing</Title>

<Para>
The PQexec function is adequate for submitting queries in simple synchronous
applications.  It has a couple of major deficiencies however:

<ItemizedList>
<ListItem>
<Para>
PQexec waits for the query to be completed.  The application may have other
work to do (such as maintaining a user interface), in which case it won't
want to block waiting for the response.
</Para>
</ListItem>
<ListItem>
<Para>
M
 
Marc G. Fournier 已提交
772 773 774
Since control is buried inside PQexec, it is hard for the frontend
to decide it would like to try to cancel the ongoing query.  (It can be
done from a signal handler, but not otherwise.)
B
Bruce Momjian 已提交
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
</Para>
</ListItem>
<ListItem>
<Para>
PQexec can return only one PGresult structure.  If the submitted query
string contains multiple SQL commands, all but the last PGresult are
discarded by PQexec.
</Para>
</ListItem>
</ItemizedList>
</Para>

<Para>
Applications that do not like these limitations can instead use the
underlying functions that PQexec is built from: PQsendQuery and
PQgetResult.

<ItemizedList>
<ListItem>
<Para>
<Function>PQsendQuery</Function>
          Submit a query to <ProductName>Postgres</ProductName> without
	  waiting for the result(s).  TRUE is returned if the query was
	  successfully dispatched, FALSE if not (in which case, use
	  PQerrorMessage to get more information about the failure).
T
Thomas G. Lockhart 已提交
800
<synopsis>
B
Bruce Momjian 已提交
801 802
int PQsendQuery(PGconn *conn,
                const char *query);
T
Thomas G. Lockhart 已提交
803
</synopsis>
B
Bruce Momjian 已提交
804 805 806 807 808 809 810 811 812 813 814 815 816
	  After successfully calling PQsendQuery, call PQgetResult one or more
	  times to obtain the query results.  PQsendQuery may not be called
	  again (on the same connection) until PQgetResult has returned NULL,
	  indicating that the query is done.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQgetResult</Function>
          Wait for the next result from a prior PQsendQuery,
	  and return it.  NULL is returned when the query is complete
	  and there will be no more results.
T
Thomas G. Lockhart 已提交
817
<synopsis>
B
Bruce Momjian 已提交
818
PGresult *PQgetResult(PGconn *conn);
T
Thomas G. Lockhart 已提交
819
</synopsis>
B
Bruce Momjian 已提交
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
	  PQgetResult must be called repeatedly until it returns NULL,
	  indicating that the query is done.  (If called when no query is
	  active, PQgetResult will just return NULL at once.)
	  Each non-null result from PQgetResult should be processed using
	  the same PGresult accessor functions previously described.
	  Don't forget to free each result object with PQclear when done with it.
	  Note that PQgetResult will block only if a query is active and the
	  necessary response data has not yet been read by PQconsumeInput.
</Para>
</ListItem>

</ItemizedList>
</Para>

<Para>
Using PQsendQuery and PQgetResult solves one of PQexec's problems:
if a query string contains multiple SQL commands, the results of those
commands can be obtained individually.  (This allows a simple form of
overlapped processing, by the way: the frontend can be handling the
results of one query while the backend is still working on later
queries in the same query string.)  However, calling PQgetResult will
still cause the frontend to block until the backend completes the
next SQL command.  This can be avoided by proper use of three more
functions:

<ItemizedList>
<ListItem>
<Para>
<Function>PQconsumeInput</Function>
	  If input is available from the backend, consume it.
T
Thomas G. Lockhart 已提交
850
<synopsis>
T
Tom Lane 已提交
851
int PQconsumeInput(PGconn *conn);
T
Thomas G. Lockhart 已提交
852
</synopsis>
T
Tom Lane 已提交
853 854 855 856 857 858
PQconsumeInput normally returns 1 indicating "no error", but returns
0 if there was some kind of trouble (in which case PQerrorMessage
is set).  Note that the result does not say whether any input data
was actually collected.   After calling PQconsumeInput,
the application may check PQisBusy and/or PQnotifies to see if their state
has changed.
B
Bruce Momjian 已提交
859
	  PQconsumeInput may be called even if the application is not
860 861
	  prepared to deal with a result or notification just yet.  The
	  routine will read available data and save it in a buffer, thereby
B
Bruce Momjian 已提交
862 863 864 865 866 867 868 869 870 871 872 873
	  causing a select(2) read-ready indication to go away.  The
	  application can thus use PQconsumeInput to clear the select
	  condition immediately, and then examine the results at leisure.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQisBusy</Function>
	  Returns TRUE if a query is busy, that is, PQgetResult would block
	  waiting for input.  A FALSE return indicates that PQgetResult can
	  be called with assurance of not blocking.
T
Thomas G. Lockhart 已提交
874
<synopsis>
B
Bruce Momjian 已提交
875
int PQisBusy(PGconn *conn);
T
Thomas G. Lockhart 已提交
876
</synopsis>
B
Bruce Momjian 已提交
877 878 879 880 881 882 883 884 885 886 887 888
	  PQisBusy will not itself attempt to read data from the backend;
	  therefore PQconsumeInput must be invoked first, or the busy
	  state will never end.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQsocket</Function>
	  Obtain the file descriptor number for the backend connection socket.
	  A valid descriptor will be >= 0; a result of -1 indicates that
	  no backend connection is currently open.
T
Thomas G. Lockhart 已提交
889
<synopsis>
B
Bruce Momjian 已提交
890
int PQsocket(PGconn *conn);
T
Thomas G. Lockhart 已提交
891
</synopsis>
B
Bruce Momjian 已提交
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914
	  PQsocket should be used to obtain the backend socket descriptor
	  in preparation for executing select(2).  This allows an application
	  to wait for either backend responses or other conditions.
	  If the result of select(2) indicates that data can be read from
	  the backend socket, then PQconsumeInput should be called to read the
	  data; after which, PQisBusy, PQgetResult, and/or PQnotifies can be
	  used to process the response.
</Para>
</ListItem>

</ItemizedList>
</Para>

<Para>
A typical frontend using these functions will have a main loop that uses
select(2) to wait for all the conditions that it must respond to.  One of
the conditions will be input available from the backend, which in select's
terms is readable data on the file descriptor identified by PQsocket.
When the main loop detects input ready, it should call PQconsumeInput
to read the input.  It can then call PQisBusy, followed by PQgetResult
if PQisBusy returns FALSE.  It can also call PQnotifies to detect NOTIFY
messages (see "Asynchronous Notification", below).  An example is given
in the sample programs section.
915
</Para>
B
Bruce Momjian 已提交
916 917 918 919

<Para>
A frontend that uses PQsendQuery/PQgetResult can also attempt to cancel
a query that is still being processed by the backend.
920
</Para>
B
Bruce Momjian 已提交
921 922 923 924 925 926 927 928

<Para>
<ItemizedList>
<ListItem>
<Para>
<Function>PQrequestCancel</Function>
	  Request that <ProductName>Postgres</ProductName> abandon
	  processing of the current query.
T
Thomas G. Lockhart 已提交
929
<synopsis>
B
Bruce Momjian 已提交
930
int PQrequestCancel(PGconn *conn);
T
Thomas G. Lockhart 已提交
931
</synopsis>
B
Bruce Momjian 已提交
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949
	  The return value is TRUE if the cancel request was successfully
	  dispatched, FALSE if not.  (If not, PQerrorMessage tells why not.)
	  Successful dispatch is no guarantee that the request will have any
	  effect, however.  Regardless of the return value of PQrequestCancel,
	  the application must continue with the normal result-reading
	  sequence using PQgetResult.  If the cancellation
	  is effective, the current query will terminate early and return
	  an error result.  If the cancellation fails (say because the
	  backend was already done processing the query), then there will
	  be no visible result at all.
</Para>
</ListItem>
</ItemizedList>
</Para>

<Para>
Note that if the current query is part of a transaction, cancellation
will abort the whole transaction.
950
</Para>
B
Bruce Momjian 已提交
951 952

<Para>
M
 
Marc G. Fournier 已提交
953 954 955 956 957 958 959
PQrequestCancel can safely be invoked from a signal handler.  So, it is
also possible to use it in conjunction with plain PQexec, if the decision
to cancel can be made in a signal handler.  For example, psql invokes
PQrequestCancel from a SIGINT signal handler, thus allowing interactive
cancellation of queries that it issues through PQexec.  Note that
PQrequestCancel will have no effect if the connection is not currently open
or the backend is not currently processing a query.
960
</Para>
B
Bruce Momjian 已提交
961 962 963

</Sect1>

964 965 966
<Sect1>
<Title>Fast Path</Title>

967 968 969 970 971
<Para>
<ProductName>Postgres</ProductName> provides a fast path interface to send
function calls to the backend.  This is a trapdoor into system internals and
can be a potential security hole.  Most users will not need this feature.

972 973 974
<ItemizedList>
<ListItem>
<Para>
975 976
<Function>PQfn</Function>
	Request execution of a backend function via the fast path interface.
T
Thomas G. Lockhart 已提交
977
<synopsis>
978 979 980 981 982 983 984
PGresult* PQfn(PGconn* conn,
               int fnid,
               int *result_buf,
               int *result_len,
               int result_is_int,
               PQArgBlock *args,
               int nargs);
T
Thomas G. Lockhart 已提交
985
</synopsis>
T
Tom Lane 已提交
986 987 988 989
     The fnid argument is the object identifier of the function to be
     executed.
     result_buf is the buffer in which
     to place the return value.  The caller must  have  allocated
990 991 992 993 994 995 996 997 998
     sufficient space to store the return value (there is no check!).
     The actual result length will be returned in the integer pointed
     to  by  result_len.   If a 4-byte integer result is expected, set
     result_is_int to 1; otherwise set it to 0.  (Setting result_is_int to 1
     tells libpq to byte-swap the value if necessary, so that it is
     delivered as a proper int value for the client machine.  When
     result_is_int is 0, the byte string sent by the backend is returned
     unmodified.)
     args and nargs specify the arguments to be passed to the function.
T
Thomas G. Lockhart 已提交
999
<synopsis>
1000 1001 1002 1003 1004
typedef struct {
             int len;
             int isint;
             union {
                 int *ptr;
T
Thomas G. Lockhart 已提交
1005
                 int integer;
1006 1007
             } u;
         } PQArgBlock;
T
Thomas G. Lockhart 已提交
1008
</synopsis>
1009 1010
     PQfn always returns a valid PGresult*.  The  resultStatus  should be checked before the result is used.   The
     caller is responsible for  freeing  the  PGresult  with
M
 
Marc G. Fournier 已提交
1011
     PQclear when it is no longer needed.
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
</Para>
</ListItem>
</ItemizedList>
</Para>

</Sect1>

<Sect1>
<Title>Asynchronous Notification</Title>

<Para>
B
Bruce Momjian 已提交
1023 1024
<ProductName>Postgres</ProductName> supports asynchronous notification via the
LISTEN and NOTIFY commands.  A backend registers its interest in a particular
T
Tom Lane 已提交
1025 1026
notification condition with the LISTEN command (and can stop listening
with the UNLISTEN command).  All backends listening on a
B
Bruce Momjian 已提交
1027 1028 1029 1030 1031 1032
particular condition will be notified asynchronously when a NOTIFY of that
condition name is executed by any backend.  No additional information is
passed from the notifier to the listener.  Thus, typically, any actual data
that needs to be communicated is transferred through a database relation.
Commonly the condition name is the same as the associated relation, but it is
not necessary for there to be any associated relation.
1033
</Para>
B
Bruce Momjian 已提交
1034 1035

<Para>
T
Tom Lane 已提交
1036 1037 1038
<FileName>libpq</FileName> applications submit LISTEN and UNLISTEN
commands as ordinary SQL queries.  Subsequently, arrival of NOTIFY
messages can be detected by calling PQnotifies().
1039 1040 1041 1042

<ItemizedList>
<ListItem>
<Para>
B
Bruce Momjian 已提交
1043 1044 1045
<Function>PQnotifies</Function>
          Returns  the next notification from a list of unhandled
          notification messages received from the backend.  Returns NULL if
T
Tom Lane 已提交
1046 1047 1048
          there are no pending notifications.  Once a notification is
	  returned from PQnotifies, it is considered handled and will be
	  removed from the list of notifications.
T
Thomas G. Lockhart 已提交
1049
<synopsis>
B
Bruce Momjian 已提交
1050
PGnotify* PQnotifies(PGconn *conn);
1051 1052 1053 1054 1055 1056 1057

typedef struct pgNotify
    {
        char        relname[NAMEDATALEN];       /* name of relation
                                                 * containing data */
        int         be_pid;                     /* process id of backend */
    } PGnotify;
T
Thomas G. Lockhart 已提交
1058
</synopsis>
B
Bruce Momjian 已提交
1059 1060
	  After processing a PGnotify object returned by PQnotifies,
	  be sure to free it with free() to avoid a memory leak.
1061 1062 1063
	  NOTE: in <productname>Postgres</productname> 6.4 and later,
	  the be_pid is the notifying backend's, whereas in earlier versions
	  it was always your own backend's PID.
1064 1065 1066 1067 1068
</Para>
</ListItem>
</ItemizedList>
</Para>

T
Tom Lane 已提交
1069 1070 1071
<Para>
The  second  sample program gives an example of the use
of asynchronous notification.
1072
</Para>
T
Tom Lane 已提交
1073

B
Bruce Momjian 已提交
1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
<Para>
PQnotifies() does not actually read backend data; it just returns messages
previously absorbed by another <FileName>libpq</FileName> function.  In prior
releases of <FileName>libpq</FileName>, the only way to ensure timely receipt
of NOTIFY messages was to constantly submit queries, even empty ones, and then
check PQnotifies() after each PQexec().  While this still works, it is
deprecated as a waste of processing power.  A better way to check for NOTIFY
messages when you have no useful queries to make is to call PQconsumeInput(),
then check PQnotifies().  You can use select(2) to wait for backend data to
arrive, thereby using no CPU power unless there is something to do.  Note that
this will work OK whether you use PQsendQuery/PQgetResult or plain old PQexec
for queries.  You should, however, remember to check PQnotifies() after each
PQgetResult or PQexec to see if any notifications came in during the
processing of the query.
</Para>

1090 1091 1092 1093 1094 1095
</Sect1>

<Sect1>
<Title>Functions Associated with the COPY Command</Title>

<Para>
T
Tom Lane 已提交
1096
     The COPY command in <ProductName>Postgres</ProductName> has options to  read  from
1097
     or  write  to  the  network  connection  used by <FileName>libpq</FileName>.
T
Tom Lane 已提交
1098 1099
     Therefore, functions are necessary to access this  network
     connection directly so applications may take advantage of this capability.
1100 1101
</Para>

B
Bruce Momjian 已提交
1102 1103 1104 1105 1106
<Para>
     These functions should be executed only after obtaining a PGRES_COPY_OUT
     or PGRES_COPY_IN result object from PQexec or PQgetResult.
</Para>

1107 1108 1109 1110 1111 1112 1113
<Para>
<ItemizedList>
<ListItem>
<Para>
<Function>PQgetline</Function>
          Reads  a  newline-terminated  line  of  characters
          (transmitted  by the backend server) into a buffer
T
Tom Lane 已提交
1114
          string of size length.
T
Thomas G. Lockhart 已提交
1115
<synopsis>
T
Tom Lane 已提交
1116 1117 1118
int PQgetline(PGconn *conn,
              char *string,
              int length)
T
Thomas G. Lockhart 已提交
1119
</synopsis>
T
Tom Lane 已提交
1120
  Like fgets(3),  this  routine copies up to length-1 characters into string.
1121 1122 1123 1124 1125 1126
          It is like gets(3), however, in that  it  converts
          the terminating newline into a null character.
          PQgetline returns EOF at EOF, 0 if the entire line
          has been read, and 1 if the buffer is full but the
          terminating newline has not yet been read.
          Notice that the application must check to see if a
B
Bruce Momjian 已提交
1127
          new line consists of  the  two characters  "\.",
T
Tom Lane 已提交
1128 1129 1130 1131 1132 1133 1134 1135
          which  indicates  that the backend server has finished sending
	  the results  of  the  copy  command.
If  the  application might
receive lines that are more than length-1  characters  long,
care is needed to be sure one recognizes the "\." line correctly
(and does not, for example, mistake the end of a long data line
for a terminator line).
The code in
1136 1137 1138
<FileName>
../src/bin/psql/psql.c
</FileName>
T
Tom Lane 已提交
1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
contains routines that correctly handle  the  copy protocol.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQgetlineAsync</Function>
          Reads  a  newline-terminated  line  of  characters
          (transmitted  by the backend server) into a buffer
          without blocking.
T
Thomas G. Lockhart 已提交
1149
<synopsis>
T
Tom Lane 已提交
1150 1151 1152
int PQgetlineAsync(PGconn *conn,
                   char *buffer,
                   int bufsize)
T
Thomas G. Lockhart 已提交
1153
</synopsis>
T
Tom Lane 已提交
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
This routine is similar to PQgetline, but it can be used by applications
that must read COPY data asynchronously, that is without blocking.
Having issued the COPY command and gotten a PGRES_COPY_OUT response, the
application should call PQconsumeInput and PQgetlineAsync until the
end-of-data signal is detected.  Unlike PQgetline, this routine takes
responsibility for detecting end-of-data.
On each call, PQgetlineAsync will return data if a complete newline-
terminated data line is available in libpq's input buffer, or if the
incoming data line is too long to fit in the buffer offered by the caller.
Otherwise, no data is returned until the rest of the line arrives.
The routine returns -1 if the end-of-copy-data marker has been recognized,
or 0 if no data is available, or a positive number giving the number of
bytes of data returned.  If -1 is returned, the caller must next call
PQendcopy, and then return to normal processing.
The data returned will not extend beyond a newline character.  If possible
a whole line will be returned at one time.  But if the buffer offered by
the caller is too small to hold a line sent by the backend, then a partial
data line will be returned.  This can be detected by testing whether the
last returned byte is '\n' or not.
The returned string is not null-terminated.  (If you want to add a
terminating null, be sure to pass a bufsize one smaller than the room
actually available.)
1176 1177
</Para>
</ListItem>
T
Tom Lane 已提交
1178

1179 1180 1181
<ListItem>
<Para>
<Function>PQputline</Function>
T
Tom Lane 已提交
1182 1183
Sends  a  null-terminated  string  to  the backend server.
Returns 0 if OK, EOF if unable to send the string.
T
Thomas G. Lockhart 已提交
1184
<synopsis>
T
Tom Lane 已提交
1185 1186
int PQputline(PGconn *conn,
              char *string);
T
Thomas G. Lockhart 已提交
1187
</synopsis>
T
Tom Lane 已提交
1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198
Note the application must explicitly  send  the  two
characters  "\." on a final line  to indicate to the backend that it
has finished sending its data.
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQputnbytes</Function>
Sends  a  non-null-terminated  string  to  the backend server.
Returns 0 if OK, EOF if unable to send the string.
T
Thomas G. Lockhart 已提交
1199
<synopsis>
T
Tom Lane 已提交
1200 1201 1202
int PQputnbytes(PGconn *conn,
                const char *buffer,
                int nbytes);
T
Thomas G. Lockhart 已提交
1203
</synopsis>
T
Tom Lane 已提交
1204 1205 1206
This is exactly like PQputline, except that the data buffer need
not be null-terminated since the number of bytes to send is
specified directly.
1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQendcopy</Function>
          Syncs with the backend.  This function waits until
          the  backend  has  finished  the  copy.  It should
          either be issued when the  last  string  has  been
          sent  to  the  backend using PQputline or when the
          last string has been  received  from  the  backend
          using PGgetline.  It must be issued or the backend
          may get "out of sync"  with  the  frontend.   Upon
          return from this function, the backend is ready to
          receive the next query.
          The return value is 0  on  successful  completion,
          nonzero otherwise.
T
Thomas G. Lockhart 已提交
1224
<synopsis>
1225
int PQendcopy(PGconn *conn);
T
Thomas G. Lockhart 已提交
1226
</synopsis>
1227
</Para>
M
 
Marc G. Fournier 已提交
1228 1229 1230 1231

<Para>
As an example:

1232
<ProgramListing>
B
Bruce Momjian 已提交
1233
PQexec(conn, "create table foo (a int4, b char16, d float8)");
1234 1235 1236 1237
PQexec(conn, "copy foo from stdin");
PQputline(conn, "3&lt;TAB&gt;hello world&lt;TAB&gt;4.5\n");
PQputline(conn,"4&lt;TAB&gt;goodbye world&lt;TAB&gt;7.11\n");
...
B
Bruce Momjian 已提交
1238
PQputline(conn,"\\.\n");
1239 1240 1241 1242 1243 1244
PQendcopy(conn);
</ProgramListing>
</Para>
</ListItem>
</ItemizedList>
</Para>
B
Bruce Momjian 已提交
1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261

<Para>
When using PQgetResult, the application should respond to
a PGRES_COPY_OUT result by executing PQgetline repeatedly,
followed by PQendcopy after the terminator line is seen.
It should then return to the PQgetResult loop until PQgetResult
returns NULL.  Similarly a PGRES_COPY_IN result is processed
by a series of PQputline calls followed by PQendcopy, then
return to the PQgetResult loop.  This arrangement will ensure that
a copy in or copy out command embedded in a series of SQL commands
will be executed correctly.
Older applications are likely to submit a copy in or copy out
via PQexec and assume that the transaction is done after PQendcopy.
This will work correctly only if the copy in/out is the only
SQL command in the query string.
</Para>

1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272
</Sect1>

<Sect1>
<Title><FileName>libpq</FileName> Tracing Functions</Title>

<Para>
<ItemizedList>
<ListItem>
<Para>
<Function>PQtrace</Function>
          Enable  tracing of the frontend/backend communication to a debugging file stream.
T
Thomas G. Lockhart 已提交
1273
<synopsis>
1274 1275
void PQtrace(PGconn *conn
             FILE *debug_port)
T
Thomas G. Lockhart 已提交
1276
</synopsis>
1277 1278 1279 1280 1281 1282 1283
</Para>
</ListItem>

<ListItem>
<Para>
<Function>PQuntrace</Function>
          Disable tracing started by PQtrace
T
Thomas G. Lockhart 已提交
1284
<synopsis>
1285
void PQuntrace(PGconn *conn)
T
Thomas G. Lockhart 已提交
1286
</synopsis>
1287 1288 1289 1290 1291 1292 1293
</Para>
</ListItem>
</ItemizedList>
</Para>

</Sect1>

1294 1295 1296 1297 1298 1299 1300 1301 1302 1303
<Sect1>
<Title>
<FileName>libpq</FileName> Control Functions</Title>

<Para>
<ItemizedList>
<ListItem>
<Para>
<Function>PQsetNoticeProcessor</Function>
Control reporting of notice and warning messages generated by libpq.
T
Thomas G. Lockhart 已提交
1304
<synopsis>
1305 1306 1307
void PQsetNoticeProcessor (PGconn * conn,
        void (*noticeProcessor) (void * arg, const char * message),
        void * arg)
T
Thomas G. Lockhart 已提交
1308
</synopsis>
1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
</Para>
</ListItem>
</ItemizedList>
</Para>

<Para>
By default, <filename>libpq</filename> prints "notice" messages from the backend on stderr,
as well as a few error messages that it generates by itself.
This behavior can be overridden by supplying a callback function that
does something else with the messages.  The callback function is passed
the text of the error message (which includes a trailing newline), plus
a void pointer that is the same one passed to <function>PQsetNoticeProcessor</function>.
(This pointer can be used to access application-specific state if needed.)
The default notice processor is simply
<ProgramListing>
static void
defaultNoticeProcessor(void * arg, const char * message)
{
    fprintf(stderr, "%s", message);
}
</ProgramListing>
1330
</Para>
1331 1332 1333

<Para>
To use a special notice processor, call <function>PQsetNoticeProcessor</function> just after
1334
creation of a new PGconn object.
1335
</Para>
1336 1337 1338

</Sect1>

1339 1340 1341 1342
<Sect1>
<Title>User Authentication Functions</Title>

<Para>
T
Tom Lane 已提交
1343 1344
The frontend/backend authentication process is  handled
by  <Function>PQconnectdb</Function>  without any further intervention.
M
 
Marc G. Fournier 已提交
1345 1346 1347
The authentication method is now
determined entirely by the DBA (see pga_hba.conf(5)).  The following
routines no longer have any effect and should not be used.
1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360
</Para>

<Para>
<ItemizedList>
<ListItem>
<Para>
<Function>fe_getauthname</Function>
          Returns a pointer to static space containing whatever name the user has authenticated.  Use of this
          routine  in  place  of calls to getenv(3) or getpwuid(3) by applications is highly recommended,  as
          it  is  entirely  possible  that the authenticated
          user name is not the same as  value  of  the  <Acronym>USER</Acronym>
          environment   variable  or  the  user's  entry  in
          <FileName>/etc/passwd</FileName>.
T
Thomas G. Lockhart 已提交
1361
<synopsis>
1362
char *fe_getauthname(char* errorMessage)
T
Thomas G. Lockhart 已提交
1363
</synopsis>
1364 1365 1366 1367 1368 1369 1370 1371 1372 1373
</Para>
</ListItem>

<ListItem>
<Para>
<Function>fe_setauthsvc</Function>
          Specifies that  <FileName>libpq</FileName>  should  use  authentication
          service  name rather than its compiled-in default.
          This value is typically taken from a  command-line
          switch.
T
Thomas G. Lockhart 已提交
1374
<synopsis>
1375 1376
void fe_setauthsvc(char *name,
                   char* errorMessage)
T
Thomas G. Lockhart 已提交
1377
</synopsis>
1378 1379 1380 1381 1382 1383 1384 1385 1386
          Any   error   messages   from  the  authentication
          attempts are returned in  the  errorMessage  argument.
</Para>
</ListItem>
</ItemizedList>
</Para>

</Sect1>

T
Thomas G. Lockhart 已提交
1387
<Sect1 id="libpq-envars">
T
Tom Lane 已提交
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413
<Title>Environment Variables</Title>

<Para>
The following environment variables can be used to select default
connection parameter values, which will be used by PQconnectdb or
PQsetdbLogin if no value is directly specified by the calling code.
These are useful to avoid hard-coding database names into simple
application programs.

<ItemizedList>
<ListItem>
<Para>
<Acronym>PGHOST</Acronym> sets the default server name.
If a non-zero-length string is specified, TCP/IP communication is used.
Without a host name, libpq will connect using a local Unix domain socket.
</Para>
</ListItem>
<ListItem>
<Para>
<Acronym>PGPORT</Acronym>  sets the default port or local Unix domain socket
file extension for communicating with the <ProductName>Postgres</ProductName>
backend.
</Para>
</ListItem>
<ListItem>
<Para>
T
Thomas G. Lockhart 已提交
1414 1415
<Acronym>PGDATABASE</Acronym>  sets the default 
<ProductName>Postgres</ProductName> database name.
T
Tom Lane 已提交
1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
</Para>
</ListItem>
<ListItem>
<Para>
<Acronym>PGUSER</Acronym>
sets the username used to connect to the database and for authentication.
</Para>
</ListItem>
<ListItem>
<Para>
<Acronym>PGPASSWORD</Acronym>
sets the password used if the backend demands password authentication.
</Para>
</ListItem>
<ListItem>
<Para>
T
Thomas G. Lockhart 已提交
1432 1433
<Acronym>PGREALM</Acronym> sets the Kerberos realm to  use  with  
<ProductName>Postgres</ProductName>,
T
Tom Lane 已提交
1434
  if  it is different from the local realm.  If
T
Thomas G. Lockhart 已提交
1435 1436
<Acronym>PGREALM</Acronym> is set, <ProductName>Postgres</ProductName> 
applications  will  attempt
T
Tom Lane 已提交
1437 1438 1439 1440 1441 1442 1443 1444
        authentication  with  servers for this realm and use
        separate ticket files to avoid conflicts with  local
        ticket  files.   This  environment  variable is only
        used if Kerberos authentication is selected by the backend.
</Para>
</ListItem>
<ListItem>
<Para>
T
Thomas G. Lockhart 已提交
1445 1446
<Acronym>PGOPTIONS</Acronym> sets additional runtime  options  for  
the <ProductName>Postgres</ProductName> backend.
T
Tom Lane 已提交
1447 1448 1449 1450
</Para>
</ListItem>
<ListItem>
<Para>
T
Thomas G. Lockhart 已提交
1451 1452
<Acronym>PGTTY</Acronym> sets the file or tty on which  debugging  
messages from the backend server are displayed.
T
Tom Lane 已提交
1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506
</Para>
</ListItem>
</ItemizedList>
</Para>

<Para>
The following environment variables can be used to specify user-level default
behavior for every Postgres session:

<ItemizedList>
<ListItem>
<Para>
<Acronym>PGDATESTYLE</Acronym>
sets the default style of date/time representation.
</Para>
</ListItem>
<ListItem>
<Para>
<Acronym>PGTZ</Acronym>
sets the default time zone.
</Para>
</ListItem>
</ItemizedList>
</Para>

<Para>
The following environment variables can be used to specify default internal
behavior for every Postgres session:

<ItemizedList>
<ListItem>
<Para>
<Acronym>PGGEQO</Acronym>
sets the default mode for the genetic optimizer.
</Para>
</ListItem>
<ListItem>
<Para>
<Acronym>PGRPLANS</Acronym>
sets the default mode to allow or disable right-sided plans in the optimizer.
</Para>
</ListItem>
<ListItem>
<Para>
<Acronym>PGCOSTHEAP</Acronym>
sets the default cost for heap searches for the optimizer.
</Para>
</ListItem>
<ListItem>
<Para>
<Acronym>PGCOSTINDEX</Acronym>
sets the default cost for indexed searches for the optimizer.
</Para>
</ListItem>
1507 1508 1509 1510 1511 1512
<ListItem>
<Para>
<Acronym>PGQUERY_LIMIT</Acronym>
sets the maximum number of rows returned by a query.
</Para>
</ListItem>
T
Tom Lane 已提交
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
</ItemizedList>
</Para>

<Para>
Refer to the <command>SET</command> <acronym>SQL</acronym> command
for information on correct values for these environment variables.
</Para>

</Sect1>

1523
<Sect1>
1524
<Title>Caveats</Title>
1525 1526 1527

<Para>
     The  query  buffer is 8192 bytes long, and queries over
B
Bruce Momjian 已提交
1528
     that length will be rejected.
1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
</Para>
</Sect1>

<Sect1>
<Title>Sample Programs</Title>

<Sect2>
<Title>Sample Program 1</Title>

<Para>
<ProgramListing>
T
Thomas G. Lockhart 已提交
1540
/*
1541 1542 1543 1544 1545
 * testlibpq.c Test the C version of Libpq, the Postgres frontend
 * library.
 *
 *
 */
T
Thomas G. Lockhart 已提交
1546 1547 1548 1549
#include &lt;stdio.h&gt;
#include "libpq-fe.h"

void
1550
exit_nicely(PGconn *conn)
T
Thomas G. Lockhart 已提交
1551
{
1552 1553
    PQfinish(conn);
    exit(1);
T
Thomas G. Lockhart 已提交
1554 1555 1556 1557
}

main()
{
1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
    char       *pghost,
               *pgport,
               *pgoptions,
               *pgtty;
    char       *dbName;
    int         nFields;
    int         i,
                j;

    /* FILE *debug; */

    PGconn     *conn;
    PGresult   *res;

    /*
     * begin, by setting the parameters for a backend connection if the
     * parameters are null, then the system will try to use reasonable
     * defaults by looking up environment variables or, failing that,
     * using hardwired constants
     */
    pghost = NULL;              /* host name of the backend server */
    pgport = NULL;              /* port of the backend server */
    pgoptions = NULL;           /* special options to start up the backend
                                 * server */
    pgtty = NULL;               /* debugging tty for the backend server */
    dbName = "template1";

    /* make a connection to the database */
    conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

    /*
     * check to see that the backend connection was successfully made
     */
    if (PQstatus(conn) == CONNECTION_BAD)
    {
1593 1594
        fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
        fprintf(stderr, "%s", PQerrorMessage(conn));
1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613
        exit_nicely(conn);
    }

    /* debug = fopen("/tmp/trace.out","w"); */
    /* PQtrace(conn, debug);  */

    /* start a transaction block */
    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN command failed\n");
        PQclear(res);
        exit_nicely(conn);
    }

    /*
     * should PQclear PGresult whenever it is no longer needed to avoid
     * memory leaks
     */
T
Thomas G. Lockhart 已提交
1614 1615
    PQclear(res);

1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626
    /*
     * fetch instances from the pg_database, the system catalog of
     * databases
     */
    res = PQexec(conn, "DECLARE mycursor CURSOR FOR select * from pg_database");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "DECLARE CURSOR command failed\n");
        PQclear(res);
        exit_nicely(conn);
    }
T
Thomas G. Lockhart 已提交
1627
    PQclear(res);
1628 1629 1630 1631 1632 1633
    res = PQexec(conn, "FETCH ALL in mycursor");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "FETCH ALL command didn't return tuples properly\n");
        PQclear(res);
        exit_nicely(conn);
T
Thomas G. Lockhart 已提交
1634 1635
    }

1636 1637 1638
    /* first, print out the attribute names */
    nFields = PQnfields(res);
    for (i = 0; i &lt; nFields; i++)
1639
        printf("%-15s", PQfname(res, i));
1640 1641 1642 1643 1644 1645
    printf("\n\n");

    /* next, print out the instances */
    for (i = 0; i &lt; PQntuples(res); i++)
    {
        for (j = 0; j &lt; nFields; j++)
1646
            printf("%-15s", PQgetvalue(res, i, j));
1647 1648 1649
        printf("\n");
    }
    PQclear(res);
T
Thomas G. Lockhart 已提交
1650

1651 1652 1653 1654 1655 1656 1657
    /* close the cursor */
    res = PQexec(conn, "CLOSE mycursor");
    PQclear(res);

    /* commit the transaction */
    res = PQexec(conn, "COMMIT");
    PQclear(res);
T
Thomas G. Lockhart 已提交
1658

1659 1660
    /* close the connection to the database and cleanup */
    PQfinish(conn);
T
Thomas G. Lockhart 已提交
1661

1662
    /* fclose(debug); */
T
Thomas G. Lockhart 已提交
1663
}
1664 1665 1666 1667 1668 1669 1670 1671 1672
</ProgramListing>
</Para>
</Sect2>

<Sect2>
<Title>Sample Program 2</Title>

<Para>
<ProgramListing>
T
Thomas G. Lockhart 已提交
1673
/*
1674
 * testlibpq2.c Test of the asynchronous notification interface
T
Thomas G. Lockhart 已提交
1675
 *
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691
 * populate a database with the following:
 *
 * CREATE TABLE TBL1 (i int4);
 *
 * CREATE TABLE TBL2 (i int4);
 *
 * CREATE RULE r1 AS ON INSERT TO TBL1 DO [INSERT INTO TBL2 values
 * (new.i); NOTIFY TBL2];
 *
 * Then start up this program After the program has begun, do
 *
 * INSERT INTO TBL1 values (10);
 *
 *
 *
 */
T
Thomas G. Lockhart 已提交
1692 1693 1694
#include &lt;stdio.h&gt;
#include "libpq-fe.h"

1695 1696
void
exit_nicely(PGconn *conn)
T
Thomas G. Lockhart 已提交
1697
{
1698 1699
    PQfinish(conn);
    exit(1);
T
Thomas G. Lockhart 已提交
1700 1701 1702 1703
}

main()
{
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738
    char       *pghost,
               *pgport,
               *pgoptions,
               *pgtty;
    char       *dbName;
    int         nFields;
    int         i,
                j;

    PGconn     *conn;
    PGresult   *res;
    PGnotify   *notify;

    /*
     * begin, by setting the parameters for a backend connection if the
     * parameters are null, then the system will try to use reasonable
     * defaults by looking up environment variables or, failing that,
     * using hardwired constants
     */
    pghost = NULL;              /* host name of the backend server */
    pgport = NULL;              /* port of the backend server */
    pgoptions = NULL;           /* special options to start up the backend
                                 * server */
    pgtty = NULL;               /* debugging tty for the backend server */
    dbName = getenv("USER");    /* change this to the name of your test
                                 * database */

    /* make a connection to the database */
    conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

    /*
     * check to see that the backend connection was successfully made
     */
    if (PQstatus(conn) == CONNECTION_BAD)
    {
1739 1740
        fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
        fprintf(stderr, "%s", PQerrorMessage(conn));
1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754
        exit_nicely(conn);
    }

    res = PQexec(conn, "LISTEN TBL2");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "LISTEN command failed\n");
        PQclear(res);
        exit_nicely(conn);
    }

    /*
     * should PQclear PGresult whenever it is no longer needed to avoid
     * memory leaks
T
Thomas G. Lockhart 已提交
1755
     */
1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771
    PQclear(res);

    while (1)
    {

        /*
         * wait a little bit between checks; waiting with select()
         * would be more efficient.
         */
        sleep(1);
        /* collect any asynchronous backend messages */
        PQconsumeInput(conn);
        /* check for asynchronous notify messages */
        while ((notify = PQnotifies(conn)) != NULL)
        {
            fprintf(stderr,
1772
                 "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
1773 1774 1775
                    notify-&gt;relname, notify-&gt;be_pid);
            free(notify);
        }
T
Thomas G. Lockhart 已提交
1776 1777
    }

1778 1779
    /* close the connection to the database and cleanup */
    PQfinish(conn);
T
Thomas G. Lockhart 已提交
1780 1781

}
1782 1783 1784 1785 1786 1787 1788 1789 1790
</ProgramListing>
</Para>
</Sect2>

<Sect2>
<Title>Sample Program 3</Title>

<Para>
<ProgramListing>
T
Thomas G. Lockhart 已提交
1791
/*
1792 1793
 * testlibpq3.c Test the C version of Libpq, the Postgres frontend
 * library. tests the binary cursor interface
T
Thomas G. Lockhart 已提交
1794 1795 1796
 *
 *
 *
1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814
 * populate a database by doing the following:
 *
 * CREATE TABLE test1 (i int4, d float4, p polygon);
 *
 * INSERT INTO test1 values (1, 3.567, '(3.0, 4.0, 1.0,
 * 2.0)'::polygon);
 *
 * INSERT INTO test1 values (2, 89.05, '(4.0, 3.0, 2.0,
 * 1.0)'::polygon);
 *
 * the expected output is:
 *
 * tuple 0: got i = (4 bytes) 1, d = (4 bytes) 3.567000, p = (4
 * bytes) 2 points   boundbox = (hi=3.000000/4.000000, lo =
 * 1.000000,2.000000) tuple 1: got i = (4 bytes) 2, d = (4 bytes)
 * 89.050003, p = (4 bytes) 2 points   boundbox =
 * (hi=4.000000/3.000000, lo = 2.000000,1.000000)
 *
T
Thomas G. Lockhart 已提交
1815 1816 1817 1818
 *
 */
#include &lt;stdio.h&gt;
#include "libpq-fe.h"
1819
#include "utils/geo-decls.h"    /* for the POLYGON type */
T
Thomas G. Lockhart 已提交
1820

1821 1822
void
exit_nicely(PGconn *conn)
T
Thomas G. Lockhart 已提交
1823
{
1824 1825
    PQfinish(conn);
    exit(1);
T
Thomas G. Lockhart 已提交
1826 1827 1828 1829
}

main()
{
1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866
    char       *pghost,
               *pgport,
               *pgoptions,
               *pgtty;
    char       *dbName;
    int         nFields;
    int         i,
                j;
    int         i_fnum,
                d_fnum,
                p_fnum;
    PGconn     *conn;
    PGresult   *res;

    /*
     * begin, by setting the parameters for a backend connection if the
     * parameters are null, then the system will try to use reasonable
     * defaults by looking up environment variables or, failing that,
     * using hardwired constants
     */
    pghost = NULL;              /* host name of the backend server */
    pgport = NULL;              /* port of the backend server */
    pgoptions = NULL;           /* special options to start up the backend
                                 * server */
    pgtty = NULL;               /* debugging tty for the backend server */

    dbName = getenv("USER");    /* change this to the name of your test
                                 * database */

    /* make a connection to the database */
    conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

    /*
     * check to see that the backend connection was successfully made
     */
    if (PQstatus(conn) == CONNECTION_BAD)
    {
1867 1868
        fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
        fprintf(stderr, "%s", PQerrorMessage(conn));
1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913
        exit_nicely(conn);
    }

    /* start a transaction block */
    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN command failed\n");
        PQclear(res);
        exit_nicely(conn);
    }

    /*
     * should PQclear PGresult whenever it is no longer needed to avoid
     * memory leaks
     */
    PQclear(res);

    /*
     * fetch instances from the pg_database, the system catalog of
     * databases
     */
    res = PQexec(conn, "DECLARE mycursor BINARY CURSOR FOR select * from test1");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "DECLARE CURSOR command failed\n");
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    res = PQexec(conn, "FETCH ALL in mycursor");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "FETCH ALL command didn't return tuples properly\n");
        PQclear(res);
        exit_nicely(conn);
    }

    i_fnum = PQfnumber(res, "i");
    d_fnum = PQfnumber(res, "d");
    p_fnum = PQfnumber(res, "p");

    for (i = 0; i &lt; 3; i++)
    {
1914
        printf("type[%d] = %d, size[%d] = %d\n",
1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935
               i, PQftype(res, i),
               i, PQfsize(res, i));
    }
    for (i = 0; i &lt; PQntuples(res); i++)
    {
        int        *ival;
        float      *dval;
        int         plen;
        POLYGON    *pval;

        /* we hard-wire this to the 3 fields we know about */
        ival = (int *) PQgetvalue(res, i, i_fnum);
        dval = (float *) PQgetvalue(res, i, d_fnum);
        plen = PQgetlength(res, i, p_fnum);

        /*
         * plen doesn't include the length field so need to
         * increment by VARHDSZ
         */
        pval = (POLYGON *) malloc(plen + VARHDRSZ);
        pval-&gt;size = plen;
1936 1937 1938
        memmove((char *) &amp;pval-&gt;npts, PQgetvalue(res, i, p_fnum), plen);
        printf("tuple %d: got\n", i);
        printf(" i = (%d bytes) %d,\n",
1939
               PQgetlength(res, i, i_fnum), *ival);
1940
        printf(" d = (%d bytes) %f,\n",
1941
               PQgetlength(res, i, d_fnum), *dval);
1942
        printf(" p = (%d bytes) %d points \tboundbox = (hi=%f/%f, lo = %f,%f)\n",
1943 1944 1945 1946 1947 1948 1949
               PQgetlength(res, i, d_fnum),
               pval-&gt;npts,
               pval-&gt;boundbox.xh,
               pval-&gt;boundbox.yh,
               pval-&gt;boundbox.xl,
               pval-&gt;boundbox.yl);
    }
T
Thomas G. Lockhart 已提交
1950
    PQclear(res);
1951 1952 1953

    /* close the cursor */
    res = PQexec(conn, "CLOSE mycursor");
T
Thomas G. Lockhart 已提交
1954 1955
    PQclear(res);

1956 1957
    /* commit the transaction */
    res = PQexec(conn, "COMMIT");
T
Thomas G. Lockhart 已提交
1958
    PQclear(res);
1959 1960 1961

    /* close the connection to the database and cleanup */
    PQfinish(conn);
T
Thomas G. Lockhart 已提交
1962 1963

}
1964
</ProgramListing>
1965
</Para>
1966 1967 1968 1969

</Sect2>
</Sect1>
</Chapter>