pvDatabaseCPP  4.5.1
pvDatabase.h
Go to the documentation of this file.
1 
6 #ifndef PVDATABASE_H
7 #define PVDATABASE_H
8 
9 #include <list>
10 #include <map>
11 
12 #include <pv/pvData.h>
13 #include <pv/pvTimeStamp.h>
14 #include <pv/rpcService.h>
15 #include <pv/pvStructureCopy.h>
16 
17 #include <shareLib.h>
18 
19 namespace epics { namespace pvDatabase {
20 
21 class PVRecord;
22 typedef std::tr1::shared_ptr<PVRecord> PVRecordPtr;
23 typedef std::tr1::weak_ptr<PVRecord> PVRecordWPtr;
24 typedef std::map<std::string,PVRecordPtr> PVRecordMap;
25 
27 typedef std::tr1::shared_ptr<PVRecordField> PVRecordFieldPtr;
28 typedef std::vector<PVRecordFieldPtr> PVRecordFieldPtrArray;
29 typedef std::tr1::shared_ptr<PVRecordFieldPtrArray> PVRecordFieldPtrArrayPtr;
30 
32 typedef std::tr1::shared_ptr<PVRecordStructure> PVRecordStructurePtr;
33 typedef std::tr1::weak_ptr<PVRecordStructure> PVRecordStructureWPtr;
34 
36 typedef std::tr1::shared_ptr<PVRecordClient> PVRecordClientPtr;
37 typedef std::tr1::weak_ptr<PVRecordClient> PVRecordClientWPtr;
38 
39 class PVListener;
40 typedef std::tr1::shared_ptr<PVListener> PVListenerPtr;
41 typedef std::tr1::weak_ptr<PVListener> PVListenerWPtr;
42 
43 class PVDatabase;
44 typedef std::tr1::shared_ptr<PVDatabase> PVDatabasePtr;
45 typedef std::tr1::weak_ptr<PVDatabase> PVDatabaseWPtr;
46 
56 class epicsShareClass PVRecord :
58  public std::tr1::enable_shared_from_this<PVRecord>
59 {
60 public:
61  POINTER_DEFINITIONS(PVRecord);
65  virtual ~PVRecord();
72  virtual bool init() {initPVRecord(); return true;}
78  virtual void start() {}
88  virtual void process();
92  virtual void destroy() {}
101  virtual void remove();
109  virtual epics::pvAccess::RPCServiceAsync::shared_pointer getService(
110  epics::pvData::PVStructurePtr const & pvRequest)
111  {
112  return epics::pvAccess::RPCServiceAsync::shared_pointer();
113  }
121  static PVRecordPtr create(
122  std::string const & recordName,
123  epics::pvData::PVStructurePtr const & pvStructure);
129  std::string getRecordName() const { return recordName;}
135  PVRecordStructurePtr getPVRecordStructure() const { return pvRecordStructure;}
141  epics::pvData::PVStructurePtr getPVStructure() const { return pvStructure;}
149  PVRecordFieldPtr findPVRecordField(
150  epics::pvData::PVFieldPtr const & pvField);
156  void lock();
162  void unlock();
172  bool tryLock();
182  void lockOtherRecord(PVRecordPtr const & otherRecord);
191  bool addPVRecordClient(PVRecordClientPtr const & pvRecordClient);
200  bool addListener(
201  PVListenerPtr const & pvListener,
202  epics::pvCopy::PVCopyPtr const & pvCopy);
208  void nextMasterPVField(epics::pvData::PVFieldPtr const & pvField);
216  bool removeListener(
217  PVListenerPtr const & pvListener,
218  epics::pvCopy::PVCopyPtr const & pvCopy);
219 
220 
224  void beginGroupPut();
228  void endGroupPut();
233  int getTraceLevel() {return traceLevel;}
238  void setTraceLevel(int level) {traceLevel = level;}
239 protected:
245  PVRecord(
246  std::string const & recordName,
247  epics::pvData::PVStructurePtr const & pvStructure);
253  void initPVRecord();
254 private:
255  PVRecordFieldPtr findPVRecordField(
256  PVRecordStructurePtr const & pvrs,
257  epics::pvData::PVFieldPtr const & pvField);
258  void notifyClients();
259 
260  std::string recordName;
261  epics::pvData::PVStructurePtr pvStructure;
262  PVRecordStructurePtr pvRecordStructure;
263  std::list<PVListenerWPtr> pvListenerList;
264  std::list<PVRecordClientWPtr> clientList;
265  epics::pvData::Mutex mutex;
266  std::size_t depthGroupPut;
267  int traceLevel;
268  // following only valid while addListener or removeListener is active.
269  bool isAddListener;
270  PVListenerWPtr pvListener;
271 
272  epics::pvData::PVTimeStamp pvTimeStamp;
273  epics::pvData::TimeStamp timeStamp;
274 };
275 
276 epicsShareFunc std::ostream& operator<<(std::ostream& o, const PVRecord& record);
277 
284 class epicsShareClass PVRecordField :
285  public virtual epics::pvData::PostHandler,
286  public std::tr1::enable_shared_from_this<PVRecordField>
287 {
288 public:
289  POINTER_DEFINITIONS(PVRecordField);
298  epics::pvData::PVFieldPtr const & pvField,
299  PVRecordStructurePtr const &parent,
300  PVRecordPtr const & pvRecord);
304  virtual ~PVRecordField() {}
310  PVRecordStructurePtr getParent();
316  epics::pvData::PVFieldPtr getPVField();
321  std::string getFullFieldName();
326  std::string getFullName();
331  PVRecordPtr getPVRecord();
336  virtual void postPut();
337 protected:
338  virtual void init();
339  virtual void postParent(PVRecordFieldPtr const & subField);
340  virtual void postSubField();
341 private:
342  bool addListener(PVListenerPtr const & pvListener);
343  virtual void removeListener(PVListenerPtr const & pvListener);
344  void callListener();
345 
346  std::list<PVListenerWPtr> pvListenerList;
347  epics::pvData::PVField::weak_pointer pvField;
348  bool isStructure;
349  PVRecordStructureWPtr parent;
350  PVRecordWPtr pvRecord;
351  std::string fullName;
352  std::string fullFieldName;
353  friend class PVRecordStructure;
354  friend class PVRecord;
355 };
356 
363 class epicsShareClass PVRecordStructure : public PVRecordField {
364 public:
365  POINTER_DEFINITIONS(PVRecordStructure);
373  epics::pvData::PVStructurePtr const &pvStructure,
374  PVRecordStructurePtr const &parent,
375  PVRecordPtr const & pvRecord);
379  virtual ~PVRecordStructure() {}
384  PVRecordFieldPtrArrayPtr getPVRecordFields();
389  epics::pvData::PVStructurePtr getPVStructure();
390 protected:
394  virtual void init();
395 private:
396  epics::pvData::PVStructure::weak_pointer pvStructure;
397  PVRecordFieldPtrArrayPtr pvRecordFields;
398  friend class PVRecord;
399 };
400 
406 class epicsShareClass PVRecordClient {
407 public:
408  POINTER_DEFINITIONS(PVRecordClient);
412  virtual ~PVRecordClient() {}
417  virtual void detach(PVRecordPtr const & pvRecord) = 0;
418 };
419 
426 class epicsShareClass PVListener :
427  virtual public PVRecordClient
428 {
429 public:
430  POINTER_DEFINITIONS(PVListener);
434  virtual ~PVListener() {}
441  virtual void dataPut(PVRecordFieldPtr const & pvRecordField) = 0;
448  virtual void dataPut(
449  PVRecordStructurePtr const & requested,
450  PVRecordFieldPtr const & pvRecordField) = 0;
455  virtual void beginGroupPut(PVRecordPtr const & pvRecord) = 0;
460  virtual void endGroupPut(PVRecordPtr const & pvRecord) = 0;
465  virtual void unlisten(PVRecordPtr const & pvRecord) = 0;
466 };
467 
473 class epicsShareClass PVDatabase {
474 public:
475  POINTER_DEFINITIONS(PVDatabase);
480  static PVDatabasePtr getMaster();
484  virtual ~PVDatabase();
491  PVRecordPtr findRecord(std::string const& recordName);
498  bool addRecord(PVRecordPtr const & record);
504  bool removeRecord(PVRecordPtr const & record);
509  epics::pvData::PVStringArrayPtr getRecordNames();
510 private:
511  PVDatabase();
512  void lock();
513  void unlock();
514  PVRecordMap recordMap;
515  epics::pvData::Mutex mutex;
516  static bool getMasterFirstCall;
517 };
518 
519 }}
520 
521 #endif /* PVDATABASE_H */
522 
virtual void start()
Optional method for derived class.
Definition: pvDatabase.h:78
int getTraceLevel()
get trace level (0,1,2) means (nothing,lifetime,process)
Definition: pvDatabase.h:233
std::tr1::shared_ptr< PVListener > PVListenerPtr
Definition: pvDatabase.h:39
virtual epics::pvAccess::RPCServiceAsync::shared_pointer getService(epics::pvData::PVStructurePtr const &pvRequest)
Optional method for derived class.
Definition: pvDatabase.h:109
std::tr1::shared_ptr< PVCopy > PVCopyPtr
Definition: pvPlugin.h:25
Listener for PVRecord::message.
Definition: pvDatabase.h:426
virtual ~PVRecordField()
Destructor.
Definition: pvDatabase.h:304
virtual ~PVRecordStructure()
Destructor.
Definition: pvDatabase.h:379
virtual ~PVListener()
Destructor.
Definition: pvDatabase.h:434
std::tr1::shared_ptr< PVRecordClient > PVRecordClientPtr
Definition: pvDatabase.h:35
std::map< std::string, PVRecordPtr > PVRecordMap
Definition: pvDatabase.h:24
virtual ~PVRecordClient()
Destructor.
Definition: pvDatabase.h:412
std::tr1::weak_ptr< PVDatabase > PVDatabaseWPtr
Definition: pvDatabase.h:45
std::tr1::weak_ptr< PVListener > PVListenerWPtr
Definition: pvDatabase.h:41
Base interface for a PVRecord.
Definition: pvDatabase.h:56
std::tr1::shared_ptr< PVDatabase > PVDatabasePtr
Definition: pvDatabase.h:43
virtual bool init()
Optional initialization method.
Definition: pvDatabase.h:72
PVRecordStructurePtr getPVRecordStructure() const
Get the top level PVRecordStructure.
Definition: pvDatabase.h:135
The interface for a database of PVRecords.
Definition: pvDatabase.h:473
std::tr1::weak_ptr< PVRecordStructure > PVRecordStructureWPtr
Definition: pvDatabase.h:33
Interface for a field of a record.
Definition: pvDatabase.h:284
Callback for traversing master structure.
An interface implemented by code that accesses the record.
Definition: pvDatabase.h:406
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
virtual void destroy()
DEPRECATED.
Definition: pvDatabase.h:92
std::vector< PVRecordFieldPtr > PVRecordFieldPtrArray
Definition: pvDatabase.h:28
std::tr1::shared_ptr< PVRecordStructure > PVRecordStructurePtr
Definition: pvDatabase.h:31
std::tr1::weak_ptr< PVRecord > PVRecordWPtr
Definition: pvDatabase.h:23
std::string getRecordName() const
Get the name of the record.
Definition: pvDatabase.h:129
std::tr1::shared_ptr< PVRecordField > PVRecordFieldPtr
Definition: pvDatabase.h:26
Interface for a field that is a structure.
Definition: pvDatabase.h:363
std::tr1::shared_ptr< PVRecordFieldPtrArray > PVRecordFieldPtrArrayPtr
Definition: pvDatabase.h:29
epics::pvData::PVStructurePtr getPVStructure() const
Get the top level PVStructure.
Definition: pvDatabase.h:141
std::ostream & operator<<(std::ostream &o, const PVRecord &record)
Definition: pvRecord.cpp:348
std::tr1::weak_ptr< PVRecordClient > PVRecordClientWPtr
Definition: pvDatabase.h:37
void setTraceLevel(int level)
set trace level (0,1,2) means (nothing,lifetime,process)
Definition: pvDatabase.h:238