/***************************************************************************
 *   Copyright (C) 2004 by root                                            *
 *   root@bu1wks2682                                                       *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include <upc_functions.h>
void CreateIndex (char *table,char *index_name,char *field,MYSQL *mysql) {
 char bufi[200],sqlt[300],*cp; int i;
 if (index_name==NULL) {
  cp=bufi; sprintf(bufi,"%s_%s",table,field);
  for (i=strlen(table); i<strlen(bufi) ; i++) if (bufi[i]==',') bufi[i]='_';
 } else cp=index_name;
 printf("\nCreate Index: %s\n",cp);
 sprintf(sqlt, "create index %s on %s(%s) ",cp,table,field);
 mysql_query(mysql,sqlt);
}

void Mybind (MYSQL_BIND *array,int *row,void *variable, int length,
 #ifdef __cplusplus
  enum_field_types type,
 #else 
  int type,
 #endif
  struct my_nu *my_null) {
  array[*row].buffer=(char*)variable;
  if (type==FIELD_TYPE_STRING || type==FIELD_TYPE_VAR_STRING) { 
   my_null[*row].length=array[*row].buffer_length=length;
  } 
  array[(*row)++].buffer_type=type;
}

static void print_st_error(MYSQL_STMT *stmt, const char *msg) {
 if (stmt && mysql_stmt_errno(stmt))  {
   if (stmt->mysql && stmt->mysql->server_version)
     fprintf(stdout," [MySQL-%s]\n",stmt->mysql->server_version);
   else fprintf(stdout," [MySQL]\n ");
   fprintf(stdout,"[%d] %s\n",mysql_stmt_errno(stmt),mysql_stmt_error(stmt));
 } else if (msg) fprintf(stderr, " [MySQL] %s\n", msg);
}

int Mysql_Execute (MYSQL_STMT *stmt,char *text) {int error;
 if ((error=mysql_execute(stmt))) print_st_error(stmt, text);
 return error;
}

int Mysql_Fetch (MYSQL_STMT *stmt,char *text) { int error;
 if ((error = mysql_fetch(stmt))!=MYSQL_NO_DATA) {
  if (error) print_st_error(stmt,text);
 }
 return error;
}

void NuTo (MYSQL_BIND *my_bind,struct my_nu *my_null,int from,int to) {
 for (;from<to;from++) {
  my_bind[from].is_null=&my_null[from].is_null; my_bind[from].length=&my_null[from].length;
  my_null[from].is_null=0;
 }
}

void Mysql_Error (MYSQL *mysql,char *text) {
 printf("%s Error: %s\n",text,mysql_error(mysql));
 exit(0);
}

void ClientConnect(MYSQL **mysql,char *mysql_host,char *mysql_userid, char *mysql_passwd,char *mysql_db,int mysql_port) {  
  printf(" -- Establishing a connection to '%s' ...\n",mysql_host );
 if (!(*mysql = mysql_init(NULL))) { printf(" -- mysql_init() failed\n");}
 if (!(mysql_real_connect(*mysql,mysql_host,mysql_userid,mysql_passwd,mysql_db ,mysql_port,NULL,0))) {
  printf(" -- connection failed\n"); mysql_close(*mysql);
  printf(" -- Check the connection options using --help or -?\n");
 }
}

void Mysql_Query (MYSQL *mysql,char *query_str) {
 printf(" -- Mysql_Query\n");
 if (mysql_query(mysql, query_str))
 {
  printf(" -- Rossz query In\n");
  printf(" -- [%d] %s\n",mysql_errno(mysql),mysql_error(mysql));
 }
}

void MyPrepareIn (MYSQL *mysql,char *query_str,MYSQL_STMT **stmt ,MYSQL_BIND *my_bind) {
 printf(" -- MyPrepareIn\n");
 if (!(*stmt = mysql_prepare(mysql, query_str, strlen(query_str)))) 
 {
  printf(" -- Rossz prepare In\n");
  printf(" -- [%d] %s\n",mysql_errno(mysql),mysql_error(mysql));
 }
 if (mysql_bind_result(*stmt, my_bind)){printf(" -- Rossz bind result In\n");}
 if (mysql_execute(*stmt)) 
 {
  printf(" -- execute In failed %s\n",mysql_stmt_error(*stmt));
  fprintf(stdout," -- [%d] %s\n",mysql_errno(mysql),mysql_error(mysql));
 }
}

void MyPrepareOut (MYSQL *mysql,char *query_str,MYSQL_STMT **stmt,MYSQL_BIND *my_bind) {
 if (!(*stmt = mysql_prepare(mysql, query_str, strlen(query_str)))) {
  printf("\nRossz prepare Out\n");
  fprintf(stdout,"[%d] %s\n",mysql_errno(mysql),mysql_error(mysql));
  fprintf(stdout,"characterset = %s\n",mysql_character_set_name(mysql));
 }
 if (mysql_bind_param(*stmt, my_bind)) printf("Rossz bind result Out");
 fprintf(stdout,"[%d] %s\n",mysql_errno(mysql),mysql_error(mysql));
}



/* utils */

byte const mon[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

void GetXDate (MYSQL_TIME *rd) {  struct tm tm; time_t now;
 now=time((time_t*)NULL); tm=*localtime(&now);
 rd->year=tm.tm_year; rd->month=tm.tm_mon+1; rd->day=tm.tm_mday;
}

int CompSdat (MYSQL_TIME *tol,MYSQL_TIME *ig) { long l1,l2;
 l1=tol->year*10000+tol->month*100+tol->day;
 l2=ig->year*10000+ig->month*100+ig->day;
 if (l1==l2) return 0;
 return ((l1>l2) ? 1:-1);
}

int Days (MYSQL_TIME *tol,MYSQL_TIME *ig) {
 int j,nap=0; MYSQL_TIME seg; unsigned char bmo[sizeof(mon) / sizeof(mon[0])];
 memcpy(bmo,mon,sizeof(bmo));
 if (CompSdat(tol,ig)>0) return 0;
 if (tol->year<ig->year) {
  if (tol->year&3) bmo[2]=28;
  nap=bmo[tol->month]-tol->day+1;
  for (j=tol->month+1; j<13; j++) nap+=bmo[j];
  for (j=tol->year+1; j<ig->year; j++) nap+=(j&3) ? 365:366;
  seg.year=ig->year;seg.month=seg.day=1;
 }
 else seg=*tol;
 if (seg.month<ig->month) {
  bmo[2]=(ig->year&3) ? 28:29;
  nap+=bmo[seg.month]-seg.day+1;
  for (j=seg.month+1; j<ig->month; j++) nap+=bmo[j];
  seg.day=1;
 }
 nap+=ig->day-seg.day;
 return nap;
}
/* utils end */

