Linux下在makefile中預定義宏來處理訪問不同的數據庫

 

    寫這篇文章是由前面我總結的這篇小結 http://blog.csdn.net/sunrier/article/details/7664515 而引出的想法,下面主要實現在一個makefile文件中預定義處理兩種不同的數據庫。

 

//mysqldbproc.c

/*************************************************************       
    FileName : mysqldbproc.c   
    FileFunc : C語言接口訪問MySQL      
    Version  : V0.1       
    Author   : Sunrier       
    Date     : 2012-06-25 
    Descp    : Linux下使用C語言訪問MySQL函數  
*************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>

static MYSQL s_my_connection;
static int s_iDbconnected = 0;/*數據庫連接標誌 連接時爲1,斷開時爲0*/

int mysql_login(char* pServer,char *pUser,char *pPassword,char *pDataBase)
{
	MYSQL *conn_ptr = NULL;
	MYSQL_RES *res_ptr = NULL;
	MYSQL_ROW sqlrow;
	int iRetCode = 1;
	unsigned int uiTimeOut = 7;

	if( s_iDbconnected )
		return 0;
		
	conn_ptr = mysql_init(&s_my_connection);
	if( !conn_ptr )
	{
		fprintf(stderr,"mysql_init failed ! \n");
		return EXIT_FAILURE;
	}

	iRetCode  = mysql_options(&s_my_connection,MYSQL_OPT_CONNECT_TIMEOUT,(const char *)&uiTimeOut);
	if( iRetCode  )
	{
		fprintf(stderr,"Connection is timeout! \n");
		return EXIT_FAILURE;
	}
	
	conn_ptr = NULL;
	conn_ptr = mysql_real_connect(&s_my_connection,pServer,pUser,pPassword,pDataBase,0,NULL,0);
	if( conn_ptr )
	{
		printf("MySQL Connection success!\n");
		s_iDbconnected = 1;		
	}
	else
	{
		fprintf(stderr,"Connection failed!\n");
		if( mysql_errno(&s_my_connection) )
		{
			fprintf(stderr,"Connection error %d: %s!\n",mysql_errno(&s_my_connection),mysql_error(&s_my_connection));
			return EXIT_FAILURE;
		}
	}
	
	return EXIT_SUCCESS;
}


void mysql_logout( void )
{
	if( s_iDbconnected )
		mysql_close(&s_my_connection);	/*關閉連接*/
	s_iDbconnected = 0 ;
}



 

 

//db2dbproc.sqc

/*************************************************************       
    FileName : db2dbproc.sqc   
    FileFunc : C語言接口訪問DB2數據庫     
    Version  : V0.1       
    Author   : Sunrier       
    Date     : 2012-06-25 
    Descp    : Linux下使用C語言訪問DB2函數  
*************************************************************/
#include <stdio.h>   
#include <string.h>   
#include <sqlca.h>   
  
#define PARAERR                 0x04   
#define DATABASEERR             0x08   
  
EXEC SQL include sqlca;  
  
int check_error(char szMessage[])  
{  
    if( sqlca.sqlcode )  
    {  
        printf("Check error report : \n");  
        printf("Error occured : %s ,sqlcode = [%d] \n",szMessage,sqlca.sqlcode);  
        return 1;  
  }  
    
  return 0;  
}  
  
int db2_login(int iArgcFlag,char *pUserName,char *pPassword,char *pDataBase)   
{  
    int iRetCode = 1;  
    EXEC SQL BEGIN DECLARE SECTION;  
            char szUserName[50];  
            char szPassword[50];  
            char szDataBase[50];  
    EXEC SQL END   DECLARE SECTION;  
      
    memset(szUserName,0,sizeof(szUserName));  
    memset(szPassword,0,sizeof(szPassword));      
    memset(szDataBase,0,sizeof(szDataBase));  
    strcpy(szDataBase,pDataBase);  
  
    if( 1==iArgcFlag )  
    {  
        EXEC SQL CONNECT TO:szDataBase ;  
    }  
    else  
    {  
        if( 3==iArgcFlag )  
        {  
            strcpy(szUserName,pUserName);  
            strcpy(szPassword,pPassword);  
            EXEC SQL CONNECT TO:szDataBase USER:szUserName USING:szPassword;  
        }     
        else  
        {  
            printf("Usage : argc found error !\n");  
            return PARAERR;  
        }     
    }  
          
    iRetCode = check_error("CONNECT TO DATABASE");  
          
    return iRetCode;  
}  
  
void db2_logout( void )  
{  
    EXEC SQL CONNECT RESET;  
      
    check_error("CONNECT RESET");  
}  
 



 

 

//demo.c

/*************************************************************       
    FileName : demo.c   
    FileFunc : 測試登陸和關閉MySQL和DB2數據庫     
    Version  : V0.1       
    Author   : Sunrier       
    Date     : 2012-06-25  
    Descp    : Linux下使用C語言訪問常用數據庫的函數        
*************************************************************/ 
#include <stdio.h>
 
#ifdef MYSQL 

int main(int argc,char *argv[])
{
	int iRetCode = 0;
	char szServer[20] = "localhost";  
	/*char szServer[20] = "127.0.0.1";*/
  	char szUser[20] = "Sunrier";  
  	char szPassword[20] = "redhat";  
  	char szDatabase[20] = "test";  

	iRetCode = mysql_login(szServer,szUser,szPassword,szDatabase);
	
	if( iRetCode )
	{	
		system("service mysqld start");
		iRetCode = mysql_login(szServer,szUser,szPassword,szDatabase);
	}
		
	printf("iRetCode = %d \n",iRetCode); 
	mysql_logout();
	
	return 0;
}

#else
  
int main(int argc,char *argv[])    
{    
    int iRetCode = 0;   
    int iArgcFlag;    
    char szUserName[20] = "Sunrier";      
    char szPassword[20] = "redhat";      
    char szDatabase[20] = "test";   
   
    iArgcFlag = 3;     
    
    iRetCode = db2_login(iArgcFlag,szUserName,szPassword,szDatabase);    
            
    printf("iRetCode = %d \n",iRetCode);    
      
    if( iRetCode )  
    {    
		printf("DB2 Connection failure !\n");    
    }  
    else  
    {     
		printf("DB2 Connection success !\n");  
    }  
       
    db2_logout();    
        
    return 0;    
}    


#endif




 

 

//makefile

#makefile
OBJS = demo   
all:$(OBJS)  
CFLAGS = -O -w -ansi     
#CFLAGS = -O -Wall -ansi 

#定義數據庫類型
DATABASETYPE = -D MYSQL  
#DATABASETYPE = 

CC = gcc $(CFLAGS) 

#通用庫路徑
LIBPATH = -L/usr/lib

MYSQLINCPATH = -I/usr/include/mysql  
MYSQLLIBPATH = -L/usr/lib/mysql  
MYSQLLIB = -lmysqlclient -lz -lm

DB2LIBPATH = -L/app/db2inst1/sqllib/lib
DB2LIB = -ldb2 -lm
 
ifneq ($(DATABASETYPE),)
demo:demo.c mysqldbproc.c
	@echo -e "Start compile MySQL file ...... "
	@$(CC) $(MYSQLINCPATH) -c mysqldbproc.c
	@$(CC) $(DATABASETYPE) $(MYSQLINCPATH) $(MYSQLLIBPATH)  -o demo demo.c mysqldbproc.o $(MYSQLLIB)
#	@$(CC) $(DATABASETYPE) $(MYSQLINCPATH) $(MYSQLLIBPATH) -o $@ $? $(MYSQLLIB)
else
demo:demo.c db2dbproc.sqc
	@echo -e "Start compile DB2 file ...... "
	@db2 connect to test 
	@db2 prep db2dbproc.sqc  
	@$(CC) -o $@ demo.c db2dbproc.c $(DB2LIB)
	@rm -rf db2dbproc.c
#	@$(CC) -o $@ $? $(DB2LIB) 
#	gcc -ldb2 -L/usr/lib -lm -o demo demo.c db2dbproc.c   
#	@gcc -L/app/db2inst1/sqllib/lib -ldb2 -L/usr/lib -lm -o demo db2dbproc.c
endif
clean:
	@ls | grep -v ^makefile$$ | grep -v [.]c$$ | grep -v [.]h$$ | grep -v [.]sql$$ | grep -v [.]sqc$$ | grep -v [.]txt$$ | xargs rm -rf





 

 

定義了MYSQL數據庫的情況下執行:

[Sunrier@localhost DB]$ make clean
[Sunrier@localhost DB]$ ls
db2dbproc.sqc  mysqldbproc.c  demo.c  makefile
[Sunrier@localhost DB]$ make
Start compile MySQL file ......
[Sunrier@localhost DB]$ ls
db2dbproc.sqc  mysqldbproc.c  mysqldbproc.o  demo  demo.c  makefile
[Sunrier@localhost DB]$ ./demo
MySQL Connection success!
iRetCode = 0
[Sunrier@localhost DB]$

 

沒有定義MYSQL數據庫的情況下,即爲DB2數據庫執行:

[Sunrier@localhost DB]$ make clean
[Sunrier@localhost DB]$ ls
db2dbproc.sqc  mysqldbproc.c  demo.c  makefile
[Sunrier@localhost DB]$ make

Start compile DB2 file ......

     Database Connection Information

 Database server        = DB2/LINUX 8.2.3
 SQL authorization ID   = CPICDB2
 Local database alias   = TEST


LINE    MESSAGES FOR db2dbproc.sqc
------  --------------------------------------------------------------------
        SQL0060W  The "C" precompiler is in progress.
        SQL0091W  Precompilation or binding was ended with "0"
                  errors and "0" warnings.
[Sunrier@localhost DB]$ ls
db2dbproc.sqc  mysqldbproc.c  demo  demo.c  makefile
[Sunrier@localhost DB]$ ./demo
iRetCode = 0
DB2 Connection success !
[Sunrier@localhost DB]$

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章