#ifndef RDBMSDATASOURCE_H #define RDBMSDATASOURCE_H #include #include #include #include #include #include "dataSource.h" #include #include #include "scriptLoader.h" #include "connectionLoader.h" /// Project2 component to provide access to transactional RDBMS data sources class RdbmsDataSource : public DataSource { public: class ConnectionRef; class RdbmsConnection { public: RdbmsConnection(const DB::Connection * connection, time_t kat); ~RdbmsConnection(); void touch() const; bool isExpired() const; const DB::Connection * const connection; bool txOpen; boost::optional threadId; private: friend class ConnectionRef; friend class RdbmsDataSource; mutable time_t lastUsedTime; void incRef(); void decRef(); unsigned int users; const time_t keepAliveTime; }; typedef boost::shared_ptr ConnectionPtr; class ConnectionRef { public: ConnectionRef(); ConnectionRef(const ConnectionPtr &); ~ConnectionRef(); ConnectionRef & operator=(const ConnectionRef &); const DB::Connection * operator->() const; const DB::Connection & operator*() const; const DB::Connection * get() const; private: ConnectionPtr conn; }; class ConnectionInfo { public: ConnectionInfo(ScriptNodePtr); DB::Connection * connect() const; bool operator<(const ConnectionInfo & o) const; const std::string dsn; const boost::shared_ptr typeId; }; typedef std::map ReadonlyDSNs; // Map hostname to DSN string typedef std::multimap DBHosts; // Map DSN strings to connections typedef std::map FailedHosts; // Map DSN strings to failures RdbmsDataSource(ScriptNodePtr p); ~RdbmsDataSource(); ConnectionRef getReadonly() const; ConnectionRef getWritable() const; virtual void close() override; virtual void commit() override; virtual void rollback() override; const ConnectionInfo masterDsn; const bool preferLocal; protected: static ConnectionPtr connectTo(const ConnectionInfo & dsn); ReadonlyDSNs roDSNs; private: mutable std::mutex ilock; static std::mutex glock; mutable std::string localhost; static DBHosts dbhosts; static FailedHosts failedhosts; typedef std::pair ChangedDSN; typedef std::set ChangedDSNs; static ChangedDSNs changedDSNs; friend class RdbmsDataSourceLoader; }; #endif