#pragma once #include #include #include #include #include "sql/SqlQuery.h" #include "misc/spin_mutex.h" #if defined(HAVE_MYSQL_MYSQL_H) #include #elif defined(HAVE_MYSQL_H) #include #else typedef void MYSQL; #endif #define ERROR_MYSQL_MISSING_DRIVER -1 #define ERROR_MYSQL_INVLID_CONNECT -2 #define ERROR_MYSQL_INVLID_PROPERTIES -3 #define ERROR_MYSQL_INVLID_URL -4 namespace sql::mysql { class MySQLManager; bool evaluate_sql_query(std::string& sql, const std::vector& vars, std::vector& result); class MySQLCommand : public CommandData { }; struct Connection { MYSQL* handle = nullptr; spin_mutex used_lock; bool used = false; ~Connection(); }; struct AcquiredConnection { MySQLManager* owner; std::shared_ptr connection; AcquiredConnection(MySQLManager* owner, std::shared_ptr ); ~AcquiredConnection(); }; class MySQLManager : public SqlManager { friend struct AcquiredConnection; public: //typedef std::function&)> ListenerConnectionDisconnect; //typedef std::function&)> ListenerConnectionCreated; typedef std::function ListenerConnected; typedef std::function ListenerDisconnected; MySQLManager(); virtual ~MySQLManager(); result connect(const std::string &string) override; bool connected() override; result disconnect() override; ListenerDisconnected listener_disconnected; protected: std::shared_ptr copyCommandData(std::shared_ptr ptr) override; std::shared_ptr allocateCommandData() override; result executeCommand(std::shared_ptr ptr) override; result queryCommand(std::shared_ptr ptr, const QueryCallback &fn) override; public: std::unique_ptr next_connection(); void connection_closed(const std::shared_ptr& /* connection */); std::mutex connections_lock; std::condition_variable connections_condition; std::deque> connections; bool disconnecting = false; }; }