diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index e362f5f1..f54fd7ea 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -547,7 +547,8 @@ void FolderModel::deleteFolder(const QModelIndex &mi) { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); DBHelper::removeFromDB(&f, db); - DBHelper::updateChildrenInfo(item->parent()->id, db); + auto folder = DBHelper::updateChildrenInfo(item->parent()->id, db); + DBHelper::propagateFolderUpdatesToParent(folder, db); connectionName = db.connectionName(); } QSqlDatabase::removeDatabase(connectionName); @@ -560,7 +561,8 @@ void FolderModel::updateFolderChildrenInfo(qulonglong folderId) QString connectionName = ""; { QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); - DBHelper::updateChildrenInfo(folderId, db); + auto folder = DBHelper::updateChildrenInfo(folderId, db); + DBHelper::propagateFolderUpdatesToParent(folder, db); connectionName = db.connectionName(); } QSqlDatabase::removeDatabase(connectionName); diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 416414ae..0e434ce1 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -727,8 +727,57 @@ void DBHelper::update(const Folder &folder, QSqlDatabase &db) updateFolderInfo.exec(); } -void DBHelper::updateChildrenInfo(const Folder &folder, QSqlDatabase &db) +void DBHelper::propagateFolderUpdatesToParent(const Folder &folder, QSqlDatabase &db) { + auto currentParentId = folder.parentId; + auto currentId = folder.id; + while (currentParentId != 1) { + auto f = loadFolder(currentParentId, db); + currentParentId = f.parentId; + currentId = f.id; + } + + if (currentId != folder.id) { + updateChildrenInfo(currentId, db); + } +} + +Folder DBHelper::updateChildrenInfo(qulonglong folderId, QSqlDatabase &db) +{ + auto folder = loadFolder(folderId, db); + QList subitems; + QList subfolders = DBHelper::getFoldersFromParent(folderId, db, false); + QList comics = DBHelper::getComicsFromParent(folderId, db, false); + + QList updatedSubfolders; + for (auto sf : subfolders) { + updatedSubfolders.append(new Folder(updateChildrenInfo(static_cast(sf)->id, db))); + } + + subitems.append(updatedSubfolders); + subitems.append(comics); + + std::sort(subitems.begin(), subitems.end(), naturalSortLessThanCILibraryItem); + + QString coverHash = ""; + for (auto item : subitems) { + if (item->isDir()) { + auto f = static_cast(item); + auto firstChildHash = f->getFirstChildHash(); + if (!firstChildHash.isEmpty()) { + coverHash = firstChildHash; + break; + } + } else { + auto c = static_cast(item); + coverHash = c->info.hash; + break; + } + } + + folder.setNumChildren(subfolders.count() + comics.count()); + folder.setFirstChildHash(coverHash); + QSqlQuery updateFolderInfo(db); updateFolderInfo.prepare("UPDATE folder SET " "numChildren = :numChildren, " @@ -736,39 +785,30 @@ void DBHelper::updateChildrenInfo(const Folder &folder, QSqlDatabase &db) "WHERE id = :id "); updateFolderInfo.bindValue(":numChildren", folder.getNumChildren()); updateFolderInfo.bindValue(":firstChildHash", folder.getFirstChildHash()); - 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, " - "firstChildHash = :firstChildHash " - "WHERE id = :id "); - updateFolderInfo.bindValue(":numChildren", subfolders.count() + comics.count()); - updateFolderInfo.bindValue(":firstChildHash", firstComic != NULL ? firstComic->info.hash : ""); updateFolderInfo.bindValue(":id", folderId); updateFolderInfo.exec(); + + qDeleteAll(subfolders); + qDeleteAll(updatedSubfolders); + qDeleteAll(comics); + + return folder; } void DBHelper::updateChildrenInfo(QSqlDatabase &db) { + QElapsedTimer timer; + timer.start(); + QSqlQuery selectQuery(db); // TODO check - selectQuery.prepare("SELECT id FROM folder"); + selectQuery.prepare("SELECT id FROM folder f WHERE f.parentId = 1"); selectQuery.exec(); while (selectQuery.next()) { DBHelper::updateChildrenInfo(selectQuery.value(0).toULongLong(), db); } + + qDebug() << timer.elapsed(); } void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 3b5e5820..0d552ca3 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -66,8 +66,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 propagateFolderUpdatesToParent(const Folder &folder, QSqlDatabase &db); + static Folder updateChildrenInfo(qulonglong folderId, QSqlDatabase &db); static void updateChildrenInfo(QSqlDatabase &db); static void updateProgress(qulonglong libraryId, const ComicInfo &comicInfo); static void setComicAsReading(qulonglong libraryId, const ComicInfo &comicInfo); diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index dfea43ab..4058dd58 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -185,9 +185,10 @@ void LibraryCreator::run() update(QDir(_source)); } - if (partialUpdate) - DBHelper::updateChildrenInfo(folderDestinationModelIndex.data(FolderModel::IdRole).toULongLong(), _database); - else + if (partialUpdate) { + auto folder = DBHelper::updateChildrenInfo(folderDestinationModelIndex.data(FolderModel::IdRole).toULongLong(), _database); + DBHelper::propagateFolderUpdatesToParent(folder, _database); + } else DBHelper::updateChildrenInfo(_database); _database.commit(); @@ -199,9 +200,9 @@ void LibraryCreator::run() // si estabamos en modo creación, se está añadiendo una librería que ya existía y se ha actualizado antes de añadirse. if (!partialUpdate) { if (!creation) { - emit(updated()); + emit updated(); } else { - emit(created()); + emit created(); } } QLOG_INFO() << "Update library END"; @@ -377,16 +378,20 @@ void LibraryCreator::update(QDir dirS) bool updated; int i, j; for (i = 0, j = 0; (i < lenghtS) || (j < lenghtD);) { - if (stopRunning) + if (stopRunning) { + qDeleteAll(listD); return; + } updated = false; if (i >= lenghtS) // finished source files/dirs { // QLOG_WARN() << "finished source files/dirs" << dirS.absolutePath(); // delete listD //from j for (; j < lenghtD; j++) { - if (stopRunning) + if (stopRunning) { + qDeleteAll(listD); return; + } DBHelper::removeFromDB(listD.at(j), (_database)); } updated = true; @@ -396,8 +401,10 @@ void LibraryCreator::update(QDir dirS) // QLOG_WARN() << "finished library files/dirs" << dirS.absolutePath(); // create listS //from i for (; i < lenghtS; i++) { - if (stopRunning) + if (stopRunning) { + qDeleteAll(listD); return; + } QFileInfo fileInfoS = listS.at(i); if (fileInfoS.isDir()) // create folder { @@ -548,4 +555,6 @@ void LibraryCreator::update(QDir dirS) } } } + + qDeleteAll(listD); } diff --git a/YACReaderLibrary/server/controllers/v1/foldercontroller.cpp b/YACReaderLibrary/server/controllers/v1/foldercontroller.cpp index fbe02168..0ba2ff78 100644 --- a/YACReaderLibrary/server/controllers/v1/foldercontroller.cpp +++ b/YACReaderLibrary/server/controllers/v1/foldercontroller.cpp @@ -308,5 +308,7 @@ void FolderController::service(HttpRequest &request, HttpResponse &response) t.setVariable("page", QString("%1").arg(page + 1)); t.setVariable("pages", QString("%1").arg(numPages)); + qDeleteAll(folderContent); + response.write(t.toUtf8(), true); } diff --git a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp index 836fa5ee..9c59f67c 100644 --- a/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp +++ b/YACReaderLibrary/server/controllers/v2/foldercontentcontroller_v2.cpp @@ -63,6 +63,8 @@ void FolderContentControllerV2::serviceContent(const int &library, const qulongl } } + qDeleteAll(folderContent); + QJsonDocument output(items); response.write(output.toJson(QJsonDocument::Compact)); diff --git a/common/folder.cpp b/common/folder.cpp index c6a0cd54..288ad66e 100644 --- a/common/folder.cpp +++ b/common/folder.cpp @@ -34,6 +34,9 @@ Folder &Folder::operator=(const Folder &other) this->finished = other.finished; this->completed = other.completed; this->manga = other.manga; + this->numChildren = other.numChildren; + this->firstChildHash = other.firstChildHash; + this->customImage = other.customImage; return *this; }