mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-04-19 14:40:57 -04:00
189 lines
6.3 KiB
C++
189 lines
6.3 KiB
C++
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#include "AlarmEventsTable.hpp"
|
|
|
|
#include <Interface/AlarmEventRecord.hpp>
|
|
|
|
AlarmEventsTableRow::AlarmEventsTableRow(uint32_t id,
|
|
uint32_t hourOfDay,
|
|
uint32_t minuteOfHour,
|
|
const std::string &musicTone,
|
|
bool enabled,
|
|
uint32_t snoozeDuration,
|
|
const std::string &rruleText)
|
|
: Record{id}, hourOfDay{hourOfDay}, minuteOfHour{minuteOfHour}, musicTone{musicTone}, enabled{enabled},
|
|
snoozeDuration{snoozeDuration}, rruleText{rruleText}
|
|
{}
|
|
|
|
AlarmEventsTableRow::AlarmEventsTableRow(const AlarmEventRecord &rec)
|
|
: AlarmEventsTableRow{rec.ID,
|
|
static_cast<uint32_t>(rec.alarmTime.hourOfDay.count()),
|
|
static_cast<uint32_t>(rec.alarmTime.minuteOfHour.count()),
|
|
rec.musicTone,
|
|
rec.enabled,
|
|
rec.snoozeDuration,
|
|
rec.rruleText}
|
|
{}
|
|
|
|
AlarmEventsTableRow::AlarmEventsTableRow(const QueryResult &result)
|
|
: Record{result[0].getUInt32()}, hourOfDay{result[1].getUInt32()},
|
|
minuteOfHour{result[2].getUInt32()}, musicTone{result[3].getString()}, enabled{result[4].getBool()},
|
|
snoozeDuration{result[5].getUInt32()}, rruleText{result[6].getString()}
|
|
{}
|
|
|
|
auto AlarmEventsTableRow::isValid() const -> bool
|
|
{
|
|
return (ID != 0);
|
|
}
|
|
|
|
AlarmEventsTable::AlarmEventsTable(Database *db) : Table(db)
|
|
{
|
|
createTableRow = [](const QueryResult &retQuery) { return AlarmEventsTableRow(retQuery); };
|
|
}
|
|
|
|
bool AlarmEventsTable::create()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool AlarmEventsTable::add(AlarmEventsTableRow entry)
|
|
{
|
|
return db->execute("INSERT or ignore INTO alarms ( hour, minute, music_tone, enabled, snooze_duration, rrule)"
|
|
"VALUES ( %lu, %lu, '%q', %d, %lu, '%q');",
|
|
entry.hourOfDay,
|
|
entry.minuteOfHour,
|
|
entry.musicTone.c_str(),
|
|
entry.enabled,
|
|
entry.snoozeDuration,
|
|
entry.rruleText.c_str());
|
|
}
|
|
|
|
bool AlarmEventsTable::removeById(uint32_t id)
|
|
{
|
|
return db->execute("DELETE FROM alarms "
|
|
"WHERE alarms._id = %lu;",
|
|
id);
|
|
}
|
|
|
|
bool AlarmEventsTable::update(AlarmEventsTableRow entry)
|
|
{
|
|
return db->execute("UPDATE alarms SET hour = '%lu', minute = '%lu', music_tone = '%q', enabled = '%d', "
|
|
"snooze_duration = '%lu', rrule = '%q' "
|
|
"WHERE _id=%lu;",
|
|
entry.hourOfDay,
|
|
entry.minuteOfHour,
|
|
entry.musicTone.c_str(),
|
|
entry.enabled,
|
|
entry.snoozeDuration,
|
|
entry.rruleText.c_str(),
|
|
entry.ID);
|
|
}
|
|
|
|
AlarmEventsTableRow AlarmEventsTable::getById(uint32_t id)
|
|
{
|
|
auto retQuery = db->query("SELECT * "
|
|
"FROM alarms "
|
|
"WHERE _id = %lu;",
|
|
id);
|
|
|
|
if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {
|
|
return AlarmEventsTableRow();
|
|
}
|
|
|
|
return AlarmEventsTableRow(*retQuery);
|
|
}
|
|
|
|
std::vector<AlarmEventsTableRow> AlarmEventsTable::getLimitOffset(uint32_t offset, uint32_t limit)
|
|
{
|
|
auto retQuery = db->query("SELECT * FROM alarms "
|
|
"ORDER BY hour, minute "
|
|
"LIMIT %lu OFFSET %lu;",
|
|
limit,
|
|
offset);
|
|
|
|
return retQueryUnpack(std::move(retQuery));
|
|
}
|
|
|
|
std::vector<AlarmEventsTableRow> AlarmEventsTable::getEnabled()
|
|
{
|
|
auto retQuery = db->query("SELECT * FROM alarms "
|
|
"WHERE enabled = 1;");
|
|
|
|
return retQueryUnpack(std::move(retQuery));
|
|
}
|
|
|
|
std::vector<AlarmEventsTableRow> AlarmEventsTable::getLimitOffsetByField(uint32_t offset,
|
|
uint32_t limit,
|
|
AlarmEventsTableFields field,
|
|
const char *str)
|
|
{
|
|
std::unique_ptr<QueryResult> retQuery = nullptr;
|
|
const auto &fieldName = getFieldName(field);
|
|
|
|
if (fieldName.empty()) {
|
|
return {};
|
|
}
|
|
|
|
retQuery = db->query("SELECT * FROM alarms e "
|
|
"WHERE %q = '%q' "
|
|
"ORDER BY hour, minute "
|
|
"LIMIT %lu OFFSET %lu;",
|
|
fieldName.c_str(),
|
|
str,
|
|
limit,
|
|
offset);
|
|
|
|
return retQueryUnpack(std::move(retQuery));
|
|
}
|
|
|
|
auto AlarmEventsTable::toggleAll(bool toggle) -> bool
|
|
{
|
|
auto ret = db->execute("UPDATE alarms SET enabled = '%d';", static_cast<int>(toggle));
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t AlarmEventsTable::count()
|
|
{
|
|
auto queryRet = db->query("SELECT COUNT(*) FROM alarms;");
|
|
if (!queryRet || queryRet->getRowCount() == 0) {
|
|
return 0;
|
|
}
|
|
|
|
return (*queryRet)[0].getUInt32();
|
|
}
|
|
|
|
uint32_t AlarmEventsTable::countByFieldId(const char *field, uint32_t id)
|
|
{
|
|
auto queryRet = db->query("SELECT COUNT(*) FROM alarms "
|
|
"WHERE %q=%lu;",
|
|
field,
|
|
id);
|
|
if ((queryRet == nullptr) || (queryRet->getRowCount() == 0)) {
|
|
return 0;
|
|
}
|
|
|
|
return (*queryRet)[0].getUInt32();
|
|
}
|
|
|
|
std::string AlarmEventsTable::getFieldName(AlarmEventsTableFields field)
|
|
{
|
|
switch (field) {
|
|
case AlarmEventsTableFields::AlarmTimeHour:
|
|
return "hour";
|
|
case AlarmEventsTableFields::AlarmTimeMinute:
|
|
return "minute";
|
|
case AlarmEventsTableFields::MusicTone:
|
|
return "music_tone";
|
|
case AlarmEventsTableFields::Enabled:
|
|
return "enabled";
|
|
case AlarmEventsTableFields::SnoozeDuration:
|
|
return "snooze_duration";
|
|
case AlarmEventsTableFields::Rrule:
|
|
return "rrule";
|
|
default:
|
|
return "";
|
|
}
|
|
}
|