rllib  1
rlbussignaldatabase.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002                           rlbussignaldatabase.cpp  -  description
00003                              -------------------
00004     begin                : Mon Aug 02 2002
00005     copyright            : (C) 2002 by Rainer Lehrig
00006     email                : lehrig@t-online.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This library is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as        *
00013  *   published by the Free Software Foundation                             *
00014  *                                                                         *
00015  ***************************************************************************/
00016 #include <stdio.h>
00017 #include <string.h>
00018 #include <stdlib.h>
00019 #include <stdarg.h>
00020 #ifdef RLWIN32
00021 #include <winsock2.h>
00022 #endif
00023 #include <mysql.h>
00024 #include "rlbussignaldatabase.h"
00025 #include "rlcutil.h"
00026 
00027 static int   mysql_is_initialized = 0;
00028 static MYSQL mysql;
00029 
00030 rlBussignalDatabase::rlBussignalDatabase()
00031 {
00032   databaseName = NULL;
00033   tableName    = NULL;
00034   connection   = NULL;
00035   if(mysql_is_initialized == 0)
00036   {
00037     mysql_init(&mysql);
00038     mysql_is_initialized = 1;
00039   }
00040 }
00041 
00042 rlBussignalDatabase::~rlBussignalDatabase()
00043 {
00044   closeDatabase();
00045   if(databaseName != NULL) delete [] databaseName;
00046   if(tableName != NULL) delete [] tableName;
00047 }
00048 
00049 int rlBussignalDatabase::openDatabase(const char *database, const char *table)
00050 {
00051   if(databaseName != NULL) delete [] databaseName;
00052   if(tableName != NULL) delete [] tableName;
00053   databaseName = new char[strlen(database)+1];
00054   strcpy(databaseName,database);
00055   tableName    = new char[strlen(table)+1];
00056   strcpy(tableName,table);
00057   connection = (void *) mysql_real_connect(&mysql, "localhost","bususr","buspw",databaseName,0,0,0);
00058   if(connection == NULL)
00059   {
00060     printf(mysql_error(&mysql));
00061     return -1;
00062   }
00063   return 0;
00064 }
00065 
00066 int rlBussignalDatabase::writeDatabaseInt(const char *item, int val)
00067 {
00068   sprintf(buf,"%d",val);
00069   sprintf(typebuf,"I1");
00070   return writeDatabaseString(item);
00071 }
00072 
00073 int rlBussignalDatabase::writeDatabaseIntArray(const char *item, int *val, int len)
00074 {
00075   int  i;
00076   char vbuf[80];
00077 
00078   buf[0] = '\0';
00079   for(i=0; i<len; i++)
00080   {
00081     sprintf(vbuf,"%d,",val[i]);
00082     if(strlen(buf)+strlen(vbuf) >= sizeof(buf)-1) return -1;
00083     strcat(buf,vbuf);
00084   }
00085   sprintf(typebuf,"I%d",len);
00086   return writeDatabaseString(item);
00087 }
00088 
00089 int rlBussignalDatabase::writeDatabaseFloat(const char *item, float val)
00090 {
00091   sprintf(buf,"%f",val);
00092   sprintf(typebuf,"F1");
00093   return writeDatabaseString(item);
00094 }
00095 
00096 int rlBussignalDatabase::writeDatabaseFloatArray(const char *item, float *val, int len)
00097 {
00098   int  i;
00099   char vbuf[80];
00100 
00101   buf[0] = '\0';
00102   for(i=0; i<len; i++)
00103   {
00104     sprintf(vbuf,"%f,",val[i]);
00105     if(strlen(buf)+strlen(vbuf) >= sizeof(buf)-1) return -1;
00106     strcat(buf,vbuf);
00107   }
00108   sprintf(typebuf,"F%d",len);
00109   return writeDatabaseString(item);
00110 }
00111 
00112 int rlBussignalDatabase::writeDatabaseString(const char *item, char *val)
00113 {
00114   sprintf(typebuf,"S%d",strlen(val));
00115   rlstrncpy(buf,val,sizeof(buf)-1);
00116   return writeDatabaseString(item);
00117 }
00118 
00119 int rlBussignalDatabase::writeDatabaseString(const char *item)
00120 {
00121   int  ret;
00122   char sqlbuf[rl_PRINTF_LENGTH];
00123 
00124   // Try an UPDATE
00125   ret = snprintf(sqlbuf,sizeof(sqlbuf)-1,"UPDATE %s SET datatype='%s', datavalue='%s' WHERE name='%s'",tableName,typebuf,buf,item);
00126   if(ret < 0)
00127   {
00128     printf("sqlbuf too small in writeDatabaseString\n");
00129     return -1;
00130   }
00131   ret = myquery(sqlbuf);
00132   if(ret > 0) return 0; // success
00133 
00134   // Try an INSERT
00135   ret = snprintf(sqlbuf,sizeof(sqlbuf)-1,"INSERT INTO %s VALUES ('%s','%s','%s')",tableName,item,typebuf,buf);
00136   if(ret < 0)
00137   {
00138     printf("sqlbuf too small in writeDatabaseString\n");
00139     return -1;
00140   }
00141   ret = myquery(sqlbuf);
00142   if(ret >= 0) return 0; // success
00143   return -1;             // failure
00144 }
00145 
00146 int rlBussignalDatabase::myquery(const char *query)
00147 {
00148   int state,num_rows;
00149   MYSQL_RES *result;
00150 
00151   //printf("query=%s\n",query);
00152   state = mysql_query((MYSQL *) connection, query);
00153   if(state != 0)
00154   {
00155     //printf("query failed state=%d query=%s\n",state,query);
00156     return -1;
00157   }
00158   num_rows = mysql_affected_rows((MYSQL *) connection);
00159   result = mysql_store_result((MYSQL *) connection);
00160   mysql_free_result(result);
00161   //printf("num_rows=%d\n",num_rows);
00162   return num_rows;
00163 }
00164 
00165 int rlBussignalDatabase::readDatabase(const char *item, char *type, char *value)
00166 {
00167   char query[1024];
00168   int state,num_rows;
00169   MYSQL_RES *result;
00170   MYSQL_ROW row;
00171 
00172   *type = *value = '\0';
00173   sprintf(query,"select * from bus where name = '%s'",item);
00174   //printf("query=%s\n",query);
00175   state = mysql_query((MYSQL *) connection, query);
00176   if(state != 0)
00177   {
00178     //printf("query failed state=%d query=%s\n",state,query);
00179     return -1;
00180   }
00181   num_rows = mysql_affected_rows((MYSQL *) connection);
00182   result = mysql_store_result((MYSQL *) connection);
00183   if(result != NULL)
00184   {
00185     row = mysql_fetch_row(result);
00186     if(row != NULL)
00187     {
00188       if(row[1] != NULL) strcpy(type ,row[1]);
00189       if(row[2] != NULL) strcpy(value,row[2]);
00190     }
00191     mysql_free_result(result);
00192   }
00193   //printf("num_rows=%d\n",num_rows);
00194   return num_rows;
00195 }
00196 
00197 int rlBussignalDatabase::closeDatabase()
00198 {
00199   mysql_close((MYSQL *) connection);
00200   return 0;
00201 }
00202