forked from gary/ems
2
0
Fork 0
sun_ems/ems_c/kernel/kit_db.h

379 lines
21 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************************
* @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 <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#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] diDoSetsDIDO逻辑设置结构体的 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] breakDbIdMQTT断联的数据库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