#include "stdafx.h" #include #include #include #include // ¾²Ì¬³ÉÔ±³õʼ»¯ std::mutex AlarmManager::m_mutex; // »ñÈ¡µ¥ÀýʵÀý AlarmManager& AlarmManager::getInstance() { static AlarmManager instance; return instance; } // ¹¹Ô캯Êý AlarmManager::AlarmManager() : m_pDB(nullptr) {} // Îö¹¹º¯Êý AlarmManager::~AlarmManager() { m_pDB = nullptr; } // ÉèÖÃÊý¾Ý¿âÁ¬½Ó void AlarmManager::setDatabase(BL::Database* db) { std::lock_guard lock(m_mutex); m_pDB = db; } // ³õʼ»¯±¨¾¯±í bool AlarmManager::initializeAlarmTable() { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } const std::string createTableQuery = R"( CREATE TABLE IF NOT EXISTS alarms ( id TEXT NOT NULL, description TEXT NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME NOT NULL ) )"; return m_pDB->executeQuery(createTableQuery); } // Ìí¼Ó±¨¾¯ bool AlarmManager::addAlarm(const std::string& id, const std::string& description, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "INSERT INTO alarms (id, description, start_time, end_time) VALUES (" << "'" << id << "', " << "'" << description << "', " << "'" << startTime << "', " << "'" << endTime << "')"; std::lock_guard lock(m_mutex); return m_pDB->executeQuery(query.str()); } // ²éѯËùÓб¨¾¯Êý¾Ý std::vector> AlarmManager::getAllAlarms() { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } const std::string query = "SELECT id, description, start_time, end_time FROM alarms"; return m_pDB->fetchResults(query); } // ¸ù¾Ý±¨¾¯ID²éѯ±¨¾¯ std::vector> AlarmManager::getAlarmsById(const std::string& id) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, description, start_time, end_time FROM alarms WHERE id = '" << id << "'"; return m_pDB->fetchResults(query.str()); } // ¸ù¾ÝÃèÊö²éѯ±¨¾¯ std::vector> AlarmManager::getAlarmsByDescription(const std::string& description) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, description, start_time, end_time FROM alarms WHERE description LIKE '%" << description << "%'"; return m_pDB->fetchResults(query.str()); } // ¸ù¾Ýʱ¼ä·¶Î§²éѯ±¨¾¯ std::vector> AlarmManager::getAlarmsByTimeRange( const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, description, start_time, end_time FROM alarms WHERE 1=1"; if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } return m_pDB->fetchResults(query.str()); } // ¸ù¾ÝID¡¢¿ªÊ¼Ê±¼äºÍ½áÊøÊ±¼ä²éѯ±¨¾¯ std::vector> AlarmManager::getAlarmsByIdAndTimeRange( const std::string& id, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, description, start_time, end_time FROM alarms WHERE id = '" << id << "'"; if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } return m_pDB->fetchResults(query.str()); } // ·ÖÒ³²éѯ±¨¾¯Êý¾Ý std::vector> AlarmManager::getAlarms(int startPosition, int count) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, description, start_time, end_time FROM alarms LIMIT " << count << " OFFSET " << startPosition; return m_pDB->fetchResults(query.str()); } // ɸѡ±¨¾¯Êý¾Ý std::vector> AlarmManager::getFilteredAlarms( const std::string& description, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT id, description, start_time, end_time FROM alarms WHERE 1=1"; if (!description.empty()) { query << " AND description LIKE '%" << description << "%'"; } if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } int offset = (pageNumber - 1) * pageSize; query << " ORDER BY start_time DESC LIMIT " << pageSize << " OFFSET " << offset; return m_pDB->fetchResults(query.str()); } // »ñÈ¡·ûºÏÌõ¼þµÄ±¨¾¯×ÜÊý int AlarmManager::getTotalAlarmCount( const std::string& description, const std::string& startTime, const std::string& endTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "SELECT COUNT(*) FROM alarms WHERE 1=1"; if (!description.empty()) { query << " AND description LIKE '%" << description << "%'"; } if (!startTime.empty()) { query << " AND start_time >= '" << startTime << "'"; } if (!endTime.empty()) { query << " AND end_time <= '" << endTime << "'"; } auto results = m_pDB->fetchResults(query.str()); return (!results.empty() && !results[0].empty()) ? std::stoi(results[0][0]) : 0; } // ¸üб¨¾¯µÄ½áÊøÊ±¼ä bool AlarmManager::updateAlarmEndTime(const std::string& id, const std::string& description, const std::string& startTime, const std::string& newEndTime) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "UPDATE alarms SET end_time = '" << newEndTime << "'" << " WHERE id = '" << id << "'" << " AND description = '" << description << "'" << " AND start_time = '" << startTime << "'"; return m_pDB->executeQuery(query.str()); } // ÇåÀí¾É±¨¾¯Êý¾Ý void AlarmManager::cleanOldAlarms(int daysToKeep) { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); } std::ostringstream query; query << "DELETE FROM alarms WHERE end_time < datetime('now', '-" << daysToKeep << " days')"; m_pDB->executeQuery(query.str()); }