#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>

exec sql include ../regression;
exec sql whenever sqlerror sqlprint;

static void
dump_binary(char *buf, int len, int ind)
{
	int i;

	printf("len=%d, ind=%d, data=0x", len, ind);
	for (i = 0; i < len; ++i)
		printf("%02x", 0xff & buf[i]);
	printf("\n");
}

#define DATA_SIZE 0x200
#define LACK_SIZE 13
#
int
main(void)
{
exec sql begin declare section;
	bytea send_buf[2][512];
	bytea recv_buf[2][DATA_SIZE];
	bytea recv_vlen_buf[][DATA_SIZE];
	bytea recv_short_buf[DATA_SIZE - LACK_SIZE];
	int ind[2];
exec sql end declare section;
	int i, j, c;

#define init() { \
	for (i = 0; i < 2; ++i) \
	{ \
		memset(recv_buf[i].arr, 0x0, sizeof(recv_buf[i].arr)); \
		recv_buf[i].len = 0; \
		ind[i] = 0; \
	} \
	recv_vlen_buf = NULL, \
	memset(recv_short_buf.arr, 0x0, sizeof(recv_short_buf.arr)); \
} \
while (0)

	ECPGdebug(1, stderr);

	for (i = 0; i < 2; ++i)
	{
		for (j = 0, c = 0xff; (c == -1 ? c = 0xff : 1), j < DATA_SIZE; ++j, --c)
			send_buf[i].arr[j] = c;

		send_buf[i].len = DATA_SIZE;
	}

    exec sql connect to REGRESSDB1;

	exec sql create table if not exists test (data1 bytea, data2 bytea);

	exec sql prepare ins_stmt from "insert into test values(?,?)";
	exec sql prepare sel_stmt from "select data1,data2 from test";
	exec sql allocate descriptor idesc;
	exec sql allocate descriptor odesc;

	/* Test for static sql statement with normal host variable, indicator */
	init();
	exec sql truncate test;
	exec sql insert into test values(:send_buf[0], :send_buf[1]);
	exec sql select data1,data2 into :recv_buf[0]:ind[0], :recv_short_buf:ind[1] from test;
	dump_binary(recv_buf[0].arr, recv_buf[0].len, ind[0]);
	dump_binary(recv_short_buf.arr, recv_short_buf.len, ind[1]);

	/* Test for cursor */
	init();
	exec sql truncate test;
	exec sql insert into test values(:send_buf[0], :send_buf[1]);
	exec sql declare cursor1 cursor for select data1 from test where data1 = :send_buf[0];
	exec sql open cursor1;
	exec sql fetch from cursor1 INTO :recv_buf[0];
	exec sql close cursor1;
	exec sql free cursor1 ;
	dump_binary(recv_buf[0].arr, recv_buf[0].len, 0);

	/* Test for variable length array */
	init();
	exec sql truncate test;
	exec sql insert into test values(:send_buf[0], :send_buf[1]);
	exec sql insert into test values(:send_buf[0], :send_buf[1]);
	exec sql select data1 into :recv_vlen_buf from test;
	dump_binary(recv_vlen_buf[0].arr, recv_vlen_buf[0].len, 0);
	dump_binary(recv_vlen_buf[1].arr, recv_vlen_buf[1].len, 0);
	free(recv_vlen_buf);

	/* Test for dynamic sql statement with normal host variable, indicator */
	init();
	exec sql truncate test;
	exec sql execute ins_stmt using :send_buf[0], :send_buf[1];
	exec sql execute sel_stmt into  :recv_buf[0]:ind[0], :recv_short_buf:ind[1];
	dump_binary(recv_buf[0].arr, recv_buf[0].len, ind[0]);
	dump_binary(recv_short_buf.arr, recv_short_buf.len, ind[1]);

	/* Test for dynamic sql statement with sql descriptor */
	init();
	exec sql truncate test;
	exec sql set descriptor idesc value 1 data = :send_buf[0];
	exec sql set descriptor idesc value 2 data = :send_buf[1];
	exec sql execute ins_stmt using sql descriptor idesc;
	exec sql execute sel_stmt into  sql descriptor odesc;
	exec sql get descriptor odesc value 1 :recv_buf[0] = data, :ind[0] = indicator;
	exec sql get descriptor odesc value 2 :recv_short_buf = data, :ind[1] = indicator;
	dump_binary(recv_buf[0].arr, recv_buf[0].len, ind[0]);
	dump_binary(recv_short_buf.arr, recv_short_buf.len, ind[1]);

	exec sql drop table test;
	exec sql commit;
	exec sql disconnect;

	return 0;
}
