379 lines
21 KiB
C
379 lines
21 KiB
C
|
/*****************************************************************************
|
|||
|
* @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] 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
|