首页 > 代码库 > linux下操作mysql,支持重连

linux下操作mysql,支持重连

(一)code

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
#include <mysql/errmsg.h>
#include <sys/time.h>


#define MAX_QUERY_LEN 1024
#define MAX_QUERY_COUNT 2
#define PRINT_MYSQL_ERROR(mysql) fprintf(stderr, "mysql-error:%s\n", mysql_error(mysql))


typedef struct prop_global{
  MYSQL *mysql;
  char *db_host;
  char *db_user;
  char *db_pwd;
  char *db_name;
  char query[MAX_QUERY_LEN];
  int order_id;  
}prop_global_t;


static prop_global_t *g_p;


int prop_init(const char *host, const char *user, const char *pwd, const char *db){
   prop_global_t *y=(prop_global_t *) malloc( sizeof(*y));
  
   y->mysql = mysql_init(NULL);
   if( NULL == y->mysql ){
       PRINT_MYSQL_ERROR( y->mysql );
       return -1;
   }
 //  printf("mysql %s, %s, %s, %s\n", host, user, pwd, db);
   if( NULL == mysql_real_connect( y->mysql, host, user, pwd, db, 0, NULL, 0 ) ){
        PRINT_MYSQL_ERROR( y->mysql );
       return -1;
   }
   
   y->db_host = strdup(host);
   y->db_user = strdup(user);
   y->db_pwd  = strdup(pwd );
   y->db_name = strdup( db);
   y->order_id = 1;
   g_p = y;
   //printf("mysql init ok\n");
   return 0;
}


int safe_query( prop_global_t *y, const char *query, int len){
   int i;
   int errno;
   //printf("sql: %d %s\n", len, query );
   for( i=0; i<MAX_QUERY_COUNT; i++){
      errno = mysql_real_query(y->mysql, query, len);
      switch( errno ){
      case 0: return 0;
      case CR_SERVER_GONE_ERROR:
      case CR_SERVER_LOST:
           mysql_close( y->mysql );
           y->mysql = mysql_init(NULL);
           if( NULL == mysql_real_connect( y->mysql, y->db_host, y->db_user, y->db_pwd, y->db_name, 0, NULL, 0 ) ){
               PRINT_MYSQL_ERROR( y->mysql );
                return -1;
           }
           break;
      default:
           PRINT_MYSQL_ERROR( y->mysql );
           return -1;
      }
   }
   return -1;
}


int get_lzddz_num(void){
    int n;
    int rownum = 0;
    //MYSQL_ROW row;
    MYSQL_RES *res = NULL;
    prop_global_t *y = g_p;
    int r = -1;


    n = snprintf(y->query, MAX_QUERY_LEN , "select userid,matchid,matchseq ,userseq , score, state, takecoin , token, signupcond,site, rtime from t_jj_user_match where  matchid = 6684674 or matchid = 6684675 or  matchid = 6684676" );
    if( safe_query(y, y->query, n )){
        printf("err:%d\n", __LINE__);  return r;
    }
    
    res = mysql_store_result(y->mysql);
    if( NULL == res ){
         printf("err:%d\n", __LINE__); return r;
    }
    
    rownum = mysql_num_rows( res );
    /*
    printf("lzddz num = %d\n", rownum );
    if( rownum > 0 ){
        while( (row = mysql_fetch_row(res) ) ) {
            printf("%d\t", atoi( row[0] )); //userid
            printf("%d\t", atoi( row[1] )); //matchid
            printf("%d\t", atoi( row[2] )); //matchseq
            printf("%d\t", atoi( row[3] )); //userseq
            printf("%d\t", atoi( row[4] )); //score
            printf("%d\t", atoi( row[5] )); //state
            printf("%d\t", atoi( row[6] )); //takecoin
            printf("%d\t", atoi( row[7] )); //token
            printf("%d\t", atoi( row[8] )); //signupcond
            printf("%d\t", atoi( row[9] )); //site
            printf("%d\t", atoi( row[10] )); // rtime
            printf("\n");
        }
    }
    */
    mysql_free_result(res);
    system("date"); 
    printf("lzddz num = %d\n", rownum );  
  
   return rownum;
}


void prop_release( void ){
    prop_global_t *y = g_p;
    mysql_close( y->mysql );
    free( y->db_host);
    free( y->db_user);
    free( y->db_pwd );
    free( y->db_name);
}
int main(void){
   int ret = 0;
   ret = prop_init( "41.15.11.59", "lhm", "1234567lhm", "db_jj");
   if( 0 == ret ){
       get_lzddz_num();
       prop_release(); 
   }
   return 0;

}


(二)Makefile

[lvhongmin@AY1401201736089361adZ database]$ cat Makefile 
FLAGS = -O2 -g -Wpointer-arith -Wstrict-prototypes -lm -W -Wall
LIB = -lpthread -lmysqlclient
INCLUDE_PATH = /usr/include/mysql
CC = gcc
all:lhm.exe
lhm.exe:lhm_query.c
        $(CC) -o $@ ${LIB} ${FLAGS} -L /usr/lib64/mysql -I ${INCLUDE_PATH} lhm_query.c


clean:
        rm lhm.exe