|
|
|
@ -1,6 +1,6 @@ |
|
|
|
.\" This is -*-nroff-*- |
|
|
|
.\" This is -*-nroff-*- |
|
|
|
.\" XXX standard disclaimer belongs here.... |
|
|
|
.\" XXX standard disclaimer belongs here.... |
|
|
|
.\" $Header: /cvsroot/pgsql/src/man/Attic/libpq.3,v 1.17 1998/06/24 13:21:27 momjian Exp $ |
|
|
|
.\" $Header: /cvsroot/pgsql/src/man/Attic/libpq.3,v 1.18 1998/07/04 17:50:04 momjian Exp $ |
|
|
|
.TH LIBPQ INTRO 03/12/94 PostgreSQL PostgreSQL |
|
|
|
.TH LIBPQ INTRO 03/12/94 PostgreSQL PostgreSQL |
|
|
|
.SH DESCRIPTION |
|
|
|
.SH DESCRIPTION |
|
|
|
Libpq is the programmer's interface to Postgres. Libpq is a set of |
|
|
|
Libpq is the programmer's interface to Postgres. Libpq is a set of |
|
|
|
@ -109,8 +109,14 @@ The following routines deal with making a connection to a backend |
|
|
|
from a C program. |
|
|
|
from a C program. |
|
|
|
.PP |
|
|
|
.PP |
|
|
|
.B PQsetdb |
|
|
|
.B PQsetdb |
|
|
|
|
|
|
|
.br |
|
|
|
|
|
|
|
.B PQsetdbLogin |
|
|
|
.IP |
|
|
|
.IP |
|
|
|
Makes a new connection to a backend. |
|
|
|
Makes a new connection to a backend. |
|
|
|
|
|
|
|
.B PQsetdb |
|
|
|
|
|
|
|
is the method usually used to |
|
|
|
|
|
|
|
connect to the database when username/password authentication is not |
|
|
|
|
|
|
|
needed. |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
PGconn *PQsetdb(char *pghost, |
|
|
|
PGconn *PQsetdb(char *pghost, |
|
|
|
char *pgport, |
|
|
|
char *pgport, |
|
|
|
@ -118,12 +124,30 @@ PGconn *PQsetdb(char *pghost, |
|
|
|
char *pgtty, |
|
|
|
char *pgtty, |
|
|
|
char *dbName); |
|
|
|
char *dbName); |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.IP |
|
|
|
|
|
|
|
.B PQsetdbLogin |
|
|
|
|
|
|
|
is the method used to |
|
|
|
|
|
|
|
connect to the database when username/password authentication is |
|
|
|
|
|
|
|
needed. |
|
|
|
|
|
|
|
.nf |
|
|
|
|
|
|
|
PGconn *PQsetdbLogin(char *pghost, |
|
|
|
|
|
|
|
char *pgport, |
|
|
|
|
|
|
|
char *pgoptions, |
|
|
|
|
|
|
|
char *pgtty, |
|
|
|
|
|
|
|
char *dbName, |
|
|
|
|
|
|
|
char *login, |
|
|
|
|
|
|
|
char *pwd); |
|
|
|
|
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
If any argument is NULL, then the corresponding environment variable |
|
|
|
If any argument is NULL, then the corresponding environment variable |
|
|
|
is checked. If the environment variable is also not set, then hardwired |
|
|
|
is checked. If the environment variable is also not set, then hardwired |
|
|
|
defaults are used. |
|
|
|
defaults are used. |
|
|
|
.IP |
|
|
|
.IP |
|
|
|
.I PQsetdb |
|
|
|
.I PQsetdb |
|
|
|
always returns a valid PGconn pointer. The |
|
|
|
and |
|
|
|
|
|
|
|
.I PQsetdbLogin |
|
|
|
|
|
|
|
always return a valid PGconn pointer. The |
|
|
|
.I PQstatus |
|
|
|
.I PQstatus |
|
|
|
(see below) command should be called to ensure that a connection was |
|
|
|
(see below) command should be called to ensure that a connection was |
|
|
|
properly made before queries are sent via the connection. Libpq |
|
|
|
properly made before queries are sent via the connection. Libpq |
|
|
|
@ -132,37 +156,44 @@ the accessor functions below to get at the contents of PGconn. Avoid |
|
|
|
directly referencing the fields of the PGconn structure as they are |
|
|
|
directly referencing the fields of the PGconn structure as they are |
|
|
|
subject to change in the future. |
|
|
|
subject to change in the future. |
|
|
|
.IP |
|
|
|
.IP |
|
|
|
|
|
|
|
|
|
|
|
.B PQdb |
|
|
|
.B PQdb |
|
|
|
returns the database name of the connection. |
|
|
|
returns the database name of the connection. |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
char *PQdb(PGconn *conn) |
|
|
|
char *PQdb(PGconn *conn) |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
.B PQhost |
|
|
|
.B PQhost |
|
|
|
returns the host name of the connection. |
|
|
|
returns the host name of the connection. |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
char *PQhost(PGconn *conn) |
|
|
|
char *PQhost(PGconn *conn) |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
.B PQoptions |
|
|
|
.B PQoptions |
|
|
|
returns the pgoptions used in the connection. |
|
|
|
returns the pgoptions used in the connection. |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
char *PQoptions(PGconn *conn) |
|
|
|
char *PQoptions(PGconn *conn) |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
.B PQport |
|
|
|
.B PQport |
|
|
|
returns the pgport of the connection. |
|
|
|
returns the pgport of the connection. |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
char *PQport(PGconn *conn) |
|
|
|
char *PQport(PGconn *conn) |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
.B PQtty |
|
|
|
.B PQtty |
|
|
|
returns the pgtty of the connection. |
|
|
|
returns the pgtty of the connection. |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
char *PQtty(PGconn *conn) |
|
|
|
char *PQtty(PGconn *conn) |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
.B PQstatus |
|
|
|
.B PQstatus |
|
|
|
Returns the status of the connection. The status can be CONNECTION_OK or |
|
|
|
Returns the status of the connection. The status can be CONNECTION_OK or |
|
|
|
CONNECTION_BAD. |
|
|
|
CONNECTION_BAD. |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
ConnStatusType *PQstatus(PGconn *conn) |
|
|
|
ConnStatusType *PQstatus(PGconn *conn) |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
.B PQerrorMessage |
|
|
|
.B PQerrorMessage |
|
|
|
returns the error message associated with the connection |
|
|
|
returns the error message associated with the connection |
|
|
|
.nf |
|
|
|
.nf |
|
|
|
@ -654,23 +685,30 @@ exit_nicely(PGconn* conn) |
|
|
|
|
|
|
|
|
|
|
|
main() |
|
|
|
main() |
|
|
|
{ |
|
|
|
{ |
|
|
|
char *pghost, *pgport, *pgoptions, *pgtty; |
|
|
|
char *pghost, |
|
|
|
|
|
|
|
*pgport, |
|
|
|
|
|
|
|
*pgoptions, |
|
|
|
|
|
|
|
*pgtty; |
|
|
|
char *dbName; |
|
|
|
char *dbName; |
|
|
|
int nFields; |
|
|
|
int nFields; |
|
|
|
int i,j; |
|
|
|
int i, |
|
|
|
|
|
|
|
j; |
|
|
|
|
|
|
|
|
|
|
|
/* FILE *debug; */ |
|
|
|
/* FILE *debug; */ |
|
|
|
|
|
|
|
|
|
|
|
PGconn *conn; |
|
|
|
PGconn *conn; |
|
|
|
PGresult *res; |
|
|
|
PGresult *res; |
|
|
|
|
|
|
|
|
|
|
|
/* begin, by setting the parameters for a backend connection |
|
|
|
/* |
|
|
|
if the parameters are null, then the system will try to use |
|
|
|
* begin, by setting the parameters for a backend connection if the |
|
|
|
reasonable defaults by looking up environment variables |
|
|
|
* parameters are null, then the system will try to use reasonable |
|
|
|
or, failing that, using hardwired constants */ |
|
|
|
* defaults by looking up environment variables or, failing that, |
|
|
|
|
|
|
|
* using hardwired constants |
|
|
|
|
|
|
|
*/ |
|
|
|
pghost = NULL; /* host name of the backend server */ |
|
|
|
pghost = NULL; /* host name of the backend server */ |
|
|
|
pgport = NULL; /* port of the backend server */ |
|
|
|
pgport = NULL; /* port of the backend server */ |
|
|
|
pgoptions = NULL; /* special options to start up the backend server */ |
|
|
|
pgoptions = NULL; /* special options to start up the backend |
|
|
|
|
|
|
|
* server */ |
|
|
|
pgtty = NULL; /* debugging tty for the backend server */ |
|
|
|
pgtty = NULL; /* debugging tty for the backend server */ |
|
|
|
dbName = "template1"; |
|
|
|
dbName = "template1"; |
|
|
|
|
|
|
|
|
|
|
|
@ -678,7 +716,8 @@ main() |
|
|
|
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); |
|
|
|
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); |
|
|
|
|
|
|
|
|
|
|
|
/* check to see that the backend connection was successfully made */ |
|
|
|
/* check to see that the backend connection was successfully made */ |
|
|
|
if (PQstatus(conn) == CONNECTION_BAD) { |
|
|
|
if (PQstatus(conn) == CONNECTION_BAD) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "Connection to database '%s' failed.\\n", dbName); |
|
|
|
fprintf(stderr, "Connection to database '%s' failed.\\n", dbName); |
|
|
|
fprintf(stderr, "%s", PQerrorMessage(conn)); |
|
|
|
fprintf(stderr, "%s", PQerrorMessage(conn)); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
@ -689,18 +728,26 @@ main() |
|
|
|
|
|
|
|
|
|
|
|
/* start a transaction block */ |
|
|
|
/* start a transaction block */ |
|
|
|
res = PQexec(conn, "BEGIN"); |
|
|
|
res = PQexec(conn, "BEGIN"); |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "BEGIN command failed\\n"); |
|
|
|
fprintf(stderr, "BEGIN command failed\\n"); |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
} |
|
|
|
} |
|
|
|
/* should PQclear PGresult whenever it is no longer needed to avoid |
|
|
|
|
|
|
|
memory leaks */ |
|
|
|
/* |
|
|
|
|
|
|
|
* should PQclear PGresult whenever it is no longer needed to avoid |
|
|
|
|
|
|
|
* memory leaks |
|
|
|
|
|
|
|
*/ |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
|
|
/* fetch instances from the pg_database, the system catalog of databases*/ |
|
|
|
/* |
|
|
|
|
|
|
|
* fetch instances from the pg_database, the system catalog of |
|
|
|
|
|
|
|
* databases |
|
|
|
|
|
|
|
*/ |
|
|
|
res = PQexec(conn, "DECLARE mycursor CURSOR FOR select * from pg_database"); |
|
|
|
res = PQexec(conn, "DECLARE mycursor CURSOR FOR select * from pg_database"); |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "DECLARE CURSOR command failed\\n"); |
|
|
|
fprintf(stderr, "DECLARE CURSOR command failed\\n"); |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
@ -708,7 +755,8 @@ main() |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
|
|
res = PQexec(conn, "FETCH ALL in mycursor"); |
|
|
|
res = PQexec(conn, "FETCH ALL in mycursor"); |
|
|
|
if (PQresultStatus(res) != PGRES_TUPLES_OK) { |
|
|
|
if (PQresultStatus(res) != PGRES_TUPLES_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "FETCH ALL command didn't return tuples properly\\n"); |
|
|
|
fprintf(stderr, "FETCH ALL command didn't return tuples properly\\n"); |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
@ -716,16 +764,15 @@ main() |
|
|
|
|
|
|
|
|
|
|
|
/* first, print out the attribute names */ |
|
|
|
/* first, print out the attribute names */ |
|
|
|
nFields = PQnfields(res); |
|
|
|
nFields = PQnfields(res); |
|
|
|
for (i=0; i < nFields; i++) { |
|
|
|
for (i = 0; i < nFields; i++) |
|
|
|
printf("%-15s", PQfname(res, i)); |
|
|
|
printf("%-15s", PQfname(res, i)); |
|
|
|
} |
|
|
|
|
|
|
|
printf("\\n\\n"); |
|
|
|
printf("\\n\\n"); |
|
|
|
|
|
|
|
|
|
|
|
/* next, print out the instances */ |
|
|
|
/* next, print out the instances */ |
|
|
|
for (i=0; i < PQntuples(res); i++) { |
|
|
|
for (i = 0; i < PQntuples(res); i++) |
|
|
|
for (j=0 ; j < nFields; j++) { |
|
|
|
{ |
|
|
|
|
|
|
|
for (j = 0; j < nFields; j++) |
|
|
|
printf("%-15s", PQgetvalue(res, i, j)); |
|
|
|
printf("%-15s", PQgetvalue(res, i, j)); |
|
|
|
} |
|
|
|
|
|
|
|
printf("\\n"); |
|
|
|
printf("\\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -744,6 +791,7 @@ main() |
|
|
|
|
|
|
|
|
|
|
|
/* fclose(debug); */ |
|
|
|
/* fclose(debug); */ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.fi |
|
|
|
.fi |
|
|
|
.bp |
|
|
|
.bp |
|
|
|
.SH "Sample Program 2" |
|
|
|
.SH "Sample Program 2" |
|
|
|
@ -772,7 +820,8 @@ INSERT INTO TBL1 values (10); |
|
|
|
#include <stdio.h> |
|
|
|
#include <stdio.h> |
|
|
|
#include "libpq-fe.h" |
|
|
|
#include "libpq-fe.h" |
|
|
|
|
|
|
|
|
|
|
|
void exit_nicely(PGconn* conn) |
|
|
|
void |
|
|
|
|
|
|
|
exit_nicely(PGconn *conn) |
|
|
|
{ |
|
|
|
{ |
|
|
|
PQfinish(conn); |
|
|
|
PQfinish(conn); |
|
|
|
exit(1); |
|
|
|
exit(1); |
|
|
|
@ -780,53 +829,68 @@ void exit_nicely(PGconn* conn) |
|
|
|
|
|
|
|
|
|
|
|
main() |
|
|
|
main() |
|
|
|
{ |
|
|
|
{ |
|
|
|
char *pghost, *pgport, *pgoptions, *pgtty; |
|
|
|
char *pghost, |
|
|
|
|
|
|
|
*pgport, |
|
|
|
|
|
|
|
*pgoptions, |
|
|
|
|
|
|
|
*pgtty; |
|
|
|
char *dbName; |
|
|
|
char *dbName; |
|
|
|
int nFields; |
|
|
|
int nFields; |
|
|
|
int i,j; |
|
|
|
int i, |
|
|
|
|
|
|
|
j; |
|
|
|
|
|
|
|
|
|
|
|
PGconn *conn; |
|
|
|
PGconn *conn; |
|
|
|
PGresult *res; |
|
|
|
PGresult *res; |
|
|
|
PGnotify *notify; |
|
|
|
PGnotify *notify; |
|
|
|
|
|
|
|
|
|
|
|
/* begin, by setting the parameters for a backend connection |
|
|
|
/* |
|
|
|
if the parameters are null, then the system will try to use |
|
|
|
* begin, by setting the parameters for a backend connection if the |
|
|
|
reasonable defaults by looking up environment variables |
|
|
|
* parameters are null, then the system will try to use reasonable |
|
|
|
or, failing that, using hardwired constants */ |
|
|
|
* defaults by looking up environment variables or, failing that, |
|
|
|
|
|
|
|
* using hardwired constants |
|
|
|
|
|
|
|
*/ |
|
|
|
pghost = NULL; /* host name of the backend server */ |
|
|
|
pghost = NULL; /* host name of the backend server */ |
|
|
|
pgport = NULL; /* port of the backend server */ |
|
|
|
pgport = NULL; /* port of the backend server */ |
|
|
|
pgoptions = NULL; /* special options to start up the backend server */ |
|
|
|
pgoptions = NULL; /* special options to start up the backend |
|
|
|
|
|
|
|
* server */ |
|
|
|
pgtty = NULL; /* debugging tty for the backend server */ |
|
|
|
pgtty = NULL; /* debugging tty for the backend server */ |
|
|
|
dbName = getenv("USER"); /* change this to the name of your test database*/ |
|
|
|
dbName = getenv("USER"); /* change this to the name of your test |
|
|
|
|
|
|
|
* database */ |
|
|
|
|
|
|
|
|
|
|
|
/* make a connection to the database */ |
|
|
|
/* make a connection to the database */ |
|
|
|
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); |
|
|
|
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); |
|
|
|
|
|
|
|
|
|
|
|
/* check to see that the backend connection was successfully made */ |
|
|
|
/* check to see that the backend connection was successfully made */ |
|
|
|
if (PQstatus(conn) == CONNECTION_BAD) { |
|
|
|
if (PQstatus(conn) == CONNECTION_BAD) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "Connection to database '%s' failed.\\n", dbName); |
|
|
|
fprintf(stderr, "Connection to database '%s' failed.\\n", dbName); |
|
|
|
fprintf(stderr, "%s", PQerrorMessage(conn)); |
|
|
|
fprintf(stderr, "%s", PQerrorMessage(conn)); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
res = PQexec(conn, "LISTEN TBL2"); |
|
|
|
res = PQexec(conn, "LISTEN TBL2"); |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "LISTEN command failed\\n"); |
|
|
|
fprintf(stderr, "LISTEN command failed\\n"); |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
} |
|
|
|
} |
|
|
|
/* should PQclear PGresult whenever it is no longer needed to avoid |
|
|
|
|
|
|
|
memory leaks */ |
|
|
|
/* |
|
|
|
|
|
|
|
* should PQclear PGresult whenever it is no longer needed to avoid |
|
|
|
|
|
|
|
* memory leaks |
|
|
|
|
|
|
|
*/ |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
|
|
while (1) { |
|
|
|
while (1) |
|
|
|
|
|
|
|
{ |
|
|
|
/* async notification only come back as a result of a query */ |
|
|
|
/* async notification only come back as a result of a query */ |
|
|
|
/* we can send empty queries */ |
|
|
|
/* we can send empty queries */ |
|
|
|
res = PQexec(conn, ""); |
|
|
|
res = PQexec(conn, ""); |
|
|
|
/* printf("res->status = %s\\n", pgresStatus[PQresultStatus(res)]); */ |
|
|
|
/* printf("res->status = %s\\n", pgresStatus[PQresultStatus(res)]); */ |
|
|
|
/* check for asynchronous returns */ |
|
|
|
/* check for asynchronous returns */ |
|
|
|
notify = PQnotifies(conn); |
|
|
|
notify = PQnotifies(conn); |
|
|
|
if (notify) { |
|
|
|
if (notify) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, |
|
|
|
fprintf(stderr, |
|
|
|
"ASYNC NOTIFY of '%s' from backend pid '%d' received\\n", |
|
|
|
"ASYNC NOTIFY of '%s' from backend pid '%d' received\\n", |
|
|
|
notify->relname, notify->be_pid); |
|
|
|
notify->relname, notify->be_pid); |
|
|
|
@ -840,6 +904,7 @@ main() |
|
|
|
PQfinish(conn); |
|
|
|
PQfinish(conn); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.fi |
|
|
|
.fi |
|
|
|
.bp |
|
|
|
.bp |
|
|
|
.SH "Sample Program 3" |
|
|
|
.SH "Sample Program 3" |
|
|
|
@ -877,7 +942,8 @@ tuple 1: got |
|
|
|
#include "libpq-fe.h" |
|
|
|
#include "libpq-fe.h" |
|
|
|
#include "utils/geo-decls.h" /* for the POLYGON type */ |
|
|
|
#include "utils/geo-decls.h" /* for the POLYGON type */ |
|
|
|
|
|
|
|
|
|
|
|
void exit_nicely(PGconn* conn) |
|
|
|
void |
|
|
|
|
|
|
|
exit_nicely(PGconn *conn) |
|
|
|
{ |
|
|
|
{ |
|
|
|
PQfinish(conn); |
|
|
|
PQfinish(conn); |
|
|
|
exit(1); |
|
|
|
exit(1); |
|
|
|
@ -885,31 +951,42 @@ void exit_nicely(PGconn* conn) |
|
|
|
|
|
|
|
|
|
|
|
main() |
|
|
|
main() |
|
|
|
{ |
|
|
|
{ |
|
|
|
char *pghost, *pgport, *pgoptions, *pgtty; |
|
|
|
char *pghost, |
|
|
|
|
|
|
|
*pgport, |
|
|
|
|
|
|
|
*pgoptions, |
|
|
|
|
|
|
|
*pgtty; |
|
|
|
char *dbName; |
|
|
|
char *dbName; |
|
|
|
int nFields; |
|
|
|
int nFields; |
|
|
|
int i,j; |
|
|
|
int i, |
|
|
|
int i_fnum, d_fnum, p_fnum; |
|
|
|
j; |
|
|
|
|
|
|
|
int i_fnum, |
|
|
|
|
|
|
|
d_fnum, |
|
|
|
|
|
|
|
p_fnum; |
|
|
|
|
|
|
|
|
|
|
|
PGconn *conn; |
|
|
|
PGconn *conn; |
|
|
|
PGresult *res; |
|
|
|
PGresult *res; |
|
|
|
|
|
|
|
|
|
|
|
/* begin, by setting the parameters for a backend connection |
|
|
|
/* |
|
|
|
if the parameters are null, then the system will try to use |
|
|
|
* begin, by setting the parameters for a backend connection if the |
|
|
|
reasonable defaults by looking up environment variables |
|
|
|
* parameters are null, then the system will try to use reasonable |
|
|
|
or, failing that, using hardwired constants */ |
|
|
|
* defaults by looking up environment variables or, failing that, |
|
|
|
|
|
|
|
* using hardwired constants |
|
|
|
|
|
|
|
*/ |
|
|
|
pghost = NULL; /* host name of the backend server */ |
|
|
|
pghost = NULL; /* host name of the backend server */ |
|
|
|
pgport = NULL; /* port of the backend server */ |
|
|
|
pgport = NULL; /* port of the backend server */ |
|
|
|
pgoptions = NULL; /* special options to start up the backend server */ |
|
|
|
pgoptions = NULL; /* special options to start up the backend |
|
|
|
|
|
|
|
* server */ |
|
|
|
pgtty = NULL; /* debugging tty for the backend server */ |
|
|
|
pgtty = NULL; /* debugging tty for the backend server */ |
|
|
|
|
|
|
|
|
|
|
|
dbName = getenv("USER"); /* change this to the name of your test database*/ |
|
|
|
dbName = getenv("USER"); /* change this to the name of your test |
|
|
|
|
|
|
|
* database */ |
|
|
|
|
|
|
|
|
|
|
|
/* make a connection to the database */ |
|
|
|
/* make a connection to the database */ |
|
|
|
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); |
|
|
|
conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); |
|
|
|
|
|
|
|
|
|
|
|
/* check to see that the backend connection was successfully made */ |
|
|
|
/* check to see that the backend connection was successfully made */ |
|
|
|
if (PQstatus(conn) == CONNECTION_BAD) { |
|
|
|
if (PQstatus(conn) == CONNECTION_BAD) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "Connection to database '%s' failed.\\n", dbName); |
|
|
|
fprintf(stderr, "Connection to database '%s' failed.\\n", dbName); |
|
|
|
fprintf(stderr, "%s", PQerrorMessage(conn)); |
|
|
|
fprintf(stderr, "%s", PQerrorMessage(conn)); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
@ -917,18 +994,26 @@ main() |
|
|
|
|
|
|
|
|
|
|
|
/* start a transaction block */ |
|
|
|
/* start a transaction block */ |
|
|
|
res = PQexec(conn, "BEGIN"); |
|
|
|
res = PQexec(conn, "BEGIN"); |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "BEGIN command failed\\n"); |
|
|
|
fprintf(stderr, "BEGIN command failed\\n"); |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
} |
|
|
|
} |
|
|
|
/* should PQclear PGresult whenever it is no longer needed to avoid |
|
|
|
|
|
|
|
memory leaks */ |
|
|
|
/* |
|
|
|
|
|
|
|
* should PQclear PGresult whenever it is no longer needed to avoid |
|
|
|
|
|
|
|
* memory leaks |
|
|
|
|
|
|
|
*/ |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
|
|
/* fetch instances from the pg_database, the system catalog of databases*/ |
|
|
|
/* |
|
|
|
|
|
|
|
* fetch instances from the pg_database, the system catalog of |
|
|
|
|
|
|
|
* databases |
|
|
|
|
|
|
|
*/ |
|
|
|
res = PQexec(conn, "DECLARE mycursor BINARY CURSOR FOR select * from test1"); |
|
|
|
res = PQexec(conn, "DECLARE mycursor BINARY CURSOR FOR select * from test1"); |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "DECLARE CURSOR command failed\\n"); |
|
|
|
fprintf(stderr, "DECLARE CURSOR command failed\\n"); |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
@ -936,7 +1021,8 @@ main() |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
|
|
res = PQexec(conn, "FETCH ALL in mycursor"); |
|
|
|
res = PQexec(conn, "FETCH ALL in mycursor"); |
|
|
|
if (PQresultStatus(res) != PGRES_TUPLES_OK) { |
|
|
|
if (PQresultStatus(res) != PGRES_TUPLES_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
fprintf(stderr, "FETCH ALL command didn't return tuples properly\\n"); |
|
|
|
fprintf(stderr, "FETCH ALL command didn't return tuples properly\\n"); |
|
|
|
PQclear(res); |
|
|
|
PQclear(res); |
|
|
|
exit_nicely(conn); |
|
|
|
exit_nicely(conn); |
|
|
|
@ -946,22 +1032,28 @@ main() |
|
|
|
d_fnum = PQfnumber(res, "d"); |
|
|
|
d_fnum = PQfnumber(res, "d"); |
|
|
|
p_fnum = PQfnumber(res, "p"); |
|
|
|
p_fnum = PQfnumber(res, "p"); |
|
|
|
|
|
|
|
|
|
|
|
for (i=0;i<3;i++) { |
|
|
|
for (i = 0; i < 3; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
printf("type[%d] = %d, size[%d] = %d\\n", |
|
|
|
printf("type[%d] = %d, size[%d] = %d\\n", |
|
|
|
i, PQftype(res, i), |
|
|
|
i, PQftype(res, i), |
|
|
|
i, PQfsize(res, i)); |
|
|
|
i, PQfsize(res, i)); |
|
|
|
} |
|
|
|
} |
|
|
|
for (i=0; i < PQntuples(res); i++) { |
|
|
|
for (i = 0; i < PQntuples(res); i++) |
|
|
|
|
|
|
|
{ |
|
|
|
int *ival; |
|
|
|
int *ival; |
|
|
|
float *dval; |
|
|
|
float *dval; |
|
|
|
int plen; |
|
|
|
int plen; |
|
|
|
POLYGON *pval; |
|
|
|
POLYGON *pval; |
|
|
|
|
|
|
|
|
|
|
|
/* we hard-wire this to the 3 fields we know about */ |
|
|
|
/* we hard-wire this to the 3 fields we know about */ |
|
|
|
ival = (int *) PQgetvalue(res, i, i_fnum); |
|
|
|
ival = (int *) PQgetvalue(res, i, i_fnum); |
|
|
|
dval = (float *) PQgetvalue(res, i, d_fnum); |
|
|
|
dval = (float *) PQgetvalue(res, i, d_fnum); |
|
|
|
plen = PQgetlength(res, i, p_fnum); |
|
|
|
plen = PQgetlength(res, i, p_fnum); |
|
|
|
|
|
|
|
|
|
|
|
/* plen doesn't include the length field so need to increment by VARHDSZ*/ |
|
|
|
/* |
|
|
|
|
|
|
|
* plen doesn't include the length field so need to increment by |
|
|
|
|
|
|
|
* VARHDSZ |
|
|
|
|
|
|
|
*/ |
|
|
|
pval = (POLYGON *) malloc(plen + VARHDRSZ); |
|
|
|
pval = (POLYGON *) malloc(plen + VARHDRSZ); |
|
|
|
pval->size = plen; |
|
|
|
pval->size = plen; |
|
|
|
memmove((char *) &pval->npts, PQgetvalue(res, i, p_fnum), plen); |
|
|
|
memmove((char *) &pval->npts, PQgetvalue(res, i, p_fnum), plen); |
|
|
|
@ -994,4 +1086,3 @@ main() |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
.fi |
|
|
|
.fi |
|
|
|
|
|
|
|
|
|
|
|
|