summaryrefslogtreecommitdiffstats
path: root/archivemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archivemodel.cpp')
-rw-r--r--archivemodel.cpp35
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();
+ }
+}