]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix compilation of SQL modules, use GlobalCulls to clean up deleted modules
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Wed, 30 Sep 2009 03:22:25 +0000 (03:22 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Wed, 30 Sep 2009 03:22:25 +0000 (03:22 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11780 e03df62e-2008-0410-955e-edbf42e46eb7

include/dynamic.h
src/modules.cpp
src/modules/extra/m_mysql.cpp
src/modules/extra/m_pgsql.cpp
src/modules/extra/m_sqlite3.cpp

index 19ff7bdaf67f56008258a926b2efa1c62e05b8bb..ec09675e0cde67f65dc196614f83e2fbecd1184d 100644 (file)
@@ -17,7 +17,7 @@
 /** The DLLManager class is able to load a module file by filename,
  * and locate its init_module symbol.
  */
-class CoreExport DLLManager
+class CoreExport DLLManager : public classbase
 {
  protected:
 
index 67c90b128b401e3dbd045f11dd3564d62ef08cf5..db41a757a1f70a85c06c63b4836a5da38ceb2422 100644 (file)
@@ -561,8 +561,8 @@ bool ModuleManager::Unload(const char* filename)
 
                ServerInstance->Parser->RemoveCommands(modfind->second.second);
 
-               delete modfind->second.second;
-               delete modfind->second.first;
+               ServerInstance->GlobalCulls.AddItem(modfind->second.second);
+               ServerInstance->GlobalCulls.AddItem(modfind->second.first);
                Modules.erase(modfind);
 
                ServerInstance->Logs->Log("MODULE", DEFAULT,"Module %s unloaded",filename);
index 023ead94be6dfef950b6542fd4113b28ae3c6093..a0ac9ffac165d094803f1a13e3c2c8ac5e976976 100644 (file)
@@ -671,9 +671,9 @@ class ModuleSQL;
 class DispatcherThread : public SocketThread
 {
  private:
-       ModuleSQL* Parent;
+       ModuleSQL* const Parent;
  public:
-       DispatcherThread(ModuleSQL* CreatorModule) : SocketThread(Instance), Parent(CreatorModule),{ }
+       DispatcherThread(ModuleSQL* CreatorModule) : Parent(CreatorModule) { }
        ~DispatcherThread() { }
        virtual void Run();
        virtual void OnNotify();
@@ -684,7 +684,6 @@ ModuleSQL::ModuleSQL() : rehashing(false)
        ServerInstance->Modules->UseInterface("SQLutils");
 
        Conf = new ConfigReader;
-       PublicServerInstance = ServerInstance;
        currid = 0;
 
        Dispatcher = new DispatcherThread(this);
@@ -769,7 +768,7 @@ Version ModuleSQL::GetVersion()
 
 void DispatcherThread::Run()
 {
-       LoadDatabases(Parent->Conf, Parent->PublicServerInstance, Parent);
+       LoadDatabases(Parent->Conf, Parent);
 
        SQLConnection* conn = NULL;
 
@@ -779,7 +778,7 @@ void DispatcherThread::Run()
                if (Parent->rehashing)
                {
                        Parent->rehashing = false;
-                       LoadDatabases(Parent->Conf, Parent->PublicServerInstance, Parent);
+                       LoadDatabases(Parent->Conf, Parent);
                }
 
                conn = NULL;
index c0d301107e9488d177da328feb6ab0e4d3fb85a2..c0b2bbac852516dac9c4d70fd237fcf623186828 100644 (file)
@@ -91,10 +91,9 @@ std::string SQLhost::GetDSN()
 class ReconnectTimer : public Timer
 {
  private:
-       Module* mod;
+       Module* const mod;
  public:
-       ReconnectTimer(Module* m)
-       : Timer(5, SI->Time(), false), mod(m)
+       ReconnectTimer(Module* m) : Timer(5, ServerInstance->Time(), false), mod(m)
        {
        }
        virtual void Tick(time_t TIME);
@@ -313,7 +312,7 @@ class SQLConn : public EventHandler
        SQLConn(Module* self, const SQLhost& hi)
        : EventHandler(), confhost(hi), us(self), sql(NULL), status(CWRITE), qinprog(false)
        {
-               idle = this->ServerInstance->Time();
+               idle = ServerInstance->Time();
                if(!DoConnect())
                {
                        ServerInstance->Logs->Log("m_pgsql",DEFAULT, "WARNING: Could not connect to database with id: " + ConvToStr(hi.id));
@@ -366,7 +365,7 @@ class SQLConn : public EventHandler
                if(this->fd <= -1)
                        return false;
 
-               if (!this->ServerInstance->SE->AddFd(this))
+               if (!ServerInstance->SE->AddFd(this, FD_WANT_NO_WRITE | FD_WANT_NO_READ))
                {
                        ServerInstance->Logs->Log("m_pgsql",DEBUG, "BUG: Couldn't add pgsql socket to socket engine");
                        return false;
@@ -381,15 +380,17 @@ class SQLConn : public EventHandler
                switch(PQconnectPoll(sql))
                {
                        case PGRES_POLLING_WRITING:
-                               ServerInstance->SE->WantWrite(this);
+                               ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_WRITE | FD_WANT_NO_READ);
                                status = CWRITE;
                                return true;
                        case PGRES_POLLING_READING:
+                               ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
                                status = CREAD;
                                return true;
                        case PGRES_POLLING_FAILED:
                                return false;
                        case PGRES_POLLING_OK:
+                               ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
                                status = WWRITE;
                                return DoConnectedPoll();
                        default:
@@ -411,7 +412,7 @@ class SQLConn : public EventHandler
                        /* We just read stuff from the server, that counts as it being alive
                         * so update the idle-since time :p
                         */
-                       idle = this->ServerInstance->Time();
+                       idle = ServerInstance->Time();
 
                        if (PQisBusy(sql))
                        {
@@ -495,15 +496,17 @@ class SQLConn : public EventHandler
                switch(PQresetPoll(sql))
                {
                        case PGRES_POLLING_WRITING:
-                               ServerInstance->SE->WantWrite(this);
+                               ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_WRITE | FD_WANT_NO_READ);
                                status = CWRITE;
                                return DoPoll();
                        case PGRES_POLLING_READING:
+                               ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
                                status = CREAD;
                                return true;
                        case PGRES_POLLING_FAILED:
                                return false;
                        case PGRES_POLLING_OK:
+                               ServerInstance->SE->ChangeEventMask(this, FD_WANT_POLL_READ | FD_WANT_NO_WRITE);
                                status = WWRITE;
                                return DoConnectedPoll();
                        default:
@@ -732,11 +735,11 @@ class SQLConn : public EventHandler
 
        void Close()
        {
-               if (!this->ServerInstance->SE->DelFd(this))
+               if (!ServerInstance->SE->DelFd(this))
                {
                        if (sql && PQstatus(sql) == CONNECTION_BAD)
                        {
-                               this->ServerInstance->SE->DelFd(this, true);
+                               ServerInstance->SE->DelFd(this, true);
                        }
                        else
                        {
index 0631131023be98de60058ec17e891a7cb3d9464e..806cbce7210d4aaf763b4c327a59bb6d00d2f6c8 100644 (file)
@@ -51,28 +51,25 @@ class ResultNotifier : public BufferedSocket
        ModuleSQLite3* mod;
 
  public:
-       ResultNotifier(ModuleSQLite3* m, int newfd, char* ip) : BufferedSocket(SI, newfd, ip), mod(m)
+       ResultNotifier(ModuleSQLite3* m, int newfd) : BufferedSocket(newfd), mod(m)
        {
        }
 
-       virtual bool OnDataReady()
+       void OnDataReady()
        {
-               char data = 0;
-               if (ServerInstance->SE->Recv(this, &data, 1, 0) > 0)
-               {
-                       Dispatch();
-                       return true;
-               }
-               return false;
+               recvq.clear();
+               Dispatch();
        }
 
+       void OnError(BufferedSocketError) {}
+
        void Dispatch();
 };
 
 class SQLiteListener : public ListenSocketBase
 {
        ModuleSQLite3* Parent;
-       irc::sockets::insp_sockaddr sock_us;
+       irc::sockets::sockaddrs sock_us;
        socklen_t uslen;
        FileReader* index;
 
@@ -86,19 +83,17 @@ class SQLiteListener : public ListenSocketBase
                }
        }
 
-       virtual void OnAcceptReady(const std::string &ipconnectedto, int nfd, const std::string &incomingip)
+       void OnAcceptReady(int nfd)
        {
-               new ResultNotifier(this->Parent, this->ServerInstance, nfd, (char *)ipconnectedto.c_str()); // XXX unsafe casts suck
+               new ResultNotifier(Parent, nfd);
        }
 
-       /* Using getsockname and ntohs, we can determine which port number we were allocated */
        int GetPort()
        {
-#ifdef IPV6
-               return ntohs(sock_us.sin6_port);
-#else
-               return ntohs(sock_us.sin_port);
-#endif
+               int port = 0;
+               std::string addr;
+               irc::sockets::satoap(&sock_us, addr, port);
+               return port;
        }
 };
 
@@ -502,27 +497,16 @@ class SQLConn : public classbase
        {
                if (QueueFD < 0)
                {
-                       if ((QueueFD = socket(AF_FAMILY, SOCK_STREAM, 0)) == -1)
+                       if ((QueueFD = socket(AF_INET, SOCK_STREAM, 0)) == -1)
                        {
                                /* crap, we're out of sockets... */
                                return;
                        }
 
-                       irc::sockets::insp_sockaddr addr;
-
-#ifdef IPV6
-                       irc::sockets::insp_aton("::1", &addr.sin6_addr);
-                       addr.sin6_family = AF_FAMILY;
-                       addr.sin6_port = htons(listener->GetPort());
-#else
-                       irc::sockets::insp_inaddr ia;
-                       irc::sockets::insp_aton("127.0.0.1", &ia);
-                       addr.sin_family = AF_FAMILY;
-                       addr.sin_addr = ia;
-                       addr.sin_port = htons(listener->GetPort());
-#endif
-
-                       if (connect(QueueFD, (sockaddr*)&addr,sizeof(addr)) == -1)
+                       irc::sockets::sockaddrs addr;
+                       irc::sockets::aptosa("127.0.0.1", listener->GetPort(), &addr);
+
+                       if (connect(QueueFD, &addr.sa, sa_size(addr)) == -1)
                        {
                                /* wtf, we cant connect to it, but we just created it! */
                                return;
@@ -553,11 +537,7 @@ class ModuleSQLite3 : public Module
                }
 
                /* Create a socket on a random port. Let the tcp stack allocate us an available port */
-#ifdef IPV6
-               listener = new SQLiteListener(this, ServerInstance, 0, "::1");
-#else
-               listener = new SQLiteListener(this, ServerInstance, 0, "127.0.0.1");
-#endif
+               listener = new SQLiteListener(this, 0, "127.0.0.1");
 
                if (listener->GetFd() == -1)
                {
@@ -582,7 +562,6 @@ class ModuleSQLite3 : public Module
                ClearAllConnections();
 
                ServerInstance->SE->DelFd(listener);
-               ServerInstance->BufferedSocketCull();
 
                if (QueueFD >= 0)
                {
@@ -594,9 +573,10 @@ class ModuleSQLite3 : public Module
                {
                        ServerInstance->SE->DelFd(notifier);
                        notifier->Close();
-                       ServerInstance->BufferedSocketCull();
                }
 
+               ServerInstance->GlobalCulls.Apply();
+
                ServerInstance->Modules->UnpublishInterface("SQL", this);
                ServerInstance->Modules->UnpublishFeature("SQL");
                ServerInstance->Modules->DoneWithInterface("SQLutils");