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
278279template <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
284285template <typename TType, typename TKey>
@@ -296,11 +297,15 @@ TKey DataTypeStore<TType, TKey>::toKey(const QString &key)
296297template <typename TType, typename TKey>
297298void 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
336343template <typename TType, typename TKey>
@@ -418,16 +425,20 @@ TKey CachingDataTypeStore<TType, TKey>::toKey(const QString &key)
418425template <typename TType, typename TKey>
419426void 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
473485template <typename TType, typename TKey>
@@ -561,28 +573,32 @@ TKey CachingDataTypeStore<TType*, TKey>::toKey(const QString &key)
561573template <typename TType, typename TKey>
562574void 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