X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fextra%2Fm_sqlite3.cpp;h=8c191381a7e1717e416eb5549613bd651dbe83a9;hb=8f7f74cf0f297e2b8476fc4c670515f8940580ea;hp=0f7ce5ed8c437e8f9eea36509dc83cc8d911a164;hpb=b40bd0f7ab7ed92d898f3e48eea1abc737b4f2a9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/extra/m_sqlite3.cpp b/src/modules/extra/m_sqlite3.cpp index 0f7ce5ed8..8c191381a 100644 --- a/src/modules/extra/m_sqlite3.cpp +++ b/src/modules/extra/m_sqlite3.cpp @@ -16,7 +16,6 @@ #include "users.h" #include "channels.h" #include "modules.h" - #include "m_sqlv2.h" /* $ModDesc: sqlite3 provider */ @@ -34,7 +33,8 @@ typedef std::deque paramlist; typedef std::deque ResultQueue; ResultNotifier* resultnotify = NULL; - +ResultNotifier* resultdispatch = NULL; +int QueueFD = -1; class ResultNotifier : public BufferedSocket { @@ -73,7 +73,18 @@ class ResultNotifier : public BufferedSocket virtual int OnIncomingConnection(int newsock, char* ip) { - Dispatch(); + resultdispatch = new ResultNotifier(Instance, mod, newsock, ip); + return true; + } + + virtual bool OnDataReady() + { + char data = 0; + if (Instance->SE->Recv(this, &data, 1, 0) > 0) + { + Dispatch(); + return true; + } return false; } @@ -427,32 +438,36 @@ class SQLConn : public classbase void SendNotify() { - int QueueFD; - if ((QueueFD = socket(AF_FAMILY, SOCK_STREAM, 0)) == -1) + if (QueueFD < 0) { - /* crap, we're out of sockets... */ - return; - } + if ((QueueFD = socket(AF_FAMILY, SOCK_STREAM, 0)) == -1) + { + /* crap, we're out of sockets... */ + return; + } - insp_sockaddr addr; + insp_sockaddr addr; #ifdef IPV6 - insp_aton("::1", &addr.sin6_addr); - addr.sin6_family = AF_FAMILY; - addr.sin6_port = htons(resultnotify->GetPort()); + insp_aton("::1", &addr.sin6_addr); + addr.sin6_family = AF_FAMILY; + addr.sin6_port = htons(resultnotify->GetPort()); #else - insp_inaddr ia; - insp_aton("127.0.0.1", &ia); - addr.sin_family = AF_FAMILY; - addr.sin_addr = ia; - addr.sin_port = htons(resultnotify->GetPort()); + insp_inaddr ia; + insp_aton("127.0.0.1", &ia); + addr.sin_family = AF_FAMILY; + addr.sin_addr = ia; + addr.sin_port = htons(resultnotify->GetPort()); #endif - if (connect(QueueFD, (sockaddr*)&addr,sizeof(addr)) == -1) - { - /* wtf, we cant connect to it, but we just created it! */ - return; + if (connect(QueueFD, (sockaddr*)&addr,sizeof(addr)) == -1) + { + /* wtf, we cant connect to it, but we just created it! */ + return; + } } + char id = 0; + send(QueueFD, &id, 1, 0); } }; @@ -488,11 +503,24 @@ class ModuleSQLite3 : public Module { ClearQueue(); ClearAllConnections(); - resultnotify->SetFd(-1); - resultnotify->state = I_ERROR; - resultnotify->OnError(I_ERR_SOCKET); - resultnotify->ClosePending = true; - delete resultnotify; + + ServerInstance->SE->DelFd(resultnotify); + resultnotify->Close(); + ServerInstance->BufferedSocketCull(); + + if (QueueFD >= 0) + { + shutdown(QueueFD, 2); + close(QueueFD); + } + + if (resultdispatch) + { + ServerInstance->SE->DelFd(resultdispatch); + resultdispatch->Close(); + ServerInstance->BufferedSocketCull(); + } + ServerInstance->Modules->UnpublishInterface("SQL", this); ServerInstance->Modules->UnpublishFeature("SQL"); ServerInstance->Modules->DoneWithInterface("SQLutils"); @@ -642,7 +670,7 @@ class ModuleSQLite3 : public Module virtual Version GetVersion() { - return Version(1,1,0,0,VF_VENDOR|VF_SERVICEPROVIDER,API_VERSION); + return Version(1,2,0,0,VF_VENDOR|VF_SERVICEPROVIDER,API_VERSION); } }; @@ -653,4 +681,3 @@ void ResultNotifier::Dispatch() } MODULE_INIT(ModuleSQLite3) -