This is Unofficial EPICS BASE Doxygen Site
addRecord.cpp
Go to the documentation of this file.
1 /* addRecord.cpp */
12 #include <string>
13 #include <cstring>
14 #include <stdexcept>
15 #include <memory>
16 #include <set>
17 
18 #include <pv/lock.h>
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>
28 
29 
30 #define epicsExportSharedSymbols
31 #include "pv/pvStructureCopy.h"
32 #include "pv/pvDatabase.h"
33 #include "pv/addRecord.h"
34 
36 using namespace epics::pvData;
37 using namespace epics::pvAccess;
38 using namespace std;
39 
40 namespace epics { namespace pvDatabase {
41 
42 AddRecordPtr AddRecord::create(
43  std::string const & recordName)
44 {
45  FieldCreatePtr fieldCreate = getFieldCreate();
46  PVDataCreatePtr pvDataCreate = getPVDataCreate();
47  StructureConstPtr topStructure = fieldCreate->createFieldBuilder()->
48  addNestedStructure("argument")->
49  add("recordName",pvString)->
50  addNestedUnion("union") ->
51  endNested()->
52  endNested()->
53  addNestedStructure("result") ->
54  add("status",pvString) ->
55  endNested()->
56  createStructure();
57  PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure);
58  AddRecordPtr pvRecord(
59  new AddRecord(recordName,pvStructure));
60  if(!pvRecord->init()) pvRecord.reset();
61  return pvRecord;
62 }
63 
64 AddRecord::AddRecord(
65  std::string const & recordName,
66  epics::pvData::PVStructurePtr const & pvStructure)
67 : PVRecord(recordName,pvStructure)
68 {
69 }
70 
71 bool AddRecord::init()
72 {
73  initPVRecord();
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;
79  return true;
80 }
81 
82 void AddRecord::process()
83 {
84  PVDataCreatePtr pvDataCreate = getPVDataCreate();
85  string name = pvRecordName->get();
86  PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name);
87  if(pvRecord) {
88  pvResult->put(name + " already exists");
89  return;
90  }
91  PVUnionPtr pvUnion = getPVStructure()->getSubField<PVUnion>("argument.union");
92  if(!pvUnion) {
93  pvResult->put(name + " argument.union is NULL");
94  return;
95  }
96  PVFieldPtr pvField(pvUnion->get());
97  if(!pvField) {
98  pvResult->put(name + " union has no value");
99  return;
100  }
101  if(pvField->getField()->getType()!=epics::pvData::structure) {
102  pvResult->put(name + " union most be a structure");
103  return;
104  }
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);
109  if(result) {
110  pvResult->put("success");
111  } else {
112  pvResult->put("failure");
113  }
114 }
115 
116 
117 }}
pvac::PutEvent result
Definition: clientSync.cpp:117
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
std::tr1::shared_ptr< AddRecord > AddRecordPtr
Definition: addRecord.h:21
Base interface for a PVRecord.
Definition: pvDatabase.h:56
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
Holds all PVA related.
Definition: pvif.h:34
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
std::tr1::shared_ptr< PVUnion > PVUnionPtr
Definition: pvData.h:107
pvData
Definition: monitor.h:428
This class implements introspection object for a structure.
Definition: pvIntrospect.h:697
PVUnion has a single subfield.
Definition: pvData.h:940
Add another record in the same database.
Definition: addRecord.h:32
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648