]> Some of my projects - localmylist.git/commitdiff
When adding new files, check if there is an unknown file we actually know. Ideally...
authorAPTX <marek321@gmail.com>
Wed, 13 Jun 2012 01:15:42 +0000 (03:15 +0200)
committerAPTX <marek321@gmail.com>
Wed, 13 Jun 2012 01:15:42 +0000 (03:15 +0200)
localmylist/database.cpp
localmylist/database.h
localmylist/mylistexportparsetask.cpp
localmylist/requesthandler.cpp

index c639c8b618d202e4b723ee7557f51fd76c6674db..8da643cc355fb10d07467256d67c92b741c34d06 100644 (file)
@@ -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)");
 
index bb6c22ea0cc878a96568646ee96c4b6dca19af7b..e10d9dbd46d7798f7d5ab178a36009084134f209 100644 (file)
@@ -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<PendingRequest> 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;
index d95a5146601def6182e5b75306d05a9042bc9977..bd64338fd840d3a6a784e129b759f6897a672607 100644 (file)
@@ -546,6 +546,9 @@ void MyListExportParseTask::readFile()
                return;
 
        db->transaction();
+
+       db->removeKnownUnknownFile(f);
+
        File current = db->getFile(f.fid);
 
        if (!current.fid)
index f8beecd4502a85badfd9627ad3fd295980b4dfd9..0a1dba6ac3de1783aa508d9187832bd3cf540d38 100644 (file)
@@ -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)