diff options
Diffstat (limited to 'archivemodel.cpp')
-rw-r--r-- | archivemodel.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 86a478e..4351df8 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -32,6 +32,7 @@ ArchiveModel::ArchiveModel(const QStringList &headers, QObject *parent) : SmTree collectorMapper->setMapping(c3, c3); connect(collectorMapper, SIGNAL(mapped(QObject*)), this, SLOT(collectorFinished(QObject*))); mCollectors << c1 << c2 << c3; + connect(this, SIGNAL(needRefresh()), this, SLOT(refresh())); refresh(); } @@ -172,15 +173,18 @@ bool ArchiveModel::removeNode(const QModelIndex &idx){ } QVariant id = item->data(GenericId); removeQuery.bindValue(":id", id); + mDb.transaction(); if(removeQuery.exec()){ + mDb.commit(); if(nodeType == GenreNode || nodeType == ActorNode){ removeRows(idx.row(), 1, idx.parent()); - return true; }else if(nodeType == SeriesNode){ emit needRefresh(); - return true; } + writeCache(mOrder, root()); + return true; }else{ + mDb.rollback(); emitDatabaseError(removeQuery.lastError()); } return false; @@ -228,14 +232,14 @@ void ArchiveModel::setOrder(const QString &order){ void ArchiveModel::refresh(){ emit message(tr("Reading archive data...")); foreach(ArchiveCollector *c, mCollectors){ - if(!c->isRunning()){ - c->start(); + if(c->isRunning()){ + c->cancel(); } + c->start(); } } void ArchiveModel::collectorFinished(QObject *thread){ - QMutexLocker l(&mDoneMx); ArchiveCollector *t = qobject_cast<ArchiveCollector*>(thread); SmTreeItem *rootCopy = t->rootItem(); int sortOrder = t->sortOrder(); @@ -360,7 +364,6 @@ ArchiveCollector::ArchiveCollector(int numFields, int order, QObject *parent) : QString dbName = QString("%1").arg((qint64(this))); mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), dbName); mDb.open(); - //mRootItem = new SmTreeItem(numFields); } SmTreeItem *ArchiveCollector::rootItem(){ @@ -370,6 +373,11 @@ SmTreeItem *ArchiveCollector::rootItem(){ return retval; } +void ArchiveCollector::cancel(){ + QMutexLocker l(&mCancelledMx); + mCancelled = true; +} + void ArchiveCollector::run(){ mAccessMx.lock(); delete mRootItem; @@ -393,6 +401,7 @@ void ArchiveCollector::run(){ void ArchiveCollector::populateBySeriesName() { fetchSeries(QVariant(), mRootItem); for(int i = 0; i < mRootItem->childCount(); ++i){ + checkCancelled(); fetchParts(QVariant(), mRootItem->child(i)); } } @@ -400,6 +409,7 @@ void ArchiveCollector::populateBySeriesName() { void ArchiveCollector::populateByGenre(){ QSqlQuery genreIdQuery = QSqlQuery("SELECT igenres_id, tgenrename FROM genres ORDER BY tgenrename", mDb); while(genreIdQuery.next()){ + checkCancelled(); QList<QVariant> genreIdData; genreIdData << genreIdQuery.value(1) << genreIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::GenreNode << false << QVariant() << QVariant(); SmTreeItem *genreIdItem = new SmTreeItem(genreIdData, mRootItem); @@ -411,6 +421,7 @@ void ArchiveCollector::populateByGenre(){ void ArchiveCollector::populateByActor(){ QSqlQuery actorIdQuery = QSqlQuery("SELECT iactors_id, tactorname FROM actors ORDER BY tactorname", mDb); while(actorIdQuery.next()){ + checkCancelled(); QList<QVariant> actorIdData; actorIdData << actorIdQuery.value(1) << actorIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::ActorNode << false << QVariant() << QVariant(); SmTreeItem *actorIdItem = new SmTreeItem(actorIdData, mRootItem); @@ -421,8 +432,10 @@ void ArchiveCollector::populateByActor(){ void ArchiveCollector::fetchChildren(SmTreeItem *parent){ for(int i = 0; i < parent->childCount(); ++i){ + checkCancelled(); fetchSeries(parent->child(i)->data(ArchiveModel::GenericId), parent->child(i)); for(int j = 0; j < parent->child(i)->childCount(); ++j){ + checkCancelled(); SmTreeItem *seriesItem = parent->child(i)->child(j); fetchParts(parent->child(i)->data(ArchiveModel::GenericId), seriesItem); } @@ -452,6 +465,7 @@ void ArchiveCollector::fetchSeries(const QVariant &id, SmTreeItem *parent){ return; } while(seriesIdQuery.next()){ + checkCancelled(); QList<QVariant> seriesData; seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << ArchiveModel::SeriesNode << false << QVariant() << QVariant(); SmTreeItem *seriesItem = new SmTreeItem(seriesData, parent); @@ -477,6 +491,7 @@ void ArchiveCollector::fetchParts(const QVariant &id, SmTreeItem *parent){ } partsQuery.exec(); while(partsQuery.next()){ + checkCancelled(); QList<QVariant> partData; partData << parent->data(ArchiveModel::Name) << parent->data(ArchiveModel::GenericId) << partsQuery.value(0) << partsQuery.value(1) << ArchiveModel::SeriesPartNode << partsQuery.value(2) << partsQuery.value(3) << QVariant(); SmTreeItem *partItem = new SmTreeItem(partData, parent); @@ -484,3 +499,11 @@ void ArchiveCollector::fetchParts(const QVariant &id, SmTreeItem *parent){ } parent->setData(ArchiveModel::Count, parent->childCount()); } + +void ArchiveCollector::checkCancelled(){ + QMutexLocker l(&mCancelledMx); + if(mCancelled){ + mCancelled = false; + quit(); + } +} |