addRecord is new
This commit is contained in:
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
This document summarizes the changes to the module between releases.
|
This document summarizes the changes to the module between releases.
|
||||||
|
|
||||||
|
## Since last release
|
||||||
|
|
||||||
|
1) addRecord is new.
|
||||||
|
|
||||||
## Release 4.5.0 (EPICS 7.0.3, Jul 2019)
|
## Release 4.5.0 (EPICS 7.0.3, Jul 2019)
|
||||||
|
|
||||||
1) support is a new feature.
|
1) support is a new feature.
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
<div class="head">
|
<div class="head">
|
||||||
<h1>pvDatabaseCPP</h1>
|
<h1>pvDatabaseCPP</h1>
|
||||||
<h2 class="nocount">Release ? - TBD</h2>
|
<h2 class="nocount">Release ? - TBD</h2>
|
||||||
Latest update 2019.06.19.
|
Latest update 2019.09.11.
|
||||||
|
|
||||||
|
|
||||||
<h2 class="nocount">Abstract</h2>
|
<h2 class="nocount">Abstract</h2>
|
||||||
@ -135,6 +135,10 @@ href="./html/index.html">doxgen</a>
|
|||||||
<dd>
|
<dd>
|
||||||
This is a PVRecord that periodical processes a set of PVRecords in the local PVDatabase.
|
This is a PVRecord that periodical processes a set of PVRecords in the local PVDatabase.
|
||||||
</dd>
|
</dd>
|
||||||
|
<dt>addRecord.h</dt>
|
||||||
|
<dd>
|
||||||
|
This is a PVRecord that adds a new PVRecord to the local PVDatabase.
|
||||||
|
</dd>
|
||||||
<dt>removeRecord.h</dt>
|
<dt>removeRecord.h</dt>
|
||||||
<dd>
|
<dd>
|
||||||
This is a PVRecord that removes a PVRecord in the local PVDatabase.
|
This is a PVRecord that removes a PVRecord in the local PVDatabase.
|
||||||
@ -174,7 +178,7 @@ href="./html/index.html">doxgen</a>
|
|||||||
<p>This has the pvSupport code.</p>
|
<p>This has the pvSupport code.</p>
|
||||||
<h3>src/special</h3>
|
<h3>src/special</h3>
|
||||||
<p>
|
<p>
|
||||||
This has the code for processRecord, removeRecord, and traceRecord.
|
This has the code for processRecord, addRecord, removeRecord, and traceRecord.
|
||||||
</p>
|
</p>
|
||||||
<h3>src/copy</h3>
|
<h3>src/copy</h3>
|
||||||
<p>This has the code for pvStructureCopy and all the plugin support.
|
<p>This has the code for pvStructureCopy and all the plugin support.
|
||||||
|
@ -25,6 +25,7 @@ INC += pv/channelProviderLocal.h
|
|||||||
|
|
||||||
INC += pv/traceRecord.h
|
INC += pv/traceRecord.h
|
||||||
INC += pv/removeRecord.h
|
INC += pv/removeRecord.h
|
||||||
|
INC += pv/addRecord.h
|
||||||
INC += pv/processRecord.h
|
INC += pv/processRecord.h
|
||||||
|
|
||||||
INC += pv/pvSupport.h
|
INC += pv/pvSupport.h
|
||||||
|
63
src/pv/addRecord.h
Normal file
63
src/pv/addRecord.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* addRecord.h */
|
||||||
|
/**
|
||||||
|
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||||
|
* EPICS pvData is distributed subject to a Software License Agreement found
|
||||||
|
* in file LICENSE that is included with this distribution.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @author mrk
|
||||||
|
* @date 2013.04.18
|
||||||
|
*/
|
||||||
|
#ifndef ADDRECORD_H
|
||||||
|
#define ADDRECORD_H
|
||||||
|
|
||||||
|
#include <pv/channelProviderLocal.h>
|
||||||
|
|
||||||
|
#include <shareLib.h>
|
||||||
|
|
||||||
|
namespace epics { namespace pvDatabase {
|
||||||
|
|
||||||
|
|
||||||
|
class AddRecord;
|
||||||
|
typedef std::tr1::shared_ptr<AddRecord> AddRecordPtr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add another record in the same database.
|
||||||
|
*
|
||||||
|
* A record to add another record
|
||||||
|
* It is meant to be used via a channelPutGet request.
|
||||||
|
* The argument has one field: recordName.
|
||||||
|
* The result has a field named status.
|
||||||
|
*/
|
||||||
|
class epicsShareClass AddRecord :
|
||||||
|
public PVRecord
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
POINTER_DEFINITIONS(AddRecord);
|
||||||
|
/**
|
||||||
|
* Factory methods to create AddRecord.
|
||||||
|
* @param recordName The name for the AddRecord.
|
||||||
|
* @return A shared pointer to AddRecord..
|
||||||
|
*/
|
||||||
|
static AddRecordPtr create(
|
||||||
|
std::string const & recordName);
|
||||||
|
/**
|
||||||
|
* standard init method required by PVRecord
|
||||||
|
* @return true unless record name already exists.
|
||||||
|
*/
|
||||||
|
virtual bool init();
|
||||||
|
/**
|
||||||
|
* @brief Add the record specified by recordName.
|
||||||
|
*/
|
||||||
|
virtual void process();
|
||||||
|
private:
|
||||||
|
AddRecord(
|
||||||
|
std::string const & recordName,
|
||||||
|
epics::pvData::PVStructurePtr const & pvStructure);
|
||||||
|
epics::pvData::PVStringPtr pvRecordName;
|
||||||
|
epics::pvData::PVStringPtr pvResult;
|
||||||
|
};
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
||||||
|
#endif /* ADDRECORD_H */
|
@ -4,12 +4,15 @@ SRC_DIRS += $(PVDATABASE_SRC)/special
|
|||||||
|
|
||||||
LIBSRCS += traceRecord.cpp
|
LIBSRCS += traceRecord.cpp
|
||||||
LIBSRCS += removeRecord.cpp
|
LIBSRCS += removeRecord.cpp
|
||||||
|
LIBSRCS += addRecord.cpp
|
||||||
LIBSRCS += processRecord.cpp
|
LIBSRCS += processRecord.cpp
|
||||||
|
|
||||||
DBD += traceRecordRegister.dbd
|
DBD += traceRecordRegister.dbd
|
||||||
DBD += removeRecordRegister.dbd
|
DBD += removeRecordRegister.dbd
|
||||||
|
DBD += addRecordRegister.dbd
|
||||||
DBD += processRecordRegister.dbd
|
DBD += processRecordRegister.dbd
|
||||||
|
|
||||||
LIBSRCS += traceRecordRegister.cpp
|
LIBSRCS += traceRecordRegister.cpp
|
||||||
LIBSRCS += removeRecordRegister.cpp
|
LIBSRCS += removeRecordRegister.cpp
|
||||||
|
LIBSRCS += addRecordRegister.cpp
|
||||||
LIBSRCS += processRecordRegister.cpp
|
LIBSRCS += processRecordRegister.cpp
|
||||||
|
118
src/special/addRecord.cpp
Normal file
118
src/special/addRecord.cpp
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/* addRecord.cpp */
|
||||||
|
/**
|
||||||
|
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||||
|
* EPICS pvData is distributed subject to a Software License Agreement found
|
||||||
|
* in file LICENSE that is included with this distribution.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @author mrk
|
||||||
|
* @date 2013.04.18
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <cstring>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <memory>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <pv/lock.h>
|
||||||
|
#include <pv/pvType.h>
|
||||||
|
#include <pv/pvData.h>
|
||||||
|
#include <pv/standardField.h>
|
||||||
|
#include <pv/pvTimeStamp.h>
|
||||||
|
#include <pv/timeStamp.h>
|
||||||
|
#include <pv/rpcService.h>
|
||||||
|
#include <pv/pvAccess.h>
|
||||||
|
#include <pv/status.h>
|
||||||
|
#include <pv/serverContext.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define epicsExportSharedSymbols
|
||||||
|
#include "pv/pvStructureCopy.h"
|
||||||
|
#include "pv/pvDatabase.h"
|
||||||
|
#include "pv/addRecord.h"
|
||||||
|
|
||||||
|
using std::tr1::static_pointer_cast;
|
||||||
|
using namespace epics::pvData;
|
||||||
|
using namespace epics::pvAccess;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
namespace epics { namespace pvDatabase {
|
||||||
|
|
||||||
|
AddRecordPtr AddRecord::create(
|
||||||
|
std::string const & recordName)
|
||||||
|
{
|
||||||
|
FieldCreatePtr fieldCreate = getFieldCreate();
|
||||||
|
PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||||
|
StructureConstPtr topStructure = fieldCreate->createFieldBuilder()->
|
||||||
|
addNestedStructure("argument")->
|
||||||
|
add("recordName",pvString)->
|
||||||
|
addNestedUnion("union") ->
|
||||||
|
endNested()->
|
||||||
|
endNested()->
|
||||||
|
addNestedStructure("result") ->
|
||||||
|
add("status",pvString) ->
|
||||||
|
endNested()->
|
||||||
|
createStructure();
|
||||||
|
PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure);
|
||||||
|
AddRecordPtr pvRecord(
|
||||||
|
new AddRecord(recordName,pvStructure));
|
||||||
|
if(!pvRecord->init()) pvRecord.reset();
|
||||||
|
return pvRecord;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddRecord::AddRecord(
|
||||||
|
std::string const & recordName,
|
||||||
|
epics::pvData::PVStructurePtr const & pvStructure)
|
||||||
|
: PVRecord(recordName,pvStructure)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddRecord::init()
|
||||||
|
{
|
||||||
|
initPVRecord();
|
||||||
|
PVStructurePtr pvStructure = getPVStructure();
|
||||||
|
pvRecordName = pvStructure->getSubField<PVString>("argument.recordName");
|
||||||
|
if(!pvRecordName) return false;
|
||||||
|
pvResult = pvStructure->getSubField<PVString>("result.status");
|
||||||
|
if(!pvResult) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddRecord::process()
|
||||||
|
{
|
||||||
|
PVDataCreatePtr pvDataCreate = getPVDataCreate();
|
||||||
|
string name = pvRecordName->get();
|
||||||
|
PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name);
|
||||||
|
if(pvRecord) {
|
||||||
|
pvResult->put(name + " already exists");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PVUnionPtr pvUnion = getPVStructure()->getSubField<PVUnion>("argument.union");
|
||||||
|
if(!pvUnion) {
|
||||||
|
pvResult->put(name + " argument.union is NULL");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PVFieldPtr pvField(pvUnion->get());
|
||||||
|
if(!pvField) {
|
||||||
|
pvResult->put(name + " union has no value");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(pvField->getField()->getType()!=epics::pvData::structure) {
|
||||||
|
pvResult->put(name + " union most be a structure");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
StructureConstPtr st = static_pointer_cast<const Structure>(pvField->getField());
|
||||||
|
PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st);
|
||||||
|
PVRecordPtr pvRec = PVRecord::create(name,pvStructure);
|
||||||
|
bool result = PVDatabase::getMaster()->addRecord(pvRec);
|
||||||
|
if(result) {
|
||||||
|
pvResult->put("success");
|
||||||
|
} else {
|
||||||
|
pvResult->put("failure");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}}
|
||||||
|
|
62
src/special/addRecordRegister.cpp
Normal file
62
src/special/addRecordRegister.cpp
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright information and license terms for this software can be
|
||||||
|
* found in the file LICENSE that is included with the distribution
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author mrk
|
||||||
|
* @date 2013.07.24
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Author: Marty Kraimer */
|
||||||
|
#include <epicsThread.h>
|
||||||
|
#include <iocsh.h>
|
||||||
|
#include <pv/event.h>
|
||||||
|
#include <pv/pvAccess.h>
|
||||||
|
#include <pv/serverContext.h>
|
||||||
|
#include <pv/pvData.h>
|
||||||
|
#include <pv/pvTimeStamp.h>
|
||||||
|
#include <pv/rpcService.h>
|
||||||
|
|
||||||
|
// The following must be the last include for code pvDatabase uses
|
||||||
|
#include <epicsExport.h>
|
||||||
|
#define epicsExportSharedSymbols
|
||||||
|
#include "pv/pvStructureCopy.h"
|
||||||
|
#include "pv/pvDatabase.h"
|
||||||
|
#include "pv/addRecord.h"
|
||||||
|
|
||||||
|
using namespace epics::pvData;
|
||||||
|
using namespace epics::pvAccess;
|
||||||
|
using namespace epics::pvDatabase;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
static const iocshArg testArg0 = { "recordName", iocshArgString };
|
||||||
|
static const iocshArg *testArgs[] = {
|
||||||
|
&testArg0};
|
||||||
|
|
||||||
|
static const iocshFuncDef addRecordFuncDef = {"addRecordCreate", 1,testArgs};
|
||||||
|
|
||||||
|
static void addRecordCallFunc(const iocshArgBuf *args)
|
||||||
|
{
|
||||||
|
char *recordName = args[0].sval;
|
||||||
|
if(!recordName) {
|
||||||
|
throw std::runtime_error("addRecordCreate invalid number of arguments");
|
||||||
|
}
|
||||||
|
AddRecordPtr record = AddRecord::create(recordName);
|
||||||
|
bool result = PVDatabase::getMaster()->addRecord(record);
|
||||||
|
if(!result) cout << "recordname" << " not added" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void addRecordRegister(void)
|
||||||
|
{
|
||||||
|
static int firstTime = 1;
|
||||||
|
if (firstTime) {
|
||||||
|
firstTime = 0;
|
||||||
|
iocshRegister(&addRecordFuncDef, addRecordCallFunc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
epicsExportRegistrar(addRecordRegister);
|
||||||
|
}
|
1
src/special/addRecordRegister.dbd
Normal file
1
src/special/addRecordRegister.dbd
Normal file
@ -0,0 +1 @@
|
|||||||
|
registrar("addRecordRegister")
|
Reference in New Issue
Block a user