/*
* testlibpq1.cc
*	Test the C++ version of LIBPQ, the POSTGRES frontend library.
*
*  queries the template1 database for a list of database names
*
*/

#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";
	PgDatabase 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);
	}

	// start a transaction block
	if ( !data.ExecCommandOk("BEGIN") )
	{
		cerr << "BEGIN command failed" << 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");

	// End the transaction
	data.Exec("END");
	return 0;
}


