#include <stdlib.h>
#include <sqlca.h>
#include <string>

using namespace std;

int get_conn(  )
{
	int sqlcode;

	EXEC SQL BEGIN DECLARE SECTION;
	char   *pgdsn = getenv("PGDSN");
	char   *pguser = getenv("PGUSER");
	char   *pgpass = getenv("PGPASS");
	EXEC SQL END DECLARE SECTION;

	if (pgdsn == NULL)
	{
	    printf("PGDSN is not set\n");
	    sqlcode = 100;
	    return 1;
	}
	if (pguser == NULL)
	{
	    printf("PGUSER is not set\n");
	    sqlcode = 100;
	    return 1;
	}
	if (pgpass == NULL)
	{
	    printf("PGPASS is not set\n");
	    sqlcode = 100;
	    return 1;
	}

	EXEC SQL CONNECT TO :pgdsn USER :pguser IDENTIFIED BY :pgpass;
	sqlcode = sqlca.sqlcode;
	printf("connect sqlcode: %d\n", sqlca.sqlcode);

}

void close_conn() {
	EXEC SQL DISCONNECT;
	printf("disconnect sqlcode: %d\n", sqlca.sqlcode);
}

int main()
{

	EXEC SQL WHENEVER SQLWARNING SQLPRINT;
	EXEC SQL WHENEVER SQLERROR SQLPRINT;

	if(!get_conn()) return 1;

	EXEC SQL BEGIN DECLARE SECTION;
	char query[2048]="\0";

	struct record_ind_short {
	short Tind0;
	short Tind1;
	short Tind2;
	} record_ind_s;

	struct record_ind_full {
	short Tind0;
	short Tind1;
	short Tind2;
	short Tind3;
	short Tind4;
	short Tind5;
	} record_ind_f;

	struct record_ind_long {
	short Tind0;
	short Tind1;
	short Tind2;
	short Tind3;
	short Tind4;
	short Tind5;
	short Tind6;
	} record_ind_l;


       struct FavRecord {
	  int service_id;
	  char service_name[11];
	  char display_name[11];
	  char jsp_name[11];
          int display_seq;
          int default_display;
       } record;
	EXEC SQL END DECLARE SECTION;


	EXEC SQL WHENEVER NOT FOUND CONTINUE;

	string favSql = "select a, b, d, f, c, e from dummy";
	printf("Query String: %s\n", favSql.c_str());

	strcpy(query,favSql.c_str());
	printf("Copied query String: %s\n", query);


	EXEC SQL PREPARE favStmt FROM :query;
        EXEC SQL DECLARE c_favList CURSOR FOR favStmt;

	EXEC SQL OPEN c_favList;
	printf("Opened cursor\n");

	//while(true)
	//{
		printf("Retrieving rec with full indicator\n", query);
		EXEC SQL FETCH c_favList INTO :record :record_ind_f;
		printf("Retrieved rec with full indicator\n", query);

		printf("Retrieving rec with short indicator\n", query);
		EXEC SQL FETCH c_favList INTO :record :record_ind_s;
		printf("Retrieved rec with short indicator\n", query);

		printf("Retrieving rec with long indicator\n", query);
		EXEC SQL FETCH c_favList INTO :record :record_ind_l;
		printf("Retrieved rec with long indicator\n", query);

		printf("Retrieving rec with no indicator\n", query);
		EXEC SQL FETCH c_favList INTO :record;
		printf("Retrieved rec with no indicator\n", query);

	//}

	EXEC SQL CLOSE c_favList;

	close_conn();

  	return( 0 );
}
