summaryrefslogtreecommitdiff
path: root/project2/sql/rdbmsDataSource.h
diff options
context:
space:
mode:
Diffstat (limited to 'project2/sql/rdbmsDataSource.h')
-rw-r--r--project2/sql/rdbmsDataSource.h38
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;
};