From c9bb429ad60c0daed26de7b444d00b6ad65099ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 31 Aug 2022 16:13:28 +0200 Subject: [PATCH 1/6] Remove unused method --- YACReaderLibrary/db_helper.cpp | 13 ------------- YACReaderLibrary/db_helper.h | 1 - 2 files changed, 14 deletions(-) diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 416414ae..98ba5f57 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -727,19 +727,6 @@ 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, " - "firstChildHash = :firstChildHash " - "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); diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 3b5e5820..c7130769 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -66,7 +66,6 @@ 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 updateChildrenInfo(QSqlDatabase &db); static void updateProgress(qulonglong libraryId, const ComicInfo &comicInfo); From 5163df977abf6f0e5c83a0648f22585a0eece08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 31 Aug 2022 18:25:36 +0200 Subject: [PATCH 2/6] Fix Folder::operator= --- common/folder.cpp | 3 +++ 1 file changed, 3 insertions(+) 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; } From 36538abc185f55776ad140e365dd078fbb6e8c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 31 Aug 2022 18:26:14 +0200 Subject: [PATCH 3/6] Fix memory leaks --- YACReaderLibrary/server/controllers/v1/foldercontroller.cpp | 2 ++ .../server/controllers/v2/foldercontentcontroller_v2.cpp | 2 ++ 2 files changed, 4 insertions(+) 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)); From b70556eb41a210bd85ab053a1e2282e5b6cd90ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 31 Aug 2022 18:26:30 +0200 Subject: [PATCH 4/6] Fix emit syntax --- YACReaderLibrary/library_creator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index dfea43ab..0b2aab1f 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -199,9 +199,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"; From 0fcf9d0cba7dcdd459ba0c15628f3bedcde5724f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 31 Aug 2022 18:27:04 +0200 Subject: [PATCH 5/6] Fix memory leak in LibraryCreator --- YACReaderLibrary/library_creator.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index 0b2aab1f..afe15667 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -377,16 +377,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 +400,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 +554,6 @@ void LibraryCreator::update(QDir dirS) } } } + + qDeleteAll(listD); } From 8a6ec5fcc6cf909dd5f782a6a6ae693f1fa01fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Wed, 31 Aug 2022 18:58:25 +0200 Subject: [PATCH 6/6] Assign covers to folders from subfolders & comics Before this commit folder with no direct comics (only subfolders) didn't have a cover image to be displayed. Now updating the children info is done recursively and subfolders are taken into account. This affects the iOS client remote browser so far, but it is also needed for the future browser update (display folders as a grid instead of using EmptyFolderWidget) --- YACReaderLibrary/db/folder_model.cpp | 6 ++- YACReaderLibrary/db_helper.cpp | 71 ++++++++++++++++++++++++---- YACReaderLibrary/db_helper.h | 3 +- YACReaderLibrary/library_creator.cpp | 7 +-- 4 files changed, 72 insertions(+), 15 deletions(-) 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 98ba5f57..0e434ce1 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -727,35 +727,88 @@ void DBHelper::update(const Folder &folder, QSqlDatabase &db) updateFolderInfo.exec(); } -void DBHelper::updateChildrenInfo(qulonglong folderId, QSqlDatabase &db) +void DBHelper::propagateFolderUpdatesToParent(const Folder &folder, QSqlDatabase &db) { - QList subfolders = DBHelper::getFoldersFromParent(folderId, db, false); - QList comics = DBHelper::getComicsFromParent(folderId, db, true); + auto currentParentId = folder.parentId; + auto currentId = folder.id; + while (currentParentId != 1) { + auto f = loadFolder(currentParentId, db); + currentParentId = f.parentId; + currentId = f.id; + } - ComicDB *firstComic = NULL; - if (comics.count() > 0) - firstComic = static_cast(comics.first()); + 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, " "firstChildHash = :firstChildHash " "WHERE id = :id "); - updateFolderInfo.bindValue(":numChildren", subfolders.count() + comics.count()); - updateFolderInfo.bindValue(":firstChildHash", firstComic != NULL ? firstComic->info.hash : ""); + updateFolderInfo.bindValue(":numChildren", folder.getNumChildren()); + updateFolderInfo.bindValue(":firstChildHash", folder.getFirstChildHash()); 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 c7130769..0d552ca3 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -66,7 +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(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 afe15667..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();