mirror of
https://github.com/YACReader/yacreader
synced 2025-06-04 01:28:55 -04:00
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:
parent
00f45b9a27
commit
88056c819f
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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()));
|
||||
|
Loading…
x
Reference in New Issue
Block a user