#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <mysql.h>
#include "sqllib.h"

char errmsg[1000];

MYSQLCONN conn[SQL_COMMANDS];


/*******************************************************************/
/* miscellaneous support routines (error handling etc) */
/*******************************************************************/

void output_error(int sql_num) {
       sprintf(errmsg,"Error %u (%s)",
               mysql_errno(&conn[sql_num].mysql),
               mysql_error(&conn[sql_num].mysql));
       printf("%s\n", errmsg);
}


/*******************************************************************/
/* sql connect */
/*******************************************************************/

int sql_connect(int sql_num, char *host, char *user, char *passwd) {
       /* check not already connected? */
       if (conn[sql_num].connected) {
               printf("sql connect; already connected.");
               return 0;
       }
       if (! (mysql_connect(&conn[sql_num].mysql, host, user, passwd))) {
               output_error(sql_num);
               return 0;
       } else {
               conn[sql_num].connected = 1;
               return 1;
       }
}


int sql_disconnect(int sql_num) {
       /* check that we are connected? */
       if (! conn[sql_num].connected) {
               printf("sql disconnect; not connected.");
               return 0;
       }
       mysql_close(&conn[sql_num].mysql);
       conn[sql_num].connected = 0;
       return 1;
}


/*******************************************************************/
/* sql general commands */
/*******************************************************************/

int sql_selectdb(int sql_num, char *database) {
       /* check that we are connected to a mysql server */
       if (!conn[sql_num].connected) {
               printf("sql query statement; you are not connected to a mysql server yet (sql connect).");
               return 0;
       }

       if (mysql_select_db(&conn[sql_num].mysql, database)) {
               output_error(sql_num);
               return 0;
       } else {
               return 1;
       }
}


/*******************************************************************/
/* sql query command */
/*******************************************************************/

int sql_query(int sql_num, char *query) {
       if (! conn[sql_num].connected) {
               printf("sql query statement; you are not connected to a mysql server yet");
               return 0;
       }

       /* check there is no other active query? */
       if (conn[sql_num].qflag) {
               printf("Another query cannot be made until the current query has been finished with \"sql endquery\".");
               return 0;
       }

       /* execute the sql query statement */
       if (mysql_query(&conn[sql_num].mysql, query)) {
               output_error(sql_num);
               return 0;
       }

       conn[sql_num].result = mysql_use_result(&conn[sql_num].mysql);
       conn[sql_num].nfields = mysql_field_count(&conn[sql_num].mysql);

       /* if no results were found and none expected then all ok */
       /* otherwise we assume the query worked ok, now get the results */
       if (conn[sql_num].result == NULL) {
               if (conn[sql_num].nfields) {
                       output_error(sql_num);
                       return 0;
               }
//              show_msg("sql startquery; query executed ok but returned no results.");
               return 1;
       }

       /* return all ok now, see fetchrow & endquery for more details */
       conn[sql_num].qflag = 1;
       return 1;
}


MYSQL_FIELD *sql_fetchfield(int sql_num)
{
       /* check we are connected? */
       if (! conn[sql_num].connected) {
               printf("Not connected to a server.");
               return NULL;
       }
       /* check we had a query started? */
       if (! conn[sql_num].qflag) {
               printf("No query has been started.");
               return NULL;
       }
       return mysql_fetch_field(conn[sql_num].result);
}


MYSQL_ROW sql_fetchrow(int sql_num)
{
       /* check we are connected? */
       if (! conn[sql_num].connected) {
               printf("Not connected to a server.");
               return NULL;
       }
       /* check we had a query started? */
       if (! conn[sql_num].qflag) {
               printf("No query has been started.");
               return NULL;
       }
       return mysql_fetch_row(conn[sql_num].result);
}


int sql_endquery(int sql_num) {
       /* check we are connected? */
       if (! conn[sql_num].connected) {
               printf("Not connected to a server.");
               return 0;
       }

       /* check we had a query started? */
       if (! conn[sql_num].qflag) {
               printf("No query has been started.");
               return 0;
       }

       mysql_free_result(conn[sql_num].result);
       conn[sql_num].qflag = 0;
       return 1;
}