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#pragma once
2
3#include <iostream>
4#include <string>
5#include <utility>
6#include <vector>
7
8#include "ConnectionPool.hpp"
9#include "RowDTOAdapter.hpp"
10
15 public:
16 explicit DatabaseExecutor(ConnectionPool& pool) noexcept : pool_(pool) {
17 }
18
21
22 [[nodiscard]] bool hasConnection() const noexcept {
23 return pool_.has_connection();
24 }
25
26 template <typename... Types>
27 [[nodiscard]] bool execQuery(const std::string& query, Types&&... args);
28
29 template <typename... Types>
30 [[nodiscard]] RowDTOAdapter execSelect(const std::string& query, Types&&... args);
31
32 template <typename... Types>
33 [[nodiscard]] std::vector<RowDTOAdapter> execSelectAll(const std::string& query, Types&&... args);
34
35 private:
36 ConnectionPool& pool_;
37};
38
39template <typename... Types>
40[[nodiscard]] bool DatabaseExecutor::execQuery(const std::string& query, Types&&... args) {
41 int times = 0;
42 while (times <= 10) {
43 auto lease = pool_.acquire();
44 if (not lease) {
45 return false;
46 }
47 try {
48 NativeDatabase::Transaction txn(lease.get());
49 const NativeDatabase::ParameterList params{std::forward<Types>(args)...};
50 (void)txn.exec(query, params);
51 txn.commit();
52 return true;
54 lease.discard();
55 ++times;
56 } catch (const std::exception& e) {
57 std::cerr << "Error: " << e.what() << "\nInvalid exec for query:\n" << query << '\n';
58 return false;
59 }
60 }
61 return false;
62}
63
64template <typename... Types>
65[[nodiscard]] RowDTOAdapter DatabaseExecutor::execSelect(const std::string& query, Types&&... args) {
66 int times = 0;
67 while (times <= 10) {
68 auto lease = pool_.acquire();
69 if (not lease) {
70 return {NativeDatabase::Row{}};
71 }
72 try {
73 NativeDatabase::Transaction txn(lease.get());
74 const NativeDatabase::ParameterList params{std::forward<Types>(args)...};
75 const NativeDatabase::Result result = txn.exec(query, params);
76 txn.commit();
77 if (result.empty()) {
78 return {NativeDatabase::Row{}};
79 }
80 return {result[0]};
82 lease.discard();
83 ++times;
84 } catch (const std::exception& e) {
85 std::cerr << "Error: " << e.what() << "\nInvalid selection for query:\n" << query << '\n';
86 return {NativeDatabase::Row{}};
87 }
88 }
89 return {NativeDatabase::Row{}};
90}
91
92template <typename... Types>
93[[nodiscard]] std::vector<RowDTOAdapter> DatabaseExecutor::execSelectAll(const std::string& query, Types&&... args) {
94 int times = 0;
95 while (times <= 10) {
96 auto lease = pool_.acquire();
97 if (not lease) {
98 return {};
99 }
100 try {
101 NativeDatabase::Transaction txn(lease.get());
102 const NativeDatabase::ParameterList params{std::forward<Types>(args)...};
103 const NativeDatabase::Result result = txn.exec(query, params);
104 txn.commit();
105 std::vector<RowDTOAdapter> selection;
106 selection.reserve(static_cast<std::size_t>(result.size()));
107 for (const auto& row : result) {
108 selection.emplace_back(row);
109 }
110 return selection;
112 lease.discard();
113 ++times;
114 } catch (const std::exception& e) {
115 std::cerr << "Error: " << e.what() << "\nInvalid selection for query:\n" << query << '\n';
116 return {};
117 }
118 }
119 return {};
120}
Definition ConnectionPool.hpp:43
bool execQuery(const std::string &query, Types &&... args)
Definition DatabaseExecutor.hpp:40
RowDTOAdapter execSelect(const std::string &query, Types &&... args)
Definition DatabaseExecutor.hpp:65
DatabaseExecutor(const DatabaseExecutor &)=delete
bool hasConnection() const noexcept
Definition DatabaseExecutor.hpp:22
std::vector< RowDTOAdapter > execSelectAll(const std::string &query, Types &&... args)
Definition DatabaseExecutor.hpp:93
DatabaseExecutor & operator=(const DatabaseExecutor &)=delete
DatabaseExecutor(ConnectionPool &pool) noexcept
Definition DatabaseExecutor.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