aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/libpq++/examples/testlibpq2.cc
blob: 9bad37e3cdf6f18ce3e3f09d0c206aef4c30dd19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
* testlibpq2.cc
*	Test the C++ version of LIBPQ, the POSTGRES frontend library.
*
*  queries the template1 database for a list of database names using transaction block
*
*/

#include <iostream.h>
#include <iomanip.h>
#include "libpq++.h"

int main()
{
	// Begin, by establishing a connection to the backend.
	// When no parameters are given then the system will
	// try to use reasonable defaults by looking up environment variables
	// or, failing that, using hardwired constants
	const char* dbName = "dbname=template1";
	PgTransaction data(dbName);

	// check to see that the backend connection was successfully made
	if ( data.ConnectionBad() )
	{
		cerr << "Connection to database '" << dbName << "' failed." << endl
		<< "Error returned: " << data.ErrorMessage() << endl;
		exit(1);
	}

	// submit command to the backend
	if ( !data.ExecCommandOk("DECLARE myportal CURSOR FOR select * from pg_database") )
	{
		cerr << "DECLARE CURSOR command failed" << endl;
		exit(1);
	}

	// fetch instances from the pg_database, the system catalog of databases
	if ( !data.ExecTuplesOk("FETCH ALL in myportal") )
	{
		cerr << "FETCH ALL command didn't return tuples properly" << endl;
		exit(1);
	}

	// first, print out the attribute names
	int nFields = data.Fields();
	for (int i = 0; i < nFields; i++)
		cout << setiosflags(ios::right) << setw(15) << data.FieldName(i);
	cout << endl << endl;

	// next, print out the instances
	for (int i = 0; i < data.Tuples(); i++)
	{
		for (int j = 0; j < nFields; j++)
			cout << setiosflags(ios::right) << setw(15) << data.GetValue(i, j);
		cout << endl;
	}

	// close the portal
	data.Exec("CLOSE myportal");
	return 0;
}