/***************************************************************************** * @copyright 2024-202, . POWER SUPPLY CO., LTD. * @file xxx.c * @brief xxxx * @author xx * @date 2024/08/30 * @remark 初修订 *****************************************************************************/ #ifndef __KIT_DB_H__ #define __KIT_DB_H__ #include #include #include #include #include #include #include "kit_data.h" #include "utarray.h" #include "sqlite3.h" // sql返回数据类型,原有的db应用模块取所有数据,没有可扩展性,由于常用,放在这里 typedef struct { char **dbresult; int nrow; int ncolumn; char *errmsg; } db_table_data_t; // typedef enum // { // }db_tables_name_e; /* ############################################################################### 配置数据库操作 ############################################################################### */ /***************************************************************************** * @brief 初始化 SQLite 数据库 * @param[in] schema_dir: 存储 SQL 文件的目录路径 * @return 0-成功 1-失败 *****************************************************************************/ int kit_init_db(const char *schema_dir); /***************************************************************************** * @brief 从 SQLite 数据库中获取数据表数据。使用准备好的语句(Prepared Statement)从 SQLite数据库中 * 获取数据表数据,避免使用 `sqlite3_get_table`,因为它是一个过时的接口,存在安全和性能问题。 * @param[out] outData: 用于存储查询结果的结构体指针。 * @param[in] tableName: 数据表名称。 * @param[in] columnsName: 要查询的列名数组,可以为 NULL 或空数组,表示查询所有列。 * @param[in] columnNum: 要查询的列名数量。 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_db_data(db_table_data_t *outData, const char *tableName, const char *columnsName[], int columnNum); /***************************************************************************** * @brief 从数据库查询电站数据 * @param[in] p_station:电站信息的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_station_db_data(station_t *p_station); /***************************************************************************** * @brief 从数据库获取设备信息 * @param[out] devPointInfo: 用于存储设备信息的 UT_array 指针 * @return 0-成功 -1失败 *****************************************************************************/ int kit_get_dev_db_data(UT_array **devPointInfo); /***************************************************************************** * @brief 将 config_db 中的 device 表数据复制到 business_db 中的 device 表 * @return 0-成功 1-失败 *****************************************************************************/ int kit_sync_dev_data(); /***************************************************************************** * @brief 从数据库获取协议信息。 * 该函数从数据库中获取与指定设备 ID 关联的协议信息。 * 它使用准备好的语句(Prepared Statement)来执行查询,并绑定设备 ID 参数。 * 函数会返回获取到的协议信息,并处理查询过程中的错误。 * @param[in] templateType: 模板类别(0设备配置, 1北向配置)。 * @param[in] relatedId: 关联数据库 ID。 * @param[out] protoContent: 用于存储协议信息的字符数组。 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_protocol_db_data(const template_type_e templateType, const uint64_t relatedId, char protoContent[MAX_CONFIG_CONTENT_LEN]); /***************************************************************************** * @brief 从数据库获取点位信息 * @param[in] templateId: 模板Id * @param[out] points: 用于存储点位信息的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_point_db_data(const uint64_t devDbId, UT_array **points); /***************************************************************************** * @brief 从数据库获取读取时序数据配置 * @param[out] timedDataConfigs: 用于指定存储间隔类型的的时序数据配置的数据 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_tdata_config(UT_array **timedDataConfigs); /***************************************************************************** * @brief 从 config_db 获取点位信息并同步到 business_db * @param[out] 无 * @return 0-成功 1-失败 *****************************************************************************/ int kit_sync_point_data(); /***************************************************************************** * @brief 从数据库获取故障点位配置 * @param[out] faultsDataConfigs: 用于存储故障配置点位的数据 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_faults_config(UT_array **faultsDataConfigs); /***************************************************************************** * @brief 从数据库获取EMS设备配置信息 * @param[out] emsDevConfigs: 用于设备配置信息的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_config_db_data(UT_array **emsDevConfigs); /***************************************************************************** * @brief 根据指定配置类型Type从数据库获取 EMS 设备配置信息 * @param[in] type: 配置类型 * @param[out] emsDevConfig: 用于存储设备配置信息的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_config_by_type(ems_dev_config_type_e type, ems_dev_config_t *emsDevConfig); /***************************************************************************** * @brief 根据协议类型获取北向配置信息 * @param[out] northConfigs: 用于存储北向配置信息的数组, 使用 UT_array 存储 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_north_config_arr(UT_array **northConfigs); /***************************************************************************** * @brief 获取所有削峰填谷的日期配置 * @param[out] pvDateConfigs: 削峰填谷的日期配置数组, 使用 UT_array 存储 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_pv_date_cfg_db_data(UT_array **pvDateConfigs); /***************************************************************************** * @brief 根据削峰填谷时间配置的数据库Id获取削峰填谷时间执行配置 * @param[in] pvTimeCfgDbId: 削峰填谷时间配置的数据库Id * @param[out] pvDateConfig: 用于存储削峰填谷的日期配置, 包含一个 pv_time_config_t 类型的数组 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_pv_time_cfg_db_data(int pvDateCfgDbId, pv_date_config_t *pvDateConfig); /***************************************************************************** * @brief 设置所有削峰填谷的日期配置 * @param[out] pvDateTimeConfigs: 削峰填谷的日期配置、时间配置数组, 使用 UT_array 存储 * @return 0-成功 1-失败 *****************************************************************************/ int kit_set_pv_date_time_cfg(UT_array **pvDateTimeConfigs); /***************************************************************************** * @brief 从数据库获取EMS拓扑结构信息 * @param[out] topologys: 用于存储ems拓扑信息结构体的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_topology_db_data(UT_array **topologies); /***************************************************************************** * @brief 从数据库里获取保护算法的控制参数 * @param[in] p_protectAlgo:保护算法结构体指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_protect_algorithm(protect_algorithm_t *p_protectAlgo); /***************************************************************************** * @brief 更新数据库的保护算法数据 * @param[in] p_protectAlgo:保护算法结构体指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_set_protect_algorithm(protect_algorithm_t *p_protectAlgo); /***************************************************************************** * @brief 从数据库里获取调试模式算法的控制参数 * @param[in] p_debugAlgo:调试模式算法结构体指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_debug_algorithm(debug_algorithm_t *p_debugAlgo); /***************************************************************************** * @brief 更新数据库的调试模式算法数据 * @param[in] p_debugAlgo:调试模式算法结构体指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_set_debug_algorithm(debug_algorithm_t *p_debugAlgo); /***************************************************************************** * @brief 从数据库查询功率分配数据 * @param[in] p_allocatePower:功率分配的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_allocate_power(allocate_power_t *p_allocatePower); /***************************************************************************** * @brief 更新数据库的功率分配数据 * @param[in] p_allocatePower:功率分配的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_set_allocate_power(allocate_power_t *p_allocatePower); /***************************************************************************** * @brief 从数据库查询工作模式数据 * @param[in] p_workModeSet:工作模式的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_work_mode_set(work_mode_set_t *p_workModeSet); /***************************************************************************** * @brief 更新数据库的工作模式数据 * @param[in] p_workModeSet:工作模式的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_set_work_mode(work_mode_set_t *p_workModeSet); /***************************************************************************** * @brief 从数据库查询DIDO逻辑设置数据 * @param[in] diDoSets:DIDO逻辑设置结构体的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_di_do_set_arr(UT_array **diDoSets); /***************************************************************************** * @brief 从数据库里获取温控算法的控制参数 * @param[in] p_tempCtrlAlgo:温控算法结构体指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_temp_ctrl_algorithm(temp_ctrl_algorithm_t *p_tempCtrlAlgo); /***************************************************************************** * @brief 更新数据库的温控算法数据 * @param[in] p_tempCtrlAlgo:温控算法结构体指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_set_temp_ctrl_algorithm(temp_ctrl_algorithm_t *p_tempCtrlAlgo); /***************************************************************************** * @brief 从数据库获取高级设置 * @param[out] advancedSettings: 用于存储高级设置的数据 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_advanced_setting(UT_array **advancedSettings); /***************************************************************************** * @brief 从数据库查询升级记录数据 * @param[in] p_upgradeRecord:升级记录的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_get_upgrade_record(upgrade_record_t *p_upgradeRecord); /***************************************************************************** * @brief 更新数据库的升级记录数据 * @param[in] p_upgradeRecord:升级记录的指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_update_upgrade_record(upgrade_record_t *p_upgradeRecord); /* ############################################################################### 业务数据库操作 ############################################################################### */ /***************************************************************************** * @brief 批量插入时序数据存储 * @param[in] timedDatas: 用于存储备份数据的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_insert_timed_data(UT_array *timedDatas); /***************************************************************************** * @brief 根据日期时间条件,删除该日期时间之前timed_data_storage的数据 * @param[in] storage_interval:存储周期 * @param[in] date_time_string:日期时间 * @return 0-成功 1-失败 *****************************************************************************/ int kit_del_timed_data_by_date(int storage_interval, const char *date_time_string); /***************************************************************************** * @brief 批量插入故障数据存储 * @param[in] faultsDatas: 用于存储故障数据的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_insert_faults_data(UT_array *faultsDatas); /***************************************************************************** * @brief 根据日期时间条件,删除该日期时间之前faults_data_storage的数据 * @param[in] date_time_string:日期时间 * @return 0-成功 1-失败 *****************************************************************************/ int kit_del_faults_data_by_date(const char *date_time_string); /******************************************************************************* * @brief 删除指定时间字符串之前的断点保存数据 * @param[in] date_time_string 日期时间字符串,格式为"YYYY-MM-DD HH:MM:SS" * @return 0-成功 1-失败 *****************************************************************************/ int kit_del_break_data_by_date(const char *date_time_string); /***************************************************************************** * @brief 更新MQTT断开记录的上传状态。此函数更新数据库中MQTT断开记录的`is_uploaded`字段。 * @param[in] breakRecord: 指向包含MQTT断开信息的结构体指针。该结构体必须包含断开记录在数据库中的ID (`dbId`) 和新的上传状态 (`isUploaded`)。 * @return 0-成功更新记录;1-更新记录失败(包括SQL语句预编译失败、SQL语句执行失败或未找到匹配的记录)。如果SQL语句执行成功,但没有更新任何行(例如,`dbId`不存在),则返回1,并记录警告日志。 *****************************************************************************/ int kit_update_break_record(break_record_t *breakRecord); /***************************************************************************** * @brief 查询MQTT断开记录,根据isUploaded字段筛选。 * @param[in] isUploaded: 要查询的is_uploaded字段值。如果为255,则查询所有记录。 * @param[out] breakRecord: 用于存储查询结果的UT_array指针。 * @return 0-成功 1-失败 *****************************************************************************/ int kit_query_break_records(uint8_t isUploaded, UT_array **breakRecord); /***************************************************************************** * @brief 插入MQTT断开记录,包括中断原因、是否已上传以及断开开始和结束时间。返回插入记录的ID。 * @param[in] breakRecord: 包含MQTT断开信息的结构体指针:该结构体必须包含中断原因(reason) * @return 插入记录的ID;-1-插入记录失败(包括SQL预编译失败和SQL执行失败)。 *****************************************************************************/ long long kit_insert_break_record(break_record_t *breakRecord); /***************************************************************************** * @brief 批量插入MQTT断联时的历史数据存储 * @param[in] breakDbId:MQTT断联的数据库Id * @param[in] timedDatas: 用于历史数据存储的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_insert_break_data_storage(uint64_t breakDbId, UT_array **timedDatas); /***************************************************************************** * @brief 根据断开记录ID和行号范围查询断开数据。 * @param[in] breakDbId: MQTT断开记录的数据库ID。 * @param[out] timedDatas: 用于存储查询数据的UT_array指针。必须在调用之前初始化。 * @return 0-成功;1-失败 *****************************************************************************/ int kit_query_break_data(uint64_t breakDbId, UT_array **timedDatas); /***************************************************************************** * @brief 批量更新断开数据的上传状态,使用事务保证数据一致性。 * @param[in] break_id: MQTT断开记录的break_id。 * @param[in] ids: storage的id数组。 * @param[in] length: storage的id数组长度。 * @return 0-成功;1-失败 *****************************************************************************/ int kit_update_break_data(uint16_t break_id, uint64_t ids[], int length); /***************************************************************************** * @brief 批量插入插入功率数据 * @param[in] powerDatas: 用于存储备份数据的 UT_array 指针 * @return 0-成功 1-失败 *****************************************************************************/ int kit_insert_power_data(UT_array *powerDatas); /***************************************************************************** * @brief 根据日期时间条件,删除该日期时间之前power_data_storage的数据 * @param[in] date_time_string:日期时间 * @return 0-成功 1-失败 *****************************************************************************/ int kit_del_power_data_by_date(const char *date_time_string); /***************************************************************************** * @brief 获取指定表中特定dbId的记录数量 * @param[in] db: SQLite3 数据库连接对象 * @param[in] tabName: 查询表的名称 * @param[in] dbid: 用于查询记录的dbId值 * @return 记录数量(成功返回记录数量;失败返回-1) *****************************************************************************/ int kit_get_record_count_by_dbid(sqlite3 *db, const char *tabName, uint64_t dbid); /***************************************************************************** * @brief 插入北向断开记录,记录最新连接状态。 * @param[in] connectStatus: 连接状态 * @return 0-成功 1-失败。 *****************************************************************************/ int kit_insert_lost_contact_record(const char* connectStatus); #endif