droplet
1.3.0
A multipurpose Discord bot with the hacker in mind
Toggle main menu visibility
Loading...
Searching...
No Matches
ConnectionPool.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <condition_variable>
4
#include <cstddef>
5
#include <memory>
6
#include <mutex>
7
#include <string>
8
#include <vector>
9
10
#include "
DatabaseBackend.hpp
"
11
12
class
ConnectionPool
;
13
14
class
ConnectionLease
{
15
public
:
16
ConnectionLease
() noexcept = default;
17
ConnectionLease
(
ConnectionPool
& pool, std::unique_ptr<
NativeDatabase
::Connection> conn) noexcept;
18
ConnectionLease
(
ConnectionLease
&& other) noexcept;
19
ConnectionLease
& operator=(
ConnectionLease
&& other) noexcept;
20
~
ConnectionLease
();
21
22
ConnectionLease
(const
ConnectionLease
&) = delete;
23
ConnectionLease
& operator=(const
ConnectionLease
&) = delete;
24
25
[[nodiscard]] explicit operator
bool
() const noexcept {
26
return
static_cast<
bool
>
(conn_);
27
}
28
29
void
discard
() noexcept {
30
recycle_ =
false
;
31
}
32
33
[[nodiscard]]
NativeDatabase::Connection
&
get
() noexcept {
34
return
*conn_;
35
}
36
37
private
:
38
ConnectionPool
* pool_{
nullptr
};
39
std::unique_ptr<NativeDatabase::Connection> conn_;
40
bool
recycle_{
true
};
41
};
42
43
class
ConnectionPool
{
44
public
:
45
ConnectionPool
() =
default
;
46
~ConnectionPool
();
47
48
ConnectionPool
(
const
ConnectionPool
&) =
delete
;
49
ConnectionPool
&
operator=
(
const
ConnectionPool
&) =
delete
;
50
51
[[nodiscard]]
bool
connect
(
const
std::string& connection_string, std::size_t pool_size = 4);
52
void
disconnect
() noexcept;
53
[[nodiscard]]
bool
has_connection
() const noexcept;
54
[[nodiscard]]
ConnectionLease
acquire
();
55
56
private:
57
friend class
ConnectionLease
;
58
void
release(std::unique_ptr<
NativeDatabase
::Connection> conn) noexcept;
59
void
drop_and_replace() noexcept;
60
61
std::
string
connection_string_;
62
std::
size_t
max_size_{4};
63
mutable
std::mutex mutex_;
64
std::condition_variable cv_;
65
std::vector<std::unique_ptr<NativeDatabase::Connection>> idle_;
66
std::size_t in_use_{0};
67
bool
connected_{
false
};
68
};
DatabaseBackend.hpp
ConnectionLease::ConnectionLease
ConnectionLease() noexcept=default
ConnectionLease::get
NativeDatabase::Connection & get() noexcept
Definition
ConnectionPool.hpp:33
ConnectionLease::discard
void discard() noexcept
Definition
ConnectionPool.hpp:29
ConnectionPool
Definition
ConnectionPool.hpp:43
ConnectionPool::operator=
ConnectionPool & operator=(const ConnectionPool &)=delete
ConnectionPool::disconnect
void disconnect() noexcept
Definition
ConnectionPool.cpp:79
ConnectionPool::connect
bool connect(const std::string &connection_string, std::size_t pool_size=4)
Definition
ConnectionPool.cpp:54
ConnectionPool::ConnectionPool
ConnectionPool()=default
ConnectionPool::ConnectionLease
friend class ConnectionLease
Definition
ConnectionPool.hpp:57
ConnectionPool::ConnectionPool
ConnectionPool(const ConnectionPool &)=delete
ConnectionPool::has_connection
bool has_connection() const noexcept
Definition
ConnectionPool.cpp:86
ConnectionPool::acquire
ConnectionLease acquire()
Definition
ConnectionPool.cpp:91
NativeDatabase
Definition
DatabaseBackend.hpp:30
NativeDatabase::Connection
pqxx::connection Connection
Definition
DatabaseBackend.hpp:32
src
bot_library
bot
core
database
include
ConnectionPool.hpp
Generated by
1.18.0