droplet
1.3.0
A multipurpose Discord bot with the hacker in mind
Toggle main menu visibility
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
14
class
DatabaseExecutor
{
15
public
:
16
explicit
DatabaseExecutor
(
ConnectionPool
& pool) noexcept : pool_(pool) {
17
}
18
19
DatabaseExecutor
(
const
DatabaseExecutor
&) =
delete
;
20
DatabaseExecutor
&
operator=
(
const
DatabaseExecutor
&) =
delete
;
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
39
template
<
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
;
53
}
catch
(
const
NativeDatabase::BrokenConnectionException
&) {
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
64
template
<
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]};
81
}
catch
(
const
NativeDatabase::BrokenConnectionException
&) {
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
92
template
<
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;
111
}
catch
(
const
NativeDatabase::BrokenConnectionException
&) {
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
}
ConnectionPool.hpp
RowDTOAdapter.hpp
ConnectionPool
Definition
ConnectionPool.hpp:43
DatabaseExecutor::execQuery
bool execQuery(const std::string &query, Types &&... args)
Definition
DatabaseExecutor.hpp:40
DatabaseExecutor::execSelect
RowDTOAdapter execSelect(const std::string &query, Types &&... args)
Definition
DatabaseExecutor.hpp:65
DatabaseExecutor::DatabaseExecutor
DatabaseExecutor(const DatabaseExecutor &)=delete
DatabaseExecutor::hasConnection
bool hasConnection() const noexcept
Definition
DatabaseExecutor.hpp:22
DatabaseExecutor::execSelectAll
std::vector< RowDTOAdapter > execSelectAll(const std::string &query, Types &&... args)
Definition
DatabaseExecutor.hpp:93
DatabaseExecutor::operator=
DatabaseExecutor & operator=(const DatabaseExecutor &)=delete
DatabaseExecutor::DatabaseExecutor
DatabaseExecutor(ConnectionPool &pool) noexcept
Definition
DatabaseExecutor.hpp:16
RowDTOAdapter
Definition
RowDTOAdapter.hpp:20
NativeDatabase::BrokenConnectionException
pqxx::broken_connection BrokenConnectionException
Definition
DatabaseBackend.hpp:33
NativeDatabase::Transaction
pqxx::work Transaction
Definition
DatabaseBackend.hpp:34
NativeDatabase::Row
pqxx::row Row
Definition
DatabaseBackend.hpp:31
NativeDatabase::Result
pqxx::result Result
Definition
DatabaseBackend.hpp:36
NativeDatabase::ParameterList
pqxx::params ParameterList
Definition
DatabaseBackend.hpp:35
src
bot_library
bot
core
database
include
DatabaseExecutor.hpp
Generated by
1.18.0