summaryrefslogtreecommitdiffstats
path: root/archivemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archivemodel.cpp')
-rw-r--r--archivemodel.cpp32
1 files changed, 23 insertions, 9 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp
index b0a6941..86a478e 100644
--- a/archivemodel.cpp
+++ b/archivemodel.cpp
@@ -5,8 +5,8 @@
2 of the License, or (at your option) any later version.
*/
-#include <QSqlError>
#include <QSqlQuery>
+#include <QSqlError>
#include <QFile>
#include <QSettings>
#include <QMutexLocker>
@@ -102,7 +102,9 @@ bool ArchiveModel::setData(const QModelIndex &idx, const QVariant &value, int ro
QVariant id = item->data(GenericId);
updateQuery.bindValue(":value", value);
updateQuery.bindValue(":id", id);
+ mDb.transaction();
if(updateQuery.exec()){
+ mDb.commit();
item->setData(Name, value);
emit dataChanged(idx, idx);
if(nodeType == SeriesNode){
@@ -110,8 +112,8 @@ bool ArchiveModel::setData(const QModelIndex &idx, const QVariant &value, int ro
return true;
}
writeCache(mOrder, root());
- return true;
}else{
+ mDb.rollback();
emitDatabaseError(updateQuery.lastError());
}
return false;
@@ -226,22 +228,23 @@ void ArchiveModel::setOrder(const QString &order){
void ArchiveModel::refresh(){
emit message(tr("Reading archive data..."));
foreach(ArchiveCollector *c, mCollectors){
- c->start();
+ if(!c->isRunning()){
+ c->start();
+ }
}
}
void ArchiveModel::collectorFinished(QObject *thread){
QMutexLocker l(&mDoneMx);
ArchiveCollector *t = qobject_cast<ArchiveCollector*>(thread);
- Q_ASSERT(t);
- SmTreeItem *item = t->rootItem();
+ SmTreeItem *rootCopy = t->rootItem();
int sortOrder = t->sortOrder();
if(sortOrder == mOrder){
emit collectorAboutToBeDone();
- setRoot(item);
+ setRoot(rootCopy);
emit collectorDone();
}
- writeCache(sortOrder, item);
+ writeCache(sortOrder, rootCopy);
QString sortOrderName = mAvailableOrders.key(sortOrder);
QString msg = QString("Done reading %1").arg(sortOrderName);
emit message(msg);
@@ -353,14 +356,24 @@ const QString ArchiveModel::cacheFile(int o) const{
return cacheFile;
}
-ArchiveCollector::ArchiveCollector(int numFields, int order, QObject *parent) : QThread(parent), mNumFields(numFields), mSortOrder(order) {
+ArchiveCollector::ArchiveCollector(int numFields, int order, QObject *parent) : QThread(parent), mRootItem(0), mNumFields(numFields), mSortOrder(order) {
QString dbName = QString("%1").arg((qint64(this)));
mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), dbName);
mDb.open();
- mRootItem = new SmTreeItem(numFields);
+ //mRootItem = new SmTreeItem(numFields);
+}
+
+SmTreeItem *ArchiveCollector::rootItem(){
+ mAccessMx.lock();
+ SmTreeItem *retval = new SmTreeItem(*mRootItem);
+ mAccessMx.unlock();
+ return retval;
}
void ArchiveCollector::run(){
+ mAccessMx.lock();
+ delete mRootItem;
+ mRootItem = new SmTreeItem(mNumFields);
switch (mSortOrder){
case ArchiveModel::SeriesName:
populateBySeriesName();
@@ -374,6 +387,7 @@ void ArchiveCollector::run(){
default:
return;
}
+ mAccessMx.unlock();
}
void ArchiveCollector::populateBySeriesName() {