| | |
| | | #include "SECSRuntimeManager.h" |
| | | |
| | | // 常量 |
| | | const std::string DATABASE_FILE = R"(SECSRuntimeManager.db)"; |
| | | const std::string DATABASE_FILE = R"(SECSDataManager.db)"; |
| | | |
| | | // 静态成员初始化 |
| | | std::mutex SECSRuntimeManager::m_mutex; |
| | |
| | | } |
| | | } |
| | | |
| | | // 从数据库中获取整数 |
| | | int SECSRuntimeManager::getIntFromDB(const std::string& query) { |
| | | auto results = m_pDB->fetchResults(query); |
| | | if (!results.empty() && !results[0].empty()) { |
| | | // 转换第一个查询结果为整数 |
| | | return std::stoi(results[0][0]); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // 设置数据库连接 |
| | | void SECSRuntimeManager::setDatabase(BL::Database* db) { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | |
| | | return false; |
| | | } |
| | | |
| | | // 初始化 SystemSV 表 |
| | | initSystemSVTable(); |
| | | |
| | | // 初始化 EqpSV 表 |
| | | initEqpSVTable(); |
| | | |
| | | // 初始化 SystemDV 表 |
| | | initSystemDVTable(); |
| | | |
| | | // 初始化 EqpDV 表 |
| | | initEqpDVTable(); |
| | | |
| | | // 初始化 SystemEC 表 |
| | | initSystemECTable(); |
| | | |
| | | // 初始化 EqpEC 表 |
| | | initEqpECTable(); |
| | | |
| | | // 初始化 SystemECID 表 |
| | | initSystemEventTable(); |
| | | |
| | | // 初始化 EqpECID 表 |
| | | initEqpEventTable(); |
| | | |
| | | // 初始化 SystemEventLink 表 |
| | | initEventLinkTable(); |
| | | |
| | | // 初始化 PPID 表 |
| | | initPPIDTable(); |
| | | |
| | | // 初始化 RPTID 表 |
| | | initRPTIDTable(); |
| | | |
| | | return true; |
| | | } |
| | | |
| | |
| | | m_pDB->disconnect(); |
| | | } |
| | | } |
| | | |
| | | // 初始化 SystemSV 表 |
| | | void SECSRuntimeManager::initSystemSVTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 SystemSV 表(如果不存在) |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS SystemSV (" |
| | | "ID INTEGER PRIMARY KEY, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "DataType TEXT NOT NULL, " |
| | | "Length INTEGER NULL, " |
| | | "Unit TEXT NULL, " |
| | | "Remark TEXT, " |
| | | "SystemID INTEGER);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create SystemSV table."); |
| | | } |
| | | |
| | | // 预定义的 SV 数据 |
| | | std::vector<std::tuple<int, std::string, std::string, int, std::string, std::string, int>> svData = { |
| | | {1, "SYS_LICENSE_CODE", "ASCII", 0, "NULL", "License code (Formal; Evaluation; NoLicense)", 1}, |
| | | {2, "SYS_LICENSE_STATUS", "UINT_1", 0, "NULL", "License status(0:Unauthorized; 1:Authorized; 2:Evaluation; 3:Evaluation Expiring; 4:Trial; 5:Trial End)", 2}, |
| | | {3, "GEM_CLOCK", "ASCII", 0, "NULL", "System Clock", 3}, |
| | | {4, "SYS_SECS_COMM_MODE", "UINT_1", 0, "NULL", "SECS Communication Mode(0:HSMS Mode; 1:SECSI Mode)", 4}, |
| | | {5, "SYS_SECS_DRIVER_CONNECT_STATE", "UINT_1", 0, "NULL", "Initial SECS Driver Connect State(0:Stop; 1:Start)", 5} |
| | | }; |
| | | |
| | | for (const auto& entry : svData) { |
| | | int nID, nLength, nSystemID; |
| | | std::string sName, sDataType, sRemark, sUnit; |
| | | std::tie(nID, sName, sDataType, nLength, sUnit, sRemark, nSystemID) = entry; |
| | | |
| | | // 检查 Name 是否已存在 |
| | | int count = getIntFromDB("SELECT COUNT(*) FROM SystemSV WHERE Name = '" + sName + "';"); |
| | | if (count == 0) { |
| | | // 插入数据 |
| | | std::string insertSQL = "INSERT INTO SystemSV (ID, Name, DataType, Length, Unit, Remark, SystemID) VALUES (" |
| | | + std::to_string(nID) + ", '" |
| | | + sName + "', '" |
| | | + sDataType + "', " |
| | | + (nLength > 0 ? std::to_string(nLength) : "NULL") + ", " |
| | | + ((sUnit == "NULL") ? "NULL" : "'" + sUnit + "'") + ", '" |
| | | + sRemark + "', " |
| | | + std::to_string(nSystemID) + ");"; |
| | | |
| | | if (!m_pDB->executeQuery(insertSQL)) { |
| | | throw std::runtime_error("Failed to insert SystemSV data."); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 初始化 EqpSV 表 |
| | | void SECSRuntimeManager::initEqpSVTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 EqpSV 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS EqpSV (" |
| | | "ID INTEGER PRIMARY KEY, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "DataType TEXT NOT NULL, " |
| | | "Length INTEGER NULL, " |
| | | "Unit TEXT NULL, " |
| | | "Remark TEXT, " |
| | | "SeqNo INTEGER);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create EqpSV table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 SystemDV 表 |
| | | void SECSRuntimeManager::initSystemDVTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 SystemDV 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS SystemDV (" |
| | | "ID INTEGER PRIMARY KEY, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "DataType TEXT NOT NULL, " |
| | | "Length INTEGER NULL, " |
| | | "Unit TEXT NULL, " |
| | | "Remark TEXT, " |
| | | "SystemID INTEGER);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create SystemDV table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 EqpDV 表 |
| | | void SECSRuntimeManager::initEqpDVTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 EqpDV 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS EqpDV (" |
| | | "ID INTEGER PRIMARY KEY, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "DataType TEXT NOT NULL, " |
| | | "Length INTEGER NULL, " |
| | | "Unit TEXT NULL, " |
| | | "Remark TEXT, " |
| | | "SeqNo INTEGER);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create EqpDV table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 SystemEC 表 |
| | | void SECSRuntimeManager::initSystemECTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 SystemEC 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS SystemEC (" |
| | | "ID INTEGER PRIMARY KEY, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "DataType TEXT NOT NULL, " |
| | | "MinValue INTEGER NULL, " |
| | | "MaxValue INTEGER NULL, " |
| | | "DefaultVal INTEGER NULL, " |
| | | "Unit TEXT NULL, " |
| | | "Remark TEXT, " |
| | | "SystemID INTEGER);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create SystemEC table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 EqpEC 表 |
| | | void SECSRuntimeManager::initEqpECTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 EqpEC 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS EqpEC (" |
| | | "ID INTEGER PRIMARY KEY, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "DataType TEXT NOT NULL, " |
| | | "MinValue INTEGER NULL, " |
| | | "MaxValue INTEGER NULL, " |
| | | "DefaultValue INTEGER NULL, " |
| | | "Unit TEXT NULL, " |
| | | "Remark TEXT, " |
| | | "SeqNo INTEGER NOT NULL, " |
| | | "Length INTEGER NOT NULL, " |
| | | "CanUpdateByHost INTEGER NOT NULL);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create EqpEC table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 SystemEvent 表 |
| | | void SECSRuntimeManager::initSystemEventTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 SystemEvent 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS SystemEvent (" |
| | | "CEID INTEGER PRIMARY KEY, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "Remark TEXT, " |
| | | "SystemID INTEGER);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create SystemEvent table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 EqpEvent 表 |
| | | void SECSRuntimeManager::initEqpEventTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 EqpEvent 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS EqpEvent (" |
| | | "CEID INTEGER PRIMARY KEY AUTOINCREMENT, " |
| | | "Name TEXT UNIQUE NOT NULL, " |
| | | "Remark TEXT, " |
| | | "BitNo INTEGER);"; |
| | | |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create EqpEvent table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 EventLink 表 |
| | | void SECSRuntimeManager::initEventLinkTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 EventLink 表 |
| | | std::string createEventLinkSQL = |
| | | "CREATE TABLE IF NOT EXISTS EventLink (" |
| | | "CEID INTEGER, " |
| | | "RPTID INTEGER, " |
| | | "FOREIGN KEY (CEID) REFERENCES EqpEvent(CEID));"; |
| | | |
| | | if (!m_pDB->executeQuery(createEventLinkSQL)) { |
| | | throw std::runtime_error("Failed to create EventLink table."); |
| | | } |
| | | } |
| | | |
| | | // 初始化 PPID 表 |
| | | void SECSRuntimeManager::initPPIDTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 EqpPPID 表 |
| | | std::string createTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS EqpPPID (" |
| | | "BitNo INTEGER PRIMARY KEY AUTOINCREMENT, " |
| | | "PPID INTEGER NULL);"; |
| | | if (!m_pDB->executeQuery(createTableSQL)) { |
| | | throw std::runtime_error("Failed to create EqpPPID table."); |
| | | } |
| | | |
| | | // 先检查表是否为空 |
| | | int nCount = getIntFromDB("SELECT COUNT(*) FROM EqpPPID;"); |
| | | if (nCount == 0) { |
| | | // 插入初始数据(512 行) |
| | | for (int nBitNo = 0; nBitNo < 512; ++nBitNo) { |
| | | std::string insertSQL = "INSERT INTO EqpPPID (BitNo) VALUES (" + std::to_string(nBitNo) + ");"; |
| | | if (!m_pDB->executeQuery(insertSQL)) { |
| | | throw std::runtime_error("Failed to insert data into EqpPPID table."); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 初始化 RPTID 表 |
| | | void SECSRuntimeManager::initRPTIDTable() { |
| | | std::lock_guard<std::mutex> lock(m_mutex); |
| | | if (m_pDB == nullptr) { |
| | | throw std::runtime_error("Database not connected."); |
| | | } |
| | | |
| | | // 创建 RPTID 相关表 |
| | | std::string createReportTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS Report (" |
| | | "RPTID INTEGER PRIMARY KEY);"; |
| | | |
| | | std::string createReportVIDsTableSQL = |
| | | "CREATE TABLE IF NOT EXISTS ReportVIDs (" |
| | | "ID INTEGER PRIMARY KEY AUTOINCREMENT, " |
| | | "RPTID INTEGER NOT NULL, " |
| | | "VID INTEGER NOT NULL, " |
| | | "FOREIGN KEY (RPTID) REFERENCES Report(RPTID));"; |
| | | |
| | | if (!m_pDB->executeQuery(createReportTableSQL)) { |
| | | throw std::runtime_error("Failed to create Report table."); |
| | | } |
| | | if (!m_pDB->executeQuery(createReportVIDsTableSQL)) { |
| | | throw std::runtime_error("Failed to create ReportVIDs table."); |
| | | } |
| | | } |