updating folders' children info for every insert/delete in the db causes big performance issues, so that info is going to be updated explicitly

This commit is contained in:
Luis Ángel San Martín 2016-01-25 18:45:50 +01:00
parent 00f45b9a27
commit 88056c819f
10 changed files with 63 additions and 37 deletions

View File

@ -5,8 +5,8 @@
#include "QsLog.h"
ComicsRemover::ComicsRemover(QModelIndexList & il, QList<QString> & ps, QObject *parent)
:QObject(parent),indexList(il), paths(ps)
ComicsRemover::ComicsRemover(QModelIndexList & il, QList<QString> & 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);
}

View File

@ -10,12 +10,13 @@ class ComicsRemover : public QObject
{
Q_OBJECT
public:
explicit ComicsRemover(QModelIndexList & indexList, QList<QString> & paths, QObject *parent = 0);
explicit ComicsRemover(QModelIndexList & indexList, QList<QString> & 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<QString> paths;
qulonglong parentId;
};
class FoldersRemover : public QObject

View File

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

View File

@ -65,7 +65,7 @@ public:
//setComicInfoForSelectedComis(QList<QModelIndex> list); -->inserta la información común para los comics seleccionados
QVector<YACReaderComicReadStatus> setComicsRead(QList<QModelIndex> list,YACReaderComicReadStatus read);
qint64 asignNumbers(QList<QModelIndex> 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);

View File

@ -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<69> encontrar cualquier nodo del <20>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<QVariant> 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

View File

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

View File

@ -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<Folder *>(item),db, updateParent);
DBHelper::removeFromDB(dynamic_cast<Folder *>(item),db);
else
DBHelper::removeFromDB(dynamic_cast<ComicDB *>(item),db, updateParent);
DBHelper::removeFromDB(dynamic_cast<ComicDB *>(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();
}

View File

@ -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<ComicDB> & comicsList, qulonglong labelId, QSqlDatabase & db);
static void deleteComicsFromReadingList(const QList<ComicDB> & 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);

View File

@ -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

View File

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