88 lines
2.8 KiB
C++
88 lines
2.8 KiB
C++
#ifndef SQLITE_H
|
|
#define SQLITE_H
|
|
#include "sqlite3.h"
|
|
#include <string>
|
|
#include <mutex>
|
|
#include <vector>
|
|
#include <cstdint>
|
|
#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<Column> columns;
|
|
};
|
|
|
|
// 泛化插入:按表名在注册表中查找描述并绑定,所有类型共用这一条路径
|
|
bool insertGeneric(const char* tableName, const void* obj);
|
|
// 所有协议结构表的描述注册表(不含 msg_log 等特殊表)
|
|
static const std::vector<TableDesc>& allTables();
|
|
};
|
|
|
|
#endif // SQLITE_H
|