/*-------------------------------------------------------------------------
 *
 *   FILE
 *	pgcursordb.cpp
 *
 *   DESCRIPTION
 *      implementation of the PgCursor class.
 *   PgCursor encapsulates a cursor interface to the backend
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 *
 *-------------------------------------------------------------------------
 */
 
 #include "pgcursordb.h"

static char rcsid[] = "$Id: pgcursordb.cc,v 1.2 1999/05/23 01:04:01 momjian Exp $";

 
 
// ****************************************************************
//
// PgCursor Implementation
//
// ****************************************************************
// Make a connection to the specified database with default environment
// See PQconnectdb() for conninfo usage
PgCursor::PgCursor(const char* conninfo, const char* cursor)
   : PgTransaction(conninfo), pgCursor(cursor)
{}

// Do not make a connection to the backend -- just query
// Connection should not be closed after the object destructs since some
// other object is using the connection
PgCursor::PgCursor(const PgConnection& conn, const char* cursor)
   : PgTransaction(conn), pgCursor(cursor)
{}

// Destructor: End the transaction block
PgCursor::~PgCursor()
{
	Close();
}


// ****************************************************************
//
// PgCursor: Cursor Interface Implementation
//
// ****************************************************************
// Declare a cursor: name has already been supplied in the constructor
int PgCursor::Declare(const string& query, int binary)
{
	string cmd = "DECLARE " + pgCursor;
	if ( binary )
	     cmd += " BINARY";
	cmd += " CURSOR FOR " + query;
	return ExecCommandOk( cmd.c_str() );
} // End Declare()

// Fetch ALL tuples in given direction
int PgCursor::Fetch(const char* dir)
{
	return Fetch("ALL", dir);
} // End Fetch()

// Fetch specified amount of tuples in given direction
int PgCursor::Fetch(unsigned num, const char* dir)
{
	return Fetch( IntToString(num), dir );
} // End Fetch()

// Create and execute the actual fetch command with the given arguments
int PgCursor::Fetch(const string& num, const string& dir)
{
	string cmd = "FETCH " + dir + " " + num + " IN " + pgCursor;
	return ExecTuplesOk( cmd.c_str() );
} // End Fetch()

// Close the cursor: no more queries using the cursor should be allowed
// Actually, the backend should take care of it.
int PgCursor::Close()
{
	string cmd = "CLOSE " + pgCursor;
	return ExecCommandOk( cmd.c_str() );
} // End CloseCursor()
