Fields can now be cleared

This commit is contained in:
0xFEEDC0DE64
2018-09-01 17:52:29 +02:00
parent 562e7187b4
commit eb64b217f0
3 changed files with 72 additions and 15 deletions

View File

@@ -13,6 +13,10 @@ int main(int argc, char **argv)
message.copyTo(map); message.copyTo(map);
qDebug() << "full" << map; qDebug() << "full" << map;
qDebug() << "changing name...";
message.setName("Peter"); message.setName("Peter");
map.clear(); map.clear();
@@ -23,9 +27,15 @@ int main(int argc, char **argv)
message.copyTouchedTo(map); message.copyTouchedTo(map);
qDebug() << "delta:" << map; qDebug() << "delta:" << map;
qDebug() << "clearing touched...";
message.setTouched(false);
qDebug() << "clearing name...";
message.nameField().clear();
map.clear();
message.copyTo(map);
qDebug() << "full" << map;
map.clear(); map.clear();
message.copyTouchedTo(map); message.copyTouchedTo(map);

View File

@@ -7,7 +7,7 @@
#include <algorithm> #include <algorithm>
DbMsgFieldBase::DbMsgFieldBase() : DbMsgFieldBase::DbMsgFieldBase() :
m_touched(false) m_hasValue(false), m_touched(false)
{ {
} }
@@ -15,6 +15,16 @@ DbMsgFieldBase::~DbMsgFieldBase()
{ {
} }
bool DbMsgFieldBase::hasValue() const
{
return m_hasValue;
}
void DbMsgFieldBase::clear()
{
m_hasValue = false;
}
bool DbMsgFieldBase::touched() const bool DbMsgFieldBase::touched() const
{ {
return m_touched; return m_touched;
@@ -25,6 +35,16 @@ void DbMsgFieldBase::setTouched(bool touched)
m_touched = touched; m_touched = touched;
} }
void DbMsgFieldBase::setHasValue(bool hasValue)
{
if(m_hasValue && !hasValue)
clear();
else
m_hasValue = hasValue;
}
const QString DbMsgBase::m_clearedFieldsName(QStringLiteral("__CLEARED_FIELDS"));
DbMsgBase::DbMsgBase() DbMsgBase::DbMsgBase()
{ {
} }
@@ -62,7 +82,16 @@ void DbMsgBase::copyTo(QVariantMap &variantMap) const
{ {
const auto fields = getFields(); const auto fields = getFields();
for(auto iter = fields.cbegin(); iter != fields.cend(); iter++) for(auto iter = fields.cbegin(); iter != fields.cend(); iter++)
variantMap.insert(iter.key(), iter.value()->getVariant()); {
const auto key = iter.key();
const auto field = iter.value();
const auto hasValue = field->hasValue();
const auto variant = field->getVariant();
if(hasValue)
variantMap.insert(key, variant);
else
qWarning() << key << "has no value for full transmission!";
}
} }
void DbMsgBase::copyTouchedTo(QJsonObject &jsonObject) const void DbMsgBase::copyTouchedTo(QJsonObject &jsonObject) const
@@ -73,8 +102,18 @@ void DbMsgBase::copyTouchedTo(QJsonObject &jsonObject) const
void DbMsgBase::copyTouchedTo(QVariantMap &variantMap) const void DbMsgBase::copyTouchedTo(QVariantMap &variantMap) const
{ {
QStringList clearedFields;
const auto fields = getFields(); const auto fields = getFields();
for(auto iter = fields.cbegin(); iter != fields.cend(); iter++) for(auto iter = fields.cbegin(); iter != fields.cend(); iter++)
if(iter.value()->touched()) if(iter.value()->touched())
variantMap.insert(iter.key(), iter.value()->getVariant()); {
if(iter.value()->hasValue())
variantMap.insert(iter.key(), iter.value()->getVariant());
else
clearedFields.append(iter.key());
}
if(!clearedFields.isEmpty())
variantMap.insert(m_clearedFieldsName, clearedFields);
} }

View File

@@ -12,12 +12,19 @@ public:
DbMsgFieldBase(); DbMsgFieldBase();
virtual ~DbMsgFieldBase(); virtual ~DbMsgFieldBase();
bool hasValue() const;
virtual void clear();
bool touched() const; bool touched() const;
void setTouched(bool touched); void setTouched(bool touched);
virtual QVariant getVariant() const = 0; virtual QVariant getVariant() const = 0;
protected:
void setHasValue(bool hasValue);
private: private:
bool m_hasValue;
bool m_touched; bool m_touched;
}; };
@@ -32,27 +39,25 @@ public:
const T &getValue() const; const T &getValue() const;
void setValue(const T &value); void setValue(const T &value);
bool hasValue() const; void clear() override;
QVariant getVariant() const override;
QVariant getVariant() const;
private: private:
T m_value; T m_value;
bool m_hasValue;
}; };
template<typename T> template<typename T>
DbMsgField<T>::DbMsgField() : DbMsgField<T>::DbMsgField() :
DbMsgFieldBase(), DbMsgFieldBase()
m_hasValue(false)
{ {
} }
template<typename T> template<typename T>
DbMsgField<T>::DbMsgField(const T &value) : DbMsgField<T>::DbMsgField(const T &value) :
DbMsgFieldBase(), DbMsgFieldBase(),
m_value(value), m_hasValue(true) m_value(value)
{ {
setHasValue(true);
} }
template<typename T> template<typename T>
@@ -70,15 +75,16 @@ const T &DbMsgField<T>::getValue() const
template<typename T> template<typename T>
void DbMsgField<T>::setValue(const T &value) void DbMsgField<T>::setValue(const T &value)
{ {
m_hasValue = true;
m_value = value; m_value = value;
setHasValue(true);
setTouched(true); setTouched(true);
} }
template<typename T> template<typename T>
bool DbMsgField<T>::hasValue() const void DbMsgField<T>::clear()
{ {
return m_hasValue; DbMsgFieldBase::clear();
m_value = T();
} }
template<typename T> template<typename T>
@@ -89,6 +95,8 @@ QVariant DbMsgField<T>::getVariant() const
class DbMsgBase class DbMsgBase
{ {
static const QString m_clearedFieldsName;
public: public:
DbMsgBase(); DbMsgBase();
virtual ~DbMsgBase(); virtual ~DbMsgBase();