OCT 1. 增加SQLite3数据库支持

This commit is contained in:
huangxin 2023-03-31 14:32:32 +08:00
parent 2229b9d5fc
commit 241e24c0e3
12 changed files with 159 additions and 100 deletions

View File

@ -72,7 +72,7 @@ BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 120
ColumnLimit: 140
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: true
ConstructorInitializerAllOnOneLineOrOnePerLine: true
@ -135,7 +135,7 @@ ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 1000
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakFirstLessLess: 140
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000

View File

@ -131,9 +131,21 @@ ENDIF ()
IF (USED_SQLITE)
MESSAGE("Select Option USED_SQLITE")
LIST(APPEND COMMON_DEFINE "-DSQLITE_ON")
ENDIF ()
IF (USED_MYSQL)
MESSAGE("Select Option USED_MYSQL")
LIST(APPEND COMMON_DEFINE "-DUSED_MYSQL")
ENDIF ()
IF (USED_REDIS)
MESSAGE("Select Option USED_REDIS")
LIST(APPEND COMMON_DEFINE "-DUSED_REDIS")
ENDIF ()
IF (USED_SQLITE_CRYPTO)
LIST(APPEND COMMON_DEFINE "-DSQLITE_CRYPTO_ON")
MESSAGE("Select Option USED_SQLITE_CRYPTO")
ENDIF ()

View File

@ -40,8 +40,8 @@ application:
mysql_passwd = "AES@5/BQyUIfVxgV9BZAz/D3Rg=="; # mysql 数据库密码
mysql_database = "test"; # mysql 数据库名称
sqlite_dbname = "vcpe.db"; # sqlite3 数据库文件名
sqlite_passwd = "test123"; # sqlite3 数据库密码
sqlite_dbname = "/home/hx/vcpe.db"; # sqlite3 数据库文件名
sqlite_passwd = ""; # sqlite3 数据库密码
};
# MQ 相关配置

View File

@ -10,7 +10,7 @@ IF (USED_SQLITE_CRYPTO)
ENDIF ()
INCLUDE_DIRECTORIES(include ../opendhcp183 mongoose
./ ./include ../lwip/src/include ../lwip/src/arch_linux/include ../include)
./ ./include ../lwip/src/include ../lwip/src/arch_linux/include ../include)
FILE(GLOB C_HEADS ./include/network/*.h include/*.h include/uthash/*.h include/s2j/*.h vector/*.h ${CMAKE_BINARY_DIR}/*.h ${PROJECT_BINARY_DIR}/*.h)
AUX_SOURCE_DIRECTORY(json C_SRC)
@ -40,22 +40,13 @@ IF (USED_HTTP_SVR)
AUX_SOURCE_DIRECTORY(mongoose C_SRC)
ENDIF ()
IF (USED_REDIS)
ADD_DEFINITIONS(-DUSED_REDIS)
ENDIF ()
IF (USED_SQLITE)
ADD_DEFINITIONS(-DSQLITE_ON)
LIST(APPEND C_SRC database/database.c)
IF (SQLITE_CRYPTO_ON)
ADD_DEFINITIONS(-DSQLITE_CRYPTO_ON)
AUX_SOURCE_DIRECTORY(database/sqlite3 C_SRC)
ENDIF ()
ENDIF ()
IF (USED_MYSQL)
ADD_DEFINITIONS(-DUSED_MYSQL)
ENDIF ()
SET(CMAKE_C_STANDARD 99)
SET_SOURCE_FILES_PROPERTIES(misc/zvector.c PROPERTIES COMPILE_FLAGS "-Wall -Wextra -flto")
@ -63,7 +54,7 @@ SET_SOURCE_FILES_PROPERTIES(mongoose/mongoose.c PROPERTIES COMPILE_FLAGS "-Wall
IF (USED_SQLITE_CRYPTO)
SET_SOURCE_FILES_PROPERTIES(database/sqlite3/sqlite3.c PROPERTIES
COMPILE_FLAGS "-DSQLITE_HAS_CODEC \
COMPILE_FLAGS "-DSQLITE_HAS_CODEC \
-DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_OS_UNIX=1 \
-D_HAVE_SQLITE_CONFIG_H -DBUILD_sqlite -DNDEBUG -DSQLITE_THREADSAFE=1 \
-DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT \
@ -71,7 +62,11 @@ IF (USED_SQLITE_CRYPTO)
-DSQLITE_HAVE_ZLIB=1 -DSQLITE_TEMP_STORE=2")
ENDIF ()
ADD_DEFINITIONS(${COMMON_DEFINE} -DMG_ARCH=MG_ARCH_UNIX -DMG_ENABLE_OPENSSL=1)
ADD_DEFINITIONS(${COMMON_DEFINE})
IF (USED_HTTP_SVR)
ADD_DEFINITIONS(-DMG_ARCH=MG_ARCH_UNIX -DMG_ENABLE_OPENSSL=1)
ENDIF ()
ADD_LIBRARY(${LIB_PROJECT_TARGET} ${C_SRC} ${C_HEADS})

View File

@ -8,10 +8,9 @@
extern "C" {
#endif
int db_redis_init(void);
int db_mysql_init(void);
void *get_mysql_handle();
void db_mysql_uninit();
int db_sqlite3_init();
void db_sqlite3_uninit();
int db_sqlite3_sql_exec(const char *pSqlCmd, void *pCallback, void *pData, char **pErr);
#ifdef __cplusplus
}
#endif

View File

@ -8,67 +8,69 @@
extern "C" {
#endif
#define DEF_ERR_CODE(ERR_CODE) \
ERR_CODE(ERR_SUCCESS, 0, "成功") \
ERR_CODE(ERR_INPUT_PARAMS, 1, "输入参数错误") \
ERR_CODE(ERR_UN_SUPPORT, 2, "不支持的操作") \
ERR_CODE(ERR_CALL_SHELL, 3, "调用Shell命令失败") \
ERR_CODE(ERR_ITEM_EXISTS, 4, "该内容已经存在") \
ERR_CODE(ERR_ITEM_UNEXISTS, 5, "该内容不存在") \
ERR_CODE(ERR_SYS_INIT, 6, "系统中断") \
ERR_CODE(ERR_SYS_CALL, 7, "系统调用") \
ERR_CODE(ERR_OPEN_FILE, 8, "打开文件失败") \
ERR_CODE(ERR_READ_FILE, 9, "读取文件失败") \
ERR_CODE(ERR_FILE_NOT_EXISTS, 10, "文件不存在") \
ERR_CODE(ERR_FILE_LOCKED, 11, "文件被锁定") \
ERR_CODE(ERR_GET_FILE_SIZE, 12, "获取文件大小失败") \
ERR_CODE(ERR_COPY_FILE, 13, "复制文件失败") \
ERR_CODE(ERR_MALLOC_MEMORY, 14, "分配内存失败") \
ERR_CODE(ERR_MMAP_MEMORY, 15, "共享内存失败") \
ERR_CODE(ERR_EVP_KEY_SIZE, 16, "秘钥大小不正确") \
ERR_CODE(ERR_UNSUP_EVP_TYPE, 17, "不支持的加解密算法") \
ERR_CODE(ERR_EVP_INIT_KEY, 18, "初始化秘钥失败") \
ERR_CODE(ERR_EVP_UPDATE, 19, "加解密数据失败") \
ERR_CODE(ERR_EVP_FINALE, 20, "错误的加解密结果") \
ERR_CODE(ERR_EVP_CREATE_CTX, 21, "初始化加解密失败") \
ERR_CODE(ERR_AES_KEYGEN, 22, "AES秘钥失败") \
ERR_CODE(ERR_EVP_ENCRYPTION, 23, "加密失败") \
ERR_CODE(ERR_EVP_DECRYPTION, 24, "解密失败") \
ERR_CODE(ERR_CONFIG_INIT, 25, "配置文件初始化失败") \
ERR_CODE(ERR_UNCOMPATIBILITY_TYPE, 26, "未兼容的类型") \
ERR_CODE(ERR_STRING_TO_NUMBER, 27, "字符串转数字失败") \
ERR_CODE(ERR_UNKNOWN_CFG_ID, 28, "未识别的配置项") \
ERR_CODE(ERR_ZLOG_INIT, 29, "日志系统初始化失败") \
ERR_CODE(ERR_SYS_GET_CPU_INFO, 30, "获取CPU信息失败") \
ERR_CODE(ERR_SYS_NOT_FOUND_CPU, 31, "找不到CPU信息") \
ERR_CODE(ERR_SYS_DISK_GET_INFO, 32, "获取磁盘空间占用信息失败") \
ERR_CODE(ERR_SYS_IPMI_UNSUP, 33, "服务器IPMI接口不支持") \
ERR_CODE(ERR_SYS_SENSOR_GET_INFO, 34, "获取传感器信息失败") \
ERR_CODE(ERR_DB_CONNECT, 35, "数据库连接失败") \
ERR_CODE(ERR_MQ_CREATE_MQ, 36, "创建消息队列失败") \
ERR_CODE(ERR_MQ_CREATE_REP, 37, "创建REP消息队列失败") \
ERR_CODE(ERR_MQ_BIND_SOCKET, 38, "消息队列BIND Socket失败") \
ERR_CODE(ERR_MQ_CONN_SERVER, 39, "消息队列连接服务器失败") \
ERR_CODE(ERR_MQ_SEND_MSG, 40, "消息队列发送消息失败") \
ERR_CODE(ERR_JSON_CREAT_OBJ, 41, "创建JSON对象失败") \
ERR_CODE(ERR_JSON_PARSE_OBJ, 42, "解析JSON对象失败") \
ERR_CODE(ERR_JSON_VALID_SCH, 43, "JSON数据验证失败") \
ERR_CODE(ERR_CREATE_NETIF, 44, "创建网络接口失败") \
ERR_CODE(ERR_CREATE_PPPOE_NETIF, 45, "创建PPPoE网络接口失败") \
ERR_CODE(ERR_CREATE_PPP_SESSION, 46, "创建PPP连接失败") \
ERR_CODE(ERR_MISC_GET_IPADDR, 47, "获取网卡IP地址失败") \
ERR_CODE(ERR_MISC_GET_NETMASK, 48, "获取网卡子网掩码失败") \
ERR_CODE(ERR_MISC_GET_GATEWAY, 49, "获取网卡网关地址失败") \
ERR_CODE(ERR_MISC_GET_MACADDR, 50, "获取网卡MAC地址失败") \
ERR_CODE(ERR_MENU_EXIT, 51, "菜单执行完后自动退出") \
ERR_CODE(ERR_HTTP_UNSUP_METHOD, 52, "不支持的 HTTP 请求方法") \
ERR_CODE(ERR_HTTP_UNSUP_PAGE, 53, "找不到 HTTP 服务") \
ERR_CODE(ERR_PROTO_DECODE, 54, "HTTP 协议解析失败") \
ERR_CODE(ERR_MSG_CONTENT, 55, "msgContent内容不正确") \
ERR_CODE(ERR_SOCK_CREATE, 56, "创建套接字失败") \
ERR_CODE(ERR_SOCK_SETOPT, 57, "设置套接字参数失败")
#define DEF_ERR_CODE(ERR_CODE) \
ERR_CODE(ERR_SUCCESS, "成功") \
ERR_CODE(ERR_INPUT_PARAMS, "输入参数错误") \
ERR_CODE(ERR_UN_SUPPORT, "不支持的操作") \
ERR_CODE(ERR_CALL_SHELL, "调用Shell命令失败") \
ERR_CODE(ERR_ITEM_EXISTS, "该内容已经存在") \
ERR_CODE(ERR_ITEM_UNEXISTS, "该内容不存在") \
ERR_CODE(ERR_SYS_INIT, "系统中断") \
ERR_CODE(ERR_SYS_CALL, "系统调用") \
ERR_CODE(ERR_OPEN_FILE, "打开文件失败") \
ERR_CODE(ERR_READ_FILE, "读取文件失败") \
ERR_CODE(ERR_FILE_NOT_EXISTS, "文件不存在") \
ERR_CODE(ERR_FILE_LOCKED, "文件被锁定") \
ERR_CODE(ERR_GET_FILE_SIZE, "获取文件大小失败") \
ERR_CODE(ERR_COPY_FILE, "复制文件失败") \
ERR_CODE(ERR_MALLOC_MEMORY, "分配内存失败") \
ERR_CODE(ERR_MMAP_MEMORY, "共享内存失败") \
ERR_CODE(ERR_EVP_KEY_SIZE, "秘钥大小不正确") \
ERR_CODE(ERR_UNSUP_EVP_TYPE, "不支持的加解密算法") \
ERR_CODE(ERR_EVP_INIT_KEY, "初始化秘钥失败") \
ERR_CODE(ERR_EVP_UPDATE, "加解密数据失败") \
ERR_CODE(ERR_EVP_FINALE, "错误的加解密结果") \
ERR_CODE(ERR_EVP_CREATE_CTX, "初始化加解密失败") \
ERR_CODE(ERR_AES_KEYGEN, "AES秘钥失败") \
ERR_CODE(ERR_EVP_ENCRYPTION, "加密失败") \
ERR_CODE(ERR_EVP_DECRYPTION, "解密失败") \
ERR_CODE(ERR_CONFIG_INIT, "配置文件初始化失败") \
ERR_CODE(ERR_UNCOMPATIBILITY_TYPE, "未兼容的类型") \
ERR_CODE(ERR_STRING_TO_NUMBER, "字符串转数字失败") \
ERR_CODE(ERR_UNKNOWN_CFG_ID, "未识别的配置项") \
ERR_CODE(ERR_ZLOG_INIT, "日志系统初始化失败") \
ERR_CODE(ERR_SYS_GET_CPU_INFO, "获取CPU信息失败") \
ERR_CODE(ERR_SYS_NOT_FOUND_CPU, "找不到CPU信息") \
ERR_CODE(ERR_SYS_DISK_GET_INFO, "获取磁盘空间占用信息失败") \
ERR_CODE(ERR_SYS_IPMI_UNSUP, "服务器IPMI接口不支持") \
ERR_CODE(ERR_SYS_SENSOR_GET_INFO, "获取传感器信息失败") \
ERR_CODE(ERR_DB_UNINIT, "数据库未连接") \
ERR_CODE(ERR_DB_CONNECT, "数据库连接失败") \
ERR_CODE(ERR_DB_SQL_EXEC, "数据库SQL命令执行失败") \
ERR_CODE(ERR_MQ_CREATE_MQ, "创建消息队列失败") \
ERR_CODE(ERR_MQ_CREATE_REP, "创建REP消息队列失败") \
ERR_CODE(ERR_MQ_BIND_SOCKET, "消息队列BIND Socket失败") \
ERR_CODE(ERR_MQ_CONN_SERVER, "消息队列连接服务器失败") \
ERR_CODE(ERR_MQ_SEND_MSG, "消息队列发送消息失败") \
ERR_CODE(ERR_JSON_CREAT_OBJ, "创建JSON对象失败") \
ERR_CODE(ERR_JSON_PARSE_OBJ, "解析JSON对象失败") \
ERR_CODE(ERR_JSON_VALID_SCH, "JSON数据验证失败") \
ERR_CODE(ERR_CREATE_NETIF, "创建网络接口失败") \
ERR_CODE(ERR_CREATE_PPPOE_NETIF, "创建PPPoE网络接口失败") \
ERR_CODE(ERR_CREATE_PPP_SESSION, "创建PPP连接失败") \
ERR_CODE(ERR_MISC_GET_IPADDR, "获取网卡IP地址失败") \
ERR_CODE(ERR_MISC_GET_NETMASK, "获取网卡子网掩码失败") \
ERR_CODE(ERR_MISC_GET_GATEWAY, "获取网卡网关地址失败") \
ERR_CODE(ERR_MISC_GET_MACADDR, "获取网卡MAC地址失败") \
ERR_CODE(ERR_MENU_EXIT, "菜单执行完后自动退出") \
ERR_CODE(ERR_HTTP_UNSUP_METHOD, "不支持的 HTTP 请求方法") \
ERR_CODE(ERR_HTTP_UNSUP_PAGE, "找不到 HTTP 服务") \
ERR_CODE(ERR_PROTO_DECODE, "HTTP 协议解析失败") \
ERR_CODE(ERR_MSG_CONTENT, "msgContent内容不正确") \
ERR_CODE(ERR_SOCK_CREATE, "创建套接字失败") \
ERR_CODE(ERR_SOCK_SETOPT, "设置套接字参数失败")
#define GENERATE_ENUM(ENUM, no, x) ENUM,
#define GENERATE_ENUM(ENUM, x) ENUM,
typedef enum {
DEF_ERR_CODE(GENERATE_ENUM)

View File

@ -7,6 +7,7 @@
#ifdef __cplusplus
extern "C" {
#endif
#include <zlog.h>
enum {
@ -14,13 +15,13 @@ enum {
};
typedef enum {
trace = ZLOG_LEVEL_TRACE,
debug = ZLOG_LEVEL_DEBUG,
info = ZLOG_LEVEL_INFO,
trace = ZLOG_LEVEL_TRACE,
debug = ZLOG_LEVEL_DEBUG,
info = ZLOG_LEVEL_INFO,
notice = ZLOG_LEVEL_NOTICE,
warn = ZLOG_LEVEL_WARN,
error = ZLOG_LEVEL_ERROR,
fatal = ZLOG_LEVEL_FATAL
warn = ZLOG_LEVEL_WARN,
error = ZLOG_LEVEL_ERROR,
fatal = ZLOG_LEVEL_FATAL
} ZLOG_LV;
#define DEF_ZLOG_MOD(ZLOG_MOD) \
@ -30,6 +31,7 @@ typedef enum {
ZLOG_MOD(ZLOG_MOD_MISC, ZLOG_LEVEL_DEBUG, "MISC") \
ZLOG_MOD(ZLOG_MOD_WATCH, ZLOG_LEVEL_DEBUG, "WATCH") \
ZLOG_MOD(ZLOG_MOD_CONFIG, ZLOG_LEVEL_DEBUG, "CONFIG") \
ZLOG_MOD(ZLOG_MOD_DB, ZLOG_LEVEL_DEBUG, "DB") \
ZLOG_MOD(ZLOG_MOD_NET, ZLOG_LEVEL_DEBUG, "NET") \
ZLOG_MOD(ZLOG_MOD_CRYPTO, ZLOG_LEVEL_DEBUG, "CRYPTO") \
ZLOG_MOD(ZLOG_MOD_MQ, ZLOG_LEVEL_DEBUG, "MQ") \
@ -88,8 +90,11 @@ typedef enum {
} while (0)
zlog_category_t *zlog_get_mod_cat(ZLOG_MOD_NAME logMod);
int zlog_verify_level(int level, ZLOG_MOD_NAME logMod);
const char *zlog_vni_tag_get();
int zlog_verify_level(int level, ZLOG_MOD_NAME logMod);
const char *zlog_vni_tag_get();
#ifdef __cplusplus
}
#endif

View File

@ -19,6 +19,9 @@
#include "lib_config.h"
#include "prj_config.h"
#include "zlog_module.h"
#ifdef SQLITE_ON
#include "database.h"
#endif
#ifdef ZEROMQ_ON
#include "msg_queue.h"
#endif
@ -137,6 +140,10 @@ int user_init(const char *pAppCfgFile, const char *pCfgDirectory, const char *pK
if (cfg_get_hardware_watch_enable()) {
init_hardware();
}
#ifdef SQLITE_ON
db_sqlite3_init();
#endif
#ifdef ZEROMQ_ON
if ((ret = mq_init()) != ERR_SUCCESS) {
LOG_MOD(error, ZLOG_MOD_INIT, "Message queue init error: %d\n", ret);
@ -157,6 +164,9 @@ int user_init(const char *pAppCfgFile, const char *pCfgDirectory, const char *pK
void user_uninit() {
if (g_isInited) {
task_manager_exit();
#ifdef SQLITE_ON
db_sqlite3_uninit();
#endif
#ifdef HTTPSERVER_ON
http_svr_uinit();
#endif

View File

@ -4,8 +4,8 @@
#include <user_errno.h>
#include "common.h"
#define MAX_DESC_LENGTH (256)
#define GENERATE_STRING(STRING, no, desc) {#STRING, desc},
#define MAX_DESC_LENGTH (256)
#define GENERATE_STRING(STRING, desc) {#STRING, desc},
static const char *g_enumStrVal[][MAX_DESC_LENGTH] = {
DEF_ERR_CODE(GENERATE_STRING) {"ERR_UNKNOWN", "未知错误"},

View File

@ -18,7 +18,6 @@
#include "network/vlan.h"
#include "dhcp_options.h"
#include "config.h"
#include "ip_pool.h"
#include "user_mgr.h"
#define PKG_MMAP_BLOCKSIZ (1 << 22)
@ -99,13 +98,13 @@ static struct sock_filter g_filterCode[] = {
{0x6, 0, 0, 0x00000000},
#endif
#if 0
// create by: tcpdump "vxlan" -dd
{0x28, 0, 0, 0x0000000c},
{0x15, 2, 0, 0x00008100},
{0x15, 1, 0, 0x000088a8},
{0x15, 0, 1, 0x00009100},
{0x6, 0, 0, 0x00040000},
{0x6, 0, 0, 0x00000000},
// create by: tcpdump "vxlan" -dd
{0x28, 0, 0, 0x0000000c},
{0x15, 2, 0, 0x00008100},
{0x15, 1, 0, 0x000088a8},
{0x15, 0, 1, 0x00009100},
{0x6, 0, 0, 0x00040000},
{0x6, 0, 0, 0x00000000},
#endif
// region BPF code
// create by: tcpdump "vlan and udp and port 67 and port 68" -dd
@ -444,6 +443,7 @@ int dhcpd_init() {
dhcp_user_mgr_init();
dhcp_option_cfg_init();
dhcp_lease_init();
uv_udp_init(get_task_manager(), &uvRaw);
uv_udp_open(&uvRaw, sock);

View File

@ -24,6 +24,7 @@ typedef struct {
U32 express;
} LEASE_CACHE, *PLEASE_CACHE;
int dhcp_lease_init();
#ifdef __cplusplus
}
#endif

View File

@ -3,6 +3,41 @@
//
#include "lease.h"
#include "user_errno.h"
#include "zlog_module.h"
#include "database.h"
#define LEASE_DB_NAME ("lease")
static PMAC_FILTER g_allowTbl = NULL;
static PMAC_FILTER g_blackListTbl = NULL;
#define CREATE_LEASE_TABLE(name) \
"CREATE TABLE IF NOT EXISTS " #name \
" ( id INTEGER PRIMARY KEY AUTOINCREMENT," \
" uid INTEGER NOT NULL," \
" mac CHAR(20) NOT NULL," \
" ip INTEGER NOT NULL," \
" lease INTEGER NOT NULL," \
" create INTEGER NOT NULL," \
" netmask INTEGER," \
" gateway INTEGER," \
" dns1 INTEGER," \
" dns2 INTEGER," \
" server INTEGER NOT NULL," \
" hostname CHAR(64) DEFAULT '' NOT NULL," \
" keyType INTEGER NOT NULL" \
");" \
"CREATE INDEX IF NOT EXISTS " #name "_index ON " #name " (uid, mac);"
int dhcp_lease_init() {
int rc = 0;
rc = db_sqlite3_sql_exec(CREATE_LEASE_TABLE(lease), NULL, NULL, NULL);
if (rc != ERR_SUCCESS) {
return rc;
}
return ERR_SUCCESS;
}