Commit f53f4a11 authored by Pavel Vainerman's avatar Pavel Vainerman

(DBServer): Переработан под текущий используеммый в проектах формат таблиц.

parent f3ac636b
......@@ -162,71 +162,18 @@ void DBServer_MySQL::parse( UniSetTypes::DBMessage* dbm )
}
//--------------------------------------------------------------------------------------------
void DBServer_MySQL::parse( UniSetTypes::InfoMessage* im )
{
string message(im->message);
if( message.empty() && im->infocode != DefaultMessageCode )
message = conf->mi->getMessage(im->infocode);
if( !message.empty() )
message = db->addslashes(message);
// Прежде чем формировать строку обязательно смотрите формат базы данных(порядок полей таблицы)!!!
ostringstream ostr;
ostr << "INSERT INTO " << tblName(im->type);
ostr << "(num,node,id,date,time,time_usec,code,text,haracter,type,confirm,causeid) VALUES(";
ostr << "NULL,'"<< im->node << "','" << im->id;
ostr << "','" << ui.dateToString(im->tm.tv_sec,"/") << "','" << ui.timeToString(im->tm.tv_sec,":");
ostr << "','" << im->tm.tv_usec;
ostr << "','" << im->infocode << "','"<< message << "','" << im->character;
ostr << "','" << im->type << "','0','0')";
if( !writeToBase(ostr.str()) )
{
unideb[Debug::CRIT] << myname << "(insert): info msg error: "<< db->error() << endl;
// db->freeResult();
}
}
//--------------------------------------------------------------------------------------------
void DBServer_MySQL::parse( UniSetTypes::AlarmMessage* am )
{
string message(am->message);
if( message.empty() && am->alarmcode != DefaultMessageCode )
message = conf->mi->getMessage(am->alarmcode);
if( !message.empty() )
message = db->addslashes(message);
// Прежде чем формировать строку обязательно смотрите формат базы данных(порядок полей таблицы)!!!
ostringstream ostr;
ostr << "INSERT INTO " << tblName(am->type);
ostr << "(num,node,id,date,time,time_usec,code,text,haracter,type,confirm,causeid) VALUES(";
ostr << "NULL,'"<< am->node << "','" << am->id;
ostr << "','" << ui.dateToString(am->tm.tv_sec,"/") << "','"
<< ui.timeToString(am->tm.tv_sec,":")<< "','" << am->tm.tv_usec;
ostr << "','" << am->alarmcode<< "','" << message;
ostr << "','" << am->character << "','" << am->type << "',0,'" << am->causecode << "')";
if( !writeToBase(ostr.str()) )
{
unideb[Debug::CRIT] << myname << "(insert): alarm msg error: "<< db->error() << endl;
// db->freeResult();
}
}
//--------------------------------------------------------------------------------------------
void DBServer_MySQL::parse( UniSetTypes::ConfirmMessage* cem )
{
try
{
ostringstream data;
data << "UPDATE main_history SET confirm='" << cem->confirm << "'";
data << " WHERE sensor_id='" << cem->sensor_id << "'";
data << " AND date='" << ui.dateToString(cem->time, "-")<<" '";
data << " AND time='" << ui.timeToString(cem->time, ":") <<" '";
data << " AND time_usec='" << cem->time_usec <<" '";
data << "UPDATE " << tblName(cem->type)
<< " SET confirm='" << cem->confirm << "'"
<< " WHERE sensor_id='" << cem->sensor_id << "'"
<< " AND date='" << ui.dateToString(cem->time, "-")<<" '"
<< " AND time='" << ui.timeToString(cem->time, ":") <<" '"
<< " AND time_usec='" << cem->time_usec <<" '";
if( unideb.debugging(DBLEVEL) )
unideb[DBLEVEL] << myname << "(update_confirm): " << data.str() << endl;
......@@ -270,7 +217,7 @@ bool DBServer_MySQL::writeToBase( const string& query )
qbuf.pop();
if( unideb.debugging(Debug::CRIT) )
unideb[Debug::CRIT] << myname << "(writeToBase): DB not connected! buffer(" << qbufSize
unideb[Debug::CRIT] << myname << "(writeToBase): DB not connected! buffer(" << qbufSize
<< ") overflow! lost query: " << qlost << endl;
}
return false;
......@@ -332,63 +279,37 @@ void DBServer_MySQL::parse( UniSetTypes::SensorMessage *si )
struct timezone tz;
gettimeofday(&si->tm,&tz);
}
// см. DBTABLE AnalogSensors, DigitalSensors
ostringstream data;
data << " VALUES( ";
// Поля таблицы
data << "NULL,'"<< si->node << "','"; // num, node
data << si->id << "','"; // id (sensorid)
data << ui.dateToString(si->sm_tv_sec,"/") << "','"; // date
data << ui.timeToString(si->sm_tv_sec,":") << "','"; // time
data << si->sm_tv_usec << "','"; // time_usec
// data << ui.dateToString(si->tm.tv_sec) << "','"; // date
// data << ui.timeToString(si->tm.tv_sec) << "','"; // time
// data << si->tm.tv_usec << "','"; // time_usec
// см. DBTABLE AnalogSensors, DigitalSensors
ostringstream data;
data << "INSERT INTO " << tblName(si->type)
<< "(date, time, time_usec, sensor_id, value, node) VALUES( '"
// Поля таблицы
<< ui.dateToString(si->sm_tv_sec,"-") << "','" // date
<< ui.timeToString(si->sm_tv_sec,":") << "','" // time
<< si->sm_tv_usec << "'," // time_usec
<< si->id << "," // sensor_id
<< si->value << "," // value
<< si->node << ")"; // node
string table;
switch( si->sensor_type )
{
case UniversalIO::DigitalInput:
case UniversalIO::DigitalOutput:
table = "DigitalSensors(num,node,id,date,time,time_usec,state)";
data << si->state; // state
break;
case UniversalIO::AnalogInput:
case UniversalIO::AnalogOutput:
table = "AnalogSensors(num,node,id,date,time,time_usec,value)";
data << si->value; // value
break;
default:
unideb[Debug::WARN] << myname << "(log sensor): Unknown iotype='"
<< si->sensor_type << "'.. ignore SensorMessage..." << endl;
return;
}
data << "')";
if( unideb.debugging(DBLEVEL) )
unideb[DBLEVEL] << myname << "(insert_main_history): " << data.str() << endl;
if( !writeToBase("INSERT INTO "+table+data.str()) )
if( !writeToBase(data.str()) )
{
if( unideb.debugging(Debug::CRIT) )
unideb[Debug::CRIT] << myname << "(insert) sensor msg error: "<< db->error() << endl;
db->freeResult();
db->freeResult();
}
}
catch( Exception& ex )
{
if( unideb.debugging(Debug::CRIT) )
unideb[Debug::CRIT] << myname << "(parse SensorMessage): " << ex << endl;
{
unideb[Debug::CRIT] << myname << "(insert_main_history): " << ex << endl;
}
catch( ... )
{
if( unideb.debugging(Debug::CRIT) )
unideb[Debug::CRIT] << myname << "(parse SensorMessage): catch..." << endl;
catch( ... )
{
unideb[Debug::CRIT] << myname << "(insert_main_history): catch ..." << endl;
}
}
//--------------------------------------------------------------------------------------------
void DBServer_MySQL::init_dbserver()
......@@ -425,9 +346,8 @@ void DBServer_MySQL::init_dbserver()
string user(conf->getProp(node,"dbuser"));
string password(conf->getProp(node,"dbpass"));
tblMap[UniSetTypes::Message::Info] = "Messages";
tblMap[UniSetTypes::Message::Alarm] = "Messages";
tblMap[UniSetTypes::Message::SensorInfo] = "AnalogSensors";
tblMap[UniSetTypes::Message::SensorInfo] = "main_history";
tblMap[UniSetTypes::Message::Confirm] = "main_history";
PingTime = conf->getIntProp(node,"pingTime");
ReconnectTime = conf->getIntProp(node,"reconnectTime");
......@@ -444,7 +364,7 @@ void DBServer_MySQL::init_dbserver()
dbnode = "localhost";
if( unideb.debugging(DBLogInfoLevel) )
unideb[DBLogInfoLevel] << myname << "(init): connect dbnode=" << dbnode
unideb[DBLogInfoLevel] << myname << "(init): connect dbnode=" << dbnode
<< "\tdbname=" << dbname
<< " pingTime=" << PingTime
<< " ReconnectTime=" << ReconnectTime << endl;
......@@ -453,7 +373,7 @@ void DBServer_MySQL::init_dbserver()
{
// ostringstream err;
if( unideb.debugging(Debug::CRIT) )
unideb[Debug::CRIT] << myname
unideb[Debug::CRIT] << myname
<< "(init): DB connection error: "
<< db->error() << endl;
// throw Exception( string(myname+"(init): не смогли создать соединение с БД "+db->error()) );
......
......@@ -85,63 +85,51 @@
\section sec_DBS_Tables Таблицы MySQL
К основным таблицам относятся следующие:
\code
DROP TABLE IF EXISTS ObjectsMap;
CREATE TABLE ObjectsMap (
name varchar(80) NOT NULL default '',
rep_name varchar(80) default NULL,
id int(4) NOT NULL default '0',
msg int(1) default 0,
PRIMARY KEY (id),
KEY rep_name (rep_name),
KEY msg (msg)
) TYPE=MyISAM;
DROP TABLE IF EXISTS AnalogSensors;
CREATE TABLE AnalogSensors (
num int(11) NOT NULL auto_increment,
node int(3) default NULL,
id int(4) default NULL,
date date NOT NULL default '0000-00-00',
time time NOT NULL default '00:00:00',
time_usec int(3) unsigned default '0',
value int(6) default NULL,
PRIMARY KEY (num),
KEY date (date,time,time_usec),
KEY node (node,id)
) TYPE=MyISAM;
--
-- Table structure for table `DigitalSensors`
--
DROP TABLE IF EXISTS DigitalSensors;
CREATE TABLE DigitalSensors (
num int(11) NOT NULL auto_increment,
node int(3) default NULL,
id int(4) default NULL,
date date NOT NULL default '0000-00-00',
time time NOT NULL default '00:00:00',
time_usec int(3) unsigned default '0',
state char(1) default NULL,
confirm time NOT NULL default '00:00:00',
PRIMARY KEY (num),
KEY date (date,time,time_usec),
KEY node (node,id),
KEY confirm(confirm)
) TYPE=MyISAM;
DROP TABLE IF EXISTS SensorsThreshold;
CREATE TABLE SensorsThreshold (
sid int(11) NOT NULL default '0',
alarm int(8) NOT NULL default '0',
warning int(8) NOT NULL default '0'
) TYPE=MyISAM;
DROP TABLE IF EXISTS `main_history`;
CREATE TABLE `main_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`time` time NOT NULL,
`time_usec` int(10) unsigned NOT NULL,
`sensor_id` int(10) unsigned NOT NULL,
`value` double NOT NULL,
`node` int(10) unsigned NOT NULL,
`confirm` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `main_history_sensor_id` (`sensor_id`),
CONSTRAINT `sensor_id_refs_id_3d679168` FOREIGN KEY (`sensor_id`) REFERENCES `main_sensor` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `main_emergencylog`;
CREATE TABLE `main_emergencylog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`time` time NOT NULL,
`time_usec` int(10) unsigned NOT NULL,
`type_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `main_emergencylog_type_id` (`type_id`),
CONSTRAINT `type_id_refs_id_a3133ca` FOREIGN KEY (`type_id`) REFERENCES `main_emergencytype` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `main_emergencyrecords`;
CREATE TABLE `main_emergencyrecords` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`time` time NOT NULL,
`time_usec` int(10) unsigned NOT NULL,
`log_id` int(11) NOT NULL,
`sensor_id` int(10) unsigned NOT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`),
KEY `main_emergencyrecords_log_id` (`log_id`),
KEY `main_emergencyrecords_sensor_id` (`sensor_id`),
CONSTRAINT `log_id_refs_id_77a37ea9` FOREIGN KEY (`log_id`) REFERENCES `main_emergencylog` (`id`),
CONSTRAINT `sensor_id_refs_id_436bab5e` FOREIGN KEY (`sensor_id`) REFERENCES `main_sensor` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
\endcode
*/
class DBServer_MySQL:
public DBServer
......@@ -166,8 +154,6 @@ class DBServer_MySQL:
// Функции обработки пришедших сообщений
virtual void parse( UniSetTypes::SensorMessage* sm );
virtual void parse( UniSetTypes::DBMessage* dbmsg );
virtual void parse( UniSetTypes::InfoMessage* imsg );
virtual void parse( UniSetTypes::AlarmMessage* amsg );
virtual void parse( UniSetTypes::ConfirmMessage* cmsg );
bool writeToBase( const string& query );
......
DELETE FROM DigitalSensors WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM AnalogSensors WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM Messages WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM RSChannel WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM Network WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment