/****************************************************************************/
/* Test comment                                                             */
/*--------------------------------------------------------------------------*/
exec sql include header_test;

exec sql type str is varchar[10];

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

int
main (void)
{
exec sql begin declare section;
	typedef struct { long born; short age; } birthinfo;
	struct personal_struct	{	str name;
					birthinfo birth;
				} personal;
	struct personal_indicator {	int ind_name;
					birthinfo ind_birth;
				  } ind_personal;
	int *ind_married = NULL;
	int children, movevalue = 2;
	int ind_children;
	str *married = NULL;
	char *wifesname="Petra";
	char *query="select * from meskes where name = ?";
exec sql end declare section;

	exec sql declare cur cursor for
	       select name, born, age, married, children from meskes;

	char msg[128];
	FILE *dbgs;

	if ((dbgs = fopen("log", "w")) != NULL)
                ECPGdebug(1, dbgs);

	strcpy(msg, "connect");
	exec sql connect to unix:postgresql://localhost:5432/mm;

	strcpy(msg, "create");
	exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);

	strcpy(msg, "insert");
	exec sql insert into meskes(name, married, children) values (:wifesname, '19900404', 3);
	exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3);
	exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 10);
	exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8);
	exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4);

	strcpy(msg, "commit");
	exec sql commit;

	strcpy(msg, "open");
	exec sql open cur;

	strcpy(msg, "move");
	exec sql move :movevalue in cur;

	exec sql whenever not found do break;
	
	while (1) {
		strcpy(msg, "fetch");
		exec sql fetch from cur into :personal:ind_personal, :married:ind_married, :children:ind_children;
		printf("%8.8s", personal.name.arr);
		if (ind_personal.ind_birth.born >= 0)
			printf(", born %ld", personal.birth.born);
		if (ind_personal.ind_birth.age >= 0)
			printf(", age = %d", personal.birth.age);
		if (*ind_married >= 0)
			printf(", married %10.10s", married->arr);
		if (ind_children >= 0)
			printf(", children = %d", children);
		putchar('\n');

		free(married);
		married = NULL;
	}

	strcpy(msg, "close");
	exec sql close cur;

	/* and now a query with prepare */
	exec sql prepare MM from :query;
	exec sql declare prep cursor for MM;

	strcpy(msg, "open");
	exec sql open prep using :wifesname;

	exec sql whenever not found do break;

	while (1) {
		strcpy(msg, "fetch");
		exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children:ind_children;
		printf("%8.8s", personal.name.arr);
		if (ind_personal.ind_birth.born >= 0)
			printf(", born %ld", personal.birth.born);
		if (ind_personal.ind_birth.age >= 0)
			printf(", age = %d", personal.birth.age);
		if (*ind_married >= 0)
			printf(", married %10.10s", married->arr);
		if (ind_children >= 0)
			printf(", children = %d", children);
		putchar('\n');
	}

	free(married);

	strcpy(msg, "close");
	exec sql close prep;

	strcpy(msg, "drop");
	exec sql drop table meskes;

	strcpy(msg, "commit");
	exec sql commit;

	strcpy(msg, "disconnect"); 
	exec sql disconnect;

	if (dbgs != NULL)
                fclose(dbgs);

	return (0);
}
