/*
* testlibpq3.cc
*	Test the C++ version of LIBPQ, the POSTGRES frontend library.
*
*  queries the template1 database for a list of database names using transaction block
*  and cursor interface.
*
*/

#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.
	// Create a cursor database query object.
	// All queries using cursor will be performed through this object.
	const char* dbName = "dbname=template1";
	PgCursor cData(dbName, "myportal");

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

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

	// fetch instances from the pg_cDatabase, the system catalog of cDatabases
	if ( !cData.Fetch() )
	{
		cerr << "FETCH ALL command didn't return tuples properly" << endl;
		exit(1);
	}

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

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