pvDatabaseCPP  4.5.2
traceRecord.cpp
Go to the documentation of this file.
1 /* traceRecord.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/pvTimeStamp.h>
22 #include <pv/timeStamp.h>
23 #include <pv/rpcService.h>
24 #include <pv/pvAccess.h>
25 #include <pv/status.h>
26 #include <pv/serverContext.h>
27 
28 #define epicsExportSharedSymbols
29 #include "pv/pvStructureCopy.h"
31 #include "pv/traceRecord.h"
32 
33 using std::tr1::static_pointer_cast;
34 using namespace epics::pvData;
35 using namespace epics::pvAccess;
36 using namespace std;
37 
38 namespace epics { namespace pvDatabase {
39 
40 TraceRecordPtr TraceRecord::create(
41  std::string const & recordName)
42 {
43  FieldCreatePtr fieldCreate = getFieldCreate();
44  PVDataCreatePtr pvDataCreate = getPVDataCreate();
45  StructureConstPtr topStructure = fieldCreate->createFieldBuilder()->
46  addNestedStructure("argument")->
47  add("recordName",pvString)->
48  add("level",pvInt)->
49  endNested()->
50  addNestedStructure("result") ->
51  add("status",pvString) ->
52  endNested()->
53  createStructure();
54  PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure);
55  TraceRecordPtr pvRecord(
56  new TraceRecord(recordName,pvStructure));
57  if(!pvRecord->init()) pvRecord.reset();
58  return pvRecord;
59 }
60 
61 TraceRecord::TraceRecord(
62  std::string const & recordName,
63  epics::pvData::PVStructurePtr const & pvStructure)
64 : PVRecord(recordName,pvStructure)
65 {
66 }
67 
68 
69 bool TraceRecord::init()
70 {
71  initPVRecord();
72  PVStructurePtr pvStructure = getPVStructure();
73  pvRecordName = pvStructure->getSubField<PVString>("argument.recordName");
74  if(!pvRecordName) return false;
75  pvLevel = pvStructure->getSubField<PVInt>("argument.level");
76  if(!pvLevel) return false;
77  pvResult = pvStructure->getSubField<PVString>("result.status");
78  if(!pvResult) return false;
79  return true;
80 }
81 
82 void TraceRecord::process()
83 {
84  string name = pvRecordName->get();
85  PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name);
86  if(!pvRecord) {
87  pvResult->put(name + " not found");
88  return;
89  }
90  pvRecord->setTraceLevel(pvLevel->get());
91  pvResult->put("success");
92 }
93 
94 
95 }}
STL namespace.
Base interface for a PVRecord.
Definition: pvDatabase.h:56
Trace activity of PVRecord.
Definition: traceRecord.h:33
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
std::tr1::shared_ptr< TraceRecord > TraceRecordPtr
Definition: traceRecord.h:22