Everytime the content of a folder changes, update numChildren and firstChildId. This could cause performance issues, but the initial tests look good, and it seems that the overhead could be considered negligible. On the other hand, client queries are several times faster.

This commit is contained in:
Luis Ángel San Martín 2016-01-24 18:52:25 +01:00
parent 3cda11eec7
commit b9e7dbe41e
2 changed files with 61 additions and 12 deletions

View File

@ -160,26 +160,32 @@ QString DBHelper::getLibraryName(int id)
} }
//objects management //objects management
//deletes //deletes
void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db) void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db, bool updateParent)
{ {
if(item->isDir()) if(item->isDir())
DBHelper::removeFromDB(dynamic_cast<Folder *>(item),db); DBHelper::removeFromDB(dynamic_cast<Folder *>(item),db, updateParent);
else else
DBHelper::removeFromDB(dynamic_cast<ComicDB *>(item),db); DBHelper::removeFromDB(dynamic_cast<ComicDB *>(item),db, updateParent);
} }
void DBHelper::removeFromDB(Folder * folder, QSqlDatabase & db) void DBHelper::removeFromDB(Folder * folder, QSqlDatabase & db, bool updateParent)
{ {
QSqlQuery query(db); QSqlQuery query(db);
query.prepare("DELETE FROM folder WHERE id = :id"); query.prepare("DELETE FROM folder WHERE id = :id");
query.bindValue(":id", folder->id); query.bindValue(":id", folder->id);
query.exec(); query.exec();
if(updateParent)
DBHelper::updateChildrenInfo(folder->parentId, db);
} }
void DBHelper::removeFromDB(ComicDB * comic, QSqlDatabase & db) void DBHelper::removeFromDB(ComicDB * comic, QSqlDatabase & db, bool updateParent)
{ {
QSqlQuery query(db); QSqlQuery query(db);
query.prepare("DELETE FROM comic WHERE id = :id"); query.prepare("DELETE FROM comic WHERE id = :id");
query.bindValue(":id", comic->id); query.bindValue(":id", comic->id);
query.exec(); query.exec();
if(updateParent)
DBHelper::updateChildrenInfo(comic->parentId, db);
} }
void DBHelper::removeLabelFromDB(qulonglong id, QSqlDatabase &db) void DBHelper::removeLabelFromDB(qulonglong id, QSqlDatabase &db)
@ -408,6 +414,39 @@ void DBHelper::update(const Folder & folder, QSqlDatabase &db)
updateFolderInfo.exec(); updateFolderInfo.exec();
} }
void DBHelper::updateChildrenInfo(const Folder & folder, QSqlDatabase & db)
{
QSqlQuery updateFolderInfo(db);
updateFolderInfo.prepare("UPDATE folder SET "
"numChildren = :numChildren, "
"firstChildId = :firstChildId "
"WHERE id = :id ");
updateFolderInfo.bindValue(":numChildren", folder.getNumChildren());
updateFolderInfo.bindValue(":firstChildId", folder.getFirstChildId());
updateFolderInfo.bindValue(":id", folder.id);
updateFolderInfo.exec();
}
void DBHelper::updateChildrenInfo(qulonglong folderId, QSqlDatabase & db)
{
QList<LibraryItem *> subfolders = DBHelper::getFoldersFromParent(folderId,db,false);
QList<LibraryItem *> comics = DBHelper::getComicsFromParent(folderId,db,true);
ComicDB * firstComic = NULL;
if(comics.count() > 0)
firstComic = static_cast<ComicDB *>(comics.first());
QSqlQuery updateFolderInfo(db);
updateFolderInfo.prepare("UPDATE folder SET "
"numChildren = :numChildren, "
"firstChildId = :firstChildId "
"WHERE id = :id ");
updateFolderInfo.bindValue(":numChildren", subfolders.count() + comics.count());
updateFolderInfo.bindValue(":firstChildId", firstComic != NULL ? firstComic->info.id : 0);
updateFolderInfo.bindValue(":id", folderId);
updateFolderInfo.exec();
}
void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
@ -571,7 +610,7 @@ void DBHelper::reasignOrderToComicsInReadingList(qulonglong readingListId, QList
} }
//inserts //inserts
qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db) qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db, bool updateParent)
{ {
QSqlQuery query(db); QSqlQuery query(db);
query.prepare("INSERT INTO folder (parentId, name, path) " query.prepare("INSERT INTO folder (parentId, name, path) "
@ -580,10 +619,14 @@ qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db)
query.bindValue(":name", folder->name); query.bindValue(":name", folder->name);
query.bindValue(":path", folder->path); query.bindValue(":path", folder->path);
query.exec(); query.exec();
if(updateParent)
DBHelper::updateChildrenInfo(folder->parentId, db);
return query.lastInsertId().toULongLong(); return query.lastInsertId().toULongLong();
} }
qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db) qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db, bool updateParent)
{ {
if(!comic->info.existOnDb) if(!comic->info.existOnDb)
{ {
@ -607,6 +650,10 @@ qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db)
query.bindValue(":name", comic->name); query.bindValue(":name", comic->name);
query.bindValue(":path", comic->path); query.bindValue(":path", comic->path);
query.exec(); query.exec();
if(updateParent)
DBHelper::updateChildrenInfo(comic->parentId, db);
return query.lastInsertId().toULongLong(); return query.lastInsertId().toULongLong();
} }

View File

@ -33,9 +33,9 @@ public:
//objects management //objects management
//deletes //deletes
static void removeFromDB(LibraryItem * item, QSqlDatabase & db); static void removeFromDB(LibraryItem * item, QSqlDatabase & db, bool updateParent = true);
static void removeFromDB(Folder * folder, QSqlDatabase & db); static void removeFromDB(Folder * folder, QSqlDatabase & db, bool updateParent = true);
static void removeFromDB(ComicDB * comic, QSqlDatabase & db); static void removeFromDB(ComicDB * comic, QSqlDatabase & db, bool updateParent = true);
static void removeLabelFromDB(qulonglong id, QSqlDatabase & db); static void removeLabelFromDB(qulonglong id, QSqlDatabase & db);
static void removeListFromDB(qulonglong id, QSqlDatabase & db); static void removeListFromDB(qulonglong id, QSqlDatabase & db);
//logic deletes //logic deletes
@ -43,8 +43,8 @@ public:
static void deleteComicsFromLabel(const QList<ComicDB> & comicsList, qulonglong labelId, QSqlDatabase & db); static void deleteComicsFromLabel(const QList<ComicDB> & comicsList, qulonglong labelId, QSqlDatabase & db);
static void deleteComicsFromReadingList(const QList<ComicDB> & comicsList, qulonglong readingListId, QSqlDatabase & db); static void deleteComicsFromReadingList(const QList<ComicDB> & comicsList, qulonglong readingListId, QSqlDatabase & db);
//inserts //inserts
static qulonglong insert(Folder * folder, QSqlDatabase & db); static qulonglong insert(Folder * folder, QSqlDatabase & db, bool updateParent = true);
static qulonglong insert(ComicDB * comic, QSqlDatabase & db); static qulonglong insert(ComicDB * comic, QSqlDatabase & db, bool updateParent = true);
static qulonglong insertLabel(const QString & name, YACReader::LabelColors color , QSqlDatabase & db); static qulonglong insertLabel(const QString & name, YACReader::LabelColors color , QSqlDatabase & db);
static qulonglong insertReadingList(const QString & name, QSqlDatabase & db); static qulonglong insertReadingList(const QString & name, QSqlDatabase & db);
static qulonglong insertReadingSubList(const QString & name, qulonglong parentId, int ordering, QSqlDatabase & db); static qulonglong insertReadingSubList(const QString & name, qulonglong parentId, int ordering, QSqlDatabase & db);
@ -57,6 +57,8 @@ public:
static void update(ComicInfo * comicInfo, QSqlDatabase & db); static void update(ComicInfo * comicInfo, QSqlDatabase & db);
static void updateRead(ComicInfo * comicInfo, QSqlDatabase & db); static void updateRead(ComicInfo * comicInfo, QSqlDatabase & db);
static void update(const Folder & folder, 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 updateProgress(qulonglong libraryId,const ComicInfo & comicInfo); static void updateProgress(qulonglong libraryId,const ComicInfo & comicInfo);
static void updateReadingRemoteProgress(const ComicInfo & comicInfo, QSqlDatabase & db); static void updateReadingRemoteProgress(const ComicInfo & comicInfo, QSqlDatabase & db);
static void updateFromRemoteClient(qulonglong libraryId,const ComicInfo & comicInfo); static void updateFromRemoteClient(qulonglong libraryId,const ComicInfo & comicInfo);