]> Some of my projects - localmylist.git/commitdiff
RequestHandler now handles updates with aid&epno/epmin. Uses lid for updates with...
authorAPTX <marek321@gmail.com>
Wed, 10 Apr 2013 15:10:39 +0000 (17:10 +0200)
committerAPTX <marek321@gmail.com>
Wed, 10 Apr 2013 15:10:39 +0000 (17:10 +0200)
localmylist/database.cpp
localmylist/database.h
localmylist/databaseclasses.cpp
localmylist/databaseclasses.h
localmylist/requesthandler.cpp

index dd2802cfc317dcb3b175f5e3100403a8facff085..0491c6223a32e8b6a53e684154ee2ebf018eddc6 100644 (file)
@@ -662,6 +662,38 @@ bool Database::setFile(const File &file)
        return exec(q);
 }
 
+bool Database::updateFilesFromPendingMyListUpdate(const PendingMyListUpdate &request)
+{
+       QSqlQuery &q = prepare(
+       "UPDATE file f SET "
+       "               my_watched = CASE WHEN pmu.set_my_watched = true THEN pmu.my_watched ELSE f.my_watched END, "
+       "               my_state = CASE WHEN pmu.set_my_watched = true THEN pmu.my_state ELSE f.my_state END, "
+       "               my_file_state = CASE WHEN pmu.set_my_file_state = true THEN pmu.my_file_state ELSE f.my_file_state END, "
+       "               my_storage = CASE WHEN pmu.set_my_storage = true THEN pmu.my_storage ELSE f.my_storage END, "
+       "               my_source = CASE WHEN pmu.set_my_source = true THEN pmu.my_source ELSE f.my_source END, "
+       "               my_other = CASE WHEN pmu.set_my_other = true THEN pmu.my_other ELSE f.my_other END "
+       "       FROM episode e, (SELECT * FROM pending_mylist_update pmu WHERE update_id = :updateId) pmu "
+       "       WHERE e.eid = f.eid "
+       "               AND f.aid = pmu.aid "
+       "               AND e.type = pmu.eptype "
+       "               AND e.epno BETWEEN "
+       "                       CASE "
+       "                               WHEN pmu.epno = 0 THEN 1 "
+       "                               WHEN pmu.epmin = 0 AND pmu.epno <> 0 THEN pmu.epno "
+       "                               ELSE pmu.epmin "
+       "                       END "
+       "                       AND "
+       "                       CASE "
+       "                               WHEN pmu.epno = 0 THEN 1000000 "
+       "                               ELSE pmu.epno "
+       "                       END ");
+       // The 1000000 is used to select all episodes
+       // without having to check how many there really are
+       q.bindValue(":updateId", request.updateId);
+
+       return exec(q);
+}
+
 bool Database::addTitle(const AnimeTitle &title)
 {
        QSqlQuery &q = prepare("INSERT INTO anime_title VALUES(:aid, :type, :language, :title)");
@@ -952,6 +984,7 @@ bool Database::addPendingMyListUpdate(const PendingMyListUpdate &request)
        "               DEFAULT, DEFAULT, DEFAULT, DEFAULT) ");
 
        q.bindValue(":fid", request.fid);
+       // lid is ignored on purpose
        q.bindValue(":aid", request.aid);
        q.bindValue(":epno", request.epno);
        q.bindValue(":epmin", request.epmin);
@@ -977,11 +1010,15 @@ bool Database::addPendingMyListUpdate(const PendingMyListUpdate &request)
 PendingMyListUpdate Database::getPendingMyListUpdate(qint64 updateId)
 {
        QSqlQuery &q = prepare(
-       "SELECT update_id, fid, aid, epno, epmin, eptype, set_my_watched, my_watched, set_my_state, my_state, "
-       "               set_my_file_state, my_file_state, set_my_storage, my_storage, set_my_source, "
-       "               my_source, set_my_other, my_other, set_vote, vote, added, started, finished "
-       "       FROM pending_mylist_update "
-       "       WHERE update_id = :updateId ");
+       "SELECT pmu.update_id, pmu.fid, pmu.aid, pmu.epno, pmu.epmin, pmu.eptype, "
+       "               pmu.set_my_watched, pmu.my_watched, pmu.set_my_state, pmu.my_state, "
+       "               pmu.set_my_file_state, pmu.my_file_state, pmu.set_my_storage, "
+       "               pmu.my_storage, pmu.set_my_source, pmu.my_source, pmu.set_my_other, "
+       "               pmu.my_other, pmu.set_vote, pmu.vote, pmu.added, pmu.started, "
+       "               pmu.finished, f.lid "
+       "       FROM pending_mylist_update pmu "
+       "       LEFT JOIN file f ON f.fid = pmu.fid "
+       "       WHERE update_id = :updateId");
 
        q.bindValue(":updateId", updateId);
 
@@ -1012,7 +1049,8 @@ QList<PendingMyListUpdate> Database::getPendingMyListUpdateBatch(int limit)
        "                       LIMIT :limit) "
        "       RETURNING update_id, fid, aid, epno, epmin, eptype, set_my_watched, my_watched, set_my_state, "
        "               my_state, set_my_file_state, my_file_state, set_my_storage, my_storage, "
-       "               set_my_source, my_source, set_my_other, my_other, set_vote, vote, added, started, finished ");
+       "               set_my_source, my_source, set_my_other, my_other, set_vote, vote, added, started, finished, "
+       "               (SELECT lid FROM file f WHERE f.fid = pmu.fid)");
 
        q.bindValue(":limit", limit);
 
@@ -1465,6 +1503,8 @@ void Database::readPendingMyListUpdateData(SqlResultIteratorInterface &query, Pe
        data.vote = query.value(offset++).toDouble();
        data.added = query.value(offset++).toDateTime();
        data.started = query.value(offset++).toDateTime();
+       data.finished = query.value(offset++).toDateTime();
+       data.lid = query.value(offset++).toInt();
 }
 
 QString Database::animeFields()
@@ -1777,7 +1817,7 @@ void Database::handleNotification(const QString &name)
 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
        Q_UNUSED(source);
 #endif
-       qDebug() << "Recieved notification" << name;
+       qDebug() << "Recieved notification" << name << payload;
        if (name == "new_pending_request")
        {
                emit newPendingRequest();
index 71969ff3c0ec5e591e668857e136e20e4e4dedd3..194a6da6ba798f9ce296a7f662c7015330c36cdc 100644 (file)
@@ -73,6 +73,8 @@ public slots:
        bool setEpisode(const LocalMyList::Episode &episode);
        bool setFile(const LocalMyList::File &file);
 
+       bool updateFilesFromPendingMyListUpdate(const PendingMyListUpdate &request);
+
        bool addTitle(const LocalMyList::AnimeTitle &title);
        bool addAnime(const LocalMyList::Anime &anime);
        bool addEpisode(const LocalMyList::Episode &episode);
index cce522f3f59094bd48bf247fc5b92c79ea0c1db8..c49a075bd9d3303b3707a64942d6725cf8a256ce 100644 (file)
@@ -90,6 +90,7 @@ PendingRequest::PendingRequest()
 PendingMyListUpdate::PendingMyListUpdate()
 {
        fid = 0;
+       lid = 0;
        aid = 0;
        epno = 0;
        epmin = 0;
index daddc02cff8ec83a180e5fee1be3c6ac26d0fb1c..c3cd270e6ee958492e4ca8b3215ae1289ef9eca7 100644 (file)
@@ -172,6 +172,7 @@ struct LOCALMYLISTSHARED_EXPORT PendingMyListUpdate
 {
        qint64 updateId;
        int fid;
+       int lid;
        int aid;
        int epno;
        int epmin;
index a99433e5daf824e052394b83d09bf9d9c7f8bcc5..27fac4432386f8489a095d71bad674e8f0e7b7a5 100644 (file)
@@ -138,7 +138,26 @@ void RequestHandler::handleMyListUpdates()
 
        foreach (const PendingMyListUpdate &request, requests)
        {
-               MyListAddCommand cmd(request.fid, true);
+               MyListAddCommand cmd;
+
+               cmd.setEdit(true);
+
+               if (request.aid)
+               {
+                       cmd.setAid(request.aid);
+                       cmd.setEpno(request.epno);
+                       if (request.epmin)
+                               cmd.setEpmin(request.epmin);
+                       cmd.setEptype(request.eptype);
+               }
+               else if (request.lid)
+               {
+                       cmd.setLid(request.lid);
+               }
+               else
+               {
+                       cmd.setFid(request.fid);
+               }
 
                if (request.setMyWatched)
                {
@@ -532,14 +551,6 @@ void RequestHandler::myListEditReplyRecieved(bool success)
 
        RaiiTransaction t(db);
 
-       File file = db->getFile(reply->command().fid());
-
-       if (!file.fid)
-       {
-               qWarning("Updated file not in DB");
-               return;
-       }
-
        PendingMyListUpdate request = db->getPendingMyListUpdate(id);
 
        if (!request.updateId)
@@ -548,25 +559,41 @@ void RequestHandler::myListEditReplyRecieved(bool success)
                return;
        }
 
-       if (request.setMyWatched)
-               file.myWatched = request.myWatched;
-       if (request.setMyState)
-               file.myState = request.myState;
-       if (request.setMyFileState)
-               file.myFileState = request.myFileState;
-       if (request.setMySource)
-               file.mySource = request.mySource.isNull() ? QString("") : request.mySource;
-       if (request.setMyStorage)
-               file.myStorage = request.myStorage.isNull() ? QString("") : request.myStorage;
-       if (request.setMyOther)
-               file.myOther = request.myOther.isNull() ? QString("") : request.myOther;
+       if (request.aid)
+       {
+               db->updateFilesFromPendingMyListUpdate(request);
+       }
+       else
+       {
+               File file = db->getFile(reply->command().fid());
 
-       file.myUpdate = QDateTime::currentDateTime();
+               if (!file.fid)
+               {
+                       qWarning("Updated file not in DB");
+                       return;
+               }
 
-       db->setFile(file);
+               if (request.setMyWatched)
+                       file.myWatched = request.myWatched;
+               if (request.setMyState)
+                       file.myState = request.myState;
+               if (request.setMyFileState)
+                       file.myFileState = request.myFileState;
+               if (request.setMySource)
+                       file.mySource = request.mySource.isNull() ? QString("") : request.mySource;
+               if (request.setMyStorage)
+                       file.myStorage = request.myStorage.isNull() ? QString("") : request.myStorage;
+               if (request.setMyOther)
+                       file.myOther = request.myOther.isNull() ? QString("") : request.myOther;
+
+               file.myUpdate = QDateTime::currentDateTime();
+
+               db->setFile(file);
+       }
 
        qDebug() << "Clearing update_id" << id;
        db->clearPendingMyListUpdate(request);
+
        t.commit();
 }