| | |
| | | } |
| | | |
| | | // 添加报警信息 |
| | | bool AlarmManager::addAlarm(const AlarmData& alarmData) { |
| | | bool AlarmManager::addAlarm(const AlarmData& alarmData, int& alarmEventId) { |
| | | if (!m_pDB) { |
| | | return false; |
| | | } |
| | | |
| | | // 构建插入查询 |
| | | std::ostringstream query; |
| | | query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) VALUES (" |
| | | << alarmData.nId << ", " // 错误码 |
| | | << alarmData.nSeverityLevel << ", " // 报警等级 |
| | | << alarmData.nDeviceId << ", " // 设备ID |
| | | << alarmData.nUnitId << ", '" // 单元ID |
| | | << alarmData.strDescription << "', '" // 描述 |
| | | << alarmData.strStartTime << "', '" // 开始时间 |
| | | << alarmData.strEndTime << "')"; // 结束时间 |
| | | |
| | | // 使用锁保护多线程安全 |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | return m_pDB->executeQuery(query.str()); |
| | | #if 0 |
| | | // 开始事务 |
| | | m_pDB->executeQuery("BEGIN TRANSACTION;"); |
| | | |
| | | // 构建插入查询 |
| | | std::ostringstream query; |
| | | query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) VALUES (" |
| | | << alarmData.nId << ", " // 错误码 |
| | | << alarmData.nSeverityLevel << ", " // 报警等级 |
| | | << alarmData.nDeviceId << ", " // 设备ID |
| | | << alarmData.nUnitId << ", '" // 单元ID |
| | | << alarmData.strDescription << "', '" // 描述 |
| | | << alarmData.strStartTime << "', '" // 开始时间 |
| | | << alarmData.strEndTime << "')"; // 结束时间 |
| | | |
| | | // 使用锁保护多线程安全 |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | |
| | | // 执行插入查询 |
| | | bool result = m_pDB->executeQuery(query.str()); |
| | | if (result) { |
| | | alarmEventId = getLastInsertId(); |
| | | m_alarmCache[alarmEventId] = alarmData; |
| | | } |
| | | |
| | | // 提交事务 |
| | | m_pDB->executeQuery("COMMIT;"); |
| | | |
| | | return result; |
| | | #else |
| | | // 构建插入查询并使用 RETURNING 获取插入后的 alarm_event_id |
| | | std::ostringstream query; |
| | | query << "INSERT INTO alarms (id, severity_level, device_id, unit_id, description, start_time, end_time) " |
| | | << "VALUES (" << alarmData.nId << ", " << alarmData.nSeverityLevel << ", " << alarmData.nDeviceId << ", " |
| | | << alarmData.nUnitId << ", '" << alarmData.strDescription << "', '" << alarmData.strStartTime << "', '" |
| | | << alarmData.strEndTime << "') RETURNING alarm_event_id;"; |
| | | |
| | | // 使用锁保护多线程安全 |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | |
| | | // 执行查询并获取结果 |
| | | auto results = m_pDB->fetchResults(query.str()); |
| | | if (!results.empty() && !results[0].empty()) { |
| | | try { |
| | | // 提取并转换 alarm_event_id |
| | | alarmEventId = std::stoi(results[0][0]); |
| | | // 将插入的报警数据添加到缓存 |
| | | m_mapCache[alarmEventId] = alarmData; |
| | | return true; |
| | | } |
| | | catch (const std::exception& e) { |
| | | std::cerr << "Error parsing alarm_event_id: " << e.what() << std::endl; |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | #endif |
| | | } |
| | | |
| | | // 查询所有报警数据 |
| | |
| | | return result[0][0]; // 返回查询到的单元名称 |
| | | } |
| | | |
| | | // 获取最近插入的 alarm_event_id |
| | | int AlarmManager::getLastInsertId() { |
| | | std::string query = "SELECT last_insert_rowid();"; |
| | | auto results = m_pDB->fetchResults(query); |
| | | |
| | | if (results.empty() || results[0].empty()) { |
| | | return -1; |
| | | } |
| | | |
| | | // 从查询结果中获取最后插入的 ID |
| | | int lastInsertId = std::stoi(results[0][0]); |
| | | return lastInsertId; |
| | | } |
| | | |
| | | // 读取报警文件 |
| | | bool AlarmManager::readAlarmFile(const std::string& filename) { |
| | | std::ifstream file(filename); |
| | |
| | | auto it = m_mapAlarm.find(alarmID); |
| | | if (it != m_mapAlarm.end()) { |
| | | alarms.push_back(it->second); |
| | | } |
| | | } |
| | | else { |
| | | std::cerr << "未找到 AlarmID: " << alarmID << std::endl; |
| | | } |