175 lines
4.6 KiB
C
175 lines
4.6 KiB
C
|
|
#ifndef THREADPOOLDEMO_CCSQLITE3_H
|
|||
|
|
#define THREADPOOLDEMO_CCSQLITE3_H
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include "Sys/sqlite3.h"
|
|||
|
|
#include "CCString.h"
|
|||
|
|
#include "vector"
|
|||
|
|
#include "mutex"
|
|||
|
|
#include "CCJSONObject.h"
|
|||
|
|
#include "CCWebServlet.h"
|
|||
|
|
|
|||
|
|
struct NetSqlInfo {
|
|||
|
|
CTL::String IP = "";
|
|||
|
|
int Port = -1;
|
|||
|
|
CTL::String User = "";
|
|||
|
|
CTL::String Pass = "";
|
|||
|
|
CTL::CORS* CORS_Header = nullptr;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* 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();
|
|||
|
|
|
|||
|
|
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 是否包含小数点
|
|||
|
|
*/
|
|||
|
|
bool containsDecimal(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
|