pvDatabaseCPP  4.7.0
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);
62 
66  virtual ~PVRecord();
73  virtual bool init() {initPVRecord(); return true;}
79  virtual void start() {}
89  virtual void process();
98  virtual void remove();
106  virtual epics::pvAccess::RPCServiceAsync::shared_pointer getService(
107  epics::pvData::PVStructurePtr const & pvRequest)
108  {
109  return epics::pvAccess::RPCServiceAsync::shared_pointer();
110  }
120  static PVRecordPtr create(
121  std::string const & recordName,
122  epics::pvData::PVStructurePtr const & pvStructure,
123  int asLevel = 0, const std::string& asGroup = "DEFAULT");
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;}
244  int getAsLevel() const {return asLevel;}
250  std::string getAsGroup() const {return asGroup;}
255  void setAsLevel(int level) {asLevel=level;}
260  void setAsGroup(const std::string& group) {asGroup = group;}
261 protected:
269  PVRecord(
270  std::string const & recordName,
271  epics::pvData::PVStructurePtr const & pvStructure,
272  int asLevel = 0, const std::string& asGroup = "DEFAULT");
278  void initPVRecord();
279 private:
280  friend class PVDatabase;
281  void unlistenClients();
282 
283  PVRecordFieldPtr findPVRecordField(
284  PVRecordStructurePtr const & pvrs,
285  epics::pvData::PVFieldPtr const & pvField);
286 
287  std::string recordName;
288  epics::pvData::PVStructurePtr pvStructure;
289  PVRecordStructurePtr pvRecordStructure;
290  std::list<PVListenerWPtr> pvListenerList;
291  std::list<PVRecordClientWPtr> clientList;
292  epics::pvData::Mutex mutex;
293  std::size_t depthGroupPut;
294  int traceLevel;
295  // following only valid while addListener or removeListener is active.
296  bool isAddListener;
297  PVListenerWPtr pvListener;
298 
299  epics::pvData::PVTimeStamp pvTimeStamp;
300  epics::pvData::TimeStamp timeStamp;
301 
302  int asLevel;
303  std::string asGroup;
304 };
305 
306 epicsShareFunc std::ostream& operator<<(std::ostream& o, const PVRecord& record);
307 
314 class epicsShareClass PVRecordField :
315  public virtual epics::pvData::PostHandler,
316  public std::tr1::enable_shared_from_this<PVRecordField>
317 {
318 public:
319  POINTER_DEFINITIONS(PVRecordField);
328  epics::pvData::PVFieldPtr const & pvField,
329  PVRecordStructurePtr const &parent,
330  PVRecordPtr const & pvRecord);
334  virtual ~PVRecordField() {}
340  PVRecordStructurePtr getParent();
346  epics::pvData::PVFieldPtr getPVField();
351  std::string getFullFieldName();
356  std::string getFullName();
361  PVRecordPtr getPVRecord();
366  virtual void postPut();
367 protected:
368  virtual void init();
369  virtual void postParent(PVRecordFieldPtr const & subField);
370  virtual void postSubField();
371 private:
372  bool addListener(PVListenerPtr const & pvListener);
373  virtual void removeListener(PVListenerPtr const & pvListener);
374  void callListener();
375 
376  std::list<PVListenerWPtr> pvListenerList;
377  epics::pvData::PVField::weak_pointer pvField;
378  bool isStructure;
379  PVRecordStructureWPtr master;
380  PVRecordStructureWPtr parent;
381  PVRecordWPtr pvRecord;
382  std::string fullName;
383  std::string fullFieldName;
384  friend class PVRecordStructure;
385  friend class PVRecord;
386 };
387 
394 class epicsShareClass PVRecordStructure : public PVRecordField {
395 public:
396  POINTER_DEFINITIONS(PVRecordStructure);
404  epics::pvData::PVStructurePtr const &pvStructure,
405  PVRecordStructurePtr const &parent,
406  PVRecordPtr const & pvRecord);
410  virtual ~PVRecordStructure() {}
415  PVRecordFieldPtrArrayPtr getPVRecordFields();
420  epics::pvData::PVStructurePtr getPVStructure();
421 protected:
425  virtual void init();
426 private:
427  epics::pvData::PVStructure::weak_pointer pvStructure;
428  PVRecordFieldPtrArrayPtr pvRecordFields;
429  friend class PVRecord;
430 };
431 
437 class epicsShareClass PVRecordClient {
438 public:
439  POINTER_DEFINITIONS(PVRecordClient);
443  virtual ~PVRecordClient() {}
448  virtual void detach(PVRecordPtr const & pvRecord) = 0;
449 };
450 
457 class epicsShareClass PVListener :
458  virtual public PVRecordClient
459 {
460 public:
461  POINTER_DEFINITIONS(PVListener);
465  virtual ~PVListener() {}
472  virtual void dataPut(PVRecordFieldPtr const & pvRecordField) = 0;
479  virtual void dataPut(
480  PVRecordStructurePtr const & requested,
481  PVRecordFieldPtr const & pvRecordField) = 0;
486  virtual void beginGroupPut(PVRecordPtr const & pvRecord) = 0;
491  virtual void endGroupPut(PVRecordPtr const & pvRecord) = 0;
496  virtual void unlisten(PVRecordPtr const & pvRecord) = 0;
497 };
498 
504 class epicsShareClass PVDatabase {
505 public:
506  POINTER_DEFINITIONS(PVDatabase);
511  static PVDatabasePtr getMaster();
515  virtual ~PVDatabase();
522  PVRecordPtr findRecord(std::string const& recordName);
529  bool addRecord(PVRecordPtr const & record);
536  bool removeRecord(PVRecordPtr const & record);
541  epics::pvData::PVStringArrayPtr getRecordNames();
542 private:
543  friend class PVRecord;
544 
545  PVRecordWPtr removeFromMap(PVRecordPtr const & record);
546  PVDatabase();
547  void lock();
548  void unlock();
549  PVRecordMap recordMap;
550  epics::pvData::Mutex mutex;
551  static bool getMasterFirstCall;
552 };
553 
554 }}
555 
556 #endif /* PVDATABASE_H */
virtual void start()
Optional method for derived class.
Definition: pvDatabase.h:79
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:106
std::tr1::shared_ptr< PVCopy > PVCopyPtr
Definition: pvPlugin.h:25
std::string getAsGroup() const
Get the AS group name.
Definition: pvDatabase.h:250
Listener for PVRecord::message.
Definition: pvDatabase.h:457
virtual ~PVRecordField()
Destructor.
Definition: pvDatabase.h:334
virtual ~PVRecordStructure()
Destructor.
Definition: pvDatabase.h:410
void setAsLevel(int level)
set access security level.
Definition: pvDatabase.h:255
virtual ~PVListener()
Destructor.
Definition: pvDatabase.h:465
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:443
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:73
PVRecordStructurePtr getPVRecordStructure() const
Get the top level PVRecordStructure.
Definition: pvDatabase.h:135
The interface for a database of PVRecords.
Definition: pvDatabase.h:504
std::tr1::weak_ptr< PVRecordStructure > PVRecordStructureWPtr
Definition: pvDatabase.h:33
Interface for a field of a record.
Definition: pvDatabase.h:314
Callback for traversing master structure.
An interface implemented by code that accesses the record.
Definition: pvDatabase.h:437
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
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:394
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:319
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
void setAsGroup(const std::string &group)
set access security group
Definition: pvDatabase.h:260
int getAsLevel() const
Get the ASlevel.
Definition: pvDatabase.h:244