|
|
|
|
@ -8,7 +8,7 @@ |
|
|
|
|
#include <stdio.h> |
|
|
|
|
#include "libpq-fe.h" |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
static void |
|
|
|
|
exit_nicely(PGconn *conn1, PGconn *conn2) |
|
|
|
|
{ |
|
|
|
|
if (conn1) |
|
|
|
|
@ -18,8 +18,8 @@ exit_nicely(PGconn *conn1, PGconn *conn2) |
|
|
|
|
exit(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
check_conn(PGconn *conn) |
|
|
|
|
static void |
|
|
|
|
check_conn(PGconn *conn, const char* dbName) |
|
|
|
|
{ |
|
|
|
|
/* check to see that the backend connection was successfully made */ |
|
|
|
|
if (PQstatus(conn) == CONNECTION_BAD) |
|
|
|
|
@ -30,23 +30,26 @@ check_conn(PGconn *conn) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
main() |
|
|
|
|
int |
|
|
|
|
main(int argc, char** argv) |
|
|
|
|
{ |
|
|
|
|
char *pghost, |
|
|
|
|
*pgport, |
|
|
|
|
*pgoptions, |
|
|
|
|
*pgtty; |
|
|
|
|
char *dbName1, |
|
|
|
|
dbName2; |
|
|
|
|
*dbName2; |
|
|
|
|
char *tblName; |
|
|
|
|
int nFields; |
|
|
|
|
int i, |
|
|
|
|
j; |
|
|
|
|
|
|
|
|
|
PGconn *conn1, |
|
|
|
|
conn2; |
|
|
|
|
PGresult *res1, |
|
|
|
|
res2; |
|
|
|
|
*conn2; |
|
|
|
|
/* PGresult *res1,
|
|
|
|
|
* *res2; |
|
|
|
|
*/ |
|
|
|
|
PGresult *res1; |
|
|
|
|
|
|
|
|
|
if (argc != 4) |
|
|
|
|
{ |
|
|
|
|
@ -73,10 +76,10 @@ main() |
|
|
|
|
|
|
|
|
|
/* make a connection to the database */ |
|
|
|
|
conn1 = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName1); |
|
|
|
|
check_conn(conn1); |
|
|
|
|
check_conn(conn1, dbName1); |
|
|
|
|
|
|
|
|
|
conn2 = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName2); |
|
|
|
|
check_conn(conn2); |
|
|
|
|
check_conn(conn2, dbName2); |
|
|
|
|
|
|
|
|
|
/* start a transaction block */ |
|
|
|
|
res1 = PQexec(conn1, "BEGIN"); |
|
|
|
|
@ -97,53 +100,54 @@ main() |
|
|
|
|
* fetch instances from the pg_database, the system catalog of |
|
|
|
|
* databases |
|
|
|
|
*/ |
|
|
|
|
res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database"); |
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) |
|
|
|
|
res1 = PQexec(conn1, "DECLARE myportal CURSOR FOR select * from pg_database"); |
|
|
|
|
if (PQresultStatus(res1) != PGRES_COMMAND_OK) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "DECLARE CURSOR command failed\n"); |
|
|
|
|
PQclear(res); |
|
|
|
|
exit_nicely(conn); |
|
|
|
|
PQclear(res1); |
|
|
|
|
exit_nicely(conn1,(PGconn*)NULL); |
|
|
|
|
} |
|
|
|
|
PQclear(res); |
|
|
|
|
PQclear(res1); |
|
|
|
|
|
|
|
|
|
res = PQexec(conn, "FETCH ALL in myportal"); |
|
|
|
|
if (PQresultStatus(res) != PGRES_TUPLES_OK) |
|
|
|
|
res1 = PQexec(conn1, "FETCH ALL in myportal"); |
|
|
|
|
if (PQresultStatus(res1) != PGRES_TUPLES_OK) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "FETCH ALL command didn't return tuples properly\n"); |
|
|
|
|
PQclear(res); |
|
|
|
|
exit_nicely(conn); |
|
|
|
|
PQclear(res1); |
|
|
|
|
exit_nicely(conn1,(PGconn*)NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* first, print out the attribute names */ |
|
|
|
|
nFields = PQnfields(res); |
|
|
|
|
nFields = PQnfields(res1); |
|
|
|
|
for (i = 0; i < nFields; i++) |
|
|
|
|
{ |
|
|
|
|
printf("%-15s", PQfname(res, i)); |
|
|
|
|
printf("%-15s", PQfname(res1, i)); |
|
|
|
|
} |
|
|
|
|
printf("\n\n"); |
|
|
|
|
|
|
|
|
|
/* next, print out the instances */ |
|
|
|
|
for (i = 0; i < PQntuples(res); i++) |
|
|
|
|
for (i = 0; i < PQntuples(res1); i++) |
|
|
|
|
{ |
|
|
|
|
for (j = 0; j < nFields; j++) |
|
|
|
|
{ |
|
|
|
|
printf("%-15s", PQgetvalue(res, i, j)); |
|
|
|
|
printf("%-15s", PQgetvalue(res1, i, j)); |
|
|
|
|
} |
|
|
|
|
printf("\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PQclear(res); |
|
|
|
|
PQclear(res1); |
|
|
|
|
|
|
|
|
|
/* close the portal */ |
|
|
|
|
res = PQexec(conn, "CLOSE myportal"); |
|
|
|
|
PQclear(res); |
|
|
|
|
res1 = PQexec(conn1, "CLOSE myportal"); |
|
|
|
|
PQclear(res1); |
|
|
|
|
|
|
|
|
|
/* end the transaction */ |
|
|
|
|
res = PQexec(conn, "END"); |
|
|
|
|
PQclear(res); |
|
|
|
|
res1 = PQexec(conn1, "END"); |
|
|
|
|
PQclear(res1); |
|
|
|
|
|
|
|
|
|
/* close the connection to the database and cleanup */ |
|
|
|
|
PQfinish(conn); |
|
|
|
|
PQfinish(conn1); |
|
|
|
|
|
|
|
|
|
/* fclose(debug); */ |
|
|
|
|
return 0; /* Though PQfinish(conn1) has called exit(1) */ |
|
|
|
|
} |
|
|
|
|
|