19 #include <pv/pvType.h> 20 #include <pv/pvData.h> 21 #include <pv/standardField.h> 22 #include <pv/pvTimeStamp.h> 23 #include <pv/timeStamp.h> 24 #include <pv/rpcService.h> 25 #include <pv/pvAccess.h> 26 #include <pv/status.h> 27 #include <pv/serverContext.h> 30 #define epicsExportSharedSymbols 35 using std::tr1::static_pointer_cast;
40 namespace epics {
namespace pvDatabase {
43 std::string
const & recordName)
45 FieldCreatePtr fieldCreate = getFieldCreate();
46 PVDataCreatePtr pvDataCreate = getPVDataCreate();
47 StructureConstPtr topStructure = fieldCreate->createFieldBuilder()->
48 addNestedStructure(
"argument")->
49 add(
"recordName",pvString)->
50 addNestedUnion(
"union") ->
53 addNestedStructure(
"result") ->
54 add(
"status",pvString) ->
57 PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure);
60 if(!pvRecord->init()) pvRecord.reset();
65 std::string
const & recordName,
66 epics::pvData::PVStructurePtr
const & pvStructure)
71 bool AddRecord::init()
74 PVStructurePtr pvStructure = getPVStructure();
75 pvRecordName = pvStructure->getSubField<PVString>(
"argument.recordName");
76 if(!pvRecordName)
return false;
77 pvResult = pvStructure->getSubField<PVString>(
"result.status");
78 if(!pvResult)
return false;
82 void AddRecord::process()
84 PVDataCreatePtr pvDataCreate = getPVDataCreate();
85 string name = pvRecordName->get();
86 PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name);
88 pvResult->put(name +
" already exists");
91 PVUnionPtr pvUnion = getPVStructure()->getSubField<PVUnion>(
"argument.union");
93 pvResult->put(name +
" argument.union is NULL");
96 PVFieldPtr pvField(pvUnion->get());
98 pvResult->put(name +
" union has no value");
101 if(pvField->getField()->getType()!=epics::pvData::structure) {
102 pvResult->put(name +
" union most be a structure");
105 StructureConstPtr st = static_pointer_cast<
const Structure>(pvField->getField());
106 PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st);
107 PVRecordPtr pvRec = PVRecord::create(name,pvStructure);
108 bool result = PVDatabase::getMaster()->addRecord(pvRec);
110 pvResult->put(
"success");
112 pvResult->put(
"failure");
std::tr1::shared_ptr< AddRecord > AddRecordPtr
Base interface for a PVRecord.
Add another record in the same database.
std::tr1::shared_ptr< PVRecord > PVRecordPtr