LAPTOP-T815PCOQ\25526
2024-11-20 8dbd14952aa622587a92866dc01943869ea4f9dc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#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("δ֪");
    }
}