Implemented delta message apply

This commit is contained in:
0xFEEDC0DE64
2018-09-01 18:54:05 +02:00
parent f25d88b68a
commit b7e0f1ff2a
5 changed files with 54 additions and 28 deletions
+30
View File
@@ -68,3 +68,33 @@ void DbMsgBase::copyTouchedTo(QVariantMap &variantMap) const
if(!clearedFields.isEmpty())
variantMap.insert(m_clearedFieldsName, clearedFields);
}
void DbMsgBase::apply(const QVariantMap &variantMap)
{
const auto fields = getFields();
for(auto iter = variantMap.cbegin(); iter != variantMap.cend(); iter++)
{
if(iter.key() == m_clearedFieldsName)
{
Q_ASSERT(iter.value().type() == QVariant::StringList);
for(const auto &clearedField : iter.value().toStringList())
{
Q_ASSERT(fields.contains(clearedField));
const auto field = fields.value(clearedField);
if(field->touched())
qWarning() << "delta message contained field which has been touched!";
field->clear();
field->setTouched(false);
}
}
else
{
Q_ASSERT(fields.contains(iter.key()));
const auto field = fields.value(iter.key());
if(field->touched())
qWarning() << "delta message contained field which has been touched!";
field->setVariant(iter.value());
field->setTouched(false);
}
}
}
+2
View File
@@ -25,6 +25,8 @@ public:
void copyTo(QVariantMap &variantMap) const;
void copyTouchedTo(QVariantMap &variantMap) const;
void apply(const QVariantMap &variantMap);
protected:
virtual QMap<QString, DbMsgFieldBase*> getFields() = 0;
virtual QMap<QString, const DbMsgFieldBase*> getFields() const = 0;
+10
View File
@@ -1,5 +1,7 @@
#pragma once
#include <QMetaType>
#include "dbmsgfieldbase.h"
#include "messagingcorelib_global.h"
@@ -16,6 +18,7 @@ public:
void clear() override;
QVariant toVariant() const override;
void setVariant(const QVariant &variant) override;
private:
T m_value;
@@ -67,3 +70,10 @@ QVariant DbMsgField<T>::toVariant() const
{
return getValue();
}
template<typename T>
void DbMsgField<T>::setVariant(const QVariant &variant)
{
Q_ASSERT(variant.type() == qMetaTypeId<T>());
m_value = variant.value<T>();
}
+1
View File
@@ -17,6 +17,7 @@ public:
void setTouched(bool touched);
virtual QVariant toVariant() const = 0;
virtual void setVariant(const QVariant &variant) = 0;
protected:
void setHasValue(bool hasValue);