From b7e0f1ff2a404d49873c8e703724f18e93c35b11 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Sat, 1 Sep 2018 18:54:05 +0200 Subject: [PATCH] Implemented delta message apply --- messagingclient/main.cpp | 39 +++++++++---------------------- messagingcorelib/dbmsgbase.cpp | 30 ++++++++++++++++++++++++ messagingcorelib/dbmsgbase.h | 2 ++ messagingcorelib/dbmsgfield.h | 10 ++++++++ messagingcorelib/dbmsgfieldbase.h | 1 + 5 files changed, 54 insertions(+), 28 deletions(-) diff --git a/messagingclient/main.cpp b/messagingclient/main.cpp index ae2b587..6334f40 100644 --- a/messagingclient/main.cpp +++ b/messagingclient/main.cpp @@ -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(); } diff --git a/messagingcorelib/dbmsgbase.cpp b/messagingcorelib/dbmsgbase.cpp index f5fb834..ad62013 100644 --- a/messagingcorelib/dbmsgbase.cpp +++ b/messagingcorelib/dbmsgbase.cpp @@ -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); + } + } +} diff --git a/messagingcorelib/dbmsgbase.h b/messagingcorelib/dbmsgbase.h index 2df545d..06e53e9 100644 --- a/messagingcorelib/dbmsgbase.h +++ b/messagingcorelib/dbmsgbase.h @@ -25,6 +25,8 @@ public: void copyTo(QVariantMap &variantMap) const; void copyTouchedTo(QVariantMap &variantMap) const; + void apply(const QVariantMap &variantMap); + protected: virtual QMap getFields() = 0; virtual QMap getFields() const = 0; diff --git a/messagingcorelib/dbmsgfield.h b/messagingcorelib/dbmsgfield.h index dac230f..7e7f488 100644 --- a/messagingcorelib/dbmsgfield.h +++ b/messagingcorelib/dbmsgfield.h @@ -1,5 +1,7 @@ #pragma once +#include + #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::toVariant() const { return getValue(); } + +template +void DbMsgField::setVariant(const QVariant &variant) +{ + Q_ASSERT(variant.type() == qMetaTypeId()); + m_value = variant.value(); +} diff --git a/messagingcorelib/dbmsgfieldbase.h b/messagingcorelib/dbmsgfieldbase.h index 5c1a3b4..52c91dd 100644 --- a/messagingcorelib/dbmsgfieldbase.h +++ b/messagingcorelib/dbmsgfieldbase.h @@ -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);