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
//deletes
void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db)
void DBHelper::removeFromDB(LibraryItem * item, QSqlDatabase & db, bool updateParent)
{
if(item->isDir())
DBHelper::removeFromDB(dynamic_cast<Folder *>(item),db);
DBHelper::removeFromDB(dynamic_cast<Folder *>(item),db, updateParent);
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);
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)
void DBHelper::removeFromDB(ComicDB * comic, QSqlDatabase & db, bool updateParent)
{
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)
@ -408,6 +414,39 @@ 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, "
"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)
{
QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
@ -571,7 +610,7 @@ void DBHelper::reasignOrderToComicsInReadingList(qulonglong readingListId, QList
}
//inserts
qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db)
qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db, bool updateParent)
{
QSqlQuery query(db);
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(":path", folder->path);
query.exec();
if(updateParent)
DBHelper::updateChildrenInfo(folder->parentId, db);
return query.lastInsertId().toULongLong();
}
qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db)
qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db, bool updateParent)
{
if(!comic->info.existOnDb)
{
@ -607,6 +650,10 @@ qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db)
query.bindValue(":name", comic->name);
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);
static void removeFromDB(Folder * folder, QSqlDatabase & db);
static void removeFromDB(ComicDB * comic, QSqlDatabase & db);
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 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);
static qulonglong insert(ComicDB * comic, QSqlDatabase & db);
static qulonglong insert(Folder * folder, QSqlDatabase & db, bool updateParent = true);
static qulonglong insert(ComicDB * comic, QSqlDatabase & db, bool updateParent = true);
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);
@ -57,6 +57,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(const Folder & folder, QSqlDatabase & db);
static void updateChildrenInfo(qulonglong folderId, 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);