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);