📄 db.c
字号:
#include <stdio.h> #include <mysql.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <errmsg.h>#include <mysqld_error.h>#include <string.h>#include <stdlib.h>#include <signal.h> #include <pthread.h>#include "devicelog.h"#include "db.h"#include "queue.h"#include "logging.h" #ifndef MYSQL_VERSION_ID /*below the mysql server 3.22.34 ,use the mysql_field_count */#define mysql_field_count mysql_num_fields#endif#if MYSQL_VERSION_ID > 32224#define mysql_field_count mysql_num_fields#endifextern int sem; //信号量,用于与服务器消息接收线程通信extern pthread_cond_t ndone_cond; //条件变量,用于与服务器消息接收线程通信extern pthread_mutex_t ndone_mutex; //互斥锁,用于与服务器消息接收线程通信extern LinkQueue *Q;#define filename "/.itworks.conf" //mysql的客户端需要的连接参数,包括用户名,密码等char hostname[16],username[16],password[16],dbname[10]; //用来存储连接数据库的参数:主机名,用户名,密码,数据库名char severity_level[2]; //定义紧急时间处理级别char mail_server[16]; //定义邮件服务器地址char from_addr[64];MYSQL *conn=NULL; //定义MYSQL的连接句柄 /**************************************************************************************************************** 函数功能: 初始化mysql客户端所需的各种参数****************************************************************************************************************/void initparameters(void) { char string[20]; FILE *fp=NULL; int i=0,j=0; char ch; fp=fopen(filename,"r"); if(!fp) { log_fatal("InitDBparameters","ERROR: Can not open the mysql config file!"); exit(1); } do { memset(string,0,20); ch=fgetc(fp); while(ch!='\n'&&ch!=EOF) { string[i]=ch; ch=fgetc(fp); i++; } string[i]='\0'; switch(string[1]) { case 'h': j=strcspn(string,"=");j++; //printf("the host name is:%s\n",string+j); memset(hostname,0,16); strncpy(hostname,string+j,strlen(string+j)); hostname[strlen(string+j)]='\0'; break; case 'u': j=strcspn(string,"=");j++; //printf("the user name is :%s\n",string+j); memset(username,0,16); strncpy(username,string+j,strlen(string+j)); username[strlen(string+j)]='\0'; break; case 'p': j=strcspn(string,"=");j++; // printf("the password is :%s\n",string+j); memset(password,0,16); strncpy(password,string+j,strlen(string+j)); password[strlen(string+j)]='\0'; break; case 'd': j=strcspn(string,"="); j++; // printf("the password is :%s\n",string+j); memset(dbname,0,10); strncpy(dbname,string+j,strlen(string+j)); dbname[strlen(string+j)]='\0'; break; case 's': j=strcspn(string,"="); j++; // printf("the password is :%s\n",string+j); memset(severity_level,0,sizeof(severity_level)); strncpy(severity_level,string+j,strlen(string+j)); severity_level[strlen(string+j)]='\0'; break; case 'm': j=strcspn(string,"="); j++; // printf("the password is :%s\n",string+j); memset(mail_server,0,sizeof(mail_server)); strncpy(mail_server,string+j,strlen(string+j)); mail_server[strlen(string+j)]='\0'; break; case 'f': j=strcspn(string,"="); j++; // printf("the password is :%s\n",string+j); memset(from_addr,0,sizeof(from_addr)); strncpy(from_addr,string+j,strlen(string+j)); from_addr[strlen(string+j)]='\0'; break; default: break; } i=0; }while(ch!=EOF); fclose(fp); log_debug("HOSTNAME",hostname); log_debug("USERNAME",username); log_debug("PASSWORD",password); log_debug("DBNAME",dbname); log_debug("MAILSERVER",mail_server); log_debug("SEVERITY_LEVEL",severity_level); log_debug("FROM_ADDR",from_addr); log_info("DB","The parameters has initialized!");} /****************************************************************************************************** 函数功能: 处理select语句的查询 @ conn: 与MYSQL的连接指针 @ selectquery: 查询语句 @ result: 查询结果*******************************************************************************************************/void process_select_query(MYSQL *conn,char *selectquery,char *result){ MYSQL_RES *res; MYSQL_ROW rows; if(mysql_real_query(conn,selectquery,strlen(selectquery))!=0) { log_warn("DB","error in select query!"); log_debug("DB",selectquery); log_warn("DB",(char *)mysql_error(conn)); if(CR_SERVER_LOST == mysql_errno(conn)) //与服务器失去连接,重新发起连接 conn=doconnect(); return ; } res=mysql_store_result(conn); rows=mysql_fetch_row(res); if(rows!=NULL) strcpy(result,rows[0]); //将查询结果保存在result中 else strcpy(result,"Unknown"); //没有记录则将result置于“Unknown” }/********************************************************************************************************* 函数功能: 处理有返回结果的查询,并将结果全部打印***********************************************************************************************************/ void process_result_set(MYSQL_RES *res) { int colCount=0,j=0; MYSQL_ROW row; colCount=(int) mysql_num_fields(res); while((row=mysql_fetch_row(res))!=NULL) { for(j=0;j<colCount;j++) { log_debug("DB",row[j]); } } } /*end of process_result_set*//******************************************************************************************************************* 函数功能:处理查询,主要处理了不返回结果的查询,如insert语句,和返回结果的查询,如select语句 @ conn: MYSQL的连接指针 @ query: sql查询语句********************************************************************************************************************/void process_query(MYSQL *conn,char * query) { MYSQL_RES *res; if(mysql_real_query(conn,query,strlen(query))!=0) { log_warn("DB","error in query!"); log_debug("DB",query); log_warn("DB",(char *)mysql_error(conn)); if(CR_SERVER_LOST == mysql_errno(conn)) //与服务器失去连接,重新发起连接 conn=doconnect(); return ; } else { res=mysql_store_result(conn); if(res==NULL) { if(mysql_field_count(conn)>0)/*an error in store the result*/ { log_warn("DB","there are some problem in store the result\n"); return ; } else /*the query has no return result*/ { log_info("DB","One info insert into database!"); } } else { process_result_set(res); mysql_free_result(res); } }}/*end of process_query*/ /****************************************************************************************************************** 函数功能: 于mysql服务器建立连接******************************************************************************************************************/MYSQL * doconnect(){ MYSQL * conn; conn=mysql_init(NULL); if(conn==NULL) { log_error("DB","Connect init error!"); log_error("DB",(char *)mysql_error(conn)); return NULL; } if(mysql_real_connect(conn,hostname, username, password, dbname, 0, NULL, 0 )==NULL) { log_error("DB","can't connect to the mysql server !"); return NULL; } log_info("DB","Connect to the mysql server!"); return conn;}void reconfig(){ if(conn != NULL) { disconnect(conn); } initparameters(); conn=doconnect(); return ;}/********************************************************************************************************************* 函数功能: 关闭与mysql服务器的连接 @ conn : 与MYSQL服务器的连接指针********************************************************************************************************************/void disconnect(MYSQL * conn){ mysql_close(conn); conn=NULL; log_info("DB","Disconnect to the mysql server!"); // printf("close the connection to the mysql server!\n");} void sendmail_write(const int sock,const char *str, const char *arg){ char buf[4096]; memset(buf,0,sizeof(buf)); if(arg!=NULL) snprintf(buf,sizeof(buf),str,arg); else snprintf(buf,sizeof(buf),str); send(sock,buf,strlen(buf),0); }int sendmail(const char *from, const char *to, const char *subject,const char *body, const char *hostname,const int port){ struct sockaddr_in server_addr; int sock=0; sock=socket(AF_INET,SOCK_STREAM,0); bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(port); inet_aton(hostname,server_addr.sin_addr); if(connect(sock,(struct sockaddr *)&server_addr,sizeof(server_addr))<0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -