Commit 139d4132 authored by Pavel Vainerman's avatar Pavel Vainerman

(RRDStorage): добавил обработку параметра overwrite при создании БД.

parent 1564431a
bin_PROGRAMS = UObject #SUBDIRS=tests
UObject_SOURCES = UObject_SK.cc UObject.cc
UObject_SK.cc: UObject.src.xml bin_SCRIPTS = @PACKAGE@-codegen
@UNISET_CODEGEN@ --ask -n UObject --topdir $(top_builddir)/ --no-main UObject.src.xml
clean-local: xsldir = $(datadir)/uniset/xslt
rm -rf *_SK.cc *_SK.h xsl_DATA = *.xsl skel*
all-local:
chmod 'a+x' @PACKAGE@-codegen
all-local: UObject_SK.cc UObject_SK.h
...@@ -19,7 +19,7 @@ $(GENERATED): ../@PACKAGE@-codegen testgen.src.xml ../*.xsl ...@@ -19,7 +19,7 @@ $(GENERATED): ../@PACKAGE@-codegen testgen.src.xml ../*.xsl
$(GENERATED2): ../@PACKAGE@-codegen testgen-alone.src.xml ../*.xsl $(GENERATED2): ../@PACKAGE@-codegen testgen-alone.src.xml ../*.xsl
../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen --local-include --alone -n TestGenAlone testgen-alone.src.xml ../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen --local-include --alone -n TestGenAlone testgen-alone.src.xml
$(GENUOBJ): ../@PACKAGE@-codegen testgen.src.xml ../*.xsl $(GENUOBJ): ../@PACKAGE@-codegen uobject.src.xml ../*.xsl
../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen -n UObject --no-main uobject.src.xml ../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen -n UObject --no-main uobject.src.xml
clean-local: clean-local:
......
...@@ -122,8 +122,13 @@ ...@@ -122,8 +122,13 @@
<HeartBeatTime time_msec="5000"/> <HeartBeatTime time_msec="5000"/>
<TestGen input1_s="Input1_S" input2_s="DumpSensor1_S" name="TestGen" output1_c="DO_C"/> <TestGen input1_s="Input1_S" input2_s="DumpSensor1_S" name="TestGen" output1_c="DO_C"/>
<RRDStorage1 name="RRDStorage1"> <RRDStorage1 name="RRDStorage1">
<rrd filename="rrdtest.rrd" filter_field="rrd" filter_value="1" step="5" ds_field="rrd1_ds"> <rrd filename="rrdtest.rrd" filter_field="rrd" filter_value="1" step="5" ds_field="rrd1_ds" overwrite="0">
<item rra="RRA:AVERAGE:0.5:1:4320"/> <item rra="RRA:AVERAGE:0.5:1:4320"/>
<item rra="RRA:MAX:0.5:1:4320"/>
</rrd>
<rrd filename="rrdtest2.rrd" filter_field="rrd" filter_value="2" step="10" ds_field="rrd2_ds" overwrite="0">
<item rra="RRA:AVERAGE:0.5:1:4320"/>
<item rra="RRA:MAX:0.5:1:4320"/>
</rrd> </rrd>
</RRDStorage1> </RRDStorage1>
</settings> </settings>
...@@ -198,7 +203,10 @@ ...@@ -198,7 +203,10 @@
<item id="51" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" ntit="1" mbtype="rtu" name="Input51_S" priority="Medium" rs="5" textname="Команда 2"/> <item id="51" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" ntit="1" mbtype="rtu" name="Input51_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="52" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="1" mbtype="rtu" name="Input52_S" priority="Medium" rs="5" textname="Команда 2"/> <item id="52" iotype="DI" mbaddr="0x01" mbfunc="0x06" mbreg="0x02" nbit="1" mbtype="rtu" name="Input52_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="53" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" nbit="2" mbtype="rtu" name="Input53_S" priority="Medium" rs="5" textname="Команда 2"/> <item id="53" iotype="DI" mbaddr="0x01" mbfunc="0x03" mbreg="0x01" nbit="2" mbtype="rtu" name="Input53_S" priority="Medium" rs="5" textname="Команда 2"/>
<item id="54" iotype="AI" name="AI54_S" textname="AI sensor 54" rrd="1" rrd1_ds="GAUGE:120:U:U"/> <item id="54" iotype="AI" name="AI54_S" textname="AI sensor 54" rrd="1" rrd1_ds="GAUGE:20:U:U"/>
<item id="55" iotype="AI" name="AI55_S" textname="AI sensor 55" rrd="1" rrd1_ds="GAUGE:20:U:U"/>
<item id="56" iotype="AI" name="AI56_S" textname="AI sensor 56" rrd="2" rrd2_ds="COUNTER:20:U:U"/>
<item id="57" iotype="AI" name="AI57_S" textname="AI sensor 57" rrd="2" rrd2_ds="DERIVE:20:U:U"/>
</sensors> </sensors>
<thresholds name="thresholds"> <thresholds name="thresholds">
<sensor iotype="AI" name="AI_AS"> <sensor iotype="AI" name="AI_AS">
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
if HAVE_EXTENTIONS if HAVE_EXTENTIONS
SUBDIRS = lib include SharedMemory IOControl LogicProcessor \ SUBDIRS = lib include SharedMemory IOControl LogicProcessor \
ModbusMaster ModbusSlave SMViewer UniNetwork UNetUDP DBServer-MySQL DBServer-SQLite \ ModbusMaster ModbusSlave SMViewer UniNetwork UNetUDP DBServer-MySQL DBServer-SQLite \
SharedMemoryPlus tests RRDStorage SharedMemoryPlus tests
#SMDBServer #SMDBServer
#SharedMemoryPlus #SharedMemoryPlus
#UDPExchange #UDPExchange
......
...@@ -5,7 +5,6 @@ extern "C" { ...@@ -5,7 +5,6 @@ extern "C" {
#include <cmath> #include <cmath>
#include <sstream> #include <sstream>
#include "Exceptions.h" #include "Exceptions.h"
#include "extensions/Extensions.h"
#include "RRDStorage.h" #include "RRDStorage.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
using namespace std; using namespace std;
...@@ -13,11 +12,12 @@ using namespace UniSetTypes; ...@@ -13,11 +12,12 @@ using namespace UniSetTypes;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
RRDStorage::RRDStorage( UniSetTypes::ObjectId objId, xmlNode* cnode, UniSetTypes::ObjectId shmId, SharedMemory* ic, RRDStorage::RRDStorage( UniSetTypes::ObjectId objId, xmlNode* cnode, UniSetTypes::ObjectId shmId, SharedMemory* ic,
const string prefix ): const string prefix, DebugStream& log ):
UObject_SK(objId,cnode), UObject_SK(objId,cnode),
shm( new SMInterface(shmId,&ui,objId,ic) ), shm( new SMInterface(shmId,&ui,objId,ic) ),
prefix(prefix) prefix(prefix)
{ {
dlog = log;
UniXML::iterator it(cnode); UniXML::iterator it(cnode);
UniXML::iterator it1(cnode); UniXML::iterator it1(cnode);
...@@ -55,13 +55,16 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID ) ...@@ -55,13 +55,16 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID )
int rrdstep = it.getPIntProp("step",5); int rrdstep = it.getPIntProp("step",5);
int lastup = it.getPIntProp("lastup",0); int lastup = it.getPIntProp("lastup",0);
bool overwrite = it.getPIntProp("overwrite",0);
RRDStorage::dlog[Debug::INFO] << myname << "(init): add rrd: file='" << fname if( RRDStorage::dlog.debugging(Debug::INFO) )
RRDStorage::dlog[Debug::INFO] << myname << "(init): add rrd: file='" << fname
<< " " << ff << "='" << fv << " " << ff << "='" << fv
<< "' create='" << cf << "'" << "' create='" << cf << "'"
<< " step=" << rrdstep << " step=" << rrdstep
<< endl; << endl;
std::list<std::string> rralist; std::list<std::string> rralist;
UniXML::iterator it_rra(cnode); UniXML::iterator it_rra(cnode);
if( !it_rra.goChildren() ) if( !it_rra.goChildren() )
...@@ -174,13 +177,22 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID ) ...@@ -174,13 +177,22 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID )
// cout << "*** argv[" << k << "]='" << argv[k] << "'" << endl; // cout << "*** argv[" << k << "]='" << argv[k] << "'" << endl;
// Собственно создаём RRD // Собственно создаём RRD
rrd_clear_error(); if( !overwrite && file_exist(fname) )
if( rrd_create_r(fname.c_str(),rrdstep,lastup,argc,(const char**)argv) < 0 )
{ {
ostringstream err; if( RRDStorage::dlog.debugging(Debug::INFO) )
err << myname << "(init): Can`t create RRD ('" << fname << "'): err: " << string(rrd_get_error()); RRDStorage::dlog[Debug::INFO] << myname << "(init): ignore create file='" << fname
RRDStorage::dlog[Debug::CRIT] << err.str() << endl; << "'. File exist... overwrite=0." << endl;
throw SystemError(err.str()); }
else
{
rrd_clear_error();
if( rrd_create_r(fname.c_str(),rrdstep,lastup,argc,(const char**)argv) < 0 )
{
ostringstream err;
err << myname << "(init): Can`t create RRD ('" << fname << "'): err: " << string(rrd_get_error());
RRDStorage::dlog[Debug::CRIT] << err.str() << endl;
throw SystemError(err.str());
}
} }
// Чистим выделенную память // Чистим выделенную память
...@@ -205,10 +217,11 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID ) ...@@ -205,10 +217,11 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID )
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
void RRDStorage::help_print( int argc, const char* const* argv ) void RRDStorage::help_print( int argc, const char* const* argv )
{ {
cout << "--rrdstorage-name - ID for rrdstorage. Default: RRDStorage1. " << endl; cout << " Default prefix='rrd'" << endl;
cout << "--rrdstorage-locale name - DB locale. Default: koi8-r. " << endl; cout << "--prefix-name - ID for rrdstorage. Default: RRDStorage1. " << endl;
cout << "--rrdstorage-heartbeat-id name - ID for heartbeat sensor." << endl; cout << "--prefix-confnode - configuration section name. Default: <NAME name='NAME'...> " << endl;
cout << "--rrdstorage-heartbeat-max val - max value for heartbeat sensor." << endl; cout << "--prefix-heartbeat-id name - ID for heartbeat sensor." << endl;
cout << "--prefix-heartbeat-max val - max value for heartbeat sensor." << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
RRDStorage* RRDStorage::init_rrdstorage( int argc, const char* const* argv, RRDStorage* RRDStorage::init_rrdstorage( int argc, const char* const* argv,
......
...@@ -4,15 +4,53 @@ ...@@ -4,15 +4,53 @@
#include "UObject_SK.h" #include "UObject_SK.h"
#include "SMInterface.h" #include "SMInterface.h"
#include "SharedMemory.h" #include "SharedMemory.h"
#include "extensions/Extensions.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
/*! /*!
"RoundRobinDatabase" - реализация циклического хранилища.
Процесс реализует циклическое хранение данных (от датчиков) и позволяет
конфигурировать любое количество rrd-баз и входящих в них "источников".
Пример секции конфигурации:
\code
<RRDStorage1 name="RRDStorage1">
<rrd filename="rrdtest.rrd" filter_field="rrd" filter_value="1" step="5" ds_field="rrd1_ds" overwrite="0">
<item rra="RRA:AVERAGE:0.5:1:4320"/>
<item rra="RRA:MAX:0.5:1:4320"/>
</rrd>
<rrd filename="rrdtest2.rrd" filter_field="rrd" filter_value="2" step="10" ds_field="rrd2_ds" overwrite="0">
<item rra="RRA:AVERAGE:0.5:1:4320"/>
<item rra="RRA:MAX:0.5:1:4320"/>
</rrd>
</RRDStorage1>
\endcode
Где:
\b filename - имя создаваемого rrd-файла
\b filter_field - поле у датчика, определяющее, что его нужно сохранять в БД
\b filter_value - значение filter_field, определяющее, что датчик нужно сохранять в БД
\b ds_field - поле определяющее, параметр задающий формат хранения. Если \a ds_field не задано,
то будет браться filter_field+filter_value+'_ds'.
\b step - период обновления данных (в секундах)
\b overwrite - [0,1]. Пересоздавать ли БД, если файл уже существует.
При этом в секции <sensors> у датчиков прописываются параметры относящиеся к источнику:
\code
<sensors>
...
<item id="54" iotype="AI" name="AI54_S" textname="AI sensor 54" rrd="1" rrd1_ds="GAUGE:20:U:U"/>
<item id="55" iotype="AI" name="AI55_S" textname="AI sensor 55" rrd="1" rrd1_ds="GAUGE:20:U:U"/>
<item id="56" iotype="AI" name="AI56_S" textname="AI sensor 56" rrd="2" rrd2_ds="COUNTER:20:U:U"/>
<item id="57" iotype="AI" name="AI57_S" textname="AI sensor 57" rrd="2" rrd2_ds="DERIVE:20:U:U"/>
...
</sensors>
\endcode
*/ */
class RRDStorage: class RRDStorage:
public UObject_SK public UObject_SK
{ {
public: public:
RRDStorage( UniSetTypes::ObjectId objId, xmlNode* cnode, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, RRDStorage( UniSetTypes::ObjectId objId, xmlNode* cnode, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
const std::string prefix="rrd" ); const std::string prefix="rrd", DebugStream& log=UniSetExtensions::dlog );
virtual ~RRDStorage(); virtual ~RRDStorage();
/*! глобальная функция для инициализации объекта */ /*! глобальная функция для инициализации объекта */
......
...@@ -58,8 +58,6 @@ int main( int argc, const char** argv ) ...@@ -58,8 +58,6 @@ int main( int argc, const char** argv )
return 1; return 1;
} }
db->init_dlog(dlog);
ObjectsActivator act; ObjectsActivator act;
act.addObject(static_cast<class UniSetObject*>(db)); act.addObject(static_cast<class UniSetObject*>(db));
......
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