droplet 1.3.0
A multipurpose Discord bot with the hacker in mind
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
12class ConnectionPool;
13
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;
21
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
44 public:
45 ConnectionPool() = default;
47
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};
ConnectionLease() noexcept=default
NativeDatabase::Connection & get() noexcept
Definition ConnectionPool.hpp:33
void discard() noexcept
Definition ConnectionPool.hpp:29
Definition ConnectionPool.hpp:43
ConnectionPool & operator=(const ConnectionPool &)=delete
void disconnect() noexcept
Definition ConnectionPool.cpp:79
bool connect(const std::string &connection_string, std::size_t pool_size=4)
Definition ConnectionPool.cpp:54
ConnectionPool()=default
friend class ConnectionLease
Definition ConnectionPool.hpp:57
ConnectionPool(const ConnectionPool &)=delete
bool has_connection() const noexcept
Definition ConnectionPool.cpp:86
ConnectionLease acquire()
Definition ConnectionPool.cpp:91
Definition DatabaseBackend.hpp:30
pqxx::connection Connection
Definition DatabaseBackend.hpp:32