#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

exec sql include sqlca;

exec sql whenever sqlerror sqlprint;
exec sql whenever not found sqlprint;

static void
print_result(long sec, long usec, char *text)
{
	if (usec < 0)
	{
		sec--;
		usec+=1000000;
	}
	printf("I needed %ld seconds and %ld microseconds for the %s test.\n", sec, usec, text);
	exec sql vacuum;
	sleep(1);
}

int
main ()
{
exec sql begin declare section;
	long i;
exec sql end declare section;
	struct timeval tvs, tve;

	exec sql connect to mm;

	exec sql create table perftest1(number int4, ascii char(16));

	exec sql create unique index number1 on perftest1(number);

	exec sql create table perftest2(number int4, next_number int4);

	exec sql create unique index number2 on perftest2(number);

	exec sql commit;

	exec sql set autocommit to on;

	exec sql begin transaction;

	gettimeofday(&tvs, NULL);

	for (i = 0;i < 1407; i++)
	{
		exec sql begin declare section;
			char text[16];
		exec sql end declare section;

		sprintf(text, "%ld", i);
		exec sql insert into perftest1(number, ascii) values (:i, :text);
		exec sql insert into perftest2(number, next_number) values (:i, :i+1);
	}

	exec sql commit;

	gettimeofday(&tve, NULL);

	print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "insert");

	exec sql begin transaction;

	gettimeofday(&tvs, NULL);

	for (i = 0;i < 1407; i++)
	{
		exec sql begin declare section;
			char text[16];
		exec sql end declare section;

		exec sql select ascii into :text from perftest1 where number = :i;
	}

	exec sql commit;

	gettimeofday(&tve, NULL);

	print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "selection&projection");

	exec sql begin transaction;

	gettimeofday(&tvs, NULL);

	for (i = 0;i < 1407; i++)
	{
		exec sql begin declare section;
			char text[16];
		exec sql end declare section;

		exec sql select perftest1.ascii into :text from perftest1, perftest2 where perftest1.number = perftest2.number and perftest2.number = :i;
	}

	exec sql commit;

	gettimeofday(&tve, NULL);

	print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "join");

	exec sql begin transaction;

	gettimeofday(&tvs, NULL);

	exec sql update perftest2 set next_number = next_number + 1;

	exec sql commit;

	gettimeofday(&tve, NULL);

	print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "update");

	exec sql begin transaction;

	gettimeofday(&tvs, NULL);

	exec sql delete from perftest2;

	exec sql commit;

	gettimeofday(&tve, NULL);

	print_result(tve.tv_sec - tvs.tv_sec, tve.tv_usec - tvs.tv_usec, "delete");

	exec sql set autocommit = off;

	exec sql drop index number2;

	exec sql drop table perftest2;

	exec sql drop index number1;

	exec sql drop table perftest1;

	exec sql commit;

	exec sql disconnect;

	return (0);
}
