diff options
Diffstat (limited to 'src/Common/UserCache.cpp')
-rw-r--r-- | src/Common/UserCache.cpp | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/src/Common/UserCache.cpp b/src/Common/UserCache.cpp index 63f72dd..79f27c7 100644 --- a/src/Common/UserCache.cpp +++ b/src/Common/UserCache.cpp @@ -83,7 +83,21 @@ boost::shared_ptr<const UserInfo> UserCache::getUserInfoByName(const std::string } boost::shared_ptr<const std::set<unsigned long> > UserCache::getUserGroupList(unsigned long uid) throw(Core::Exception) { - return backend->getUserGroupList(uid); + getFullUserGroupList(); + + boost::lock_guard<boost::shared_mutex> lock(mutex); + + if(!userGroups) + throw userGroupException; + + std::pair<std::multimap<unsigned long, unsigned long>::const_iterator, std::multimap<unsigned long, unsigned long>::const_iterator> range = userGroups->equal_range(uid); + + boost::shared_ptr<std::set<unsigned long> > groups(new std::set<unsigned long>); + + for(std::multimap<unsigned long, unsigned long>::const_iterator group = range.first; group != range.second; ++group) + groups->insert(group->second); + + return groups; } @@ -145,8 +159,47 @@ boost::shared_ptr<const GroupInfo> UserCache::getGroupInfoByName(const std::stri return boost::shared_ptr<GroupInfo>(new GroupInfo(group->second)); } -boost::shared_ptr<const std::set<unsigned long> > UserCache::getGroupUserList(unsigned long uid) throw(Core::Exception) { - return backend->getGroupUserList(uid); +boost::shared_ptr<const std::set<unsigned long> > UserCache::getGroupUserList(unsigned long gid) throw(Core::Exception) { + getFullUserGroupList(); + + boost::lock_guard<boost::shared_mutex> lock(mutex); + + if(!userGroups) + throw userGroupException; + + std::pair<std::multimap<unsigned long, unsigned long>::iterator, std::multimap<unsigned long, unsigned long>::iterator> range = groupUsers->equal_range(gid); + + boost::shared_ptr<std::set<unsigned long> > users(new std::set<unsigned long>); + + for(std::multimap<unsigned long, unsigned long>::iterator user = range.first; user != range.second; ++user) + users->insert(user->second); + + return users; +} + +boost::shared_ptr<const std::multimap<unsigned long, unsigned long> > UserCache::getFullUserGroupList() throw(Core::Exception) { + boost::lock_guard<boost::shared_mutex> lock(mutex); + + if(userGroups) { + std::cerr << "Cached" << std::endl; + return userGroups; + } + else if(userGroupException) + throw userGroupException; + + try { + userGroups = backend->getFullUserGroupList(); + + groupUsers.reset(new std::multimap<unsigned long, unsigned long>); + for(std::multimap<unsigned long, unsigned long>::const_iterator usergroup = userGroups->begin(); usergroup != userGroups->end(); ++usergroup) + groupUsers->insert(std::make_pair(usergroup->second, usergroup->first)); + + return userGroups; + } + catch(Core::Exception e) { + userGroupException = e; + throw userGroupException; + } } } |