diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-01-08 23:23:10 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-01-08 23:23:10 +0000 |
commit | 95494e65270f9d52a09b458682dc41bf537d62aa (patch) | |
tree | 8409440141d78f37e7925ff89a2b2d9c928dff56 /src | |
parent | 27c6e9c76ecf069521b0a561241cf362134a3eef (diff) |
xline.db reading. Two things I notice are funky in some way about this.. 1) db module needs to know when lines are being added because of db read (else it generates spurious writes), 2) somehow, my E:Lines in my db turned into glines. Other than that, it seems to have worked.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8669 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/m_xline_db.cpp | 94 |
1 files changed, 93 insertions, 1 deletions
diff --git a/src/modules/m_xline_db.cpp b/src/modules/m_xline_db.cpp index af011173a..93b13029d 100644 --- a/src/modules/m_xline_db.cpp +++ b/src/modules/m_xline_db.cpp @@ -24,6 +24,7 @@ class ModuleXLineDB : public Module { Implementation eventlist[] = { I_OnAddLine, I_OnDelLine }; ServerInstance->Modules->Attach(eventlist, this, 2); + ReadDatabase(); } virtual ~ModuleXLineDB() @@ -103,7 +104,7 @@ ServerInstance->Config->ServerName, line->set_time, line->duration, line->reason for (std::vector<XLine *>::iterator i = xlines.begin(); i != xlines.end(); i++) { line = (*i); - fprintf(f, "%s %s %s %lu %lu :%s\n", line->type.c_str(), line->Displayable(), + fprintf(f, "LINE %s %s %s %lu %lu :%s\n", line->type.c_str(), line->Displayable(), ServerInstance->Config->ServerName, line->set_time, line->duration, line->reason); } @@ -130,6 +131,97 @@ ServerInstance->Config->ServerName, line->set_time, line->duration, line->reason return true; } + bool ReadDatabase() + { + FILE *f; + char linebuf[MAXBUF]; + unsigned int lineno = 0; + + f = fopen("xline.db", "r"); + if (!f) + { + if (errno == ENOENT) + { + /* xline.db doesn't exist, fake good return value (we don't care about this) */ + return true; + } + else + { + /* this might be slightly more problematic. */ + ServerInstance->Log(DEBUG, "xlinedb: Cannot read database! %s (%d)", strerror(errno), errno); + ServerInstance->SNO->WriteToSnoMask('x', "database: cannot read db: %s (%d)", strerror(errno), errno); + return false; + } + } + + while (fgets(linebuf, MAXBUF, f)) + { + char *c = linebuf; + + while (c && *c) + { + if (*c == '\n') + { + *c = '\0'; + } + + c++; + } + // Smart man might think of initing to 1, and moving this to the bottom. Don't. We use continue in this loop. + lineno++; + + // Inspired by the command parser. :) + irc::tokenstream tokens(linebuf); + int items = 0; + std::string command_p[MAXPARAMETERS]; + std::string tmp; + + while (tokens.GetToken(tmp) && (items < MAXPARAMETERS)) + { + command_p[items] = tmp.c_str(); + items++; + } + + if (command_p[0] == "VERSION") + { + if (command_p[1] == "1") + { + ServerInstance->Log(DEBUG, "xlinedb: Reading db version %s", command_p[1].c_str()); + } + else + { + fclose(f); + ServerInstance->Log(DEBUG, "xlinedb: I got database version %s - I don't understand it", command_p[1].c_str()); + ServerInstance->SNO->WriteToSnoMask('x', "database: I got a database version (%s) I don't understand", command_p[1].c_str()); + return false; + } + } + else if (command_p[0] == "LINE") + { + //mercilessly stolen from spanningtree + XLineFactory* xlf = ServerInstance->XLines->GetFactory(command_p[0]); + + if (!xlf) + { + ServerInstance->SNO->WriteToSnoMask('x', "database: Unknown line type (%s).", command_p[1].c_str()); + continue; + } + + XLine* xl = xlf->Generate(ServerInstance->Time(), atoi(command_p[5].c_str()), command_p[3].c_str(), command_p[6].c_str(), command_p[2].c_str()); + xl->SetCreateTime(atoi(command_p[4].c_str())); + + if (ServerInstance->XLines->AddLine(xl, NULL)) + { + ServerInstance->SNO->WriteToSnoMask('x', "database: Added a line of type %s", command_p[1].c_str()); + } + } + } + + return true; + } + + + virtual Version GetVersion() { return Version(1, 1, 0, 0, VF_VENDOR, API_VERSION); |