// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "AlarmEventsTable.hpp" #include "Common/Types.hpp" #include 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(rec.alarmTime.hourOfDay.count()), static_cast(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 (" u32_c u32_c str_c u32_c u32_c str_ ");", 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=" u32_ ";", id); } bool AlarmEventsTable::update(AlarmEventsTableRow entry) { return db->execute("UPDATE alarms SET hour=" u32_c "minute=" u32_c "music_tone=" str_c "enabled=" u32_c "snooze_duration=" u32_c "rrule=" str_ " WHERE _id=" u32_ ";", 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=" u32_ ";", id); if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) { return AlarmEventsTableRow(); } return AlarmEventsTableRow(*retQuery); } std::vector AlarmEventsTable::getLimitOffset(uint32_t offset, uint32_t limit) { auto retQuery = db->query("SELECT * FROM alarms ORDER BY hour, minute LIMIT " u32_ " OFFSET " u32_ ";", limit, offset); return retQueryUnpack(std::move(retQuery)); } std::vector AlarmEventsTable::getEnabled() { auto retQuery = db->query("SELECT * FROM alarms WHERE enabled = 1;"); return retQueryUnpack(std::move(retQuery)); } std::vector AlarmEventsTable::getLimitOffsetByField(uint32_t offset, uint32_t limit, AlarmEventsTableFields field, const char *str) { std::unique_ptr retQuery = nullptr; const auto &fieldName = getFieldName(field); if (fieldName.empty()) { return {}; } retQuery = db->query("SELECT * FROM alarms e WHERE %q=" str_ "ORDER BY hour, minute LIMIT " u32_ " OFFSET " u32_c ";", 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=" u32_ ";", static_cast(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=" u32_ ";", 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 ""; } }