#include "stdafx.h" #include "SystemLogManager.h" #include #include #include // ¾²Ì¬³ÉÔ±±äÁ¿³õʼ»¯ std::unique_ptr SystemLogManager::m_instance = nullptr; std::mutex SystemLogManager::m_mutex; // »ñÈ¡µ¥ÀýʵÀý SystemLogManager& SystemLogManager::getInstance() { if (m_instance == nullptr) { std::lock_guard lock(m_mutex); if (m_instance == nullptr) { m_instance = std::unique_ptr(new SystemLogManager()); } } return *m_instance; } // ¹¹Ô캯Êý SystemLogManager::SystemLogManager() : m_pDB(nullptr) {} // ÉèÖÃÊý¾Ý¿âÁ¬½Ó void SystemLogManager::setDatabase(std::unique_ptr& db) { std::lock_guard lock(m_mutex); m_pDB = &db; } // ³õʼ»¯ÈÕÖ¾±í bool SystemLogManager::initializeLogTable() { if (!m_pDB || !(*m_pDB)) { std::cerr << "Database connection is not set." << std::endl; return false; } const std::string createTableQuery = R"( CREATE TABLE IF NOT EXISTS system_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, log_type TEXT NOT NULL, event TEXT NOT NULL, username TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) )"; return (*m_pDB)->executeQuery(createTableQuery); } // Ìí¼ÓÈÕÖ¾ bool SystemLogManager::log(LogType logType, const std::string& event, const std::string& username) { if (!m_pDB || !(*m_pDB)) { std::cerr << "Database connection is not set." << std::endl; return false; } std::ostringstream query; query << "INSERT INTO system_logs (log_type, event, username) VALUES (" << "'" << logTypeToString(logType) << "', " << "'" << event << "', " << "'" << username << "')"; return (*m_pDB)->executeQuery(query.str()); } // »ñÈ¡ÈÕÖ¾ÄÚÈÝ std::vector> SystemLogManager::getLogs(int startPosition, int count) { std::vector> logs; if (!m_pDB || !(*m_pDB)) { std::cerr << "Database connection is not set." << std::endl; return logs; } std::ostringstream query; // Èç¹û startPosition ºÍ count ¶¼ÊÇ -1£¬»ñȡȫ²¿Êý¾Ý if (startPosition == -1 && count == -1) { query << "SELECT id, log_type, event, username, timestamp FROM system_logs"; } else { query << "SELECT id, log_type, event, username, timestamp FROM system_logs " << "LIMIT " << count << " OFFSET " << startPosition; } auto results = (*m_pDB)->fetchResults(query.str()); for (const auto& row : results) { logs.push_back(row); } return logs; } // ת»»ÈÕÖ¾ÀàÐÍΪ×Ö·û´® std::string SystemLogManager::logTypeToString(LogType logType) const { switch (logType) { case LogType::Info: return _T("ÐÅÏ¢"); case LogType::Error: return _T("´íÎó"); case LogType::Operation: return _T("²Ù×÷"); default: return _T("δ֪"); } }