#ifndef SQLITE_H #define SQLITE_H #include "sqlite3.h" #include #include #include #include #include "../pmSysvariable.h" #include "../udpcomm/ccuUdpMsg.h" #include "../udpcomm/CommLogger.h" class SQLite : public ICommLogger { public: // 数据库健康状态 enum class Status { OK, Degraded, Disabled }; explicit SQLite(const std::string& dbPath); ~SQLite(); // 连接是否有效(无锁的指针判断,仅用于快速探活) bool isConnected() const { return m_db != nullptr; } Status status() const { return m_status; } std::string lastError() const; // 建表(幂等,含迁移) bool createTable(); bool createTable(const std::string& tableName, const std::string& columns); // 状态反馈数据 bool insertData(ccuState data); bool insertData(disHighVolBusState data); bool insertData(disHighAVolBusState data); bool insertData(disLowMainBusState data); bool insertData(disLowBusState data); bool insertData(const msg_CcuSetParmFbMsg& fb); // 下发指令数据 bool insertData(ccuColCmd cmd); bool insertData(ccuSetParmCmd cmd); bool insertData(disHighVolBusCmd cmd); bool insertData(disHighAVolBusCmd cmd); bool insertData(disLowMainBusCmd cmd); bool insertData(disLowBusCmd cmd); // 原始收发帧落库(实现 ICommLogger,供 udpComm 调用) void onFrame(int direction, unsigned short msgId, const char* name, const unsigned char* data, unsigned int len, bool checksumOk) override; // 查询接口 long long count(const std::string& table); bool queryInt(const std::string& sql, long long& out); std::string m_dbPath; private: sqlite3* m_db; mutable std::mutex m_dbMutex; Status m_status; std::string m_lastError; bool setError(int rc, const char* op); bool applyPragmas(); bool migrate(); bool createTableInternal(const std::string& tableName, const std::string& columns); bool createAllTablesUnlocked(); // 列描述:名称 + SQL 类型 + 绑定器(无捕获函数指针) struct Column { const char* name; const char* sqlType; void (*bind)(sqlite3_stmt*, int& idx, const void* obj); }; // 表描述:表名 + 数据列。建表(DDL)与插入(DML)共用这一份,作为唯一数据源。 struct TableDesc { const char* name; std::vector columns; }; // 泛化插入:按表名在注册表中查找描述并绑定,所有类型共用这一条路径 bool insertGeneric(const char* tableName, const void* obj); // 所有协议结构表的描述注册表(不含 msg_log 等特殊表) static const std::vector& allTables(); }; #endif // SQLITE_H