Skip to content

Commit 5565601

Browse files
authored
Improve rules database handling (dresden-elektronik#7672)
- Only store than needed and on application exit. - Fix store/reload timestriggered and lasttriggered.
1 parent 7f3c45c commit 5565601

File tree

5 files changed

+46
-15
lines changed

5 files changed

+46
-15
lines changed

database.cpp

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3251,6 +3251,17 @@ static int sqliteLoadAllRulesCallback(void *user, int ncols, char **colval , cha
32513251
{
32523252
rule.etag = val;
32533253
}
3254+
else if (strcmp(colname[i], "lasttriggered") == 0)
3255+
{
3256+
if (colval[i][0] >= '0' && colval[i][0] <= '9') // isdigit()
3257+
{
3258+
rule.m_lastTriggered = QDateTime::fromString(val, QLatin1String("yyyy-MM-ddTHH:mm:ssZ"));
3259+
}
3260+
}
3261+
else if (strcmp(colname[i], "timestriggered") == 0)
3262+
{
3263+
rule.setTimesTriggered(val.toUInt());
3264+
}
32543265
else if (strcmp(colname[i], "owner") == 0)
32553266
{
32563267
rule.setOwner(val);
@@ -5423,11 +5434,18 @@ void DeRestPluginPrivate::saveDb()
54235434
// save/delete rules
54245435
if (saveDatabaseItems & DB_RULES)
54255436
{
5426-
std::vector<Rule>::const_iterator i = rules.begin();
5427-
std::vector<Rule>::const_iterator end = rules.end();
5437+
auto i = rules.begin();
5438+
const auto end = rules.end();
54285439

54295440
for (; i != end; ++i)
54305441
{
5442+
if (!i->needSaveDatabase())
5443+
{
5444+
continue;
5445+
}
5446+
5447+
i->clearNeedSaveDatabase();
5448+
54315449
const QString &rid = i->id();
54325450

54335451
if (i->state() == Rule::StateDeleted)
@@ -5453,19 +5471,23 @@ void DeRestPluginPrivate::saveDb()
54535471

54545472
QString actionsJSON = Rule::actionsToString(i->actions());
54555473
QString conditionsJSON = Rule::conditionsToString(i->conditions());
5474+
QString lastTriggered;
54565475

5457-
// QString sql = QString(QLatin1String("REPLACE INTO rules (rid, name, created, etag, lasttriggered, owner, status, timestriggered, actions, conditions) VALUES ('%1', '%2', '%3', '%4', '%5', '%6', '%7', '%8', '%9', '%10')"))
5458-
// .arg(rid, i->name(), i->creationtime(),
5459-
// i->etag, i->lastTriggered(), i->owner(),
5460-
// i->status(), QString::number(i->timesTriggered()), actionsJSON)
5461-
// .arg(conditionsJSON);
5476+
if (i->lastTriggered().isValid())
5477+
{
5478+
lastTriggered = i->lastTriggered().toString(QLatin1String("yyyy-MM-ddTHH:mm:ssZ"));
5479+
}
5480+
else
5481+
{
5482+
lastTriggered = QLatin1String("none");
5483+
}
54625484

54635485
QString sql = QLatin1String("REPLACE INTO rules (rid, name, created, etag, lasttriggered, owner, status, timestriggered, actions, conditions, periodic) VALUES ('") +
54645486
rid + QLatin1String("','") +
54655487
i->name() + QLatin1String("','") +
54665488
i->creationtime() + QLatin1String("','") +
54675489
i->etag + QLatin1String("','") +
5468-
QLatin1String("none','") +
5490+
lastTriggered + QLatin1String("','") +
54695491
i->owner() + QLatin1String("','") +
54705492
i->status() + QLatin1String("','") +
54715493
QString::number(i->timesTriggered()) + QLatin1String("','") +

rest_rules.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@ int DeRestPluginPrivate::createRule(const ApiRequest &req, ApiResponse &rsp)
530530

531531
DBG_Printf(DBG_INFO, "create rule %s: %s\n", qPrintable(rule.id()), qPrintable(rule.name()));
532532
rules.push_back(rule);
533+
rules.back().setNeedSaveDatabase();
533534
indexRulesTriggers();
534535
queSaveDb(DB_RULES, DB_SHORT_SAVE_DELAY);
535536

@@ -811,6 +812,7 @@ int DeRestPluginPrivate::updateRule(const ApiRequest &req, ApiResponse &rsp)
811812
{
812813
updateEtag(rule->etag);
813814
updateEtag(gwConfigEtag);
815+
rule->setNeedSaveDatabase();
814816
queSaveDb(DB_RULES, DB_SHORT_SAVE_DELAY);
815817
}
816818

@@ -947,6 +949,7 @@ int DeRestPluginPrivate::deleteRule(const ApiRequest &req, ApiResponse &rsp)
947949

948950
updateEtag(gwConfigEtag);
949951
updateEtag(rule->etag);
952+
rule->setNeedSaveDatabase();
950953

951954
queSaveDb(DB_RULES, DB_SHORT_SAVE_DELAY);
952955

@@ -1435,9 +1438,10 @@ void DeRestPluginPrivate::triggerRule(Rule &rule)
14351438
{
14361439
rule.m_lastTriggered = QDateTime::currentDateTimeUtc();
14371440
rule.setTimesTriggered(rule.timesTriggered() + 1);
1441+
rule.setNeedSaveDatabase();
14381442
updateEtag(rule.etag);
14391443
updateEtag(gwConfigEtag);
1440-
queSaveDb(DB_RULES, DB_HUGE_SAVE_DELAY);
1444+
//queSaveDb(DB_RULES, DB_HUGE_SAVE_DELAY);
14411445
}
14421446
}
14431447

rest_sensors.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3938,6 +3938,7 @@ void DeRestPluginPrivate::handleIndicationSearchSensors(const deCONZ::ApsDataInd
39383938
{
39393939
DBG_Printf(DBG_INFO, "ikea remote delete legacy rule %s\n", qPrintable(ri->name()));
39403940
ri->setState(Rule::StateDeleted);
3941+
ri->setNeedSaveDatabase();
39413942
changed = true;
39423943
}
39433944
}

rule.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,17 @@ void Rule::setCreationtime(const QString &creationtime)
9797

9898
/*! Returns the count the rule was triggered.
9999
*/
100-
const quint32 &Rule::timesTriggered() const
100+
quint32 Rule::timesTriggered() const
101101
{
102-
return this->m_timesTriggered;
102+
return m_timesTriggered;
103103
}
104104

105105
/*! Sets the count the rule was triggered.
106106
\param timesTriggered the count the rule was triggered
107107
*/
108-
void Rule::setTimesTriggered(const quint32 &timesTriggered)
108+
void Rule::setTimesTriggered(quint32 timesTriggered)
109109
{
110-
this->m_timesTriggered = timesTriggered;
110+
m_timesTriggered = timesTriggered;
111111
}
112112

113113
/*! Returns the trigger periodic time value in milliseconds.

rule.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ class Rule
9696
const QDateTime &lastTriggered() const;
9797
const QString &creationtime() const;
9898
void setCreationtime(const QString &creationtime);
99-
const quint32 &timesTriggered() const;
100-
void setTimesTriggered(const quint32 &timesTriggered);
99+
quint32 timesTriggered() const;
100+
void setTimesTriggered(quint32 timesTriggered);
101101
int triggerPeriodic() const;
102102
void setTriggerPeriodic(int ms);
103103
const QString &owner() const;
@@ -110,6 +110,9 @@ class Rule
110110
void setActions(const std::vector<RuleAction> &actions);
111111
bool isEnabled() const;
112112
int handle() const;
113+
bool needSaveDatabase() const { return m_needSave; }
114+
void setNeedSaveDatabase() { m_needSave = true; }
115+
void clearNeedSaveDatabase() { m_needSave = false; }
113116

114117
static QString actionsToString(const std::vector<RuleAction> &actions);
115118
static QString conditionsToString(const std::vector<RuleCondition> &conditions);
@@ -122,6 +125,7 @@ class Rule
122125
QDateTime m_lastTriggered;
123126

124127
private:
128+
bool m_needSave = false;
125129
State m_state;
126130
QString m_id;
127131
int m_handle;

0 commit comments

Comments
 (0)