From e1b40f54cb6409a686fce7cc881fda6f7638cc46 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Tue, 2 Feb 2016 22:51:08 +0000 Subject: [PATCH] refs #581 Allow setting the timestamp when putting a value in the cache. --- src/blackmisc/datacache.h | 2 +- src/blackmisc/valuecache.cpp | 7 ++++--- src/blackmisc/valuecache.h | 4 ++-- src/blackmisc/valuecacheprivate.h | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/blackmisc/datacache.h b/src/blackmisc/datacache.h index 023d2ce10..08455f271 100644 --- a/src/blackmisc/datacache.h +++ b/src/blackmisc/datacache.h @@ -178,7 +178,7 @@ namespace BlackMisc QString getFilename() const { return CDataCache::filenameForKey(this->getKey()); } //! Data cache doesn't support setAndSave (because set() already causes save anyway). - CStatusMessage setAndSave(const typename Trait::type &value) = delete; + CStatusMessage setAndSave(const typename Trait::type &value, qint64 timestamp = 0) = delete; }; /*! diff --git a/src/blackmisc/valuecache.cpp b/src/blackmisc/valuecache.cpp index 17b1329d5..5d0265195 100644 --- a/src/blackmisc/valuecache.cpp +++ b/src/blackmisc/valuecache.cpp @@ -410,11 +410,12 @@ namespace BlackMisc return element.m_value.read(); } - CStatusMessage CValuePage::setValue(Element &element, const CVariant &value, bool save) + CStatusMessage CValuePage::setValue(Element &element, const CVariant &value, qint64 timestamp, bool save) { Q_ASSERT(QThread::currentThread() == thread()); - if (element.m_value.read() == value) { return {}; } + if (timestamp == 0) { timestamp = QDateTime::currentMSecsSinceEpoch(); } + if (element.m_value.read() == value && element.m_timestamp == timestamp) { return {}; } auto error = validate(element, value); if (error.isEmpty()) @@ -430,7 +431,7 @@ namespace BlackMisc element.m_saved = save; element.m_value.uniqueWrite() = value; - emit valuesWantToCache({ { { element.m_key, value } }, QDateTime::currentMSecsSinceEpoch(), save }); + emit valuesWantToCache({ { { element.m_key, value } }, timestamp, save }); } } else diff --git a/src/blackmisc/valuecache.h b/src/blackmisc/valuecache.h index dec46533d..5b96e12ce 100644 --- a/src/blackmisc/valuecache.h +++ b/src/blackmisc/valuecache.h @@ -279,10 +279,10 @@ namespace BlackMisc const T &get() const { static const T empty {}; return *(isValid() ? static_cast(getVariant().data()) : &empty); } //! Write a new value. Must be called from the thread in which the owner lives. - CStatusMessage set(const T &value) { return m_page.setValue(m_element, CVariant::from(value)); } + CStatusMessage set(const T &value, qint64 timestamp = 0) { return m_page.setValue(m_element, CVariant::from(value), timestamp); } //! Write and save in the same step. Must be called from the thread in which the owner lives. - CStatusMessage setAndSave(const T &value) { return m_page.setValue(m_element, CVariant::from(value), true); } + CStatusMessage setAndSave(const T &value, qint64 timestamp = 0) { return m_page.setValue(m_element, CVariant::from(value), timestamp, true); } //! Get the key string of this value. const QString &getKey() const { return m_page.getKey(m_element); } diff --git a/src/blackmisc/valuecacheprivate.h b/src/blackmisc/valuecacheprivate.h index 255b4efec..533aa3ac9 100644 --- a/src/blackmisc/valuecacheprivate.h +++ b/src/blackmisc/valuecacheprivate.h @@ -62,7 +62,7 @@ namespace BlackMisc const CVariant &getValue(const Element &element) const; //! Write the value corresponding to the element's key and begin synchronizing it to any other pages. - CStatusMessage setValue(Element &element, const CVariant &value, bool save = false); + CStatusMessage setValue(Element &element, const CVariant &value, qint64 timestamp, bool save = false); //! Get the key string corresponding to the element. const QString &getKey(const Element &element) const;