#if defined(_NT)
#include <windows.h>
#else
#define TRUE	1
#define FALSE	0
#endif

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>

#include <mysql.h>



#define QUERY_DROP_TABLE			"DROP TABLE xxx"
#define QUERY_CREATE_TABLE			"CREATE TABLE xxx (workdept CHAR(6), level INTEGER) TYPE = INNODB"
#define QUERY1						"insert into xxx (workdept, level) values ('A00',18)"
#define QUERY2						"insert into xxx (workdept, level) values ('B01',18)"
#define QUERY3						"insert into xxx (workdept, level) values ('C01',20)"
#define QUERY4						"insert into xxx (workdept, level) values ('E01',16)"
#define QUERY5						"insert into xxx (workdept, level) values ('D11',16)"
#define QUERY6						"insert into xxx (workdept, level) values ('D21',16)"
#define QUERY7						"insert into xxx (workdept, level) values ('E11',16)"
#define QUERY8						"insert into xxx (workdept, level) values ('E21',14)"
#define QUERY9						"insert into xxx (workdept, level) values ('A00',19)"
#define QUERY10						"insert into xxx (workdept, level) values ('A00',14)"
#define QUERY11						"insert into xxx (workdept, level) values ('C01',16)"
#define QUERY12						"insert into xxx (workdept, level) values ('C01',18)"
#define QUERY13						"insert into xxx (workdept, level) values ('D11',16)"
#define QUERY14						"insert into xxx (workdept, level) values ('D11',17)"
#define QUERY15						"insert into xxx (workdept, level) values ('D11',16)"
#define QUERY16						"insert into xxx (workdept, level) values ('D11',17)"
#define QUERY17						"insert into xxx (workdept, level) values ('D11',16)"
#define QUERY18						"insert into xxx (workdept, level) values ('D11',16)"
#define QUERY19						"insert into xxx (workdept, level) values ('D11',17)"
#define QUERY20						"insert into xxx (workdept, level) values ('D11',18)"
#define QUERY21						"insert into xxx (workdept, level) values ('D21',14)"
#define QUERY22						"insert into xxx (workdept, level) values ('D21',17)"
#define QUERY23						"insert into xxx (workdept, level) values ('D21',15)"
#define QUERY24						"insert into xxx (workdept, level) values ('D21',16)"
#define QUERY25						"insert into xxx (workdept, level) values ('D21',15)"
#define QUERY26						"insert into xxx (workdept, level) values ('E11',17)"
#define QUERY27						"insert into xxx (workdept, level) values ('E11',12)"
#define QUERY28						"insert into xxx (workdept, level) values ('E11',14)"
#define QUERY29						"insert into xxx (workdept, level) values ('E11',12)"
#define QUERY30						"insert into xxx (workdept, level) values ('E21',16)"
#define QUERY31						"insert into xxx (workdept, level) values ('E21',14)"
#define QUERY32						"insert into xxx (workdept, level) values ('E21',16)"
				

MYSQL			*mysql = NULL;



void print_mysql_error(MYSQL *mysql)
{
	fprintf(stderr, "%d:%s\n", mysql_errno(mysql), mysql_error(mysql));
}


void print_mysql_stmt_error(MYSQL_STMT *stmt)
{
	fprintf(stderr, "stmt error=%s\n", mysql_stmt_error(stmt));
}


void exec_query(const char *query, const int IgnoreError)
{
	if (mysql_query(mysql, query))
	{
		if (IgnoreError == FALSE)
		{
			fprintf(stderr, "mysql_query(), failed\n");
			fprintf(stderr, "query=%s\n", query);
			goto ErrorExit;
		}
	}
	return;

ErrorExit:
	print_mysql_error(mysql);
	return;
}


int select_statement()
{
#define QUERY		"select workdept, avg(level) from xxx group  by workdept"
	MYSQL_STMT		*stmt;
	MYSQL_BIND		bind_array[10];
	char			name[256];
	int				rc;
	double			avg;
	const unsigned long type= CURSOR_TYPE_READ_ONLY;
	unsigned long	name_len;

	stmt = mysql_stmt_init(mysql);
	if (!stmt)
	{
		fprintf(stderr, " mysql_stmt_init(), out of memory\n");
		goto ErrorExit;
	}

	mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void *) &type);

	if (mysql_stmt_prepare(stmt, QUERY, strlen(QUERY)))
	{
		fprintf(stderr, " mysql_stmt_prepare(), failed\n");
		print_mysql_stmt_error(stmt);
		goto ErrorExit;
	}

	/* output bind */
	memset(bind_array, 0, sizeof(bind_array));
	bind_array[0].buffer_type= MYSQL_TYPE_STRING;
	bind_array[0].buffer= (char *) name;
	bind_array[0].buffer_length= sizeof(name);
	bind_array[0].length= &name_len;
	bind_array[1].buffer_type= MYSQL_TYPE_DOUBLE;
	bind_array[1].buffer= (char *) &avg;

	if (mysql_stmt_bind_result(stmt, bind_array))
	{
		fprintf(stderr, " mysql_stmt_bind_result(), failed\n");
		print_mysql_stmt_error(stmt);
		goto ErrorExit;
	}
	
	if (mysql_stmt_execute(stmt))
	{
		fprintf(stderr, " mysql_stmt_execute(), failed\n");
		print_mysql_stmt_error(stmt);
		goto ErrorExit;
	}

	for (;;)
	{
		rc = mysql_stmt_fetch(stmt);
		if (rc == MYSQL_NO_DATA)
		{
			printf("no more rows found\n");
			break;
		}
		else
		{
			if (rc == 0)
			{
				name[name_len]= '\0';
				printf("%s;%8.4f\n", name, avg);
			}
		}
	}


	if (mysql_stmt_close(stmt))
	{
		fprintf(stderr, " mysql_stmt_close(), failed\n");
		print_mysql_stmt_error(stmt);
		goto ErrorExit;
	}

	return(TRUE);

ErrorExit:
	print_mysql_error(mysql);
	return(FALSE);
}


int main(void)
{
	int		i = 0;

	if ((mysql = mysql_init((MYSQL *) 0)) == NULL) goto ErrorExit;

	if (mysql_real_connect(mysql, "", "root", "root", "mysql", 0, NULL, 0) == NULL) goto ErrorExit;

	exec_query(QUERY_DROP_TABLE, TRUE);
	exec_query(QUERY_CREATE_TABLE, FALSE);
	exec_query(QUERY1, FALSE);
	exec_query(QUERY2, FALSE);
	exec_query(QUERY3, FALSE);
	exec_query(QUERY4, FALSE);
	exec_query(QUERY5, FALSE);
	exec_query(QUERY6, FALSE);
	exec_query(QUERY7, FALSE);
	exec_query(QUERY8, FALSE);
	exec_query(QUERY9, FALSE);
	exec_query(QUERY10, FALSE);
	exec_query(QUERY11, FALSE);
	exec_query(QUERY12, FALSE);
	exec_query(QUERY13, FALSE);
	exec_query(QUERY14, FALSE);
	exec_query(QUERY15, FALSE);
	exec_query(QUERY16, FALSE);
	exec_query(QUERY17, FALSE);
	exec_query(QUERY18, FALSE);
	exec_query(QUERY19, FALSE);
	exec_query(QUERY20, FALSE);
	exec_query(QUERY21, FALSE);
	exec_query(QUERY22, FALSE);
	exec_query(QUERY23, FALSE);
	exec_query(QUERY24, FALSE);
	exec_query(QUERY25, FALSE);
	exec_query(QUERY26, FALSE);
	exec_query(QUERY27, FALSE);
	exec_query(QUERY28, FALSE);
	exec_query(QUERY29, FALSE);
	exec_query(QUERY30, FALSE);
	exec_query(QUERY31, FALSE);
	exec_query(QUERY32, FALSE);

	/*  */
	(void) select_statement();
	
	mysql_close(mysql);

	return(0);

ErrorExit:
	print_mysql_error(mysql);
	return(1);
}


