From 88056c819f01212152368b5cc443076668ef3500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 25 Jan 2016 18:45:50 +0100 Subject: [PATCH] updating folders' children info for every insert/delete in the db causes big performance issues, so that info is going to be updated explicitly --- YACReaderLibrary/comics_remover.cpp | 5 ++-- YACReaderLibrary/comics_remover.h | 4 ++- YACReaderLibrary/db/comic_model.cpp | 4 +-- YACReaderLibrary/db/comic_model.h | 2 +- YACReaderLibrary/db/folder_model.cpp | 15 ++++++++--- YACReaderLibrary/db/folder_model.h | 4 ++- YACReaderLibrary/db_helper.cpp | 38 ++++++++++++++-------------- YACReaderLibrary/db_helper.h | 11 ++++---- YACReaderLibrary/library_creator.cpp | 11 +++++++- YACReaderLibrary/library_window.cpp | 6 +++-- 10 files changed, 63 insertions(+), 37 deletions(-) diff --git a/YACReaderLibrary/comics_remover.cpp b/YACReaderLibrary/comics_remover.cpp index ef3fd009..7b4eadd7 100644 --- a/YACReaderLibrary/comics_remover.cpp +++ b/YACReaderLibrary/comics_remover.cpp @@ -5,8 +5,8 @@ #include "QsLog.h" -ComicsRemover::ComicsRemover(QModelIndexList & il, QList & ps, QObject *parent) - :QObject(parent),indexList(il), paths(ps) +ComicsRemover::ComicsRemover(QModelIndexList & il, QList & ps, qulonglong parentId, QObject *parent) + :QObject(parent),indexList(il), paths(ps), parentId(parentId) { } @@ -29,6 +29,7 @@ void ComicsRemover::process() } emit finished(); + emit removedItemsFromFolder(parentId); } diff --git a/YACReaderLibrary/comics_remover.h b/YACReaderLibrary/comics_remover.h index ff9d0a21..c844afbb 100644 --- a/YACReaderLibrary/comics_remover.h +++ b/YACReaderLibrary/comics_remover.h @@ -10,12 +10,13 @@ class ComicsRemover : public QObject { Q_OBJECT public: - explicit ComicsRemover(QModelIndexList & indexList, QList & paths, QObject *parent = 0); + explicit ComicsRemover(QModelIndexList & indexList, QList & paths, qulonglong parentId, QObject *parent = 0); signals: void remove(int); void removeError(); void finished(); + void removedItemsFromFolder(qulonglong); public slots: void process(); @@ -23,6 +24,7 @@ public slots: private: QModelIndexList indexList; QList paths; + qulonglong parentId; }; class FoldersRemover : public QObject diff --git a/YACReaderLibrary/db/comic_model.cpp b/YACReaderLibrary/db/comic_model.cpp index 33ddf459..7c3fa3ab 100644 --- a/YACReaderLibrary/db/comic_model.cpp +++ b/YACReaderLibrary/db/comic_model.cpp @@ -965,7 +965,7 @@ void ComicModel::removeInTransaction(int row) endRemoveRows(); } - +/* void ComicModel::remove(ComicDB * comic, int row) { beginRemoveRows(QModelIndex(),row,row); @@ -981,7 +981,7 @@ void ComicModel::remove(ComicDB * comic, int row) QSqlDatabase::removeDatabase(_databasePath); endRemoveRows(); } - +*/ /*ComicDB TableModel::getComic(int row) { return getComic(index(row,0)); diff --git a/YACReaderLibrary/db/comic_model.h b/YACReaderLibrary/db/comic_model.h index ce0de290..bb040a0d 100644 --- a/YACReaderLibrary/db/comic_model.h +++ b/YACReaderLibrary/db/comic_model.h @@ -65,7 +65,7 @@ public: //setComicInfoForSelectedComis(QList list); -->inserta la información común para los comics seleccionados QVector setComicsRead(QList list,YACReaderComicReadStatus read); qint64 asignNumbers(QList list,int startingNumber); - void remove(ComicDB * comic, int row); + //void remove(ComicDB * comic, int row); void removeInTransaction(int row); void reload(const ComicDB & comic); void resetComicRating(const QModelIndex & mi); diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index 1df7b199..700ca367 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -172,11 +172,12 @@ QVariant FolderModel::data(const QModelIndex &index, int role) const if(role == FolderModel::FinishedRole) return item->data(FolderModel::Finished); + if(role == FolderModel::IdRole) + return item->id; + if (role != Qt::DisplayRole) return QVariant(); - - return item->data(index.column()); } //! [3] @@ -305,7 +306,7 @@ void FolderModel::setupModelData(QSqlQuery &sqlquery, FolderItem *parent) //el diccionario permitir� encontrar cualquier nodo del �rbol r�pidamente, de forma que a�adir un hijo a un padre sea O(1) items.clear(); //se a�ade el nodo 0 - items.insert(parent->id,parent); + items.insert(parent->id,parent); while (sqlquery.next()) { QList data; @@ -535,6 +536,7 @@ QModelIndex FolderModel::addFolderAtParent(const QString &folderName, const QMod QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); newFolder.id = DBHelper::insert(&newFolder, db); + DBHelper::updateChildrenInfo(parentItem->id, db); QSqlDatabase::removeDatabase(_databasePath); int destRow = 0; @@ -573,11 +575,18 @@ void FolderModel::deleteFolder(const QModelIndex &mi) QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); DBHelper::removeFromDB(&f,db); + DBHelper::updateChildrenInfo(item->parent()->id, db); QSqlDatabase::removeDatabase(_databasePath); endRemoveRows(); } +void FolderModel::updateFolderChildrenInfo(qulonglong folderId) +{ + QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); + DBHelper::updateChildrenInfo(folderId, db); + QSqlDatabase::removeDatabase(_databasePath); +} //PROXY diff --git a/YACReaderLibrary/db/folder_model.h b/YACReaderLibrary/db/folder_model.h index 4d0f16bb..ae28a33c 100644 --- a/YACReaderLibrary/db/folder_model.h +++ b/YACReaderLibrary/db/folder_model.h @@ -127,11 +127,13 @@ public: enum Roles { FinishedRole = Qt::UserRole + 1, - CompletedRole + CompletedRole, + IdRole }; public slots: void deleteFolder(const QModelIndex & mi); + void updateFolderChildrenInfo(qulonglong folderId); private: void setupModelData( QSqlQuery &sqlquery, FolderItem *parent); diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 321cb35e..5869a15f 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -160,32 +160,26 @@ QString DBHelper::getLibraryName(int id) } //objects management //deletes -void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db, bool updateParent) +void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db) { if(item->isDir()) - DBHelper::removeFromDB(dynamic_cast(item),db, updateParent); + DBHelper::removeFromDB(dynamic_cast(item),db); else - DBHelper::removeFromDB(dynamic_cast(item),db, updateParent); + DBHelper::removeFromDB(dynamic_cast(item),db); } -void DBHelper::removeFromDB(Folder * folder, QSqlDatabase & db, bool updateParent) +void DBHelper::removeFromDB(Folder * folder, QSqlDatabase & db) { 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, bool updateParent) +void DBHelper::removeFromDB(ComicDB * comic, QSqlDatabase & db) { 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) @@ -447,6 +441,18 @@ void DBHelper::updateChildrenInfo(qulonglong folderId, QSqlDatabase & db) updateFolderInfo.exec(); } +void DBHelper::updateChildrenInfo(QSqlDatabase & db) +{ + QSqlQuery selectQuery(db); //TODO check + selectQuery.prepare("SELECT id FROM folder"); + selectQuery.exec(); + + while (selectQuery.next()) + { + DBHelper::updateChildrenInfo(selectQuery.record().value(0).toULongLong(), db); + } +} + void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) { QString libraryPath = DBHelper::getLibraries().getPath(libraryId); @@ -610,7 +616,7 @@ void DBHelper::reasignOrderToComicsInReadingList(qulonglong readingListId, QList } //inserts -qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db, bool updateParent) +qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db) { QSqlQuery query(db); query.prepare("INSERT INTO folder (parentId, name, path) " @@ -620,13 +626,10 @@ qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db, bool updateParen 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, bool updateParent) +qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db) { if(!comic->info.existOnDb) { @@ -651,9 +654,6 @@ qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db, bool updateParen 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 e7f4d6fe..27c412e1 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, 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 removeFromDB(LibraryItem * item, QSqlDatabase & db); + static void removeFromDB(Folder * folder, QSqlDatabase & db); + static void removeFromDB(ComicDB * comic, QSqlDatabase & db); 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, bool updateParent = true); - static qulonglong insert(ComicDB * comic, QSqlDatabase & db, bool updateParent = true); + static qulonglong insert(Folder * folder, QSqlDatabase & db); + static qulonglong insert(ComicDB * comic, QSqlDatabase & db); 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); @@ -59,6 +59,7 @@ public: 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); static void updateReadingRemoteProgress(const ComicInfo & comicInfo, QSqlDatabase & db); static void updateFromRemoteClient(qulonglong libraryId,const ComicInfo & comicInfo); diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index 9ff6c47b..8fbc14c3 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -162,6 +162,9 @@ void LibraryCreator::run() _database.transaction(); //se crea la librería create(QDir(_source)); + + DBHelper::updateChildrenInfo(_database); + _database.commit(); _database.close(); QSqlDatabase::removeDatabase(_database.connectionName()); @@ -199,6 +202,12 @@ void LibraryCreator::run() { update(QDir(_source)); } + + if(partialUpdate) + DBHelper::updateChildrenInfo(folderDestinationModelIndex.data(FolderModel::IdRole).toULongLong(),_database); + else + DBHelper::updateChildrenInfo(_database); + _database.commit(); _database.close(); QSqlDatabase::removeDatabase(_target); @@ -243,7 +252,7 @@ qulonglong LibraryCreator::insertFolders() if(!(i->knownId)) { i->setFather(currentId); - currentId = DBHelper::insert(&(*i),_database);//insertFolder(currentId,*i); + currentId = DBHelper::insert(&(*i),_database);//insertFolder(currentId,*i); i->setId(currentId); } else diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index f89dfa23..000b9aaa 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -1291,7 +1291,7 @@ void LibraryWindow::loadLibrary(const QString & name) if(d.exists(path+"/library.ydb")) { - QSqlDatabase db = DataBaseManagement::loadDatabase(path); + QSqlDatabase db = DataBaseManagement::loadDatabase(path); manageOpeningLibraryError(db.lastError().databaseText() + "-" + db.lastError().driverText()); //será possible renombrar y borrar estas bibliotecas renameLibraryAction->setEnabled(true); @@ -2579,7 +2579,7 @@ void LibraryWindow::deleteComicsFromDisk() QLOG_INFO() << comic.parentId; } - ComicsRemover * remover = new ComicsRemover(indexList,paths); + ComicsRemover * remover = new ComicsRemover(indexList,paths,comics.at(0).parentId); QThread * thread = NULL; thread = new QThread(this); @@ -2592,6 +2592,8 @@ void LibraryWindow::deleteComicsFromDisk() connect(remover, SIGNAL(remove(int)), comicsModel, SLOT(remove(int))); connect(remover, SIGNAL(removeError()),this,SLOT(setRemoveError())); connect(remover, SIGNAL(finished()), comicsModel, SLOT(finishTransaction())); + connect(remover, SIGNAL(finished()), comicsModel, SLOT(finishTransaction())); + connect(remover, SIGNAL(removedItemsFromFolder(qulonglong)), foldersModel, SLOT(updateFolderChildrenInfo(qulonglong))); connect(remover, SIGNAL(finished()),this,SLOT(checkEmptyFolder())); connect(remover, SIGNAL(finished()),this,SLOT(checkRemoveError()));