otsdaq  v2_04_01
TableView.h
1 #ifndef _ots_TableView_h_
2 #define _ots_TableView_h_
3 
4 #include "otsdaq-core/Macros/CoutMacros.h"
5 #include "otsdaq-core/Macros/StringMacros.h"
6 #include "otsdaq-core/MessageFacility/MessageFacility.h"
7 
8 #include <stdlib.h>
9 #include <time.h> /* time_t, time, ctime */
10 #include <cassert>
11 #include <iostream>
12 #include <set>
13 #include <vector>
14 #include "otsdaq-core/TableCore/TableVersion.h"
15 #include "otsdaq-core/TableCore/TableViewColumnInfo.h"
16 
17 namespace ots
18 {
19 class TableView
20 {
21  public:
22  static const unsigned int INVALID;
23  typedef std::vector<std::vector<std::string> > DataView;
24  typedef DataView::iterator iterator;
25  typedef DataView::const_iterator const_iterator;
26 
27  TableView(const std::string& name = "");
28  virtual ~TableView(void);
29 
30  void init(void);
31  TableView& copy(const TableView& src,
32  TableVersion destinationVersion,
33  const std::string& author);
34  unsigned int copyRows(const std::string& author,
35  const TableView& src,
36  unsigned int srcOffsetRow = 0,
37  unsigned int srcRowsToCopy = (unsigned int)-1,
38  unsigned int destOffsetRow = (unsigned int)-1,
39  bool generateUniqueDataColumns = false);
40 
41  template<class T> // in included .icc source
42  unsigned int findRow(unsigned int col,
43  const T& value,
44  unsigned int offsetRow = 0) const;
45  unsigned int findRow(unsigned int col,
46  const std::string& value,
47  unsigned int offsetRow = 0) const;
48 
49  template<class T> // in included .icc source
50  unsigned int findRowInGroup(unsigned int col,
51  const T& value,
52  const std::string& groupId,
53  const std::string& childLinkIndex,
54  unsigned int offsetRow = 0) const;
55  unsigned int findRowInGroup(unsigned int col,
56  const std::string& value,
57  const std::string& groupId,
58  const std::string& childLinkIndex,
59  unsigned int offsetRow = 0) const;
60  unsigned int findCol(const std::string& name) const;
61  unsigned int findColByType(const std::string& type, int startingCol = 0) const;
62 
63  // Getters
64  const std::string& getUniqueStorageIdentifier(void) const;
65  const std::string& getTableName(void) const;
66  const TableVersion& getVersion(void) const;
67  const std::string& getComment(void) const;
68  const std::string& getAuthor(void) const;
69  const time_t& getCreationTime(void) const;
70  const time_t& getLastAccessTime(void) const;
71  const bool& getLooseColumnMatching(void) const;
72  const unsigned int getDataColumnSize(void) const;
73  const unsigned int& getSourceColumnMismatch(void) const;
74  const unsigned int& getSourceColumnMissing(void) const;
75  const std::set<std::string>& getSourceColumnNames(void) const;
76  std::set<std::string> getColumnNames(void) const;
77  std::map<std::string, unsigned int /*col*/> getColumnNamesMap(void) const;
78  std::set<std::string> getColumnStorageNames(void) const;
79  std::vector<std::string> getDefaultRowValues(void) const;
80 
81  unsigned int getNumberOfRows(void) const;
82  unsigned int getNumberOfColumns(void) const;
83  const unsigned int getColUID(void) const;
84  const unsigned int getColStatus(void) const;
85  const unsigned int getColPriority(void) const;
86 
87  // Note: Group link handling should be done in this TableView class
88  // only by using isEntryInGroup ...
89  // This is so that multiple group handling is consistent
90  private:
91  bool isEntryInGroupCol(const unsigned int& row,
92  const unsigned int& groupCol,
93  const std::string& groupNeedle,
94  std::set<std::string>* groupIDList = 0) const;
95 
96  public:
97  // std::set<std::string /*GroupId*/>
98  std::set<std::string> getSetOfGroupIDs(const std::string& childLinkIndex,
99  unsigned int row = -1) const;
100  std::set<std::string> getSetOfGroupIDs(const unsigned int& col,
101  unsigned int row = -1) const;
102  bool isEntryInGroup(const unsigned int& row,
103  const std::string& childLinkIndex,
104  const std::string& groupNeedle) const;
105  const bool getChildLink(const unsigned int& col,
106  bool& isGroup,
107  std::pair<unsigned int /*link col*/,
108  unsigned int /*link id col*/>& linkPair) const;
109  const unsigned int getColLinkGroupID(const std::string& childLinkIndex) const;
110  void addRowToGroup(const unsigned int& row,
111  const unsigned int& col,
112  const std::string& groupID); //, const std::string& colDefault);
113  bool removeRowFromGroup(const unsigned int& row,
114  const unsigned int& col,
115  const std::string& groupID,
116  bool deleteRowIfNoGroupLeft = false);
117 
118  template<class T> // in included .icc source
119  void getValue(T& value,
120  unsigned int row,
121  unsigned int col,
122  bool doConvertEnvironmentVariables = true) const;
123  // special version of getValue for string type
124  // Note: necessary because types of std::basic_string<char> cause compiler problems
125  // if no string specific function
126  void getValue(std::string& value,
127  unsigned int row,
128  unsigned int col,
129  bool doConvertEnvironmentVariables = true) const;
130 
131  template<class T> // in included .icc source
132  T validateValueForColumn(const std::string& value,
133  unsigned int col,
134  bool doConvertEnvironmentVariables = true) const;
135  // special version of getValue for string type
136  // Note: necessary because types of std::basic_string<char> cause compiler problems
137  // if no string specific function
138  std::string validateValueForColumn(const std::string& value,
139  unsigned int col,
140  bool convertEnvironmentVariables = true) const;
141  std::string getValueAsString(unsigned int row,
142  unsigned int col,
143  bool convertEnvironmentVariables = true) const;
144  std::string getEscapedValueAsString(unsigned int row,
145  unsigned int col,
146  bool convertEnvironmentVariables = true) const;
147  bool isURIEncodedCommentTheSame(const std::string& comment) const;
148 
149  const DataView& getDataView(void) const;
150  const std::vector<TableViewColumnInfo>& getColumnsInfo(void) const;
151  std::vector<TableViewColumnInfo>* getColumnsInfoP(void);
152  const TableViewColumnInfo& getColumnInfo(unsigned int column) const;
153 
154  // Setters
155 
156  void setUniqueStorageIdentifier(const std::string& storageUID);
157  void setTableName(const std::string& name);
158  void setComment(const std::string& comment);
159  void setURIEncodedComment(const std::string& uriComment);
160  void setAuthor(const std::string& author);
161  void setCreationTime(time_t t);
162  void setLastAccessTime(time_t t = time(0));
163  void setLooseColumnMatching(bool setValue);
164 
165  template<class T> // in included .icc source
166  void setVersion(const T& version);
167  template<class T> // in included .icc source
168  void setValue(const T& value, unsigned int row, unsigned int col);
169  void setValue(const std::string& value, unsigned int row, unsigned int col);
170  void setValue(const char* value, unsigned int row, unsigned int col);
171 
172  // Careful: The setValueAsString method is used to set the value without any
173  // consistency check with the data type
174  void setValueAsString(const std::string& value, unsigned int row, unsigned int col);
175 
176  void resizeDataView(unsigned int nRows, unsigned int nCols);
177  unsigned int addRow(
178  const std::string& author = "",
179  bool incrementUniqueData = false,
180  std::string baseNameAutoUID = "",
181  unsigned int rowToAdd =
182  (unsigned int)-1); // returns index of added row, default is last row
183  void deleteRow(int r);
184 
185  // Lore did not like this.. wants special access through separate Supervisor for
186  // "Database Management" int addColumn(std::string name, std::string viewName,
187  // std::string viewType); //returns index of added column, always is last column
188  // unless
189 
190  iterator begin(void) { return theDataView_.begin(); }
191  iterator end(void) { return theDataView_.end(); }
192  const_iterator begin(void) const { return theDataView_.begin(); }
193  const_iterator end(void) const { return theDataView_.end(); }
194  void reset(void);
195  void print(std::ostream& out = std::cout) const;
196  void printJSON(std::ostream& out = std::cout) const;
197  int fillFromJSON(const std::string& json);
198  int fillFromCSV(const std::string& data,
199  const int& dataOffset = 0,
200  const std::string& author = "");
201  bool setURIEncodedValue(const std::string& value,
202  const unsigned int& row,
203  const unsigned int& col,
204  const std::string& author = "");
205 
206  private:
207  const unsigned int getOrInitColUID(void);
208  const unsigned int getOrInitColStatus(void);
209  const unsigned int getOrInitColPriority(void);
210 
211  TableView& operator=(const TableView src); // operator= is purposely undefined and
212  // private (DO NOT USE IT!) - should use
213  // TableView::copy()
214 
215  std::string uniqueStorageIdentifier_; // starts empty "", used to implement
216  // re-writable views ("temporary views") in
217  // artdaq db
218  std::string tableName_; // View name (extensionTableName in xml)
219  TableVersion version_; // Table version
220  std::string comment_; // Table version comment
221  std::string author_;
222  time_t creationTime_; // used more like "construction"(constructor) time
223  time_t lastAccessTime_; // last time the ConfigurationInterface:get() retrieved this
224  // view
225  unsigned int colUID_, colStatus_, colPriority_; // special column pointers
226  std::map<std::string, unsigned int>
227  colLinkGroupIDs_; // map from child link index to column
228 
229  bool fillWithLooseColumnMatching_;
230  unsigned int sourceColumnMismatchCount_, sourceColumnMissingCount_;
231  std::set<std::string> sourceColumnNames_;
232 
233  std::vector<TableViewColumnInfo> columnsInfo_;
234  DataView theDataView_;
235 };
236 
237 #include "otsdaq-core/TableCore/TableView.icc" //define template functions
238 
239 } // namespace ots
240 
241 #endif