|
rllib
1
|
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
1.7.5.1