summaryrefslogtreecommitdiffstats
path: root/src/Common/UserCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/UserCache.cpp')
-rw-r--r--src/Common/UserCache.cpp59
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;
+ }
}
}