From: APTX Date: Wed, 13 Jun 2012 01:15:42 +0000 (+0200) Subject: When adding new files, check if there is an unknown file we actually know. Ideally... X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=cd9e07f966ceab00ce87655c63cb518c00b2033f;p=localmylist.git When adding new files, check if there is an unknown file we actually know. Ideally unknown_file should stay empty. --- diff --git a/localmylist/database.cpp b/localmylist/database.cpp index c639c8b..8da643c 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -141,6 +141,8 @@ struct DatabaseInternal QSqlQuery addFileEpisodeRelQuery; QSqlQuery addUnknownFileQuery; + QSqlQuery getUnknownFileQuery; + QSqlQuery removeUnknownFileQuery; QSqlQuery addPendingRequestQuery; QSqlQuery getRequestBatchQuery; @@ -644,6 +646,36 @@ bool Database::addUnknownFile(const UnknownFile &file) return exec(d->addUnknownFileQuery); } +UnknownFile Database::getUnknownFile(const QByteArray &ed2k, qint64 size) +{ + d->getUnknownFileQuery.bindValue(":ed2k", ed2k); + d->getUnknownFileQuery.bindValue(":size", size); + + if (!exec(d->getUnknownFileQuery)) + return UnknownFile(); + + UnknownFile f; + + if (d->getUnknownFileQuery.next()) + { + f.ed2k = d->getUnknownFileQuery.value(0).toByteArray(); + f.size = d->getUnknownFileQuery.value(1).toLongLong(); + f.hostId = d->getUnknownFileQuery.value(2).toInt(); + f.path = d->getUnknownFileQuery.value(3).toString(); + } + d->getUnknownFileQuery.finish(); + + return f; +} + +bool Database::removeUnknownFile(const QByteArray &ed2k, qint64 size) +{ + d->removeUnknownFileQuery.bindValue(":ed2k", ed2k); + d->removeUnknownFileQuery.bindValue(":size", size); + + return exec(d->removeUnknownFileQuery); +} + bool Database::addRequest(const PendingRequest &request) { d->addPendingRequestQuery.bindValue(":aid", request.aid); @@ -741,6 +773,9 @@ PendingMyListUpdate Database::getPendingMyListUpdate(qint64 updateId) request.added = d->getPendingMyListUpdateQuery.value(14).toDateTime(); request.started = d->getPendingMyListUpdateQuery.value(15).toDateTime(); } + + d->getPendingMyListUpdateQuery.finish(); + return request; } @@ -833,6 +868,29 @@ bool Database::truncateDatabase() "file_episode_rel, file_location, unknown_file"); } +bool Database::removeKnownUnknownFile(const File &file) +{ + UnknownFile uf = getUnknownFile(file.ed2k, file.size); + + if (uf.ed2k.isEmpty()) + return false; + + removeUnknownFile(file.ed2k, file.size); + + // Can happen if file was added by ed2k&size, not by actual file. + if (uf.path.isEmpty()) + return true; + + FileLocation fl; + fl.fid = file.fid; + fl.hostId = uf.hostId; + fl.path = uf.path; + + addFileLocation(fl); + + return true; +} + bool Database::log(const QString &message, int type) { d->addLogQuery.bindValue(":type", type); @@ -1002,6 +1060,12 @@ void Database::prepareQueries() d->addUnknownFileQuery = QSqlQuery(d->db); d->addUnknownFileQuery.prepare("INSERT INTO unknown_file VALUES(:ed2k, :size, :hostId, :path)"); + d->getUnknownFileQuery = QSqlQuery(d->db); + d->getUnknownFileQuery.prepare("SELECT ed2k, size, host_id, path FROM unknown_file WHERE ed2k = :ed2k AND size = :size"); + + d->removeUnknownFileQuery = QSqlQuery(d->db); + d->removeUnknownFileQuery.prepare("DELETE FROM unknown_file WHERE ed2k = :ed2k AND size = :size"); + d->addPendingRequestQuery = QSqlQuery(d->db); d->addPendingRequestQuery.prepare("INSERT INTO pending_request VALUES(:aid, :eid, :fid, :ed2k, :size, DEFAULT, DEFAULT, DEFAULT)"); diff --git a/localmylist/database.h b/localmylist/database.h index bb6c22e..e10d9db 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -242,7 +242,10 @@ public: bool addEpisode(const Episode &episode); bool addFile(const File &file); bool addFileEpisodeRel(const FileEpisodeRel &fileEpisodeRel); + bool addUnknownFile(const UnknownFile &file); + UnknownFile getUnknownFile(const QByteArray &ed2k, qint64 size); + bool removeUnknownFile(const QByteArray &ed2k, qint64 size); bool addRequest(const PendingRequest &request); QList getRequestBatch(int limit = 10); @@ -262,6 +265,8 @@ public: bool truncateMyListData(); bool truncateDatabase(); + bool removeKnownUnknownFile(const File &file); + bool log(const QString &message, int type = 1); QSqlDatabase connection() const; diff --git a/localmylist/mylistexportparsetask.cpp b/localmylist/mylistexportparsetask.cpp index d95a514..bd64338 100644 --- a/localmylist/mylistexportparsetask.cpp +++ b/localmylist/mylistexportparsetask.cpp @@ -546,6 +546,9 @@ void MyListExportParseTask::readFile() return; db->transaction(); + + db->removeKnownUnknownFile(f); + File current = db->getFile(f.fid); if (!current.fid) diff --git a/localmylist/requesthandler.cpp b/localmylist/requesthandler.cpp index f8beecd..0a1dba6 100644 --- a/localmylist/requesthandler.cpp +++ b/localmylist/requesthandler.cpp @@ -321,6 +321,8 @@ void RequestHandler::fileRequestComplete(bool success) else db->setFile(next); + db->removeKnownUnknownFile(next); + { Episode ep = db->getEpisode(next.eid); if (!ep.eid) @@ -342,6 +344,7 @@ void RequestHandler::fileRequestComplete(bool success) db->addRequest(request); } } + db->commit(); // File is not in mylist @@ -460,6 +463,8 @@ void RequestHandler::myListAddReplyRecieved(bool success) if (!success) return; + db->transaction(); + qDebug() << "Clearing fid/ed2k&size" << reply->command().fid() << "/" << reply->command().ed2k() << "&" << reply->command().size(); PendingRequest request; request.fid = reply->command().fid(); @@ -469,6 +474,8 @@ void RequestHandler::myListAddReplyRecieved(bool success) ed2kRequest.ed2k = reply->command().ed2k(); ed2kRequest.size = reply->command().size(); db->clearRequest(ed2kRequest); + + db->commit(); } void RequestHandler::myListEditReplyRecieved(bool success)