Skip to content
This repository was archived by the owner on Mar 4, 2023. It is now read-only.

Commit 3c61380

Browse files
committed
added support for skipping broken data in iterate
... and use iterate in caching data stores
1 parent 60b4f61 commit 3c61380

File tree

3 files changed

+84
-51
lines changed

3 files changed

+84
-51
lines changed

src/datasync/datastore.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
using namespace QtDataSync;
1010
using std::function;
1111

12+
#define QTDATASYNC_LOG d->logger
13+
1214
DataStore::DataStore(QObject *parent) :
1315
DataStore{DefaultSetup, parent}
1416
{}
@@ -150,10 +152,22 @@ QVariantList DataStore::search(int metaTypeId, const QString &query, SearchMode
150152
}
151153

152154
void DataStore::iterate(int metaTypeId, const function<bool (QVariant)> &iterator) const
155+
{
156+
iterate(metaTypeId, iterator, false);
157+
}
158+
159+
void DataStore::iterate(int metaTypeId, const std::function<bool (QVariant)> &iterator, bool skipBroken) const
153160
{
154161
for(const auto &key : keys(metaTypeId)) { // clazy:exclude=range-loop
155-
if(!iterator(load(metaTypeId, key)))
156-
break;
162+
try {
163+
if(!iterator(load(metaTypeId, key)))
164+
break;
165+
} catch (QException &e) {
166+
if(skipBroken)
167+
logWarning() << "Ignoring error on store iteration:" << e.what();
168+
else
169+
throw;
170+
}
157171
}
158172
}
159173

src/datasync/datastore.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ class Q_DATASYNC_EXPORT DataStore : public QObject
7272
//! @copybrief DataStore::iterate(const std::function<bool(T)> &) const
7373
void iterate(int metaTypeId,
7474
const std::function<bool(QVariant)> &iterator) const;
75+
void iterate(int metaTypeId,
76+
const std::function<bool(QVariant)> &iterator,
77+
bool skipBroken) const; //MAJOR merge overloads
7578
//! @copybrief DataStore::clear()
7679
void clear(int metaTypeId);
7780

@@ -118,7 +121,7 @@ class Q_DATASYNC_EXPORT DataStore : public QObject
118121
QList<T> search(const QString &query, SearchMode mode = RegexpMode) const;
119122
//! Iterates over all existing datasets of the given types
120123
template<typename T>
121-
void iterate(const std::function<bool(T)> &iterator) const;
124+
void iterate(const std::function<bool(T)> &iterator, bool skipBroken = false) const;
122125
//! Removes all datasets of the given type from the store
123126
template<typename T>
124127
void clear();
@@ -329,12 +332,12 @@ QList<T> DataStore::search(const QString &query, SearchMode mode) const
329332
}
330333

331334
template<typename T>
332-
void DataStore::iterate(const std::function<bool (T)> &iterator) const
335+
void DataStore::iterate(const std::function<bool (T)> &iterator, bool skipBroken) const
333336
{
334337
QTDATASYNC_STORE_ASSERT(T);
335338
iterate(qMetaTypeId<T>(), [iterator](const QVariant &v) {
336339
return iterator(v.template value<T>());
337-
});
340+
}, skipBroken);
338341
}
339342

340343
template<typename T>

src/datasync/datatypestore.h

Lines changed: 62 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <type_traits>
55

66
#include <QtCore/qobject.h>
7+
#include <QtCore/qdebug.h>
78

89
#include "QtDataSync/qtdatasync_global.h"
910
#include "QtDataSync/datastore.h"
@@ -64,7 +65,7 @@ class DataTypeStore : public DataTypeStoreBase
6465
//! @copybrief DataStore::search(const QString &, SearchMode) const
6566
QList<TType> search(const QString &query, DataStore::SearchMode mode = DataStore::RegexpMode);
6667
//! @copybrief DataStore::iterate(const std::function<bool(T)> &) const
67-
void iterate(const std::function<bool(TType)> &iterator);
68+
void iterate(const std::function<bool(TType)> &iterator, bool skipBroken = false);
6869
//! @copybrief DataStore::clear()
6970
void clear();
7071

@@ -276,9 +277,9 @@ QList<TType> DataTypeStore<TType, TKey>::search(const QString &query, DataStore:
276277
}
277278

278279
template<typename TType, typename TKey>
279-
void DataTypeStore<TType, TKey>::iterate(const std::function<bool (TType)> &iterator)
280+
void DataTypeStore<TType, TKey>::iterate(const std::function<bool (TType)> &iterator, bool skipBroken)
280281
{
281-
_store->iterate(iterator);
282+
_store->iterate(iterator, skipBroken);
282283
}
283284

284285
template<typename TType, typename TKey>
@@ -296,11 +297,15 @@ TKey DataTypeStore<TType, TKey>::toKey(const QString &key)
296297
template <typename TType, typename TKey>
297298
void DataTypeStore<TType, TKey>::evalDataChanged(int metaTypeId, const QString &key, bool wasDeleted)
298299
{
299-
if(metaTypeId == qMetaTypeId<TType>()) {
300-
if(wasDeleted)
301-
emit dataChanged(key, QVariant());
302-
else
303-
emit dataChanged(key, QVariant::fromValue(_store->load<TType>(key)));
300+
try {
301+
if(metaTypeId == qMetaTypeId<TType>()) {
302+
if(wasDeleted)
303+
emit dataChanged(key, QVariant());
304+
else
305+
emit dataChanged(key, QVariant::fromValue(_store->load<TType>(key)));
306+
}
307+
} catch(QException &e) {
308+
qWarning(QLoggingCategory{qUtf8Printable(QStringLiteral("qtdatasync.%1.DataTypeStore"))}) << "Failed to loaded changed data with error" << e.what(); //TODO arg setup name
304309
}
305310
}
306311

@@ -323,14 +328,16 @@ CachingDataTypeStore<TType, TKey>::CachingDataTypeStore(DataStore *store, QObjec
323328
DataTypeStoreBase{parent},
324329
_store{store}
325330
{
326-
auto userProp = TType::staticMetaObject.userProperty();
327-
for(auto data : store->loadAll<TType>())
328-
_data.insert(userProp.readOnGadget(&data).template value<TKey>(), data);
329-
330331
connect(_store, &DataStore::dataChanged,
331332
this, &CachingDataTypeStore::evalDataChanged);
332333
connect(_store, &DataStore::dataResetted,
333334
this, &CachingDataTypeStore::evalDataResetted);
335+
336+
auto userProp = TType::staticMetaObject.userProperty();
337+
store->iterate<TType>([&](const TType &data){
338+
_data.insert(userProp.readOnGadget(&data).template value<TKey>(), data);
339+
return true;
340+
}, true);
334341
}
335342

336343
template<typename TType, typename TKey>
@@ -418,16 +425,20 @@ TKey CachingDataTypeStore<TType, TKey>::toKey(const QString &key)
418425
template <typename TType, typename TKey>
419426
void CachingDataTypeStore<TType, TKey>::evalDataChanged(int metaTypeId, const QString &key, bool wasDeleted)
420427
{
421-
if(metaTypeId == qMetaTypeId<TType>()) {
422-
auto rKey = toKey(key);
423-
if(wasDeleted) {
424-
_data.remove(rKey);
425-
emit dataChanged(key, QVariant());
426-
} else {
427-
auto data = _store->load<TType>(key);
428-
_data.insert(rKey, data);
429-
emit dataChanged(key, QVariant::fromValue(data));
428+
try {
429+
if(metaTypeId == qMetaTypeId<TType>()) {
430+
auto rKey = toKey(key);
431+
if(wasDeleted) {
432+
_data.remove(rKey);
433+
emit dataChanged(key, QVariant());
434+
} else {
435+
auto data = _store->load<TType>(key);
436+
_data.insert(rKey, data);
437+
emit dataChanged(key, QVariant::fromValue(data));
438+
}
430439
}
440+
} catch(QException &e) {
441+
qWarning(QLoggingCategory{qUtf8Printable(QStringLiteral("qtdatasync.%1.CachingDataTypeStore"))}) << "Failed to loaded changed data with error" << e.what(); //TODO arg setup name
431442
}
432443
}
433444

@@ -458,16 +469,17 @@ CachingDataTypeStore<TType*, TKey>::CachingDataTypeStore(DataStore *store, QObje
458469
_store{store}
459470

460471
{
461-
auto userProp = TType::staticMetaObject.userProperty();
462-
for(auto data : store->loadAll<TType*>()){
463-
data->setParent(this);
464-
_data.insert(userProp.read(data).template value<TKey>(), data);
465-
}
466-
467472
connect(_store, &DataStore::dataChanged,
468473
this, &CachingDataTypeStore::evalDataChanged);
469474
connect(_store, &DataStore::dataResetted,
470475
this, &CachingDataTypeStore::evalDataResetted);
476+
477+
auto userProp = TType::staticMetaObject.userProperty();
478+
store->iterate<TType*>([&](TType *data){
479+
data->setParent(this);
480+
_data.insert(userProp.read(data).template value<TKey>(), data);
481+
return true;
482+
}, true);
471483
}
472484

473485
template<typename TType, typename TKey>
@@ -561,28 +573,32 @@ TKey CachingDataTypeStore<TType*, TKey>::toKey(const QString &key)
561573
template <typename TType, typename TKey>
562574
void CachingDataTypeStore<TType*, TKey>::evalDataChanged(int metaTypeId, const QString &key, bool wasDeleted)
563575
{
564-
if(metaTypeId == qMetaTypeId<TType*>()) {
565-
auto rKey = toKey(key);
566-
if(wasDeleted) {
567-
auto data = _data.take(rKey);
568-
if(data) {
569-
emit dataChanged(key, QVariant());
570-
data->deleteLater();
571-
}
572-
} else {
573-
if(_data.contains(rKey)) {
574-
_store->update(_data.value(rKey));
575-
emit dataChanged(key, QVariant::fromValue(_data.value(rKey)));
576+
try {
577+
if(metaTypeId == qMetaTypeId<TType*>()) {
578+
auto rKey = toKey(key);
579+
if(wasDeleted) {
580+
auto data = _data.take(rKey);
581+
if(data) {
582+
emit dataChanged(key, QVariant());
583+
data->deleteLater();
584+
}
576585
} else {
577-
auto data = _store->load<TType*>(key);
578-
auto oldData = _data.take(rKey);
579-
data->setParent(this);
580-
_data.insert(rKey, data);
581-
emit dataChanged(key, QVariant::fromValue(data));
582-
if(oldData)
583-
oldData->deleteLater();
586+
if(_data.contains(rKey)) {
587+
_store->update(_data.value(rKey));
588+
emit dataChanged(key, QVariant::fromValue(_data.value(rKey)));
589+
} else {
590+
auto data = _store->load<TType*>(key);
591+
auto oldData = _data.take(rKey);
592+
data->setParent(this);
593+
_data.insert(rKey, data);
594+
emit dataChanged(key, QVariant::fromValue(data));
595+
if(oldData)
596+
oldData->deleteLater();
597+
}
584598
}
585599
}
600+
} catch(QException &e) {
601+
qWarning(QLoggingCategory{qUtf8Printable(QStringLiteral("qtdatasync.%1.CachingDataTypeStore"))}) << "Failed to loaded changed data with error" << e.what(); //TODO arg setup name
586602
}
587603
}
588604

0 commit comments

Comments
 (0)