From caeb73a2cdf6db24490bbe3657372fb1ba52b78e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 15 Jul 2009 23:11:54 +0200 Subject: =?UTF-8?q?UserManager=20=C3=BCberarbeitet=20UserConfigBackend=20e?= =?UTF-8?q?ingef=C3=BChrt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/UserManager.h | 51 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) (limited to 'src/Common/UserManager.h') diff --git a/src/Common/UserManager.h b/src/Common/UserManager.h index d2529e7..5cf14db 100644 --- a/src/Common/UserManager.h +++ b/src/Common/UserManager.h @@ -35,38 +35,65 @@ namespace Mad { namespace Common { class Application; -class UserBackend; +class UserConfigBackend; +class UserDBBackend; class UserCache; class UserManager : private boost::noncopyable { private: friend class Application; - struct Compare { - bool operator() (boost::shared_ptr b1, boost::shared_ptr b2); - }; - - typedef std::map, boost::shared_ptr, Compare> BackendMap; + typedef std::map, std::pair, std::string> > BackendMap; Application *application; - BackendMap backends; + std::set > configBackends; + + BackendMap dbBackends; + std::map > dbBackendNames; + + boost::shared_ptr dbBackend; boost::shared_mutex mutex; UserManager(Application *application0) : application(application0) {} public: - void registerBackend(boost::shared_ptr backend) { + void registerBackend(boost::shared_ptr backend); + void registerBackendCached(boost::shared_ptr backend); + + void unregisterBackend(boost::shared_ptr backend) { boost::lock_guard lock(mutex); - backends.insert(std::make_pair(backend, backend)); + + BackendMap::iterator it = dbBackends.find(backend); + if(it == dbBackends.end()) + return; + + boost::shared_ptr oldBackend = it->second.first; + + std::map >::iterator it2 = dbBackendNames.find(it->second.second); + if(it2->second == backend) + dbBackendNames.erase(it2); + + dbBackends.erase(it); + + if(dbBackend == oldBackend) { + if(dbBackends.empty()) + dbBackend.reset(); + else + dbBackend = dbBackends.begin()->second.first; + } } - void registerBackendCached(boost::shared_ptr backend); - void unregisterBackend(boost::shared_ptr backend) { + void registerBackend(boost::shared_ptr backend) { + boost::lock_guard lock(mutex); + configBackends.insert(backend); + } + + void unregisterBackend(boost::shared_ptr backend) { boost::lock_guard lock(mutex); - backends.erase(backend); + configBackends.erase(backend); } boost::shared_ptr > getUserList(boost::posix_time::ptime *timestamp = 0) throw(Core::Exception); -- cgit v1.2.3