You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

285 lines
6.4 KiB
C++

#include "MySQLAdo.h"
#include <assert.h>
#include <cstdlib>
#include <cstring>
#include <time.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 true;
#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.`site_id`,t1.`sensor_id`,t2.sensor_code,t2.grp_no FROM iec_points AS t1 LEFT JOIN iec_sensors AS t2 t1.sensor_id=t2.`id` WHERE t1.`status`=1 AND t2.`status`=1 ORDER BY t1.site_id,t2.sadr";
const char* sql = "SELECT t1.`id`,t1.`site_id`,t1.`sensor_id`,t2.sensor_code,t2.grp_no FROM niec_points AS t1 LEFT JOIN niec_sensors AS t2 t1.sensor_id=t2.`id` WHERE t1.`status`=1 AND t2.`status`=1 ORDER BY t1.site_id,t2.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);
fieldIdx++; // sensor code 17位编码
pt.sensorId = strtoul(row[fieldIdx++], NULL, 10);
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;
}
std::string sql = "SELECT sadr,state,stype,ival,fval,d_time FROM niec_origin_data WHERE sadr=" + std::to_string(pt.sadr) + " 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.sadr;
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;
}