summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-01-08 23:23:10 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-01-08 23:23:10 +0000
commit95494e65270f9d52a09b458682dc41bf537d62aa (patch)
tree8409440141d78f37e7925ff89a2b2d9c928dff56 /src
parent27c6e9c76ecf069521b0a561241cf362134a3eef (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.cpp94
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);