#include "stdafx.h"
|
#include "SystemLogManager.h"
|
#include <iostream>
|
#include <sstream>
|
#include <stdexcept>
|
|
// ¾²Ì¬³ÉÔ±±äÁ¿³õʼ»¯
|
std::unique_ptr<SystemLogManager> SystemLogManager::m_instance = nullptr;
|
std::mutex SystemLogManager::m_mutex;
|
|
// »ñÈ¡µ¥ÀýʵÀý
|
SystemLogManager& SystemLogManager::getInstance() {
|
if (m_instance == nullptr) {
|
std::lock_guard<std::mutex> lock(m_mutex);
|
if (m_instance == nullptr) {
|
m_instance = std::unique_ptr<SystemLogManager>(new SystemLogManager());
|
}
|
}
|
return *m_instance;
|
}
|
|
// ¹¹Ô캯Êý
|
SystemLogManager::SystemLogManager() : m_pDB(nullptr) {}
|
|
// ÉèÖÃÊý¾Ý¿âÁ¬½Ó
|
void SystemLogManager::setDatabase(std::unique_ptr<BL::Database>& db) {
|
std::lock_guard<std::mutex> 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<std::vector<std::string>> SystemLogManager::getLogs(int startPosition, int count) {
|
std::vector<std::vector<std::string>> 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("δ֪");
|
}
|
}
|