# include "MySQLAdo.h"
# include <assert.h>
# include <cstdlib>
# include <cstring>
# include <string>
# include <time.h>
# include <math.h>
# include <stdlib.h>
# include <stdio.h>
using namespace std ;
# ifdef USING_MYSQL
# ifdef _WIN32
# pragma comment( lib, "mariadbclient.lib" )
# endif
std : : vector < IEC_POINT_TABLE > g_iec_points ;
std : : map < unsigned int , IEC_POINT_TABLE * > g_iec_point_map ;
# ifdef USING_MYSQL
bool LoadIecPoints ( ) ;
# endif
static void show_mysql_error ( MYSQL * mysql , const char * name )
{
printf ( " %s: Error(%d) [%s] \" %s \" " , name , mysql_errno ( mysql ) ,
mysql_sqlstate ( mysql ) ,
mysql_error ( mysql ) ) ;
}
static void show_stmt_error ( MYSQL_STMT * stmt , const char * name )
{
printf ( " %s: Error(%d) [%s] \" %s \" " , name , mysql_stmt_errno ( stmt ) ,
mysql_stmt_sqlstate ( stmt ) ,
mysql_stmt_error ( stmt ) ) ;
}
static void ConvertTimestampToMySQLTime ( time_t t , MYSQL_TIME & ts )
{
struct tm * ptm = gmtime ( & t ) ;
ts . year = ptm - > tm_year + 1900 ;
ts . month = ptm - > tm_mon + 1 ;
ts . day = ptm - > tm_mday ;
ts . hour = ptm - > tm_hour ;
ts . minute = ptm - > tm_min ;
ts . second = ptm - > tm_sec ;
ts . time_type = MYSQL_TIMESTAMP_DATETIME ;
}
inline void BindNullValue ( MYSQL_BIND & bind )
{
bind . buffer = NULL ;
bind . is_unsigned = false ;
bind . is_null_value = 1 ;
bind . buffer_type = MYSQL_TYPE_NULL ;
bind . buffer_length = 0 ;
}
inline void BindUByteValue ( MYSQL_BIND & bind , const unsigned char & value )
{
bind . buffer = ( char * ) & value ;
bind . is_unsigned = true ;
bind . buffer_type = MYSQL_TYPE_TINY ;
bind . buffer_length = sizeof ( value ) ;
}
inline void BindUShortValue ( MYSQL_BIND & bind , const unsigned short & value )
{
bind . buffer = ( char * ) & value ;
bind . is_unsigned = true ;
bind . buffer_type = MYSQL_TYPE_SHORT ;
bind . buffer_length = sizeof ( value ) ;
}
inline void BindUIntValue ( MYSQL_BIND & bind , const unsigned int & value )
{
bind . buffer = ( char * ) & value ;
bind . is_unsigned = true ;
bind . buffer_type = MYSQL_TYPE_LONG ;
bind . buffer_length = sizeof ( value ) ;
}
inline void BindULongValue ( MYSQL_BIND & bind , const unsigned long long & value )
{
bind . buffer = ( char * ) & value ;
bind . is_unsigned = true ;
bind . buffer_type = MYSQL_TYPE_LONGLONG ;
bind . buffer_length = sizeof ( value ) ;
}
inline void BindFloatValue ( MYSQL_BIND & bind , const float & value )
{
bind . buffer = ( char * ) & value ;
bind . buffer_type = isnan ( value ) ? MYSQL_TYPE_NULL : MYSQL_TYPE_FLOAT ;
if ( isnan ( value ) )
{
// bind.is_null_value = 1;
}
bind . buffer_length = sizeof ( value ) ;
}
inline void BindDoubleValue ( MYSQL_BIND & bind , const double & value )
{
bind . buffer = ( char * ) & value ;
bind . buffer_type = isnan ( value ) ? MYSQL_TYPE_NULL : MYSQL_TYPE_DOUBLE ;
if ( isnan ( value ) )
{
// bind.is_null_value = 1;
}
bind . buffer_length = sizeof ( value ) ;
}
inline void BindValue ( MYSQL_BIND & bind , const char * value , unsigned long & len )
{
bind . buffer = ( char * ) value ;
bind . buffer_length = len ;
bind . buffer_type = MYSQL_TYPE_STRING ;
bind . length = & len ;
}
# endif
bool PingDatabase ( ) ;
# ifdef USING_MYSQL
MYSQL * mysql = NULL ;
# endif // USING_MYSQL
bool InitDatabase ( int argc , char * * argv , const char * host , const char * username , const char * password , const char * database )
{
# ifdef USING_MYSQL
if ( mysql_library_init ( argc , argv , NULL ) ! = 0 )
{
return false ;
}
mysql = NULL ;
mysql = mysql_init ( mysql ) ;
char value = 1 ;
mysql_options ( mysql , MYSQL_OPT_RECONNECT , ( char * ) & value ) ;
MYSQL * handle = mysql_real_connect ( mysql , host , username , password , database ,
0 , /* port number, 0 for default */
NULL , /* socket file or named pipe name */
CLIENT_FOUND_ROWS /* connection flags */ ) ;
if ( handle = = NULL )
{
show_mysql_error ( mysql , " Connect MySQL " ) ;
mysql_close ( mysql ) ;
mysql = NULL ;
return false ;
}
mysql_query ( mysql , " SET NAMES utf8 " ) ;
return LoadIecPoints ( ) ;
# else
return true ;
# endif // USING_MYSQL
}
bool UninitDatabase ( )
{
# ifdef USING_MYSQL
if ( mysql ! = NULL ) mysql_close ( mysql ) ;
mysql_library_end ( ) ;
# endif
return true ;
}
bool PingDatabase ( )
{
# ifdef USING_MYSQL
if ( mysql = = NULL )
return false ;
return mysql_ping ( mysql ) = = 0 ;
# else
return false ;
# endif // USING_MYSQL
}
# ifdef USING_MYSQL
bool LoadIecPoints ( )
{
// const char* sql = "SELECT t1.`id`,t1.sadr,t1.`site_id`,t1.`sensor_id`,t1.item_no,t2.sensor_code,t2.grp_no FROM iec_points AS t1 LEFT JOIN iec_sensors AS t2 ON t1.sensor_id=t2.`id` WHERE t1.`status`=1 AND t2.`status`=1 ORDER BY t1.site_id,t1.sadr";
const char * sql = " SELECT t1.`id`,t1.sadr,t1.`site_id`,t1.`sensor_id`,t1.item_no,t2.sensor_code,t2.grp_no FROM niec_points AS t1 LEFT JOIN niec_sensors AS t2 ON t1.sensor_id=t2.`id` WHERE t1.`status`=1 AND t2.`status`=1 ORDER BY t1.site_id,t1.sadr " ;
if ( mysql_query ( mysql , sql ) )
{
// error
show_mysql_error ( mysql , " LoadIecPoints " ) ;
return false ;
}
MYSQL_RES * res = mysql_store_result ( mysql ) ;
if ( res = = NULL )
{
show_mysql_error ( mysql , " LoadIecPoints " ) ;
return false ;
}
MYSQL_ROW row ;
IEC_POINT_TABLE pt ;
size_t fieldIdx = 0 ;
while ( row = mysql_fetch_row ( res ) )
{
fieldIdx = 1 ;
// t1.`id`,t1.`site_id`,t1.`sensor_id`,t2.sensor_code,t2.grp_no
pt . sadr = strtoul ( row [ fieldIdx + + ] , NULL , 10 ) ;
pt . siteId = strtoul ( row [ fieldIdx + + ] , NULL , 10 ) ;
pt . sensorId = strtoul ( row [ fieldIdx + + ] , NULL , 10 ) ;
pt . itemNo = strtoul ( row [ fieldIdx + + ] , NULL , 10 ) ;
fieldIdx + + ; // sensor code 17位编码
pt . sensorGroupNo = strtoul ( row [ fieldIdx + + ] , NULL , 10 ) ;
g_iec_points . push_back ( pt ) ;
}
}
# endif
/*
返 回 值 :
1 : 正 确
0 : 没 有 更 多 数 据
- 1 : 出 错
*/
int GetAIPntMsg ( int j , unsigned int * igno , unsigned int * iItemNo , DAY_TIME * sCurTime , float * pfValue , unsigned int * iaddr )
{
# ifdef USING_MYSQL
if ( j < 0 )
{
return - 1 ;
}
if ( j > = g_iec_points . size ( ) )
{
return 0 ;
}
const IEC_POINT_TABLE & pt = g_iec_points [ j ] ;
if ( ! PingDatabase ( ) )
{
return - 1 ;
}
char buf [ 16 ] = { 0 } ;
sprintf ( buf , " %u " , pt . sadr ) ;
std : : string sql = " SELECT sadr,state,stype,ival,fval,d_time FROM niec_origin_data WHERE sadr= " ;
sql + = buf ;
sql + = " ORDER BY `id` DESC LIMIT 1 " ;
if ( mysql_query ( mysql , sql . c_str ( ) ) )
{
// error
show_mysql_error ( mysql , " GetAIPntMsg " ) ;
return - 1 ;
}
MYSQL_RES * res = mysql_store_result ( mysql ) ;
if ( res = = NULL )
{
return - 1 ;
}
int year = 0 , mon = 0 , day = 0 , hour = 0 , min = 0 , sec = 0 ;
MYSQL_ROW row = mysql_fetch_row ( res ) ;
if ( row )
{
if ( igno ! = NULL ) * igno = pt . sensorGroupNo ;
if ( iItemNo ! = NULL ) * iItemNo = pt . itemNo ;
if ( iaddr ! = NULL ) * iaddr = pt . sensorId ;
if ( pfValue ! = NULL ) * pfValue = atof ( row [ 4 ] ) ;
if ( sCurTime ! = NULL & & row [ 5 ] ! = NULL )
{
sscanf ( row [ 5 ] , " %04d-%02d-%2d %02d:%02d:%02d " , & year , & mon , & day , & hour , & min , & sec ) ;
sCurTime - > Year = year ;
sCurTime - > Month = mon ;
sCurTime - > Day = day ;
sCurTime - > Hour = hour ;
sCurTime - > Min = min ;
sCurTime - > Sec = sec ;
sCurTime - > mSec = 0 ;
}
}
mysql_free_result ( res ) ;
return row ! = NULL ? 1 : - 1 ;
# endif
return 0 ;
}