From c467f2b2451afe41032e5251a7e2c21166e32c3e Mon Sep 17 00:00:00 2001 From: john Date: Sun, 2 Dec 2018 12:22:37 +0100 Subject: [PATCH] add MessageMap::findAll changedSince argument to distinguish touched/changed for since/until range --- src/ebusd/bushandler.cpp | 2 +- src/ebusd/datahandler.h | 2 +- src/ebusd/mainloop.cpp | 14 +++++++------- src/lib/ebus/message.cpp | 6 +++--- src/lib/ebus/message.h | 3 ++- src/lib/ebus/test/test_message.cpp | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index 9ca23246..42f06491 100755 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -1197,7 +1197,7 @@ result_t BusHandler::prepareScan(symbol_t slave, bool full, const string& levels return RESULT_OK; } deque messages; - m_messages->findAll("scan", "", levels, true, true, false, false, true, true, 0, 0, &messages); + m_messages->findAll("scan", "", levels, true, true, false, false, true, true, 0, 0, false, &messages); auto it = messages.begin(); while (it != messages.end()) { Message* message = *it; diff --git a/src/ebusd/datahandler.h b/src/ebusd/datahandler.h index c73fa448..253386c6 100755 --- a/src/ebusd/datahandler.h +++ b/src/ebusd/datahandler.h @@ -149,7 +149,7 @@ class DataSink : virtual public DataHandler { bool isDataSink() const override { return true; } /** - * Notify the sink of an updated @a Message. + * Notify the sink of an updated @a Message (not necessarily changed though). * @param message the updated @a Message. */ virtual void notifyUpdate(Message* message); diff --git a/src/ebusd/mainloop.cpp b/src/ebusd/mainloop.cpp index 7d459319..ffe00370 100755 --- a/src/ebusd/mainloop.cpp +++ b/src/ebusd/mainloop.cpp @@ -359,7 +359,7 @@ void MainLoop::run() { time(&now); if (!dataSinks.empty()) { messages.clear(); - m_messages->findAll("", "", "*", false, true, true, true, true, true, sinkSince, now, &messages); + m_messages->findAll("", "", "*", false, true, true, true, true, true, sinkSince, now, false, &messages); for (const auto message : messages) { for (const auto dataSink : dataSinks) { dataSink->notifyUpdate(message); @@ -403,7 +403,7 @@ void MainLoop::run() { if (listening) { string levels = getUserLevels(user); messages.clear(); - m_messages->findAll("", "", levels, false, true, true, true, true, true, since, now, &messages); + m_messages->findAll("", "", levels, false, true, true, true, true, true, since, now, true, &messages); for (const auto message : messages) { ostream << message->getCircuit() << " " << message->getName() << " = " << dec; message->decodeLastData(false, nullptr, -1, 0, &ostream); @@ -867,7 +867,7 @@ result_t MainLoop::executeRead(const vector& args, const string& levels, return RESULT_OK; } deque messages; - m_newlyDefinedMessages->findAll("", "", levels, false, true, false, false, true, false, 0, 0, &messages); + m_newlyDefinedMessages->findAll("", "", levels, false, true, false, false, true, false, 0, 0, false, &messages); if (messages.empty()) { *ostream << "ERR: bad definition: no read message"; return RESULT_OK; @@ -1082,7 +1082,7 @@ result_t MainLoop::executeWrite(const vector& args, const string levels, return RESULT_OK; } deque messages; - m_newlyDefinedMessages->findAll("", "", levels, false, false, true, false, true, false, 0, 0, &messages); + m_newlyDefinedMessages->findAll("", "", levels, false, false, true, false, true, false, 0, 0, false, &messages); if (messages.empty()) { *ostream << "ERR: bad definition: no write message"; return RESULT_OK; @@ -1325,7 +1325,7 @@ result_t MainLoop::executeFind(const vector& args, const string& levels, } deque messages; m_messages->findAll(circuit, args.size() == argPos ? "" : args[argPos], useLevels, - exact, withRead, withWrite, withPassive, userLevel, !withConditions, 0, 0, &messages); + exact, withRead, withWrite, withPassive, userLevel, !withConditions, 0, 0, false, &messages); bool found = false; char str[32]; @@ -1910,8 +1910,8 @@ result_t MainLoop::executeGet(const vector& args, bool* connected, ostri verbosity |= (valueName ? OF_VALUENAME : numeric ? OF_NUMERIC : 0) | OF_JSON | (full ? OF_ALL_ATTRS : 0) | (withDefinition ? OF_DEFINTION : 0); deque messages; - m_messages->findAll(circuit, name, getUserLevels(user), exact, true, withWrite, true, true, true, 0, 0, - &messages); + m_messages->findAll(circuit, name, getUserLevels(user), exact, true, withWrite, true, true, true, 0, 0, false, + &messages); string lastName; for (deque::iterator it = messages.begin(); it != messages.end(); it++) { Message* message = *it; diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index f525b310..5bb97027 100755 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -2506,7 +2506,7 @@ Message* MessageMap::find(const string& circuit, const string& name, const strin void MessageMap::findAll(const string& circuit, const string& name, const string& levels, bool completeMatch, bool withRead, bool withWrite, bool withPassive, bool includeEmptyLevel, bool onlyAvailable, - time_t since, time_t until, deque* messages) const { + time_t since, time_t until, bool changedSince, deque* messages) const { string lcircuit = circuit; FileReader::tolower(&lcircuit); string lname = name; @@ -2553,7 +2553,7 @@ void MessageMap::findAll(const string& circuit, const string& name, const string if (message->getDstAddress() == SYN) { continue; } - time_t lastchg = message->getLastChangeTime(); + time_t lastchg = changedSince ? message->getLastChangeTime() : message->getLastUpdateTime(); if ((since != 0 && lastchg < since) || (until != 0 && lastchg >= until)) { continue; @@ -2647,7 +2647,7 @@ void MessageMap::invalidateCache(Message* message) { string circuit = message->getCircuit(); string name = message->getName(); deque messages; - findAll(circuit, name, "*", true, true, true, true, true, true, 0, 0, &messages); + findAll(circuit, name, "*", true, true, true, true, true, true, 0, 0, false, &messages); for (auto checkMessage : messages) { if (checkMessage != message) { checkMessage->m_lastUpdateTime = 0; diff --git a/src/lib/ebus/message.h b/src/lib/ebus/message.h index 2cfe44a2..daf7fd80 100755 --- a/src/lib/ebus/message.h +++ b/src/lib/ebus/message.h @@ -1403,11 +1403,12 @@ class MessageMap : public MappedFileReader { * address), or 0 to ignore. * @param until the end time to which to add updates (exclusive, also removes messages with unset destination * address), or 0 to ignore. + * @changedSince true to use the last change time for the since/until range, false to use the last seen time. * @param messages the @a deque to which to add the found @a Message instances. */ void findAll(const string& circuit, const string& name, const string& levels, bool completeMatch, bool withRead, bool withWrite, bool withPassive, bool includeEmptyLevel, bool onlyAvailable, - time_t since, time_t until, deque* messages) const; + time_t since, time_t until, bool changedSince, deque* messages) const; /** * Find the @a Message instance for the specified master data. diff --git a/src/lib/ebus/test/test_message.cpp b/src/lib/ebus/test/test_message.cpp index b409ffab..16d54bc0 100755 --- a/src/lib/ebus/test/test_message.cpp +++ b/src/lib/ebus/test/test_message.cpp @@ -367,7 +367,7 @@ int main() { continue; } deque msgs; - messages->findAll("", "", "*", false, true, true, true, true, false, 0, 0, &msgs); + messages->findAll("", "", "*", false, true, true, true, true, false, 0, 0, false, &msgs); if (msgs.empty()) { message = nullptr; cout << "\"" << check[0] << "\": create error: message not found" << endl;