1 /******************************************************************************
3 * Copyright (c) 2020 ICT/CAS.
5 * Licensed under the O-RAN Software License, Version 1.0 (the "Software License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * https://www.o-ran.org/software
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 *******************************************************************************/
29 #include "vos_types.h"
33 #define DB_MAX_TABLE 200
37 #define DB_TABLE_NAME_LEN 40
40 #define DB_COLUMN_NAME_LEN 40
43 #define DB_TABLE_COLUMNS_MAX 40
46 #define DB_DEFAULTVAL_LEN 2048
49 #define DB_FKEY_LEN (DB_TABLE_NAME_LEN+DB_COLUMN_NAME_LEN)
52 #define DB_FILTER_SUB_NUM 8
54 #define DB_FILTER_SUB_VAL_NUM 8
57 #define DB_INTEGER_LEN 8
61 #define DB_TIME_LEN 16
65 #define DB_TIME_STR_MAX_LEN 22
68 #define DB_MAC_ADDR_STR_MAX_LEN 18
71 #define DB_IPV4_ADDR_STR_MAX_LEN 16
74 #define DB_IPV6_ADDR_STR_MAX_LEN 40
77 #define DB_FILTER_OP_STR_LEN 10
80 #define DB_TABLE_INIT_FUNC_NAME_LEN 100
83 typedef enum DB_data_type_e{
84 DB_DATA_TYPE_INTEGER = 1L, ///< 数值型
85 DB_DATA_TYPE_STR , ///< 字符串型
86 DB_DATA_TYPE_DATETIME , ///< 时间型
87 DB_DATA_TYPE_MAC , ///< MAC地址型
88 DB_DATA_TYPE_IPV4_ADDR , ///< IPv4地址型
89 DB_DATA_TYPE_IPV6_ADDR , ///< IPv6地址型
90 DB_DATA_TYPE_BUFFER , ///< buffer型
96 typedef enum DB_filter_sub_type_e{
97 DB_FILTER_SUB_TYPE_EQUAL = 1, ///< 相等
98 DB_FILTER_SUB_TYPE_N_EQUAL , ///< 不相等
99 DB_FILTER_SUB_TYPE_GREAT , ///< 大于
100 DB_FILTER_SUB_TYPE_LESS , ///< 小于
101 DB_FILTER_SUB_TYPE_GREAT_EQ , ///< 大于等于
102 DB_FILTER_SUB_TYPE_LESS_EQ , ///< 小于等于
103 DB_FILTER_SUB_TYPE_INCLUDE , ///< 包含
104 DB_FILTER_SUB_TYPE_EXCLUDE , ///< 不包含
105 DB_FILTER_SUB_TYPE_MAX
106 }DB_filter_sub_type_t;
109 typedef enum DB_filter_option_e{
110 DB_FILTER_OPTION_AND = 1, ///< 与
111 DB_FILTER_OPTION_OR , ///< 或
116 typedef enum DB_order_type_e{
117 DB_ORDER_TYPE_ASCEND = 0, ///< 升序(默认)
118 DB_ORDER_TYPE_DESCEND = 1, ///< 降序
121 #define DB_ORDER_TYPE_DESCEND_STR "DESC"
124 typedef struct DB_order_s{
125 CHAR col_name[DB_COLUMN_NAME_LEN];
126 DB_order_type_t type; ///< 默认升序
131 typedef union DB_data_val_u{
133 CHAR strVal[DB_DEFAULTVAL_LEN];
134 CHAR datetimeVal[DB_DEFAULTVAL_LEN];
135 CHAR macVal[DB_MAC_ADDR_STR_MAX_LEN];
136 CHAR ipv4_addrVal[DB_IPV4_ADDR_STR_MAX_LEN];
137 CHAR ipv6_addrVal[DB_IPV6_ADDR_STR_MAX_LEN];
138 }VOS_PACKED DB_data_val_t;
142 typedef struct DB_column_info_s{
143 CHAR name[DB_COLUMN_NAME_LEN]; ///< 列名
144 LONG type; ///< 数据的类型
145 LONG size; ///< 对于BUFFER和STR 类型,代表BUFFER 和 STR(包含字符串结尾 '\0') 占用的字节数
147 CHAR fkey[DB_FKEY_LEN]; ///< 外键,表名+.+列名的字符串,格式为 table(column),字符串长度为 0 则表示不是外键
148 DB_data_val_t defaultVal; ///< 默认值
149 }VOS_PACKED DB_column_info_t;
152 typedef struct DB_database_s{
153 CHAR path[FILE_PATH_MAX]; ///< 文件路径
154 VOID *handle; ///< 被打开的数据库
159 typedef ULONG DB_row_handle_t;
165 typedef LONG (*DB_table_init_func_t)(VOID);
168 typedef struct DB_table_info_s{
169 CHAR name[DB_TABLE_NAME_LEN]; ///< name 表名
170 LONG max_row; ///< 静态表标志,1为静态表,0为动态表
171 DB_table_init_func_t table_init_func; ///< 表初始化函数,可以为空
172 CHAR table_init_func_name[DB_TABLE_INIT_FUNC_NAME_LEN];
176 typedef struct DB_query_filter_sub_s{
177 CHAR col_name[DB_COLUMN_NAME_LEN]; ///< name 表名
178 DB_data_val_t val[DB_FILTER_SUB_VAL_NUM];
179 DB_filter_sub_type_t sub_type;
180 DB_filter_option_t option;
181 }DB_query_filter_sub_t;
184 typedef struct DB_query_filter_s{
185 DB_query_filter_sub_t sub[DB_FILTER_SUB_NUM];
186 DB_filter_option_t option;
191 typedef enum DB_ret_code_e{
192 DB_RET_CODE_OK = 0, ///< 执行成功
193 DB_RET_CODE_table_already_exist , ///< 表已存在
194 DB_RET_CODE_table_not_exist , ///< 表已存在
195 DB_RET_CODE_table_info_already_exist , ///< 表的信息在数据库管理表中已存在(由数据库模块问题导致)
196 DB_RET_CODE_col_info_already_exist , ///< 表的列信息在数据库管理表中已存在(由数据库模块问题导致)
197 DB_RET_CODE_table_info_not_exist , ///< 表的信息在数据库管理表中不存在(由数据库模块问题导致)
198 DB_RET_CODE_col_info_not_exist , ///< 表的列信息在数据库管理表不中已存在(由数据库模块问题导致)
199 DB_RET_CODE_table_info_add_error , ///< 数据库模块添加表信息失败
200 DB_RET_CODE_col_info_add_error , ///< 数据库模块添加列信息失败
201 DB_RET_CODE_get_col_size_error , ///< 获取列大小失败
202 DB_RET_CODE_row_data_have_more , ///< row_handle 中还有数据
203 DB_RET_CODE_row_data_done , ///< row_handle 中没有数据
204 DB_RET_CODE_row_data_pk_exist , ///< 添加的数据主键冲突
205 DB_RET_CODE_table_full , ///< 表已满,无法在添加数据
207 DB_RET_CODE_error, ///< 其他错误
208 DB_RET_CODE_max, ///<
214 * @param[out] db 成功时返回被打开的数据
215 * @return 成功返回 VOS_OK,失败则返回其他
217 LONG DB_open_plat_db(DB_database_t *db);
222 * @param[in ] db 要操作的数据库
223 * @return 成功返回 VOS_OK,失败则返回其他
225 LONG DB_close_plat_db(DB_database_t *db);
230 * @param[in ] db 要操作的数据库
231 * @param[in ] table_name 表名
232 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
233 * @param[in ] timeout 等待执行结果的时间,单位 秒
234 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
236 BOOL DB_table_exist(DB_database_t *db,const CHAR *table_name,
237 LONG *retCode,LONG timeout);
242 * @param[in ] db 要操作的数据库
243 * @param[in ] table 表信息
244 * @param[in ] cols 表的列定义数组,数组最后一个成员的name为空做为数组结尾
245 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
246 * @param[in ] timeout 等待执行结果的时间,单位 秒
247 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
249 LONG DB_table_create(DB_database_t *db,DB_table_info_t *table,DB_column_info_t cols[],
250 LONG *retCode,LONG timeout);
255 * @param[in ] db 要操作的数据库
256 * @param[in ] name 表名
257 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
258 * @param[in ] timeout 等待执行结果的时间,单位 秒
259 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
261 LONG DB_table_delete(DB_database_t *db,const CHAR name[DB_TABLE_NAME_LEN],
262 LONG *retCode,LONG timeout);
267 * @param[in ] db 要操作的数据库
268 * @param[in ] table_name 要操作的表名
269 * @param[in ] data 要插入的数据,需按照创建表时定义的按顺序和大小排列每项数据,
271 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
272 * @param[in ] timeout 等待执行结果的时间,单位 秒
273 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
275 LONG DB_table_row_add(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],VOID *data,
276 LONG *retCode,LONG timeout);
281 * @param[in ] db 要操作的数据库
282 * @param[in ] table_name 要操作的表名
283 * @param[out] row_handle 查询到的行句柄
284 * @param[in ] filter 查询时的过滤条件,为NULL 表示没有过滤条件,查询所有行
285 * @param[in ] filter_num filter的个数
286 * @param[in ] order 查询结果排序方式
287 * @param[in ] order_num order的个数
288 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
289 * @param[in ] timeout 等待执行结果的时间,单位 秒
290 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
292 LONG DB_table_row_query(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],DB_row_handle_t *row_handle,
293 DB_query_filter_t filter[],LONG filter_num,DB_order_t order[],LONG order_num,
294 LONG *retCode,LONG timeout);
299 * 获取行句柄当前行数据,并自动指向下一行,当没下一行数据时,句柄会被销毁,不可再用
300 * @param[in ] db 要操作的数据库
301 * @param[in ] table_name 要操作的表名
302 * @param[in] row_handle 行句柄
303 * @param[out] data 获取到的数据,按照创建表时定义的按顺序和大小排列每项数据,
305 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
306 * @param[in ] timeout 等待执行结果的时间,单位 秒
307 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
309 LONG DB_table_row_data_pop(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],
310 DB_row_handle_t *row_handle,VOID *data,
311 LONG *retCode,LONG timeout);
315 * @param[in ] db 要操作的数据库
316 * @param[in ] table_name 要操作的表名
317 * @param[in ] row_handle 行句柄
318 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
319 * @param[in ] timeout 等待执行结果的时间,单位 秒
320 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
322 LONG DB_table_row_handle_destroy(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],DB_row_handle_t *row_handle,
323 LONG *retCode,LONG timeout);
328 * @param[in ] db 要操作的数据库
329 * @param[in ] table_name 要操作的表名
330 * @param[in ] filter 删除时的过滤条件,为NULL 表示没有过滤条件,删除所有行
331 * @param[in ] filter_num filter的个数
332 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
333 * @param[in ] timeout 等待执行结果的时间,单位 秒
334 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
336 LONG DB_table_row_delete(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],
337 DB_query_filter_t filter[],LONG filter_num,
338 LONG *retCode,LONG timeout);
344 * @param[in ] db 要操作的数据库
345 * @param[in ] table_name 要操作的表名
346 * @param[in ] newData 新的数据,需按照创建表时定义的按顺序和大小排列每项数据,
348 * @param[in ] filter 更新时的过滤条件,为NULL 表示没有过滤条件,更新所有行
349 * @param[in ] filter_num filter的个数
350 * @param[in ] col 只会用到name成员,用于更新指定的列,为NULL 表示更新匹配行的每一列,数组最后一个成员的name为空做为数组结尾
351 * @param[in ] col_num col的个数
352 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
353 * @param[in ] timeout 等待执行结果的时间,单位 秒
354 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
356 LONG DB_table_row_update(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],VOID *newData,
357 DB_query_filter_t filter[],LONG filter_num,DB_column_info_t col[],LONG col_num,
358 LONG *retCode,LONG timeout);
363 * @param[in ] db 要操作的数据库
364 * @param[in ] table_name 要操作的表名
365 * @param[out] row_count 查询到的行数
366 * @param[in ] filter 查询时的过滤条件,为NULL 表示没有过滤条件,查询所有行
367 * @param[in ] filter_num filter的个数
368 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
369 * @param[in ] timeout 等待执行结果的时间,单位 秒
370 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
372 LONG DB_table_row_count(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],LONG *row_count,
373 DB_query_filter_t filter[],LONG filter_num,
374 LONG *retCode,LONG timeout);
377 * 覆盖最早插入的数据,用于表行数到达上限的覆盖操作
378 * @param[in ] db 要操作的数据库
379 * @param[in ] table_name 要操作的表名
380 * @param[in ] newData 新的数据,需按照创建表时定义的按顺序和大小排列每项数据,
382 * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间
383 * @param[in ] timeout 等待执行结果的时间,单位 秒
384 * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他,
386 LONG DB_table_overwrite_first_row( DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],VOID *newData,
387 LONG *retCode,LONG timeout);
391 * 将DB 的error code转换成字符串
392 * @param[in ] code 错误码
393 * @return 返回错误码对应的字符串
395 const CHAR *DB_err_msg(LONG code);
400 #endif /* end of __cplusplus */
402 #endif /* end of __PLAT_DB_H__ */