74 lines
2.4 KiB
C
Raw Normal View History

2019-06-26 22:11:22 +02:00
#pragma once
2019-09-05 12:30:07 +02:00
#include <stdexcept>
#include <string>
#include <memory>
2019-06-26 22:11:22 +02:00
#include <condition_variable>
#include "sql/SqlQuery.h"
2019-09-05 12:30:07 +02:00
#include "../../misc/spin_lock.h"
2020-02-15 14:01:07 +01:00
#include <mysql.h>
2019-06-26 22:11:22 +02:00
#define ERROR_MYSQL_MISSING_DRIVER -1
#define ERROR_MYSQL_INVLID_CONNECT -2
#define ERROR_MYSQL_INVLID_PROPERTIES -3
#define ERROR_MYSQL_INVLID_URL -4
2020-02-15 14:01:07 +01:00
namespace sql::mysql {
class MySQLManager;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
bool evaluate_sql_query(std::string& sql, const std::vector<variable>& vars, std::vector<variable>& result);
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
class MySQLCommand : public CommandData { };
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
struct Connection {
MYSQL* handle = nullptr;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
spin_lock used_lock;
bool used = false;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
~Connection();
};
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
struct AcquiredConnection {
MySQLManager* owner;
std::shared_ptr<Connection> connection;
2019-09-05 12:30:07 +02:00
2020-02-15 14:01:07 +01:00
AcquiredConnection(MySQLManager* owner, std::shared_ptr<Connection> );
~AcquiredConnection();
};
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
class MySQLManager : public SqlManager {
friend struct AcquiredConnection;
public:
//typedef std::function<void(const std::shared_ptr<ConnectionEntry>&)> ListenerConnectionDisconnect;
//typedef std::function<void(const std::shared_ptr<ConnectionEntry>&)> ListenerConnectionCreated;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
typedef std::function<void()> ListenerConnected;
typedef std::function<void(bool /* wanted */)> ListenerDisconnected;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
MySQLManager();
virtual ~MySQLManager();
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
result connect(const std::string &string) override;
bool connected() override;
result disconnect() override;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
ListenerDisconnected listener_disconnected;
protected:
std::shared_ptr<CommandData> copyCommandData(std::shared_ptr<CommandData> ptr) override;
std::shared_ptr<CommandData> allocateCommandData() override;
result executeCommand(std::shared_ptr<CommandData> ptr) override;
result queryCommand(std::shared_ptr<CommandData> ptr, const QueryCallback &fn) override;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
public:
std::unique_ptr<AcquiredConnection> next_connection();
void connection_closed(const std::shared_ptr<Connection>& /* connection */);
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
std::mutex connections_lock;
std::condition_variable connections_condition;
std::deque<std::shared_ptr<Connection>> connections;
2019-06-26 22:11:22 +02:00
2020-02-15 14:01:07 +01:00
bool disconnecting = false;
};
2019-06-26 22:11:22 +02:00
}