]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add uuid hash_map - its management is automatic via userrec constructors/destructors.
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 27 Aug 2007 11:43:12 +0000 (11:43 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 27 Aug 2007 11:43:12 +0000 (11:43 +0000)
Note that this means 'fake' users used to set modes etc get a uid, but this isnt a major thing.

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7876 e03df62e-2008-0410-955e-edbf42e46eb7

src/helperfuncs.cpp
src/inspircd.cpp
src/users.cpp

index 223099c4539ac4c2ac2c08ae0796c0394af59094..4338fb9daffae390624c4469cc93a1914bd6e5ab 100644 (file)
@@ -268,17 +268,12 @@ userrec *InspIRCd::FindUUID(const std::string &uid)
 
 userrec *InspIRCd::FindUUID(const char *uid)
 {
-       for (user_hash::const_iterator a = this->clientlist->begin(); a != this->clientlist->end(); a++)
-       {
-               userrec *u = a->second;
+       user_hash::iterator finduuid = uuidlist->find(uid);
 
-               if (strcmp(u->uuid, uid) == 0)
-               {
-                       return u;
-               }
-       }
+       if (finduuid == uuidlist->end())
+               return NULL;
 
-       return NULL;
+       return finduuid->second;
 }
 
 /* find a channel record by channel name and return a pointer to it */
index 995f62f1b9b91c46791fd1a28f13a4a0c20255fe..bfd7a9d45791fb233a6ef2dce923af794f951021 100644 (file)
@@ -165,9 +165,11 @@ void InspIRCd::ResetMaxBans()
 void InspIRCd::RehashUsersAndChans()
 {
        user_hash* old_users = this->clientlist;
+       user_hash* old_uuid  = this->uuidlist;
        chan_hash* old_chans = this->chanlist;
 
        this->clientlist = new user_hash();
+       this->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
        for (user_hash::const_iterator n = old_users->begin(); n != old_users->end(); n++)
@@ -175,6 +177,11 @@ void InspIRCd::RehashUsersAndChans()
 
        delete old_users;
 
+       for (user_hash::const_iterator n = old_uuid->begin(); n != old_uuid->end(); n++)
+               this->uuidlist->insert(*n);
+
+       delete old_uuid;
+
        for (chan_hash::const_iterator n = old_chans->begin(); n != old_chans->end(); n++)
                this->chanlist->insert(*n);
 
@@ -316,6 +323,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->unregistered_count = 0;
 
        this->clientlist = new user_hash();
+       this->uuidlist = new user_hash();
        this->chanlist = new chan_hash();
 
        this->Config = new ServerConfig(this);
index 476a4f1cd28179e5c69793a0c21222ef0986fe51..72cf2103d753db4696bd136d4259c0d0413c1f7f 100644 (file)
@@ -347,6 +347,12 @@ userrec::userrec(InspIRCd* Instance, const std::string &uid) : ServerInstance(In
        operquit = cached_fullhost = cached_hostip = cached_makehost = cached_fullrealhost = NULL;
        if (!uid.empty())
                strlcpy(uuid, uid.c_str(), UUID_LENGTH);
+
+       user_hash::iterator finduuid = Instance->uuidlist->find(uuid);
+       if (finduuid != Instance->uuidlist->end())
+               (*Instance->uuidlist)[uuid] = this;
+       else
+               throw CoreException("Duplicate UUID "+uid+" in userrec constructor");
 }
 
 void userrec::RemoveCloneCounts()
@@ -393,6 +399,8 @@ userrec::~userrec()
                }
 #endif
        }
+
+       ServerInstance->uuidlist->erase(uuid);
 }
 
 char* userrec::MakeHost()