USB_Config_Vendor/CC_SDK/Include/CCServlet/CCSQLite3.h
2026-02-03 14:36:30 +08:00

193 lines
5.5 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef THREADPOOLDEMO_CCSQLITE3_H
#define THREADPOOLDEMO_CCSQLITE3_H
#pragma once
#include "Sys/sqlite3.h"
#include "CCString.h"
#include "vector"
#include "mutex"
#include "CCWebServlet.h"
#ifdef MY_SQL_BOOL
#include "CCMySql.h"
#endif
struct NetSqlInfo {
CTL::String IP = "";
int Port = -1;
CTL::String User = "";
CTL::String Pass = "";
CTL::String DBName = "";
CTL::CORS* CORS_Header = nullptr;
};
/*
* INTEGER: 整数类型,在两种数据库中都表示整数值
* REAL: 浮点数类型,在两种数据库中都表示浮点数值
* NUMERIC: 精确数值类型,在两种数据库中都支持高精度数值存储
* TEXT: 文本字符串类型,在两种数据库中都用于存储字符数据
* VARCHAR(n): 可变长度字符串类型,在两种数据库中都支持最大长度限制
* DATE: 日期类型,存储年月日信息
* TIME: 时间类型,存储时分秒信息
* DATETIME: 日期时间类型,存储完整的日期和时间信息
* TIMESTAMP: 时间戳类型,通常用于记录数据修改时间
* BLOB: 二进制大对象类型,用于存储二进制数据
* BOOLEAN: 布尔值类型存储true/false值
*
* SQLite 数据库操作示例:
* CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,);
* DROP TABLE database_name.table_name;
* INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
* SELECT * FROM table_name;
* SELECT * FROM table_name WHERE xx='xx';
* UPDATE xxx SET ADDRESS = 'Texas' WHERE xxx = xxx;
* DELETE FROM table_name WHERE xxx=xxx;
*
*/
namespace CTL {
/**
* 结构体用于存储 SQL 查询结果集
*/
struct CCResultSet {
/// 查询结果数据,以 JSON 格式存储
std::vector<JSON> Data;
/// 结果集中行数
int Row = 0;
/// 结果集中列数
int Col = 0;
/// 操作是否成功标志
bool Flag = false;
String Error = "";
};
struct CCSqlSet {
bool Flag = false;
String Error = "";
};
/**
* SQLite3 数据库操作类
*/
class SQLite3 {
struct ClientInfo_tSQL {
int ID = -1;
String Code = "";
};
public:
SQLite3() = default;
~SQLite3() = default;
/**
* 构造函数,初始化数据库路径
*
* @param Path 数据库文件路径
*/
SQLite3(CTL::String Path);
/**
* 打开数据库连接
*
* @param Path 数据库文件路径
* @return 是否成功打开数据库
*/
bool Open(CTL::String Path);
/**
* 打开数据库连接
*
* @param Host 数据库远程链接信息
* @return 是否成功打开数据库
*/
bool Open(const NetSqlInfo& Host);
/**
* 关闭数据库连接
*
* @return 是否成功关闭数据库
*/
bool Close();
/**
* 执行更新语句(如 INSERT、UPDATE、DELETE
*
* @param sql 要执行的 SQL 语句
* @return 是否成功执行
*/
CCSqlSet SqlUpdate(CTL::String sql);
/**
* 执行查询语句并返回结果集
*
* @param sql 要执行的 SQL 查询语句
* @return 查询结果集
*/
CCResultSet SqlQuery(CTL::String sql);
/**
* 获取最近一次操作的错误信息
*
* @return 错误信息字符串
*/
CTL::String GetError();
sqlite3* GetSqlite() const;
private:
sqlite3* SQL; ///< SQLite 数据库连接指针
char *zErrMsg = nullptr; ///< 错误信息指针
bool RemoteLink = false,LinkStatus = false,Blockage = false;
ClientInfo_tSQL ClientInfo;
std::mutex mutex; ///< 线程同步互斥锁
NetSqlInfo M_Host;
CTL::Thread M_Thread;
CTL::Timer timer;
WebSocketClient ws;
String zErrMsgStr = "";
/**
* 内部方法,执行 SQL 语句
*
* @param sql 要执行的 SQL 语句
* @param callback 回调函数(可选)
* @param a 用户自定义参数(可选)
* @return 是否成功执行
*/
bool SQlite(const char* sql, int(*callback)(void*, int, char**, char**) = NULL, void* a = NULL);
/**
* 检查字符串中是否包含小数点
*
* @param str 输入字符串
* @return 是否包含小数点
*/
static bool containsDecimal(const std::string &str);
static bool is_int(const std::string &str);
/**
* 根据字符串内容转换为指定类型的数据
*
* @tparam T 目标数据类型
* @param str 输入字符串
* @return 转换后的值
*/
template<typename T>
T convert(const std::string &str);
void OnOpen(CTL::WebSocketInfo& info);
void OnMessage(CTL::WebSocketInfo& info);
void OnClose(const CTL::WebSocketInfo& info);
void OnError(const CTL::WebSocketInfo& info);
};
template<typename T>
T SQLite3::convert(const std::string &str) {
if (containsDecimal(str)) {
return std::stod(str);
}
else {
return std::stoi(str);
}
}
}
#endif