Implemented delta message apply
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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>();
|
||||||
|
}
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user