droplet 1.3.0
A multipurpose Discord bot with the hacker in mind
Loading...
Searching...
No Matches
DatabaseExecutor.hpp
Go to the documentation of this file.
1/*
2 * (c) Copyright erarnitox.de - All rights reserved
3 * Author: Erarnitox <david@erarnitox.de>
4 *
5 * License: MIT License
6 */
7
8#pragma once
9
10#include <iostream>
11#include <string>
12#include <utility>
13#include <vector>
14
16#include "RowDTOAdapter.hpp"
17
22 public:
23 explicit DatabaseExecutor(IDatabaseConnectionProvider& provider) noexcept : provider_(provider) {
24 }
25
28
29 [[nodiscard]] bool hasConnection() const noexcept {
30 return provider_.hasConnection();
31 }
32
33 template <typename... Types>
34 [[nodiscard]] bool execQuery(const std::string& query, Types&&... args) noexcept;
35
36 template <typename... Types>
37 [[nodiscard]] RowDTOAdapter execSelect(const std::string& query, Types&&... args) noexcept;
38
39 template <typename... Types>
40 [[nodiscard]] std::vector<RowDTOAdapter> execSelectAll(const std::string& query, Types&&... args) noexcept;
41
42 [[nodiscard]] static DatabaseExecutor& application_instance();
43
44 private:
46};
47
48template <typename... Types>
49[[nodiscard]] bool DatabaseExecutor::execQuery(const std::string& query, Types&&... args) noexcept {
50 static thread_local int times = 0;
51 try {
52 NativeDatabase::Transaction txn(*provider_.getConnection());
53 const NativeDatabase::ParameterList params{std::forward<Types>(args)...};
54 (void)txn.exec(query, params);
55 txn.commit();
56 times = 0;
57 return true;
59 ++times;
60 if (times > 10) {
61 times = 0;
62 return false;
63 }
64 provider_.reconnect();
65 return execQuery(query, std::forward<Types>(args)...);
66 } catch (const std::exception& e) {
67 std::cerr << "Error: " << e.what() << "\nInvalid exec for query:\n" << query << std::endl;
68 return false;
69 }
70}
71
72template <typename... Types>
73[[nodiscard]] RowDTOAdapter DatabaseExecutor::execSelect(const std::string& query, Types&&... args) noexcept {
74 static thread_local int times = 0;
75 try {
76 NativeDatabase::Transaction txn(*provider_.getConnection());
77 const NativeDatabase::ParameterList params{std::forward<Types>(args)...};
78 const NativeDatabase::Result result = txn.exec(query, params);
79 txn.commit();
80 times = 0;
81 return {result[0]};
83 ++times;
84 if (times > 10) {
85 times = 0;
86 return {NativeDatabase::Row()};
87 }
88 provider_.reconnect();
89 return execSelect(query, std::forward<Types>(args)...);
90 } catch (const std::exception& e) {
91 std::cerr << "Error: " << e.what() << "\nInvalid selection for query:\n" << query << std::endl;
92 return {{}};
93 }
94}
95
96template <typename... Types>
97[[nodiscard]] std::vector<RowDTOAdapter> DatabaseExecutor::execSelectAll(const std::string& query,
98 Types&&... args) noexcept {
99 static thread_local int times = 0;
100 try {
101 NativeDatabase::Transaction txn(*provider_.getConnection());
102 const NativeDatabase::ParameterList params{std::forward<Types>(args)...};
103 const NativeDatabase::Result result = txn.exec(query, params);
104 txn.commit();
105 times = 0;
106 std::vector<RowDTOAdapter> selection;
107 for (int i{0}; i < result.size(); ++i) {
108 selection.emplace_back(result[i]);
109 }
110 return selection;
112 ++times;
113 if (times > 10) {
114 times = 0;
115 return {};
116 }
117 provider_.reconnect();
118 return execSelectAll(query, std::forward<Types>(args)...);
119 } catch (const std::exception& e) {
120 std::cerr << "Error: " << e.what() << "\nInvalid selection for query:\n" << query << std::endl;
121 return {};
122 }
123}
Definition DatabaseExecutor.hpp:21
std::vector< RowDTOAdapter > execSelectAll(const std::string &query, Types &&... args) noexcept
Definition DatabaseExecutor.hpp:97
DatabaseExecutor(const DatabaseExecutor &)=delete
bool hasConnection() const noexcept
Definition DatabaseExecutor.hpp:29
RowDTOAdapter execSelect(const std::string &query, Types &&... args) noexcept
Definition DatabaseExecutor.hpp:73
DatabaseExecutor & operator=(const DatabaseExecutor &)=delete
bool execQuery(const std::string &query, Types &&... args) noexcept
Definition DatabaseExecutor.hpp:49
DatabaseExecutor(IDatabaseConnectionProvider &provider) noexcept
Definition DatabaseExecutor.hpp:23
static DatabaseExecutor & application_instance()
Definition DatabaseExecutor.cpp:31
Definition IDatabaseConnectionProvider.hpp:16
Definition RowDTOAdapter.hpp:20
pqxx::broken_connection BrokenConnectionException
Definition DatabaseBackend.hpp:33
pqxx::work Transaction
Definition DatabaseBackend.hpp:34
pqxx::row Row
Definition DatabaseBackend.hpp:31
pqxx::result Result
Definition DatabaseBackend.hpp:36
pqxx::params ParameterList
Definition DatabaseBackend.hpp:35