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

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

parent 1564431a
bin_PROGRAMS = UObject
UObject_SOURCES = UObject_SK.cc UObject.cc
#SUBDIRS=tests
UObject_SK.cc: UObject.src.xml
@UNISET_CODEGEN@ --ask -n UObject --topdir $(top_builddir)/ --no-main UObject.src.xml
bin_SCRIPTS = @PACKAGE@-codegen
clean-local:
rm -rf *_SK.cc *_SK.h
xsldir = $(datadir)/uniset/xslt
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
$(GENERATED2): ../@PACKAGE@-codegen testgen-alone.src.xml ../*.xsl
../@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
clean-local:
......
......@@ -122,8 +122,13 @@
<HeartBeatTime time_msec="5000"/>
<TestGen input1_s="Input1_S" input2_s="DumpSensor1_S" name="TestGen" output1_c="DO_C"/>
<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: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>
</settings>
......@@ -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="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="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>
<thresholds name="thresholds">
<sensor iotype="AI" name="AI_AS">
......
......@@ -5,7 +5,7 @@
if HAVE_EXTENTIONS
SUBDIRS = lib include SharedMemory IOControl LogicProcessor \
ModbusMaster ModbusSlave SMViewer UniNetwork UNetUDP DBServer-MySQL DBServer-SQLite \
SharedMemoryPlus tests
RRDStorage SharedMemoryPlus tests
#SMDBServer
#SharedMemoryPlus
#UDPExchange
......
......@@ -5,7 +5,6 @@ extern "C" {
#include <cmath>
#include <sstream>
#include "Exceptions.h"
#include "extensions/Extensions.h"
#include "RRDStorage.h"
// -----------------------------------------------------------------------------
using namespace std;
......@@ -13,11 +12,12 @@ using namespace UniSetTypes;
using namespace UniSetExtensions;
// -----------------------------------------------------------------------------
RRDStorage::RRDStorage( UniSetTypes::ObjectId objId, xmlNode* cnode, UniSetTypes::ObjectId shmId, SharedMemory* ic,
const string prefix ):
const string prefix, DebugStream& log ):
UObject_SK(objId,cnode),
shm( new SMInterface(shmId,&ui,objId,ic) ),
prefix(prefix)
{
dlog = log;
UniXML::iterator it(cnode);
UniXML::iterator it1(cnode);
......@@ -55,13 +55,16 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID )
int rrdstep = it.getPIntProp("step",5);
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
<< "' create='" << cf << "'"
<< " step=" << rrdstep
<< endl;
std::list<std::string> rralist;
UniXML::iterator it_rra(cnode);
if( !it_rra.goChildren() )
......@@ -174,13 +177,22 @@ void RRDStorage::initRRD( xmlNode* cnode, int tmID )
// cout << "*** argv[" << k << "]='" << argv[k] << "'" << endl;
// Собственно создаём RRD
rrd_clear_error();
if( rrd_create_r(fname.c_str(),rrdstep,lastup,argc,(const char**)argv) < 0 )
if( !overwrite && file_exist(fname) )
{
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());
if( RRDStorage::dlog.debugging(Debug::INFO) )
RRDStorage::dlog[Debug::INFO] << myname << "(init): ignore create file='" << fname
<< "'. File exist... overwrite=0." << endl;
}
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 )
//--------------------------------------------------------------------------------
void RRDStorage::help_print( int argc, const char* const* argv )
{
cout << "--rrdstorage-name - ID for rrdstorage. Default: RRDStorage1. " << endl;
cout << "--rrdstorage-locale name - DB locale. Default: koi8-r. " << endl;
cout << "--rrdstorage-heartbeat-id name - ID for heartbeat sensor." << endl;
cout << "--rrdstorage-heartbeat-max val - max value for heartbeat sensor." << endl;
cout << " Default prefix='rrd'" << endl;
cout << "--prefix-name - ID for rrdstorage. Default: RRDStorage1. " << endl;
cout << "--prefix-confnode - configuration section name. Default: <NAME name='NAME'...> " << 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,
......
......@@ -4,15 +4,53 @@
#include "UObject_SK.h"
#include "SMInterface.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:
public UObject_SK
{
public:
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();
/*! глобальная функция для инициализации объекта */
......
......@@ -58,8 +58,6 @@ int main( int argc, const char** argv )
return 1;
}
db->init_dlog(dlog);
ObjectsActivator act;
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