X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=core%2Fcore.cpp;h=5bed7add09de872d1786c8d3a901f46f47dedd46;hb=2a068c11e76c7b34afb64d443dbb1afd2e208aaa;hp=b93c96e8fe2271b84d70723de7efa2b79f0befa3;hpb=d6a96a47a3964b9c0b1ea2413601d70d0d327413;p=quassel.git diff --git a/core/core.cpp b/core/core.cpp index b93c96e8..5bed7add 100644 --- a/core/core.cpp +++ b/core/core.cpp @@ -21,8 +21,10 @@ #include "core.h" #include "server.h" #include "global.h" +#include "util.h" #include "coreproxy.h" +#include #include Core::Core() { @@ -41,7 +43,7 @@ Core::Core() { foreach(key, s.childKeys()) { global->updateData(key, s.value(key)); } - initBackLog(); + initBackLogOld(); global->updateData("CoreReady", true); // Now that we are in sync, we can connect signals to automatically store further updates. // I don't think we care if global data changed locally or if it was updated by a client. @@ -61,6 +63,7 @@ Core::~Core() { if(f->isOpen()) f->close(); delete f; } + logDb.close(); } void Core::globalDataUpdated(QString key) { @@ -90,6 +93,7 @@ void Core::connectToIrc(QStringList networks) { connect(server, SIGNAL(nickRemoved(QString, QString)), coreProxy, SLOT(csNickRemoved(QString, QString))); connect(server, SIGNAL(nickUpdated(QString, QString, VarMap)), coreProxy, SLOT(csNickUpdated(QString, QString, VarMap))); connect(server, SIGNAL(ownNickSet(QString, QString)), coreProxy, SLOT(csOwnNickSet(QString, QString))); + connect(server, SIGNAL(queryRequested(QString, QString)), coreProxy, SLOT(csQueryRequested(QString, QString))); // add error handling connect(server, SIGNAL(connected(QString)), coreProxy, SLOT(csServerConnected(QString))); connect(server, SIGNAL(disconnected(QString)), this, SLOT(serverDisconnected(QString))); @@ -112,7 +116,7 @@ void Core::serverDisconnected(QString net) { void Core::recvMessageFromServer(Message msg) { Server *s = qobject_cast(sender()); Q_ASSERT(s); - logMessage(s->getNetwork(), msg); + logMessageOld(s->getNetwork(), msg); emit displayMsg(s->getNetwork(), msg); } @@ -122,8 +126,40 @@ void Core::recvStatusMsgFromServer(QString msg) { emit displayStatusMsg(s->getNetwork(), msg); } -// file name scheme: quassel-backlog-2006-29-10.bin void Core::initBackLog() { + QDir backLogDir = QDir(Global::quasselDir); + if(!backLogDir.exists()) { + qWarning(QString("Creating backlog directory \"%1\"...").arg(backLogDir.absolutePath()).toAscii()); + if(!backLogDir.mkpath(backLogDir.absolutePath())) { + qWarning(QString("Could not create backlog directory! Disabling logging...").toAscii()); + backLogEnabled = false; + return; + } + } + QString backLogFile = Global::quasselDir + "/quassel-backlog.sqlite"; + logDb = QSqlDatabase::addDatabase("QSQLITE", "backlog"); + logDb.setDatabaseName(backLogFile); + bool ok = logDb.open(); + if(!ok) { + qWarning(tr("Could not open backlog database: %1").arg(logDb.lastError().text()).toAscii()); + qWarning(tr("Disabling logging...").toAscii()); + } + // TODO store database version + QSqlQuery query = logDb.exec("CREATE TABLE IF NOT EXISTS backlog (" + "Time INTEGER, User TEXT, Network TEXT, Buffer TEXT, Message BLOB" + ");"); + if(query.lastError().isValid()) { + qWarning(tr("Could not create backlog table: %1").arg(query.lastError().text()).toAscii()); + qWarning(tr("Disabling logging...").toAscii()); + backLogEnabled = false; + return; + } + + backLogEnabled = true; +} + +// file name scheme: quassel-backlog-2006-29-10.bin +void Core::initBackLogOld() { backLogDir = QDir(Global::quasselDir + "/backlog"); if(!backLogDir.exists()) { qWarning(QString("Creating backlog directory \"%1\"...").arg(backLogDir.absolutePath()).toAscii()); @@ -164,7 +200,7 @@ void Core::initBackLog() { qWarning(QString("\"%1\": Version mismatch!").arg(f.fileName()).toAscii()); f.close(); continue; } - qDebug() << "Reading backlog from" << f.fileName(); + //qDebug() << "Reading backlog from" << f.fileName(); logFileDates[net] = QDate::fromString(f.fileName(), QString("'%1/quassel-backlog-'yyyy-MM-dd'.bin'").arg(dir.absolutePath())); if(!logFileDates[net].isValid()) { @@ -181,12 +217,32 @@ void Core::initBackLog() { backLogEnabled = true; } +void Core::logMessage(QString net, Message msg) { + if(!backLogEnabled) return; + QString buf; + if(msg.flags & Message::PrivMsg) { + // query + if(msg.flags & Message::Self) buf = msg.target; + else buf = nickFromMask(msg.sender); + } else { + buf = msg.target; + } + QSqlQuery query = logDb.exec(QString("INSERT INTO backlog Time, User, Network, Buffer, Message " + "VALUES %1, %2, %3, %4, %5;") + .arg(msg.timeStamp.toTime_t()).arg("Default").arg(net).arg(buf).arg(msg.text)); + if(query.lastError().isValid()) { + qWarning(tr("Error while logging to database: %1").arg(query.lastError().text()).toAscii()); + } + +} + + /** Log a core message (emitted via a displayMsg() signal) to the backlog file. * If a file for the current day does not exist, one will be created. Otherwise, messages will be appended. * The file header is the string defined by BACKLOG_STRING, followed by a quint8 specifying the format * version (BACKLOG_FORMAT). The rest is simply serialized Message objects. */ -void Core::logMessage(QString net, Message msg) { +void Core::logMessageOld(QString net, Message msg) { backLog[net].append(msg); if(!logFileDirs.contains(net)) { QDir dir(backLogDir.absolutePath() + "/" + net);