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

View File

@@ -7,39 +7,22 @@ int main(int argc, char **argv)
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
MyMessage message("Daniel", QDate(1996, 11, 12), QDateTime::currentDateTime(), 21, 80); MyMessage original("Daniel", QDate(1996, 11, 12), QDateTime::currentDateTime(), 21, 80);
MyMessage copy(original);
QVariantMap map; original.setName("Peter");
message.copyTo(map);
qDebug() << "full" << map;
QVariantMap delta;
original.copyTouchedTo(delta);
original.setTouched(false);
qDebug() << "before applying delta";
copy.debug();
qDebug() << "changing name..."; copy.apply(delta);
message.setName("Peter"); qDebug() << "after applying delta";
copy.debug();
map.clear();
message.copyTo(map);
qDebug() << "full" << map;
map.clear();
message.copyTouchedTo(map);
qDebug() << "delta:" << map;
qDebug() << "clearing name...";
message.nameField().clear();
map.clear();
message.copyTo(map);
qDebug() << "full" << map;
map.clear();
message.copyTouchedTo(map);
qDebug() << "delta:" << map;
return app.exec(); return app.exec();
} }

View File

@@ -68,3 +68,33 @@ void DbMsgBase::copyTouchedTo(QVariantMap &variantMap) const
if(!clearedFields.isEmpty()) if(!clearedFields.isEmpty())
variantMap.insert(m_clearedFieldsName, clearedFields); 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);
}
}
}

View File

@@ -25,6 +25,8 @@ public:
void copyTo(QVariantMap &variantMap) const; void copyTo(QVariantMap &variantMap) const;
void copyTouchedTo(QVariantMap &variantMap) const; void copyTouchedTo(QVariantMap &variantMap) const;
void apply(const QVariantMap &variantMap);
protected: protected:
virtual QMap<QString, DbMsgFieldBase*> getFields() = 0; virtual QMap<QString, DbMsgFieldBase*> getFields() = 0;
virtual QMap<QString, const DbMsgFieldBase*> getFields() const = 0; virtual QMap<QString, const DbMsgFieldBase*> getFields() const = 0;

View File

@@ -1,5 +1,7 @@
#pragma once #pragma once
#include <QMetaType>
#include "dbmsgfieldbase.h" #include "dbmsgfieldbase.h"
#include "messagingcorelib_global.h" #include "messagingcorelib_global.h"
@@ -16,6 +18,7 @@ public:
void clear() override; void clear() override;
QVariant toVariant() const override; QVariant toVariant() const override;
void setVariant(const QVariant &variant) override;
private: private:
T m_value; T m_value;
@@ -67,3 +70,10 @@ QVariant DbMsgField<T>::toVariant() const
{ {
return getValue(); return getValue();
} }
template<typename T>
void DbMsgField<T>::setVariant(const QVariant &variant)
{
Q_ASSERT(variant.type() == qMetaTypeId<T>());
m_value = variant.value<T>();
}

View File

@@ -17,6 +17,7 @@ public:
void setTouched(bool touched); void setTouched(bool touched);
virtual QVariant toVariant() const = 0; virtual QVariant toVariant() const = 0;
virtual void setVariant(const QVariant &variant) = 0;
protected: protected:
void setHasValue(bool hasValue); void setHasValue(bool hasValue);