1 #ifndef QTDATASYNC_DATATYPESTORE_H 2 #define QTDATASYNC_DATATYPESTORE_H 6 #include <QtCore/qobject.h> 7 #include <QtCore/qdebug.h> 9 #include "QtDataSync/qtdatasync_global.h" 10 #include "QtDataSync/datastore.h" 36 template <
typename TType,
typename TKey = QString>
39 QTDATASYNC_STORE_ASSERT(TType);
58 bool contains(
const TKey &key)
const;
60 TType
load(
const TKey &key)
const;
62 void save(
const TType &value);
64 bool remove(
const TKey &key);
66 template <
typename TX = TType>
67 void update(std::enable_if_t<__helpertypes::is_object<TX>::value, TX>
object)
const;
71 void iterate(
const std::function<
bool(TType)> &iterator,
bool skipBroken =
false);
81 void evalDataChanged(
int metaTypeId,
const QString &key,
bool wasDeleted);
85 template <
typename TType,
typename TKey = QString>
88 static_assert(__helpertypes::is_gadget<TType>::value,
"TType must be a Q_GADGET");
106 qint64
count()
const;
110 bool contains(
const TKey &key)
const;
114 TType
load(
const TKey &key)
const;
116 void save(
const TType &value);
118 bool remove(
const TKey &key);
120 TType
take(
const TKey &key);
136 void evalDataChanged(
int metaTypeId,
const QString &key,
bool wasDeleted);
137 void evalDataResetted();
141 template <
typename TType,
typename TKey>
144 static_assert(__helpertypes::is_object<TType*>::value,
"TType must inherit QObject");
162 qint64 count()
const;
166 bool contains(
const TKey &key)
const;
170 TType* load(
const TKey &key)
const;
172 void save(TType *value);
174 bool remove(
const TKey &key);
176 TType* take(
const TKey &key);
186 static TKey toKey(
const QString &key);
192 void evalDataChanged(
int metaTypeId,
const QString &key,
bool wasDeleted);
193 void evalDataResetted();
198 template <
typename TType,
typename TKey>
203 template <
typename TType,
typename TKey>
210 template <
typename TType,
typename TKey>
216 this, &DataTypeStore::evalDataChanged);
221 template<
typename TType,
typename TKey>
227 template <
typename TType,
typename TKey>
230 return _store->count<TType>();
233 template <
typename TType,
typename TKey>
236 return _store->keys<TType, TKey>();
239 template <
typename TType,
typename TKey>
242 return _store->loadAll<TType>();
245 template<
typename TType,
typename TKey>
248 return _store->contains<TType>(key);
251 template <
typename TType,
typename TKey>
254 return _store->load<TType>(key);
257 template <
typename TType,
typename TKey>
263 template <
typename TType,
typename TKey>
266 return _store->remove<TType>(key);
269 template<
typename TType,
typename TKey>
270 template <
typename TX>
273 _store->update<TType>(object);
276 template<
typename TType,
typename TKey>
279 return _store->search<TType>(query, mode);
282 template<
typename TType,
typename TKey>
285 _store->iterate(iterator, skipBroken);
288 template<
typename TType,
typename TKey>
291 _store->clear<TType>();
294 template<
typename TType,
typename TKey>
300 template <
typename TType,
typename TKey>
304 if(metaTypeId == qMetaTypeId<TType>()) {
311 qWarning(
QLoggingCategory{qUtf8Printable(QStringLiteral(
"qtdatasync.%1.DataTypeStore").arg(setupName()))})
312 <<
"Failed to loaded changed data with error" << e.what();
318 template <
typename TType,
typename TKey>
323 template <
typename TType,
typename TKey>
330 template <
typename TType,
typename TKey>
336 this, &CachingDataTypeStore::evalDataChanged);
338 this, &CachingDataTypeStore::evalDataResetted);
340 auto userProp = TType::staticMetaObject.userProperty();
341 store->iterate<TType>([&](
const TType &data){
342 _data.insert(userProp.readOnGadget(&data).template value<TKey>(), data);
347 template<
typename TType,
typename TKey>
353 template <
typename TType,
typename TKey>
359 template <
typename TType,
typename TKey>
365 template<
typename TType,
typename TKey>
368 return _data.contains(key);
371 template <
typename TType,
typename TKey>
374 return _data.values();
377 template <
typename TType,
typename TKey>
380 return _data.value(key);
383 template <
typename TType,
typename TKey>
389 template <
typename TType,
typename TKey>
395 template<
typename TType,
typename TKey>
398 auto mData = _data.value(key);
405 template<
typename TType,
typename TKey>
408 _store->clear<TType>();
411 template<
typename TType,
typename TKey>
414 return _data.constBegin();
417 template<
typename TType,
typename TKey>
420 return _data.constEnd();
423 template<
typename TType,
typename TKey>
429 template <
typename TType,
typename TKey>
433 if(metaTypeId == qMetaTypeId<TType>()) {
434 auto rKey = toKey(key);
439 auto data = _store->load<TType>(key);
440 _data.insert(rKey, data);
445 qWarning(
QLoggingCategory{qUtf8Printable(QStringLiteral(
"qtdatasync.%1.CachingDataTypeStore").arg(setupName()))})
446 <<
"Failed to loaded changed data with error" << e.what();
450 template <
typename TType,
typename TKey>
451 void CachingDataTypeStore<TType, TKey>::evalDataResetted()
459 template <
typename TType,
typename TKey>
464 template <
typename TType,
typename TKey>
471 template <
typename TType,
typename TKey>
478 this, &CachingDataTypeStore::evalDataChanged);
480 this, &CachingDataTypeStore::evalDataResetted);
482 auto userProp = TType::staticMetaObject.userProperty();
483 store->iterate<TType*>([&](TType *data){
484 data->setParent(
this);
485 _data.insert(userProp.read(data).template value<TKey>(), data);
490 template<
typename TType,
typename TKey>
496 template <
typename TType,
typename TKey>
502 template <
typename TType,
typename TKey>
508 template<
typename TType,
typename TKey>
514 template <
typename TType,
typename TKey>
520 template <
typename TType,
typename TKey>
523 return _data.
value(key);
526 template <
typename TType,
typename TKey>
532 template <
typename TType,
typename TKey>
535 return _store->
remove<TType*>(key);
538 template<
typename TType,
typename TKey>
541 auto mData = _data.
take(key);
549 mData->setParent(
nullptr);
554 template<
typename TType,
typename TKey>
557 _store->
clear<TType*>();
560 template<
typename TType,
typename TKey>
566 template<
typename TType,
typename TKey>
572 template<
typename TType,
typename TKey>
578 template <
typename TType,
typename TKey>
582 if(metaTypeId == qMetaTypeId<TType*>()) {
583 auto rKey =
toKey(key);
585 auto data = _data.
take(rKey);
595 auto data = _store->
load<TType*>(key);
596 auto oldData = _data.
take(rKey);
597 data->setParent(
this);
601 oldData->deleteLater();
607 <<
"Failed to loaded changed data with error" << e.what();
611 template <
typename TType,
typename TKey>
612 void CachingDataTypeStore<TType*, TKey>::evalDataResetted()
623 #endif // QTDATASYNC_DATATYPESTORE_H void save(const TType &value)
Saves the given dataset in the store.
static TKey toKey(const QString &key)
Shortcut to convert a string to the stores key type.
void update(int metaTypeId, QObject *object) const
Loads the dataset with the given key for the given type into the existing object by updating it's pro...
bool contains(const TKey &key) const
Checks if a dataset exists in the store for the given key.
void update(std::enable_if_t< __helpertypes::is_object< TX >::value, TX > object) const
Loads the dataset with the given key for the given type into the existing object by updating it's pro...
const_iterator end() const
Returns the end iterator of the internal hash.
QList< TType > loadAll() const
Loads all existing datasets for the given type.
CachingDataTypeStore(QObject *parent=nullptr)
Constructs a store for the default setup.
QHash::iterator insert(const Key &key, const T &value)
TType load(const TKey &key) const
Loads the dataset with the given key for the given type.
QList< TType > loadAll() const
Loads all existing datasets for the given type.
Main store to generically access all stored data synchronously.
TType take(const TKey &key)
Returns the dataset for the given key and removes it from the store.
A wrapper around the DataStore limited to one type to make access simpler.
void dataChanged(const QString &key, const QVariant &value)
Will be emitted when a dataset in the store has changed.
DataTypeStore(QObject *parent=nullptr)
Constructs a store for the default setup.
void dataChanged(int metaTypeId, const QString &key, bool deleted, QPrivateSignal)
Is emitted whenever a dataset has been changed.
typename QHash< TKey, TType * >::const_iterator const_iterator
Typedef for QHash::const_iterator.
bool remove(const TKey &key)
Removes the dataset with the given key for the given type.
const_iterator begin() const
Returns the begin iterator of the internal hash.
void clear(int metaTypeId)
Removes all datasets of the given type from the store.
typename QHash< TKey, TType >::const_iterator const_iterator
Typedef for QHash::const_iterator.
QVariant load(int metaTypeId, const QString &key) const
Loads the dataset with the given key for the given type.
Base class for all DataTypeStore like classes.
TType load(const TKey &key) const
Loads the dataset with the given key for the given type.
const_iterator iterator
Typedef for QHash::const_iterator.
QHash::const_iterator constEnd() const const
bool remove(const TKey &key)
Removes the dataset with the given key for the given type.
bool contains(const TKey &key) const
Checks if a dataset exists in the store for the given key.
void dataResetted(QPrivateSignal)
Is emitted when the store is resetted due to an account reset.
bool remove(int metaTypeId, const QString &key)
Removes the dataset with the given key for the given type.
void save(int metaTypeId, QVariant value)
Saves the given dataset in the store.
The primary namespace of the QtDataSync library.
void clear()
Removes all datasets of the given type from the store.
QList< Key > keys() const const
Q_DATASYNC_EXPORT const QString DefaultSetup
The default setup name.
const T value(const Key &key) const const
void setParent(QObject *parent)
QVariant fromValue(const T &value)
QList< TType > search(const QString &query, DataStore::SearchMode mode=DataStore::RegexpMode)
Searches the store for datasets of the given type where the key matches the query.
void iterate(const std::function< bool(TType)> &iterator, bool skipBroken=false)
Iterates over all existing datasets of the given types.
QHash::const_iterator constBegin() const const
qint64 count() const
Counts the number of datasets for the given type.
SearchMode
Possible pattern modes for the search mechanism.
const_iterator iterator
Typedef for QHash::const_iterator.
DataStore * store() const override
Returns a reference to the internally used DataStore.
QList< T > values() const const
qint64 count() const
Counts the number of datasets for the given type.
Interpret the search string as a regular expression. See QRegularExpression.
void clear()
Removes all datasets of the given type from the store.
bool contains(const Key &key) const const
void save(const TType &value)
Saves the given dataset in the store.
QList< TKey > keys() const
Returns all saved keys for the given type.
A DataTypeStore that caches all loaded data internally for faster access.
DataStore * store() const override
Returns a reference to the internally used DataStore.
QObject * parent() const const
void dataResetted()
Will be emitted when the store was reset or cleared.
static TKey toKey(const QString &key)
Shortcut to convert a string to the stores key type.
QString toString() const const
QString setupName() const
Returns the name of the setup this class operates on.
QList< TKey > keys() const
Returns all saved keys for the given type.