Data_deduplication_service
Service that will use hashes to deduplicate files
myPqxxModel.h
Go to the documentation of this file.
1 #ifndef DATA_DEDUPLICATION_SERVICE_MYPQXXMODEL_H
2 #define DATA_DEDUPLICATION_SERVICE_MYPQXXMODEL_H
3 
4 
5 #include <variant>
6 #include <unordered_map>
7 
8 #include <QAbstractTableModel>
9 #include <QSortFilterProxyModel>
10 #include <pqxx/pqxx>
11 
12 #include <dbCommon.h>
13 #include <QDate>
14 #include <QMouseEvent>
15 #include <QTableView>
16 
18 namespace models {
22  using oid = uint32_t;
23 
27  using returnType = std::variant <std::type_identity<int64_t>,
28  std::type_identity<double>,
29  std::type_identity<std::string>,
30  std::type_identity<pqxx::binarystring>>;
31 
35  static const std::unordered_map <oid, returnType> oidToTypeMap = {
36  {20, std::type_identity < int64_t > {}},
37  {701, std::type_identity < double > {}},
38  {25, std::type_identity < std::string > {}},
39  {17, std::type_identity < pqxx::binarystring > {}},
40  {1700, std::type_identity < double > {}}
41  };
42 
49  template<typename ReturnType>
50  QVariant
51  toQtVariant(const ReturnType &val) {
52  return {};
53  }
54 
55  template<>
56  QVariant inline toQtVariant(const pqxx::binarystring &val) {
57  return {QString::fromStdString(val.str())};
58  }
59 
60  template<>
61  QVariant inline toQtVariant(const std::string_view &val) {
62  return {QString::fromStdString(val.data())};
63  }
64 
65  template<>
66  QVariant inline toQtVariant(const std::string &val) {
67  return {QString::fromStdString(val)};
68  }
69 
70  template<>
71  QVariant inline toQtVariant(const double &val) {
72  return val;
73  }
74 
75 
76  QVariant inline toQtVariant(const int64_t &val) {
77  return static_cast<qint64>(val);
78  }
79 
80  using namespace db_services;
81 
86  public:
91  bool performConnection(myConnString &cstring);
92 
96  bool checkConnection();
97 
98  virtual void getData()=0;
99 
100 
101 
106  bool isEmpty() const {
107  return isEmpty_;
108  }
109 
110  protected:
111 
120  QVariant convertFromPqxx(const QModelIndex &index, int role) const;
121 
129  template<typename ResType1, typename ... Args>
130  void executeInTransaction(ResType1
131  (*call)(db_services::trasnactionType &, Args ...),
132  Args &&... args);
133 
142  template<typename ResType1, typename ... Args>
143  void
144  executeInTransaction(const std::function<ResType1(db_services::trasnactionType &, Args ...)> &call,
145  Args &&... args);
146 
147  void setColumnsTypes();
151  void reset() {
152  res = resType();
153  isEmpty_ = true;
154  }
155 
158  QList <oid> columnTypes;
159  QList <QString> columnNames;
160  bool good;
161  bool isEmpty_;
162  };
163 
164 
168  class myPqxxModel : public QAbstractTableModel, public myPxxxModelBase {
169  Q_OBJECT
170  public:
171 
172  explicit myPqxxModel(QObject *parent = nullptr);
173 
174  int rowCount(const QModelIndex &parent) const override {
175  return res.size();
176  }
177 
178  int columnCount(const QModelIndex &parent) const override {
179  return res.columns();
180  }
181 
189  QVariant headerData(int section, Qt::Orientation orientation,
190  int role) const override;
191 
192  QVariant data(const QModelIndex &index, int role) const override;
193 
197  void Reset();
198  };
199 
204  public:
205  explicit deduplicationCharacteristicsModel(QObject *parent = nullptr) : myPqxxModel(parent) {}
206 
210  void getData() override {
211  beginResetModel();
213  endResetModel();
214  }
215  };
216 
217 
221  class mySortFilterProxyModel : public QSortFilterProxyModel {
222  Q_OBJECT
223  public:
224  mySortFilterProxyModel(QObject *parent = nullptr)
225  : QSortFilterProxyModel(parent) {
226  }
227 
228 
229  protected:
235  bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override {
236  QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
237 
238 
239  return (sourceModel()->data(index0).toString().contains(filterRegularExpression()));
240  }
241  };
242 
243 
245  class notNullFilterProxyModel : public QSortFilterProxyModel {
246  Q_OBJECT
247 
248  public:
249  explicit notNullFilterProxyModel(QObject *parent = nullptr)
250  : QSortFilterProxyModel(parent) {
251  }
252 
253 
254  protected:
260  bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override {
261  for (int i = 0; i < sourceModel()->columnCount(); ++i) {
262  if (sourceModel()->data(sourceModel()->index(sourceRow, i, sourceParent)).isNull()) {
263  return false;
264  }
265  }
266  return true;
267  }
268  };
269 
271  class deselectableTableView : public QTableView {
272  public:
273  explicit deselectableTableView(QWidget *parent) : QTableView(parent) {}
274 
275  ~deselectableTableView() override = default;
276 
277  private:
282  void mousePressEvent(QMouseEvent *event) override {
283 
284  QModelIndex item = indexAt(event->pos());
285 
286  if (item.isValid()) {
287  QTableView::mousePressEvent(event);
288  } else {
289  clearSelection();
290  const QModelIndex index;
291  selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
292  }
293  }
294 
295  };
296 
297 
298  template<typename ResType1, typename... Args>
299  void
300  myPxxxModelBase::executeInTransaction(ResType1 (*call)(db_services::trasnactionType &, Args...), Args &&... args) {
301  if (!checkConnection()) {
302  res = pqxx::result();
303  return;
304  }
305  try {
306  auto ss = db_services::executeInTransaction(connection, call, std::forward<Args>(args)...);
307  if (!ss.has_value()) {
308  res = pqxx::result();
309  }
310  res = ss.value();
311  }
312  catch (const pqxx::sql_error &e) {
313  res = pqxx::result();
314  return;
315  }
316  catch (const std::exception &e) {
317  res = pqxx::result();
318  return;
319  }
320 
321  setColumnsTypes();
322  isEmpty_ = false;
323  }
324 
325  template<typename ResType1, typename... Args>
326  void myPxxxModelBase::executeInTransaction(const std::function<ResType1(trasnactionType &, Args...)> &call,
327  Args &&... args) {
328  if (!checkConnection()) {
329  res = pqxx::result();
330  return;
331  }
332  try {
333  auto ss = db_services::executeInTransaction(connection, call, std::forward<Args>(args)...);
334  if (!ss.has_value()) {
335  res = pqxx::result();
336  }
337  res = ss.value();
338  }
339  catch (const pqxx::sql_error &e) {
340  res = pqxx::result();
341  return;
342  }
343  catch (const std::exception &e) {
344  res = pqxx::result();
345  return;
346  }
347 
348  setColumnsTypes();
349  isEmpty_ = false;
350  }
351 
352 }
353 
354 #endif //DATA_DEDUPLICATION_SERVICE_MYPQXXMODEL_H
Pqxx model that retrieves database deduplication characteristic.
Definition: myPqxxModel.h:203
void getData() override
Definition: myPqxxModel.h:210
deduplicationCharacteristicsModel(QObject *parent=nullptr)
Definition: myPqxxModel.h:205
Tbale view that can be deselected.
Definition: myPqxxModel.h:271
deselectableTableView(QWidget *parent)
Definition: myPqxxModel.h:273
~deselectableTableView() override=default
Table model for pqxx::result.
Definition: myPqxxModel.h:168
int rowCount(const QModelIndex &parent) const override
Definition: myPqxxModel.h:174
int columnCount(const QModelIndex &parent) const override
Definition: myPqxxModel.h:178
Basic class for database pqxx::result representation.
Definition: myPqxxModel.h:85
bool isEmpty() const
Definition: myPqxxModel.h:106
QList< QString > columnNames
Definition: myPqxxModel.h:159
void executeInTransaction(ResType1(*call)(db_services::trasnactionType &, Args ...), Args &&... args)
QList< oid > columnTypes
Definition: myPqxxModel.h:158
conPtr connection
Definition: myPqxxModel.h:157
virtual void getData()=0
resType res
Definition: myPqxxModel.h:156
void executeInTransaction(const std::function< ResType1(db_services::trasnactionType &, Args ...)> &call, Args &&... args)
void reset()
Definition: myPqxxModel.h:151
bool isEmpty_
Definition: myPqxxModel.h:161
bool good
Definition: myPqxxModel.h:160
Sort filter proxy model used for searching entry names.
Definition: myPqxxModel.h:221
mySortFilterProxyModel(QObject *parent=nullptr)
Definition: myPqxxModel.h:224
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
Definition: myPqxxModel.h:235
Sort filter model that filters out all rows with NULL values.
Definition: myPqxxModel.h:245
notNullFilterProxyModel(QObject *parent=nullptr)
Definition: myPqxxModel.h:249
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
Definition: myPqxxModel.h:260
db_services namespace
Definition: dbCommon.h:17
pqxx::transaction< pqxx::isolation_level::read_committed > trasnactionType
Definition: dbCommon.h:35
pqxx::result resType
Definition: dbCommon.h:38
tl::expected< ResultType, int > executeInTransaction(conPtr &conn, ResultType(*call)(trasnactionType &, Args ...), Args &&... args)
Definition: dbCommon.h:246
resType getDedupCharacteristics(trasnactionType &txn)
Definition: dbCommon.cpp:205
bool checkConnection(const conPtr &conn)
Definition: dbCommon.cpp:309
std::shared_ptr< connectionType > conPtr
Definition: dbCommon.h:37
models namespace
Definition: myPqxxModel.cpp:3
std::variant< std::type_identity< int64_t >, std::type_identity< double >, std::type_identity< std::string >, std::type_identity< pqxx::binarystring > > returnType
Definition: myPqxxModel.h:30
QVariant toQtVariant(const ReturnType &val)
Definition: myPqxxModel.h:51
uint32_t oid
Definition: myPqxxModel.h:22
Structure to store and format connection string.
Definition: myConnString.h:15