From b9e7dbe41ea3b03940479253a51181dd691e163e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 24 Jan 2016 18:52:25 +0100 Subject: [PATCH] Everytime the content of a folder changes, update numChildren and firstChildId. This could cause performance issues, but the initial tests look good, and it seems that the overhead could be considered negligible. On the other hand, client queries are several times faster. --- YACReaderLibrary/db_helper.cpp | 61 ++++++++++++++++++++++++++++++---- YACReaderLibrary/db_helper.h | 12 ++++--- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 14277d91..2fcb6d98 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -160,26 +160,32 @@ QString DBHelper::getLibraryName(int id) } //objects management //deletes -void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db) +void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db, bool updateParent) { if(item->isDir()) - DBHelper::removeFromDB(dynamic_cast(item),db); + DBHelper::removeFromDB(dynamic_cast(item),db, updateParent); else - DBHelper::removeFromDB(dynamic_cast(item),db); + DBHelper::removeFromDB(dynamic_cast(item),db, updateParent); } -void DBHelper::removeFromDB(Folder * folder, QSqlDatabase & db) +void DBHelper::removeFromDB(Folder * folder, QSqlDatabase & db, bool updateParent) { QSqlQuery query(db); query.prepare("DELETE FROM folder WHERE id = :id"); query.bindValue(":id", folder->id); query.exec(); + + if(updateParent) + DBHelper::updateChildrenInfo(folder->parentId, db); } -void DBHelper::removeFromDB(ComicDB * comic, QSqlDatabase & db) +void DBHelper::removeFromDB(ComicDB * comic, QSqlDatabase & db, bool updateParent) { QSqlQuery query(db); query.prepare("DELETE FROM comic WHERE id = :id"); query.bindValue(":id", comic->id); query.exec(); + + if(updateParent) + DBHelper::updateChildrenInfo(comic->parentId, db); } void DBHelper::removeLabelFromDB(qulonglong id, QSqlDatabase &db) @@ -408,6 +414,39 @@ void DBHelper::update(const Folder & folder, QSqlDatabase &db) updateFolderInfo.exec(); } +void DBHelper::updateChildrenInfo(const Folder & folder, QSqlDatabase & db) +{ + QSqlQuery updateFolderInfo(db); + updateFolderInfo.prepare("UPDATE folder SET " + "numChildren = :numChildren, " + "firstChildId = :firstChildId " + "WHERE id = :id "); + updateFolderInfo.bindValue(":numChildren", folder.getNumChildren()); + updateFolderInfo.bindValue(":firstChildId", folder.getFirstChildId()); + updateFolderInfo.bindValue(":id", folder.id); + updateFolderInfo.exec(); +} + +void DBHelper::updateChildrenInfo(qulonglong folderId, QSqlDatabase & db) +{ + QList subfolders = DBHelper::getFoldersFromParent(folderId,db,false); + QList comics = DBHelper::getComicsFromParent(folderId,db,true); + + ComicDB * firstComic = NULL; + if(comics.count() > 0) + firstComic = static_cast(comics.first()); + + QSqlQuery updateFolderInfo(db); + updateFolderInfo.prepare("UPDATE folder SET " + "numChildren = :numChildren, " + "firstChildId = :firstChildId " + "WHERE id = :id "); + updateFolderInfo.bindValue(":numChildren", subfolders.count() + comics.count()); + updateFolderInfo.bindValue(":firstChildId", firstComic != NULL ? firstComic->info.id : 0); + updateFolderInfo.bindValue(":id", folderId); + updateFolderInfo.exec(); +} + void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) { QString libraryPath = DBHelper::getLibraries().getPath(libraryId); @@ -571,7 +610,7 @@ void DBHelper::reasignOrderToComicsInReadingList(qulonglong readingListId, QList } //inserts -qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db) +qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db, bool updateParent) { QSqlQuery query(db); query.prepare("INSERT INTO folder (parentId, name, path) " @@ -580,10 +619,14 @@ qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db) query.bindValue(":name", folder->name); query.bindValue(":path", folder->path); query.exec(); + + if(updateParent) + DBHelper::updateChildrenInfo(folder->parentId, db); + return query.lastInsertId().toULongLong(); } -qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db) +qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db, bool updateParent) { if(!comic->info.existOnDb) { @@ -607,6 +650,10 @@ qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db) query.bindValue(":name", comic->name); query.bindValue(":path", comic->path); query.exec(); + + if(updateParent) + DBHelper::updateChildrenInfo(comic->parentId, db); + return query.lastInsertId().toULongLong(); } diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 19611dc7..e7f4d6fe 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -33,9 +33,9 @@ public: //objects management //deletes - static void removeFromDB(LibraryItem * item, QSqlDatabase & db); - static void removeFromDB(Folder * folder, QSqlDatabase & db); - static void removeFromDB(ComicDB * comic, QSqlDatabase & db); + static void removeFromDB(LibraryItem * item, QSqlDatabase & db, bool updateParent = true); + static void removeFromDB(Folder * folder, QSqlDatabase & db, bool updateParent = true); + static void removeFromDB(ComicDB * comic, QSqlDatabase & db, bool updateParent = true); static void removeLabelFromDB(qulonglong id, QSqlDatabase & db); static void removeListFromDB(qulonglong id, QSqlDatabase & db); //logic deletes @@ -43,8 +43,8 @@ public: static void deleteComicsFromLabel(const QList & comicsList, qulonglong labelId, QSqlDatabase & db); static void deleteComicsFromReadingList(const QList & comicsList, qulonglong readingListId, QSqlDatabase & db); //inserts - static qulonglong insert(Folder * folder, QSqlDatabase & db); - static qulonglong insert(ComicDB * comic, QSqlDatabase & db); + static qulonglong insert(Folder * folder, QSqlDatabase & db, bool updateParent = true); + static qulonglong insert(ComicDB * comic, QSqlDatabase & db, bool updateParent = true); static qulonglong insertLabel(const QString & name, YACReader::LabelColors color , QSqlDatabase & db); static qulonglong insertReadingList(const QString & name, QSqlDatabase & db); static qulonglong insertReadingSubList(const QString & name, qulonglong parentId, int ordering, QSqlDatabase & db); @@ -57,6 +57,8 @@ public: static void update(ComicInfo * comicInfo, QSqlDatabase & db); static void updateRead(ComicInfo * comicInfo, QSqlDatabase & db); static void update(const Folder & folder, QSqlDatabase & db); + static void updateChildrenInfo(const Folder & folder, QSqlDatabase & db); + static void updateChildrenInfo(qulonglong folderId, QSqlDatabase & db); static void updateProgress(qulonglong libraryId,const ComicInfo & comicInfo); static void updateReadingRemoteProgress(const ComicInfo & comicInfo, QSqlDatabase & db); static void updateFromRemoteClient(qulonglong libraryId,const ComicInfo & comicInfo);