Implemented delta message apply
This commit is contained in:
@@ -7,39 +7,22 @@ int main(int argc, char **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;
|
||||
message.copyTo(map);
|
||||
qDebug() << "full" << map;
|
||||
original.setName("Peter");
|
||||
|
||||
QVariantMap delta;
|
||||
original.copyTouchedTo(delta);
|
||||
original.setTouched(false);
|
||||
|
||||
qDebug() << "before applying delta";
|
||||
copy.debug();
|
||||
|
||||
qDebug() << "changing name...";
|
||||
copy.apply(delta);
|
||||
|
||||
message.setName("Peter");
|
||||
|
||||
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;
|
||||
qDebug() << "after applying delta";
|
||||
copy.debug();
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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>();
|
||||
}
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user