//gcc testcase.c -g -o testcase -L/home/sbester/server/5.0/mysql-5.0-bk/lib -I/home/sbester/server/5.0/mysql-5.0-bk/include   -lmysqlclient_r -lz -lpthread

/*This is generated code!*/

/*section: includes*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mysql.h>
#include <pthread.h>

#define NUMTHREADS (90)

/*section: globals*/
char host[]="127.0.0.1";
char username[]="root";
char password[]="";
char database[]="test";
int port=3308;
pthread_t pthreads[NUMTHREADS];
int threaddone=0;

/*section: function declarations*/
void *worker_thread(void *arg);
MYSQL *db_connect(MYSQL *dbc);

/*section: functions*/
int db_query(MYSQL *dbc,char *sql,int showresults)
{
	int res=0;
	MYSQL_RES *r=NULL;
	MYSQL_ROW w;
	MYSQL_FIELD *field=NULL;
	int i=0,moreresult=0;
	res = mysql_query(dbc,sql);
	if(res != 0)
	{
		printf("query failed '%s' : %d (%s)\n",sql,mysql_errno(dbc),mysql_error(dbc));
		return 0;
	}

	do
	{
		r = mysql_store_result(dbc);
		if(r)
		{
			unsigned int numfields = mysql_num_fields(r);
			unsigned int numrows=mysql_num_rows(r);
			while((field = mysql_fetch_field(r)))
			{
					//print metadata information about each field
					if(showresults)
					{
						printf("%s	",field->name);
					}
			}
			if(showresults)
			{
				printf("\n------------------------------------\n");
			}

			while ((w = mysql_fetch_row(r)))
			{
				for(i = 0; i < numfields; i++)
				{
					//print each field here
					if(showresults)
					{
						printf("%s\t",w[i]);
					}
				}

				if(showresults)
				{
						printf("\n");
				}
			}
			if(showresults)
			{
				printf("\n");
			}
			mysql_free_result(r);
		}
		else //no rows returned. was it a select?
		{
			if(mysql_field_count(dbc)>0)
			{
				printf("No results for '%s'.  (%d) - %s\n",sql,mysql_errno(dbc),mysql_error(dbc));
			}
			else //it could have been some insert/update/delete
			{
				//this is successful query
			}
		}
		moreresult=mysql_next_result(dbc);
		if(moreresult>0)
		{
			printf("mysql_next_result returned %d, mysql error %s, (%d)\n",moreresult,mysql_error(dbc),mysql_errno(dbc));
			break;
		}
	} while (0==moreresult);
}

void *worker_thread(void *arg)
{
	MYSQL *dbc=NULL;
	int cancelstate=0;
	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&cancelstate);

	if (!(dbc = mysql_init(NULL)))
	{
		printf("mysql_init\n");
		dbc=NULL;
		goto threadexit;
	}
	else
	{
		if (!mysql_real_connect(dbc,host,username,password,database,port, NULL, CLIENT_FOUND_ROWS|CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS))
		{
			printf("mysql_real_connect failed: %s (%d)", mysql_error(dbc),mysql_errno(dbc));
			dbc=NULL;
		}
	}

	unsigned int counter=0;
	while(!threaddone && dbc!=NULL)
	{
		db_query(dbc,"insert ignore into `t2` (`c1`) values ('abc')",0);
		db_query(dbc,"call `p1`()",0);
	}
threadexit:
	mysql_close(dbc);
	mysql_thread_end();
	pthread_exit(0);
}


int main(int argc, const char *argv[])
{
	MYSQL *dbc=NULL;
	int i=0,err=0;

	time_t timestart=0,timenow=0;

	my_init();
	if (!(dbc = mysql_init(NULL)))
	{
		printf("mysql_init\n");
		dbc=NULL;
		goto threadexit;
	}
	else
	{
		if (!mysql_real_connect(dbc,host,username,password,database,port, NULL, CLIENT_FOUND_ROWS|CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS))
		{
			printf("mysql_real_connect failed: %s (%d)", mysql_error(dbc),mysql_errno(dbc));
			dbc=NULL;
			goto threadexit;
		}
	}

	printf("running initializations\n");
	db_query(dbc,"DROP TABLE IF EXISTS `t2`",0);
	db_query(dbc,"CREATE TABLE `t2` (`c1` enum('abc') not null)",0);
	db_query(dbc,"drop procedure if exists `p1`",0);
	db_query(dbc,"CREATE PROCEDURE `p1`() BEGIN DECLARE done INT DEFAULT 0;  DECLARE t2c1 ENUM('abc');  DECLARE mycursor CURSOR FOR SELECT `c1` FROM `t2` LIMIT 100; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN mycursor;  REPEAT  FETCH mycursor INTO t2c1;  UNTIL done END REPEAT;  CLOSE mycursor; END;",0);
	mysql_close(dbc);

	for (i=0;i<NUMTHREADS;i++)
	{
		err=pthread_create(&pthreads[i], NULL, worker_thread, (void *)i);
		if(err!=0)
		{
			printf("error spawning thread %lu, pthread_create returned %lu\n",(unsigned long)i,(unsigned long)err);
		}
	}
	printf("completed spawning new database worker threads\n");

	timestart=time(NULL);
	timenow=time(NULL);
	for(i=0;(timenow-timestart) < 6000;timenow=time(NULL))
	{
		sleep(1);
	}
	threaddone=1;

	printf("waiting for worker threads to finish\n");

	for (i=0;i<NUMTHREADS;i++)
	{
		pthread_join(pthreads[i], NULL);
	}

	exit(0);
threadexit:
	exit(-1);
}


