diff options
Diffstat (limited to 'project2/sql/rdbmsDataSource.h')
-rw-r--r-- | project2/sql/rdbmsDataSource.h | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/project2/sql/rdbmsDataSource.h b/project2/sql/rdbmsDataSource.h index 0497aab..0a1ddfd 100644 --- a/project2/sql/rdbmsDataSource.h +++ b/project2/sql/rdbmsDataSource.h @@ -4,6 +4,8 @@ #include <boost/shared_ptr.hpp> #include <map> #include <set> +#include <thread> +#include <mutex> #include "dataSource.h" #include <connection.h> #include <error.h> @@ -13,6 +15,8 @@ /// 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); @@ -22,12 +26,33 @@ class RdbmsDataSource : public DataSource { bool isExpired() const; const DB::Connection * const connection; bool txOpen; + boost::optional<std::thread::id> threadId; private: + friend class ConnectionRef; + friend class RdbmsDataSource; mutable time_t lastUsedTime; + void incRef(); + void decRef(); + unsigned int users; const time_t keepAliveTime; }; + class ConnectionRef { + public: + ConnectionRef(); + ConnectionRef(RdbmsConnection *); + ConnectionRef(const ConnectionRef &); + ~ConnectionRef(); + void operator=(const ConnectionRef &); + + const DB::Connection * operator->() const; + const DB::Connection & operator*() const; + const DB::Connection * get() const; + private: + RdbmsConnection * conn; + }; + class ConnectionInfo { public: ConnectionInfo(ScriptNodePtr); @@ -42,14 +67,14 @@ class RdbmsDataSource : public DataSource { typedef boost::shared_ptr<RdbmsConnection> ConnectionPtr; typedef std::map<std::string, ConnectionInfo> ReadonlyDSNs; // Map hostname to DSN string - typedef std::map<ConnectionInfo, ConnectionPtr> DBHosts; // Map DSN strings to connections + typedef std::multimap<ConnectionInfo, ConnectionPtr> DBHosts; // Map DSN strings to connections typedef std::map<ConnectionInfo, const DB::ConnectionError> FailedHosts; // Map DSN strings to failures RdbmsDataSource(ScriptNodePtr p); ~RdbmsDataSource(); - const DB::Connection & getReadonly() const; - const DB::Connection & getWritable() const; + ConnectionRef getReadonly() const; + ConnectionRef getWritable() const; virtual void commit(); virtual void rollback(); @@ -61,11 +86,14 @@ class RdbmsDataSource : public DataSource { ReadonlyDSNs roDSNs; private: + mutable std::mutex ilock; + static std::mutex glock; mutable std::string localhost; static DBHosts dbhosts; static FailedHosts failedhosts; - typedef std::set<std::string> DSNSet; - static DSNSet changedDSNs; + typedef std::pair<std::string, std::thread::id> ChangedDSN; + typedef std::set<ChangedDSN> ChangedDSNs; + static ChangedDSNs changedDSNs; friend class RdbmsDataSourceLoader; }; |