我的代码架构如下,用start end标注你的代码
1.big_data_edge.c
int main() {
创建子线程
for (i = 0; i < client_num; i++) {
CS104_Client_Init(&client_helper[i]);
// ...(其他初始化)...
pthread_create(&client_thread[i], NULL, CS104_Client_Task, &client_helper[i]);
}
}
2.cs104_client_main.c
__thread MYSQL* thread_conn = NULL;
int mysql_storage_start()
{
BDC810_CS104_LOG_INFO("start\n");
//read_data();
//return 0;
int data_count = 0;
//drop_all_tables();
// 初始化数据库连接
if (init_database() != 0) {
BDC810_CS104_LOG_ERROR("Database initialization failed\n");
return 1;
}
#if 0
// 计算环形缓冲区中的数据条目
if (CS104_Data_Buffer.ptr != NULL)
{
int front = CS104_Data_Buffer.ptr->front;
int rear = CS104_Data_Buffer.ptr->rear;
int size = CS104_Data_Buffer.ptr->size;
data_count = (rear - front + size) % size;
printf("Ring buffer contains %d data entries\n", size);
}
//printf("Ring buffer contains %d data entries\n", data_count);
#endif
//deleate_all_table(conn);
//char table_names[MAX_TABLES][64];
int table_num =Configuration_get_mysql_table_count();
//int table_creat_count = create_new_tables(table_num, table_names);
//if (table_creat_count <= 0) {
// BDC810_CS104_LOG_ERROR("Failed to create tables\n");
//return 1;
//}
BDC810_CS104_LOG_INFO("Successfully created %d tables\n");
//1.通过配置文件确定测点数量=表的数量
//2.
return 0;
}
/* 初始化数据库连接 */
int init_database()
{
//conn = mysql_init(NULL);
thread_conn = mysql_init(NULL);
if (thread_conn == NULL) {
BDC810_CS104_LOG_ERROR("mysql_init() failed\n");
return -1;
}
printf("mysql_init() ok\n");
#if 0
if (NULL== mysql_real_connect(conn, "192.168.103.32", "root", "123456", "resource_center", 3306, NULL, 0))
{
BDC810_CS104_LOG_ERROR("can not connect to mysql.\n");
// 打印详细的错误信息
BDC810_CS104_LOG_ERROR("Connection error111111111: %s\n", mysql_error(conn));
exit(1);
}
#endif
//配置值
const char* mysql_ip = Configuration_get_mysql_ip();
int mysql_port = Configuration_get_mysql_port();
const char* mysql_user = Configuration_get_mysql_user();
const char* mysql_password = Configuration_get_mysql_password();
const char* mysql_dbname = Configuration_get_mysql_dbname();
const char* create_db_sql = "CREATE DATABASE IF NOT EXISTS ";
const char* grant_sql = "GRANT ALL PRIVILEGES ON ";
const char* to_user = " TO 'remote_user'@'%'";
const char* local_sock = "/run/media/userdata/mysql-5.7.27/mysql.sock";
char sql_buffer[512];
// 打印配置
printf("MySQL 连接参数:\n"
" IP: %s\n"
" 端口: %d\n"
" 用户名: %s\n"
" 密码: %s\n"
" 数据库: %s\n",
mysql_ip,mysql_port,mysql_user,mysql_password,mysql_dbname);
//连接MySQL
if (NULL == mysql_real_connect(thread_conn,mysql_ip,mysql_user,mysql_password,mysql_dbname,mysql_port, local_sock, 0))
{
printf("can not connect to mysql.\n");
// 打印详细的错误信息
printf("Connection error111111111: %s\n", mysql_error(thread_conn));
exit(1);
}
printf("成功连接到MySQL服务器\n");
// 1. 创建数据库
snprintf(sql_buffer, sizeof(sql_buffer), "%s%s", create_db_sql, DB_NAME);
if (mysql_query(thread_conn, sql_buffer)) {
printf("CREATE DATABASE failed: %s\n", mysql_error(thread_conn));
mysql_close(thread_conn);
return -1;
}
// 2. 授予权限
snprintf(sql_buffer, sizeof(sql_buffer), "%s%s.*%s", grant_sql, DB_NAME, to_user);
if (mysql_query(thread_conn, sql_buffer)) {
printf("GRANT PRIVILEGES failed: %s\n", mysql_error(thread_conn));
mysql_close(thread_conn);
return -1;
}
// 3. 刷新权限
if (mysql_query(thread_conn, "FLUSH PRIVILEGES")) {
printf("FLUSH PRIVILEGES failed: %s\n", mysql_error(thread_conn));
mysql_close(thread_conn);
return -1;
}
// 4. 使用数据库
if (mysql_query(thread_conn, "USE " DB_NAME)) {
printf("USE DATABASE failed: %s\n", mysql_error(thread_conn));
mysql_close(thread_conn);
return -1;
}
return 0;
}
子线程入口函数
void* CS104_Client_Task(void* arg) {
// ...(业务逻辑)...
1.mysql_storage_start初始化 创建数据库
2.cs104_data_storage.c处理数据写入数据库
}
cs104_data_storage.c
printf("creat table mysql start================ccuid=%d rtuid=%d name=%s \n",ccuid,mapping[ccuid][i].rtuid, out_name);
// 1. 生成表名(与创建表时的规则一致)
char table_name[MAX_TABLE_NAME_LEN*5];
snprintf(table_name, MAX_TABLE_NAME_LEN, "%s_CCU%d_RTU%d_%s",prefix, ccuid, mapping[ccuid][i].rtuid, out_name);
printf("creat table mysql start================1 \n");
printf("creat table mysql start================2 table_name=%s i=%d\n",table_name,i);
// 2.创建表的SQL语句
sprintf(query, "CREATE TABLE IF NOT EXISTS %s ("
"`id` INT NOT NULL AUTO_INCREMENT,"
"`key` BIGINT NOT NULL,"
"`value` FLOAT NOT NULL,"
"PRIMARY KEY (`id`),"
"UNIQUE INDEX `key_UNIQUE` (`key` ASC))",
table_name);
printf("creat table mysql start================2 \n");
// 执行SQL语句
if (mysql_query(thread_conn, query) != 0)
{
printf("创建表失败 %s: %s\n",table_name, mysql_error(thread_conn));
}
else
{
printf("创建表成功 %s\n",table_name);
//printf("Table %s created successfully\n", table_names[table_idx]);
}
printf("creat table mysql start================3 \n");
// 3. 拼接SQL并写入数据,key是时间戳
// 生成INSERT 语句
char sql[MAX_TABLE_NAME_LEN*20];
snprintf(sql, sizeof(sql),
"INSERT INTO %s (`key`, `value`) VALUES (%lu, %f);",
table_name, local_time, real_data);
// 打印完整 SQL 语句
printf("待执行的 INSERT SQL: %s\n", sql); // 检查语句是否合法
// 执行SQL语句
if (mysql_query(thread_conn, sql) != 0)
{
printf("写入数据失败 %s: %s\n", table_name, mysql_error(thread_conn));
printf("写入数据失败 %s: %s\n",table_name);
}
else
{
printf("写入数据成功:sql %s name %s\n", sql, table_name);
//printf("Table %s created successfully\n", table_names[table_idx]);
}
打印如下:
query_point_info starta1 type=3
query_point_info starta2
query_point_info starta3
query_point_info startaSET g_set_count=48
query_point_info starta8
query_point_info starta9 count=48
query_point_info starta11
query_point_info starta12 name_len=4
creat table mysql start================ccuid=0 rtuid=1 name=set1
creat table mysql start================1
creat table mysql start================2 table_name=SET_CCU0_RTU1_set1 i=0
creat table mysql start================2
Segmentation fault (core dumped)
最新发布