// 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 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 ( %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 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 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 = '%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(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 ""; } }