otsdaq  v2_03_00
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::set<std::string> getColumnStorageNames(void) const;
78  std::vector<std::string> getDefaultRowValues(void) const;
79 
80  unsigned int getNumberOfRows(void) const;
81  unsigned int getNumberOfColumns(void) const;
82  const unsigned int getColUID(void) const;
83  const unsigned int getColStatus(void) const;
84  const unsigned int getColPriority(void) const;
85 
86  // Note: Group link handling should be done in this TableView class
87  // only by using isEntryInGroup ...
88  // This is so that multiple group handling is consistent
89  private:
90  bool isEntryInGroupCol(const unsigned int& row,
91  const unsigned int& groupCol,
92  const std::string& groupNeedle,
93  std::set<std::string>* groupIDList = 0) const;
94 
95  public:
96  // std::set<std::string /*GroupId*/>
97  std::set<std::string> getSetOfGroupIDs(const std::string& childLinkIndex,
98  unsigned int row = -1) const;
99  std::set<std::string> getSetOfGroupIDs(const unsigned int& col,
100  unsigned int row = -1) const;
101  bool isEntryInGroup(const unsigned int& row,
102  const std::string& childLinkIndex,
103  const std::string& groupNeedle) const;
104  const bool getChildLink(const unsigned int& col,
105  bool& isGroup,
106  std::pair<unsigned int /*link col*/,
107  unsigned int /*link id col*/>& linkPair) const;
108  const unsigned int getColLinkGroupID(const std::string& childLinkIndex) const;
109  void addRowToGroup(const unsigned int& row,
110  const unsigned int& col,
111  const std::string& groupID); //, const std::string& colDefault);
112  bool removeRowFromGroup(const unsigned int& row,
113  const unsigned int& col,
114  const std::string& groupID,
115  bool deleteRowIfNoGroupLeft = false);
116 
117  template<class T> // in included .icc source
118  void getValue(T& value,
119  unsigned int row,
120  unsigned int col,
121  bool doConvertEnvironmentVariables = true) const;
122  // special version of getValue for string type
123  // Note: necessary because types of std::basic_string<char> cause compiler problems
124  // if no string specific function
125  void getValue(std::string& value,
126  unsigned int row,
127  unsigned int col,
128  bool doConvertEnvironmentVariables = true) const;
129 
130  template<class T> // in included .icc source
131  T validateValueForColumn(const std::string& value,
132  unsigned int col,
133  bool doConvertEnvironmentVariables = true) const;
134  // special version of getValue for string type
135  // Note: necessary because types of std::basic_string<char> cause compiler problems
136  // if no string specific function
137  std::string validateValueForColumn(const std::string& value,
138  unsigned int col,
139  bool convertEnvironmentVariables = true) const;
140  std::string getValueAsString(unsigned int row,
141  unsigned int col,
142  bool convertEnvironmentVariables = true) const;
143  std::string getEscapedValueAsString(unsigned int row,
144  unsigned int col,
145  bool convertEnvironmentVariables = true) const;
146  bool isURIEncodedCommentTheSame(const std::string& comment) const;
147 
148  const DataView& getDataView(void) const;
149  const std::vector<TableViewColumnInfo>& getColumnsInfo(void) const;
150  std::vector<TableViewColumnInfo>* getColumnsInfoP(void);
151  const TableViewColumnInfo& getColumnInfo(unsigned int column) const;
152 
153  // Setters
154 
155  void setUniqueStorageIdentifier(const std::string& storageUID);
156  void setTableName(const std::string& name);
157  void setComment(const std::string& comment);
158  void setURIEncodedComment(const std::string& uriComment);
159  void setAuthor(const std::string& author);
160  void setCreationTime(time_t t);
161  void setLastAccessTime(time_t t = time(0));
162  void setLooseColumnMatching(bool setValue);
163 
164  template<class T> // in included .icc source
165  void setVersion(const T& version);
166  template<class T> // in included .icc source
167  void setValue(const T& value, unsigned int row, unsigned int col);
168  void setValue(const std::string& value, unsigned int row, unsigned int col);
169  void setValue(const char* value, unsigned int row, unsigned int col);
170 
171  // Careful: The setValueAsString method is used to set the value without any
172  // consistency check with the data type
173  void setValueAsString(const std::string& value, unsigned int row, unsigned int col);
174 
175  void resizeDataView(unsigned int nRows, unsigned int nCols);
176  unsigned int addRow(
177  const std::string& author = "",
178  bool incrementUniqueData = false,
179  std::string baseNameAutoUID = "",
180  unsigned int rowToAdd =
181  (unsigned int)-1); // returns index of added row, default is last row
182  void deleteRow(int r);
183 
184  // Lore did not like this.. wants special access through separate Supervisor for
185  // "Database Management" int addColumn(std::string name, std::string viewName,
186  // std::string viewType); //returns index of added column, always is last column
187  // unless
188 
189  iterator begin(void) { return theDataView_.begin(); }
190  iterator end(void) { return theDataView_.end(); }
191  const_iterator begin(void) const { return theDataView_.begin(); }
192  const_iterator end(void) const { return theDataView_.end(); }
193  void reset(void);
194  void print(std::ostream& out = std::cout) const;
195  void printJSON(std::ostream& out = std::cout) const;
196  int fillFromJSON(const std::string& json);
197  int fillFromCSV(const std::string& data,
198  const int& dataOffset = 0,
199  const std::string& author = "");
200  bool setURIEncodedValue(const std::string& value,
201  const unsigned int& row,
202  const unsigned int& col,
203  const std::string& author = "");
204 
205  private:
206  const unsigned int getOrInitColUID(void);
207  const unsigned int getOrInitColStatus(void);
208  const unsigned int getOrInitColPriority(void);
209 
210  TableView& operator=(const TableView src); // operator= is purposely undefined and
211  // private (DO NOT USE IT!) - should use
212  // TableView::copy()
213 
214  std::string uniqueStorageIdentifier_; // starts empty "", used to implement
215  // re-writable views ("temporary views") in
216  // artdaq db
217  std::string tableName_; // View name (extensionTableName in xml)
218  TableVersion version_; // Table version
219  std::string comment_; // Table version comment
220  std::string author_;
221  time_t creationTime_; // used more like "construction"(constructor) time
222  time_t lastAccessTime_; // last time the ConfigurationInterface:get() retrieved this
223  // view
224  unsigned int colUID_, colStatus_, colPriority_; // special column pointers
225  std::map<std::string, unsigned int>
226  colLinkGroupIDs_; // map from child link index to column
227 
228  bool fillWithLooseColumnMatching_;
229  unsigned int sourceColumnMismatchCount_, sourceColumnMissingCount_;
230  std::set<std::string> sourceColumnNames_;
231 
232  std::vector<TableViewColumnInfo> columnsInfo_;
233  DataView theDataView_;
234 };
235 
236 #include "otsdaq-core/TableCore/TableView.icc" //define template functions
237 
238 } // namespace ots
239 
240 #endif