#include "stdafx.h"
|
#include <sstream>
|
#include <iostream>
|
#include <stdexcept>
|
#include <ctime>
|
#include <mutex>
|
#include "AlarmManager.h"
|
|
|
// ¾²Ì¬³ÉÔ±³õʼ»¯
|
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<std::mutex> 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<std::mutex> lock(m_mutex);
|
return m_pDB->executeQuery(query.str());
|
}
|
|
// ²éѯËùÓб¨¾¯Êý¾Ý
|
std::vector<std::vector<std::string>> 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<std::vector<std::string>> 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<std::vector<std::string>> 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<std::vector<std::string>> 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<std::vector<std::string>> 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<std::vector<std::string>> 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<std::vector<std::string>> 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());
|
}
|