Browse Source

Add SqliteNetworkConfigMaster::DBC for external access to raw sqlite3 db.

Adam Ierymenko 10 years ago
parent
commit
7ee1a1151f
1 changed files with 22 additions and 0 deletions
  1. 22 0
      netconf/SqliteNetworkConfigMaster.hpp

+ 22 - 0
netconf/SqliteNetworkConfigMaster.hpp

@@ -39,12 +39,16 @@
 #include "../node/Constants.hpp"
 #include "../node/NetworkConfigMaster.hpp"
 #include "../node/Mutex.hpp"
+#include "../node/NonCopyable.hpp"
 
 namespace ZeroTier {
 
 class SqliteNetworkConfigMaster : public NetworkConfigMaster
 {
 public:
+	class DBC;
+	friend class SqliteNetworkConfigMaster::DBC;
+
 	SqliteNetworkConfigMaster(const Identity &signingId,const char *dbPath);
 	virtual ~SqliteNetworkConfigMaster();
 
@@ -80,6 +84,24 @@ private:
 	sqlite3_stmt *_sCacheNetconf;
 
 	Mutex _lock;
+
+public:
+	/**
+	 * Provides a safe interface for direct access to this master's database
+	 *
+	 * This acts as both a contextual lock of the master's Mutex and a pointer
+	 * to the Sqlite3 database instance. Dereferencing this with * yields the
+	 * sqlite3* pointer. Create on parent with DBC(SqliteNetworkConfigMaster &).
+	 */
+	class DBC : NonCopyable
+	{
+	public:
+		DBC(SqliteNetworkConfigMaster &nc) : _p(&nc) { nc._lock.lock(); }
+		~DBC() { _p->_lock.unlock(); }
+		inline sqlite3 *operator*() { return _p->_db; }
+	private:
+		SqliteNetworkConfigMaster *const _p;
+	};
 };
 
 } // namespace ZeroTier