+#include "m_sqlv2.h"
+
+
+static Module* SQLModule;
+static Module* MyMod;
+static std::string dbid;
+
+enum LogTypes { LT_OPER = 1, LT_KILL, LT_SERVLINK, LT_XLINE, LT_CONNECT, LT_DISCONNECT, LT_FLOOD, LT_LOADMODULE };
+
+enum QueryState { FIND_SOURCE, FIND_NICK, FIND_HOST, DONE};
+
+class QueryInfo;
+
+std::map<unsigned long,QueryInfo*> active_queries;
+
+class QueryInfo
+{
+public:
+ QueryState qs;
+ unsigned long id;
+ std::string nick;
+ std::string source;
+ std::string hostname;
+ int sourceid;
+ int nickid;
+ int hostid;
+ int category;
+ time_t date;
+ bool insert;
+
+ QueryInfo(const std::string &n, const std::string &s, const std::string &h, unsigned long i, int cat)
+ {
+ qs = FIND_SOURCE;
+ nick = n;
+ source = s;
+ hostname = h;
+ id = i;
+ category = cat;
+ sourceid = nickid = hostid = -1;
+ date = time(NULL);
+ insert = false;
+ }
+
+ void Go(SQLresult* res)
+ {
+ SQLrequest req = SQLreq(MyMod, SQLModule, dbid, "", "");
+ switch (qs)
+ {
+ case FIND_SOURCE:
+ if (res->Rows() && sourceid == -1 && !insert)
+ {
+ sourceid = atoi(res->GetValue(0,0).d.c_str());
+ req = SQLreq(MyMod, SQLModule, dbid, "SELECT id,actor FROM ircd_log_actors WHERE actor='?'", nick);
+ if(req.Send())
+ {
+ insert = false;
+ qs = FIND_NICK;
+ active_queries[req.id] = this;
+ }
+ }
+ else if (res->Rows() && sourceid == -1 && insert)
+ {
+ req = SQLreq(MyMod, SQLModule, dbid, "SELECT id,actor FROM ircd_log_actors WHERE actor='?'", source);
+ if(req.Send())
+ {
+ insert = false;
+ qs = FIND_SOURCE;
+ active_queries[req.id] = this;
+ }
+ }
+ else
+ {
+ req = SQLreq(MyMod, SQLModule, dbid, "INSERT INTO ircd_log_actors (actor) VALUES('?')", source);
+ if(req.Send())
+ {
+ insert = true;
+ qs = FIND_SOURCE;
+ active_queries[req.id] = this;
+ }
+ }
+ break;