X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=Include%2Fplat_db.h;fp=Include%2Fplat_db.h;h=fe7b0c389a1aa21f8a5d9aeb093e55030ab42219;hb=1f71b9a76eacf92b39c1ce6f782f8404a34f60a9;hp=0000000000000000000000000000000000000000;hpb=254694245736881ecfff4eb0d1503bf3f49a21be;p=scp%2Focu%2F5gnr.git diff --git a/Include/plat_db.h b/Include/plat_db.h new file mode 100644 index 0000000..fe7b0c3 --- /dev/null +++ b/Include/plat_db.h @@ -0,0 +1,391 @@ +/****************************************************************************** +############################################################################### +# Copyright (c) [2017-2020] [ICT/CAS] # +# Licensed under the ORAN Software License v1.0 (License) # +############################################################################### +******************************************************************************/ + + + +#ifndef __PLAT_DB_H__ +#define __PLAT_DB_H__ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include "vos_types.h" +#include "vos_lib.h" + +/** 最多的表数 */ +#define DB_MAX_TABLE 200 + + +/** 表名最大长度 */ +#define DB_TABLE_NAME_LEN 40 + +/** 列名最大长度 */ +#define DB_COLUMN_NAME_LEN 40 + +/** 表的最大列数 */ +#define DB_TABLE_COLUMNS_MAX 40 + +/** 默认值最大长度 */ +#define DB_DEFAULTVAL_LEN 2048 + +/** 外键最大长度 */ +#define DB_FKEY_LEN (DB_TABLE_NAME_LEN+DB_COLUMN_NAME_LEN) + +/** filer子元素最大个数 */ +#define DB_FILTER_SUB_NUM 8 + +#define DB_FILTER_SUB_VAL_NUM 8 + +/** INTEGER类型数据长度 */ +#define DB_INTEGER_LEN 8 + + +/** TIME类型数据长度 */ +#define DB_TIME_LEN 16 + + +/** 时间字符串数据长度 */ +#define DB_TIME_STR_MAX_LEN 22 + +/** MAC地址类型数据长度 */ +#define DB_MAC_ADDR_STR_MAX_LEN 18 + +/** IPV4地址类型数据长度 */ +#define DB_IPV4_ADDR_STR_MAX_LEN 16 + +/** IPV6地址类型数据长度 */ +#define DB_IPV6_ADDR_STR_MAX_LEN 40 + + +#define DB_FILTER_OP_STR_LEN 10 + +/** 初始化函数名最大长度 */ +#define DB_TABLE_INIT_FUNC_NAME_LEN 100 + +/** 数据库的数据类型 */ +typedef enum DB_data_type_e{ + DB_DATA_TYPE_INTEGER = 1L, ///< 数值型 + DB_DATA_TYPE_STR , ///< 字符串型 + DB_DATA_TYPE_DATETIME , ///< 时间型 + DB_DATA_TYPE_MAC , ///< MAC地址型 + DB_DATA_TYPE_IPV4_ADDR , ///< IPv4地址型 + DB_DATA_TYPE_IPV6_ADDR , ///< IPv6地址型 + DB_DATA_TYPE_BUFFER , ///< buffer型 + DB_DATA_TYPE_MAX +}DB_data_type_t; + + +/** 数据库的查询的比较类型 */ +typedef enum DB_filter_sub_type_e{ + DB_FILTER_SUB_TYPE_EQUAL = 1, ///< 相等 + DB_FILTER_SUB_TYPE_N_EQUAL , ///< 不相等 + DB_FILTER_SUB_TYPE_GREAT , ///< 大于 + DB_FILTER_SUB_TYPE_LESS , ///< 小于 + DB_FILTER_SUB_TYPE_GREAT_EQ , ///< 大于等于 + DB_FILTER_SUB_TYPE_LESS_EQ , ///< 小于等于 + DB_FILTER_SUB_TYPE_INCLUDE , ///< 包含 + DB_FILTER_SUB_TYPE_EXCLUDE , ///< 不包含 + DB_FILTER_SUB_TYPE_MAX +}DB_filter_sub_type_t; + +/** filter的组合方式 */ +typedef enum DB_filter_option_e{ + DB_FILTER_OPTION_AND = 1, ///< 与 + DB_FILTER_OPTION_OR , ///< 或 + DB_filter_TYPE_MAX +}DB_filter_option_t; + +/** 排序方式 */ +typedef enum DB_order_type_e{ + DB_ORDER_TYPE_ASCEND = 0, ///< 升序(默认) + DB_ORDER_TYPE_DESCEND = 1, ///< 降序 + DB_ORDER_TYPE_MAX +}DB_order_type_t; +#define DB_ORDER_TYPE_DESCEND_STR "DESC" + +/** 排序信息 */ +typedef struct DB_order_s{ + CHAR col_name[DB_COLUMN_NAME_LEN]; + DB_order_type_t type; ///< 默认升序 +}DB_order_t; + + +/** 数据库数据的值 */ +typedef union DB_data_val_u{ + LONG integerVal; + CHAR strVal[DB_DEFAULTVAL_LEN]; + CHAR datetimeVal[DB_DEFAULTVAL_LEN]; + CHAR macVal[DB_MAC_ADDR_STR_MAX_LEN]; + CHAR ipv4_addrVal[DB_IPV4_ADDR_STR_MAX_LEN]; + CHAR ipv6_addrVal[DB_IPV6_ADDR_STR_MAX_LEN]; +}VOS_PACKED DB_data_val_t; + + +/** 列信息 */ +typedef struct DB_column_info_s{ + CHAR name[DB_COLUMN_NAME_LEN]; ///< 列名 + LONG type; ///< 数据的类型 + LONG size; ///< 对于BUFFER和STR 类型,代表BUFFER 和 STR(包含字符串结尾 '\0') 占用的字节数 + LONG pkey; ///< 主键标志 + CHAR fkey[DB_FKEY_LEN]; ///< 外键,表名+.+列名的字符串,格式为 table(column),字符串长度为 0 则表示不是外键 + DB_data_val_t defaultVal; ///< 默认值 +}VOS_PACKED DB_column_info_t; + +/** 数据库句柄 */ +typedef struct DB_database_s{ + CHAR path[FILE_PATH_MAX]; ///< 文件路径 + VOID *handle; ///< 被打开的数据库 + LONG seqID; +}DB_database_t; + +/** 数据库查询结果的行句柄 */ +typedef ULONG DB_row_handle_t; + + +/** 数据初始化函数回调函数原型 +* 无参数,返回 VOS_OK 表示成功 +*/ +typedef LONG (*DB_table_init_func_t)(VOID); + +/** 表信息 */ +typedef struct DB_table_info_s{ + CHAR name[DB_TABLE_NAME_LEN]; ///< name 表名 + LONG max_row; ///< 静态表标志,1为静态表,0为动态表 + DB_table_init_func_t table_init_func; ///< 表初始化函数,可以为空 + CHAR table_init_func_name[DB_TABLE_INIT_FUNC_NAME_LEN]; +}DB_table_info_t; + +/** filer子元素 */ +typedef struct DB_query_filter_sub_s{ + CHAR col_name[DB_COLUMN_NAME_LEN]; ///< name 表名 + DB_data_val_t val[DB_FILTER_SUB_VAL_NUM]; + DB_filter_sub_type_t sub_type; + DB_filter_option_t option; +}DB_query_filter_sub_t; + +/** filer */ +typedef struct DB_query_filter_s{ + DB_query_filter_sub_t sub[DB_FILTER_SUB_NUM]; + DB_filter_option_t option; +}DB_query_filter_t; + + +/** 排序方式 */ +typedef enum DB_ret_code_e{ + DB_RET_CODE_OK = 0, ///< 执行成功 + DB_RET_CODE_table_already_exist , ///< 表已存在 + DB_RET_CODE_table_not_exist , ///< 表已存在 + DB_RET_CODE_table_info_already_exist , ///< 表的信息在数据库管理表中已存在(由数据库模块问题导致) + DB_RET_CODE_col_info_already_exist , ///< 表的列信息在数据库管理表中已存在(由数据库模块问题导致) + DB_RET_CODE_table_info_not_exist , ///< 表的信息在数据库管理表中不存在(由数据库模块问题导致) + DB_RET_CODE_col_info_not_exist , ///< 表的列信息在数据库管理表不中已存在(由数据库模块问题导致) + DB_RET_CODE_table_info_add_error , ///< 数据库模块添加表信息失败 + DB_RET_CODE_col_info_add_error , ///< 数据库模块添加列信息失败 + DB_RET_CODE_get_col_size_error , ///< 获取列大小失败 + DB_RET_CODE_row_data_have_more , ///< row_handle 中还有数据 + DB_RET_CODE_row_data_done , ///< row_handle 中没有数据 + DB_RET_CODE_row_data_pk_exist , ///< 添加的数据主键冲突 + DB_RET_CODE_table_full , ///< 表已满,无法在添加数据 + + DB_RET_CODE_error, ///< 其他错误 + DB_RET_CODE_max, ///< +}DB_ret_code_t; + + +/** + * 打开平台数据库 + * @param[out] db 成功时返回被打开的数据 + * @return 成功返回 VOS_OK,失败则返回其他 + */ +LONG DB_open_plat_db(DB_database_t *db); + + +/** + * 关闭平台数据库 + * @param[in ] db 要操作的数据库 + * @return 成功返回 VOS_OK,失败则返回其他 + */ +LONG DB_close_plat_db(DB_database_t *db); + + +/** + * 查看表是否存在 + * @param[in ] db 要操作的数据库 + * @param[in ] table_name 表名 + * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 + * @param[in ] timeout 等待执行结果的时间,单位 秒 + * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, + */ +BOOL DB_table_exist(DB_database_t *db,const CHAR *table_name, + LONG *retCode,LONG timeout); + + +/** + * 在指定数据库中创建表 + * @param[in ] db 要操作的数据库 + * @param[in ] table 表信息 + * @param[in ] cols 表的列定义数组,数组最后一个成员的name为空做为数组结尾 + * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 + * @param[in ] timeout 等待执行结果的时间,单位 秒 + * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, + */ +LONG DB_table_create(DB_database_t *db,DB_table_info_t *table,DB_column_info_t cols[], + LONG *retCode,LONG timeout); + + +/** + * 在指定数据库中删除表 + * @param[in ] db 要操作的数据库 + * @param[in ] name 表名 + * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 + * @param[in ] timeout 等待执行结果的时间,单位 秒 + * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, + */ +LONG DB_table_delete(DB_database_t *db,const CHAR name[DB_TABLE_NAME_LEN], + LONG *retCode,LONG timeout); + + +/** + * 向表中插入一行数据 + * @param[in ] db 要操作的数据库 + * @param[in ] table_name 要操作的表名 + * @param[in ] data 要插入的数据,需按照创建表时定义的按顺序和大小排列每项数据, + 可以传入按1字节对齐的结构体。 + * @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 + * @param[in ] timeout 等待执行结果的时间,单位 秒 + * @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, + */ +LONG DB_table_row_add(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],VOID *data, + LONG *retCode,LONG timeout); + + +/** +* 查询数据 +* @param[in ] db 要操作的数据库 +* @param[in ] table_name 要操作的表名 +* @param[out] row_handle 查询到的行句柄 +* @param[in ] filter 查询时的过滤条件,为NULL 表示没有过滤条件,查询所有行 +* @param[in ] filter_num filter的个数 +* @param[in ] order 查询结果排序方式 +* @param[in ] order_num order的个数 +* @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 +* @param[in ] timeout 等待执行结果的时间,单位 秒 +* @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, +*/ +LONG DB_table_row_query(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],DB_row_handle_t *row_handle, + DB_query_filter_t filter[],LONG filter_num,DB_order_t order[],LONG order_num, + LONG *retCode,LONG timeout); + + + +/** +* 获取行句柄当前行数据,并自动指向下一行,当没下一行数据时,句柄会被销毁,不可再用 +* @param[in ] db 要操作的数据库 +* @param[in ] table_name 要操作的表名 +* @param[in] row_handle 行句柄 +* @param[out] data 获取到的数据,按照创建表时定义的按顺序和大小排列每项数据, + 可以传入按1字节对齐的结构体指针。 +* @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 +* @param[in ] timeout 等待执行结果的时间,单位 秒 +* @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, +*/ +LONG DB_table_row_data_pop(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN], + DB_row_handle_t *row_handle,VOID *data, + LONG *retCode,LONG timeout); + +/** +* 销毁行句柄 +* @param[in ] db 要操作的数据库 +* @param[in ] table_name 要操作的表名 +* @param[in ] row_handle 行句柄 +* @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 +* @param[in ] timeout 等待执行结果的时间,单位 秒 +* @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, +*/ +LONG DB_table_row_handle_destroy(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],DB_row_handle_t *row_handle, + LONG *retCode,LONG timeout); + + +/** +* 删除行 +* @param[in ] db 要操作的数据库 +* @param[in ] table_name 要操作的表名 +* @param[in ] filter 删除时的过滤条件,为NULL 表示没有过滤条件,删除所有行 +* @param[in ] filter_num filter的个数 +* @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 +* @param[in ] timeout 等待执行结果的时间,单位 秒 +* @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, +*/ +LONG DB_table_row_delete(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN], + DB_query_filter_t filter[],LONG filter_num, + LONG *retCode,LONG timeout); + + + +/** +* 更新行 +* @param[in ] db 要操作的数据库 +* @param[in ] table_name 要操作的表名 +* @param[in ] newData 新的数据,需按照创建表时定义的按顺序和大小排列每项数据, + 可以传入按1字节对齐的结构体。 +* @param[in ] filter 更新时的过滤条件,为NULL 表示没有过滤条件,更新所有行 +* @param[in ] filter_num filter的个数 +* @param[in ] col 只会用到name成员,用于更新指定的列,为NULL 表示更新匹配行的每一列,数组最后一个成员的name为空做为数组结尾 +* @param[in ] col_num col的个数 +* @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 +* @param[in ] timeout 等待执行结果的时间,单位 秒 +* @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, +*/ +LONG DB_table_row_update(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],VOID *newData, + DB_query_filter_t filter[],LONG filter_num,DB_column_info_t col[],LONG col_num, + LONG *retCode,LONG timeout); + + +/** +* 计算行数 +* @param[in ] db 要操作的数据库 +* @param[in ] table_name 要操作的表名 +* @param[out] row_count 查询到的行数 +* @param[in ] filter 查询时的过滤条件,为NULL 表示没有过滤条件,查询所有行 +* @param[in ] filter_num filter的个数 +* @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 +* @param[in ] timeout 等待执行结果的时间,单位 秒 +* @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, +*/ +LONG DB_table_row_count(DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],LONG *row_count, + DB_query_filter_t filter[],LONG filter_num, + LONG *retCode,LONG timeout); + +/** +* 覆盖最早插入的数据,用于表行数到达上限的覆盖操作 +* @param[in ] db 要操作的数据库 +* @param[in ] table_name 要操作的表名 +* @param[in ] newData 新的数据,需按照创建表时定义的按顺序和大小排列每项数据, + 可以传入按1字节对齐的结构体。 +* @param[out] retCode 数据库执行结果,如果不关心可以填 NULL,如果关心需要传入timeout,等待时间 +* @param[in ] timeout 等待执行结果的时间,单位 秒 +* @return 返回向数据库模块发送消息的结果,成功返回 VOS_OK,失败则返回其他, +*/ +LONG DB_table_overwrite_first_row( DB_database_t *db,const CHAR table_name[DB_TABLE_NAME_LEN],VOID *newData, + LONG *retCode,LONG timeout); + + +/** +* 将DB 的error code转换成字符串 +* @param[in ] code 错误码 +* @return 返回错误码对应的字符串 +*/ +const CHAR *DB_err_msg(LONG code); + + +#ifdef __cplusplus +} +#endif /* end of __cplusplus */ + +#endif /* end of __PLAT_DB_H__ */ +