#ifndef ASYNCDBCONNECTION_H #define ASYNCDBCONNECTION_H #include #include "Pgsql_Connection.h" #include "Pgsql_Params.h" #include "Pgsql_Result.h" #include "Expected.h" #include "ConnectionConfig.h" #include #include #include #include /** \brief Class that handles asynchronous execution of queries. * * Queries are passed to this class with a routine to call on completion * when the result is on that routine is called. */ class ASyncDBConnection: public QObject { Q_OBJECT public: enum class State { NotConnected, Connecting, Connected, ///< connected and idle QuerySend, ///< connected query send expecting result CancelSend, ///< cancel send expecting result Terminating ///< shutting down }; using on_result_callback = std::function>, qint64)>; explicit ASyncDBConnection(boost::asio::io_service &ios); ~ASyncDBConnection(); State state() const; void setupConnection(const ConnectionConfig &config); void closeConnection(); /** Sends command to the server. When the result is in on_result will be called directly within the thread. If the command gives multiple results on_result will be called for each result. */ bool send(const std::string &command, on_result_callback on_result); bool send(const std::string &command, Pgsql::Params params, on_result_callback on_result); bool cancel(); signals: void onStateChanged(ASyncDBConnection::State state); void onNotice(Pgsql::ErrorDetails notice); private: Pgsql::Connection m_connection; boost::asio::ip::tcp::socket m_asioSock; ConnectionConfig m_config; State m_state = State::NotConnected; Pgsql::Canceller m_canceller; QElapsedTimer m_timer; void async_connect_handler(boost::system::error_code ec, std::size_t s); void async_query_handler(boost::system::error_code ec, std::size_t s, on_result_callback on_result); void doStateCallback(State state); void processNotice(const PGresult *result); }; Q_DECLARE_METATYPE(ASyncDBConnection::State); Q_DECLARE_METATYPE(Pgsql::ErrorDetails); #endif // ASYNCDBCONNECTION_H