pvDatabaseCPP  4.5.1
pvDatabase.cpp
Go to the documentation of this file.
1 /* pvDatabase.cpp */
12 #include <epicsGuard.h>
13 #include <list>
14 #include <map>
15 #include <pv/pvData.h>
16 #include <pv/pvTimeStamp.h>
17 #include <pv/rpcService.h>
18 
19 #define epicsExportSharedSymbols
20 #include "pv/pvStructureCopy.h"
21 #include "pv/pvDatabase.h"
22 #include "pv/pvPlugin.h"
23 #include "pv/pvArrayPlugin.h"
24 #include "pv/pvTimestampPlugin.h"
25 #include "pv/pvDeadbandPlugin.h"
26 
27 using std::tr1::static_pointer_cast;
28 using namespace epics::pvData;
29 using namespace epics::pvCopy;
30 using namespace std;
31 
32 namespace epics { namespace pvDatabase {
33 
34 #define DEBUG_LEVEL 0
35 
36 static PVDatabasePtr pvDatabaseMaster;
37 
38 PVDatabasePtr PVDatabase::getMaster()
39 {
40  static bool firstTime = true;
41  if(firstTime) {
42  firstTime = false;
43  pvDatabaseMaster = PVDatabasePtr(new PVDatabase());
44  PVArrayPlugin::create();
45  PVTimestampPlugin::create();
46  PVDeadbandPlugin::create();
47  }
48  return pvDatabaseMaster;
49 }
50 
51 PVDatabase::PVDatabase()
52 {
53  if(DEBUG_LEVEL>0) cout << "PVDatabase::PVDatabase()\n";
54 }
55 
56 PVDatabase::~PVDatabase()
57 {
58  if(DEBUG_LEVEL>0) cout << "PVDatabase::~PVDatabase()\n";
59  size_t len = recordMap.size();
60  shared_vector<string> names(len);
61  PVRecordMap::iterator iter;
62  size_t i = 0;
63  for(iter = recordMap.begin(); iter!=recordMap.end(); ++iter) {
64  names[i++] = (*iter).first;
65  }
66  for(size_t i=0; i<len; ++i) removeRecord(findRecord(names[i]));
67 }
68 
69 void PVDatabase::lock() {
70  mutex.lock();
71 }
72 
73 void PVDatabase::unlock() {
74  mutex.unlock();
75 }
76 
77 PVRecordPtr PVDatabase::findRecord(string const& recordName)
78 {
79  epicsGuard<epics::pvData::Mutex> guard(mutex);
80  PVRecordMap::iterator iter = recordMap.find(recordName);
81  if(iter!=recordMap.end()) {
82  return (*iter).second;
83  }
84  return PVRecordPtr();
85 }
86 
87 bool PVDatabase::addRecord(PVRecordPtr const & record)
88 {
89  if(record->getTraceLevel()>0) {
90  cout << "PVDatabase::addRecord " << record->getRecordName() << endl;
91  }
92  epicsGuard<epics::pvData::Mutex> guard(mutex);
93  string recordName = record->getRecordName();
94  PVRecordMap::iterator iter = recordMap.find(recordName);
95  if(iter!=recordMap.end()) {
96  return false;
97  }
98  record->start();
99  recordMap.insert(PVRecordMap::value_type(recordName,record));
100  return true;
101 }
102 
103 bool PVDatabase::removeRecord(PVRecordPtr const & record)
104 {
105  if(record->getTraceLevel()>0) {
106  cout << "PVDatabase::removeRecord " << record->getRecordName() << endl;
107  }
108  epicsGuard<epics::pvData::Mutex> guard(mutex);
109  string recordName = record->getRecordName();
110  PVRecordMap::iterator iter = recordMap.find(recordName);
111  if(iter!=recordMap.end()) {
112  PVRecordPtr pvRecord = (*iter).second;
113  recordMap.erase(iter);
114  return true;
115  }
116  return false;
117 }
118 
119 PVStringArrayPtr PVDatabase::getRecordNames()
120 {
121  epicsGuard<epics::pvData::Mutex> guard(mutex);
122  PVStringArrayPtr xxx;
123  PVStringArrayPtr pvStringArray = static_pointer_cast<PVStringArray>
124  (getPVDataCreate()->createPVScalarArray(pvString));
125  size_t len = recordMap.size();
126  shared_vector<string> names(len);
127  PVRecordMap::iterator iter;
128  size_t i = 0;
129  for(iter = recordMap.begin(); iter!=recordMap.end(); ++iter) {
130  names[i++] = (*iter).first;
131  }
132  shared_vector<const string> temp(freeze(names));
133  pvStringArray->replace(temp);
134  return pvStringArray;
135 }
136 
137 }}
#define DEBUG_LEVEL
Definition: pvDatabase.cpp:34
STL namespace.
std::tr1::shared_ptr< PVDatabase > PVDatabasePtr
Definition: pvDatabase.h:43
The interface for a database of PVRecords.
Definition: pvDatabase.h:473
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21