summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2013-06-26 10:09:24 +0200
committerArno <am@disconnect.de>2013-06-26 10:09:24 +0200
commit9e228a178d0e0b9382f5ce554083f905e65aac25 (patch)
treef1aa368086b0f90dc284d3964f95b3b0e260c3d1
parenteb697d7a3b7fc8b8af052b6f025610dd85eb176b (diff)
downloadSheMov-9e228a178d0e0b9382f5ce554083f905e65aac25.tar.gz
SheMov-9e228a178d0e0b9382f5ce554083f905e65aac25.tar.bz2
SheMov-9e228a178d0e0b9382f5ce554083f905e65aac25.zip
Fix behavior of view when refreshing
Cancel the collectors if they're still running. Otherwise we may get outdated results when refreshing the view after an update or delete.
-rw-r--r--archivemodel.cpp35
-rw-r--r--archivemodel.h5
2 files changed, 33 insertions, 7 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();
+ }
+}
diff --git a/archivemodel.h b/archivemodel.h
index be69346..3848d94 100644
--- a/archivemodel.h
+++ b/archivemodel.h
@@ -61,7 +61,6 @@ class ArchiveModel : public SmTreeModel {
const QString cacheFile(int o) const;
QSqlDatabase mDb;
QHash<QString, int> mAvailableOrders;
- QMutex mDoneMx;
QList<ArchiveCollector*> mCollectors;
int mOrder;
};
@@ -72,6 +71,7 @@ class ArchiveCollector : public QThread {
explicit ArchiveCollector(int numFields, int order, QObject *parent = 0);
SmTreeItem *rootItem();
int sortOrder() const { return mSortOrder; }
+ void cancel();
signals:
void message(const QString message);
@@ -86,11 +86,14 @@ class ArchiveCollector : public QThread {
void fetchChildren(SmTreeItem *parent);
void fetchSeries(const QVariant &id, SmTreeItem *parent);
void fetchParts(const QVariant &id, SmTreeItem *parent);
+ void checkCancelled();
QSqlDatabase mDb;
SmTreeItem *mRootItem;
QMutex mAccessMx;
+ QMutex mCancelledMx;
int mNumFields;
int mSortOrder;
+ bool mCancelled;
};
#endif // ARCHIVEMODEL_H