
#include <stdio.h>  // for printf
#include <time.h>  // for time
#include <SQLAPI.h> // main SQLAPI++ header

void CreateSampleData(SACommand& cmd, int nRows);

int main(int argv, char* argc[])
{
	SAConnection con; // connection object
	SACommand cmd(&con);

	try
	{
		con.Connect(
			_TSA("test"),
			_TSA("tester"),
			_TSA("tester"), SA_Oracle_Client);

		// Create and Insert test table
		bool bCreateTable = false;	// set to true if you want to create sample data
		if (bCreateTable)	// set to false when table is created and populated
		{
			CreateSampleData(cmd, 200000);
			con.Commit();
		}

		time_t start, finish;

		printf("Reading data without bulk support (default)...\n");
		time(&start);
		cmd.setCommandText(_TSA("Select * from TEST_BULK"));
		cmd.Execute();
		while (cmd.FetchNext())
		{
		}
		time(&finish);
		printf("Time in seconds: %g\n", difftime(finish, start));

		int nBulkSize = 1000;
		printf("Reading data with bulk support (Size=%d)...\n", nBulkSize);
		SAString sBulkSize;
		sBulkSize.Format(_TSA("%d"), nBulkSize);
		time(&start);
		cmd.setCommandText(_TSA("Select * from TEST_BULK"));
		cmd.setOption(_TSA("PreFetchRows")) = sBulkSize;
		cmd.Execute();
		while (cmd.FetchNext())
		{
		}
		time(&finish);
		printf("Time in seconds: %g\n", difftime(finish, start));
	}
	catch (SAException& x)
	{
		try
		{
			// on error rollback changes
			con.Rollback();
		}
		catch (SAException&)
		{
		}
		// print error message
		printf("%s\n", x.ErrText().GetMultiByteChars());
	}

	return 0;
}

void CreateSampleData(SACommand& cmd, int nRows)
{
	printf("Creating test table...\n");
	cmd.setCommandText(
		_TSA("CREATE TABLE TEST_BULK (FINTEGER INTEGER NOT NULL, FVARCHAR20 VARCHAR(20), PRIMARY KEY (FINTEGER))"));

	cmd.Execute();
	printf("Populating test table (rows=%d)...\n", nRows);
	cmd.setCommandText(
		_TSA("Insert into TEST_BULK (FINTEGER, FVARCHAR20) values (:1, :2)"));

	for (int i = 0; i < nRows; ++i)
	{
		SAString s;
		s.Format(_TSA("VC%d"), i);
		cmd << (long)i << s;
		cmd.Execute();

		if (((i + 1) % 1000) == 0)
			printf("%d rows inserted...\n", i + 1);
	}
}
