/** * * @file DbConnection.h * @author An Tao * * Copyright 2018, An Tao. All rights reserved. * https://github.com/an-tao/drogon * Use of this source code is governed by a MIT license * that can be found in the License file. * * Drogon * */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace drogon { namespace orm { #if __cplusplus >= 201703L | defined _WIN32 using SharedMutex = std::shared_mutex; #else using SharedMutex = std::shared_timed_mutex; #endif enum class ConnectStatus { None = 0, Connecting, SettingCharacterSet, Ok, Bad }; struct SqlCmd { string_view sql_; size_t parametersNumber_; std::vector parameters_; std::vector lengths_; std::vector formats_; QueryCallback callback_; ExceptPtrCallback exceptionCallback_; std::string preparingStatement_; #if LIBPQ_SUPPORTS_BATCH_MODE bool isChanging_{false}; #endif SqlCmd(string_view &&sql, size_t paraNum, std::vector &¶meters, std::vector &&length, std::vector &&format, QueryCallback &&cb, ExceptPtrCallback &&exceptCb) : sql_(std::move(sql)), parametersNumber_(paraNum), parameters_(std::move(parameters)), lengths_(std::move(length)), formats_(std::move(format)), callback_(std::move(cb)), exceptionCallback_(std::move(exceptCb)) { } }; class DbConnection; using DbConnectionPtr = std::shared_ptr; class DbConnection : public trantor::NonCopyable { public: using DbConnectionCallback = std::function; explicit DbConnection(trantor::EventLoop *loop) : loop_(loop) { } void setOkCallback(const DbConnectionCallback &cb) { okCallback_ = cb; } void setCloseCallback(const DbConnectionCallback &cb) { closeCallback_ = cb; } void setIdleCallback(const std::function &cb) { idleCb_ = cb; } virtual void execSql( string_view &&sql, size_t paraNum, std::vector &¶meters, std::vector &&length, std::vector &&format, ResultCallback &&rcb, std::function &&exceptCallback) = 0; virtual void batchSql( std::deque> &&sqlCommands) = 0; virtual ~DbConnection() { LOG_TRACE << "Destruct DbConn" << this; } ConnectStatus status() const { return status_; } trantor::EventLoop *loop() { return loop_; } virtual void disconnect() = 0; bool isWorking() const { return isWorking_; } protected: QueryCallback callback_; trantor::EventLoop *loop_; std::function idleCb_; ConnectStatus status_{ConnectStatus::None}; DbConnectionCallback closeCallback_{[](const DbConnectionPtr &) {}}; DbConnectionCallback okCallback_{[](const DbConnectionPtr &) {}}; std::function exceptionCallback_; bool isWorking_{false}; static std::map parseConnString( const std::string &); }; } // namespace orm } // namespace drogon