用Cygwin模擬DB2的Unix/Linux開發環境(2)
2024-09-06 23:58:01
供稿:網友
執行初始化了db2環境的cygwin 點擊桌面上的cygwin圖標,可以進入cygwin模擬的linux.. 現在,該環境不能執行db2命令,因為沒有作db2cmd初始化環境。 為了能在該環境中使用db2,必須先運行db2cmd然后在db2的命令行環境下進入cygwin測試,是否能在cygwin環境下使用db2命令。ok,到目前為止,我們已經擁有了一個和unix一樣的環境,并且能使用db2下一步我們來寫第一個sqc程序. 編寫sqc程序 編寫一個簡單程序測試,該程序主要完成,讀取系統時間,并打印。程序主要部分為: if (connectdatabase(sdbname,susername,spasswd)<0) /*連接數據庫*/ { printf("連接數據庫失敗/n"); return -1; } printf("連接數據庫成功!/n"); exec sql select char(current timestamp) into :sdatetime from (values 1) as a; if dataerror { disconnectdb(); return -1; } printf("當前時間%s/n",sdatetime); disconnectdb(); (完整程序建附件)該程序在unix主機下能編譯執行。前面說過,建立這個環境的主要意義在于方便代碼移植。所以,代碼本身不用作任何更改即可在cygwin環境下編譯。修改編譯參數 安裝過程中已經說明cygwin環境下,支持大部分unix/linux命令并且安裝了gcc的編譯器,windows平臺和unix平臺下的庫略有不同,gcc和我們在windows下常用的vc編譯器參數也略有不同,下面簡要說明。1、 在unix環境中,分為靜態庫和動態庫,它們的擴展名分別是 .a 和 .so .2、 在windows中,靜態庫擴展名為 .lib 動態庫擴展名為 .dll3、 unix下,sqc程序編譯時必須鏈接 libdb2.so庫,也就是加上 -ldb2參數(忽略lib和擴展名,這是unix下c編譯器特點)4、 windows下,sqc程序必須鏈接db2api.lib靜態庫。雖然有上述不同,但是我們的修改卻非常少,本例中使用了以前我為編譯sqc寫的makefile模板。在makefile中真正需要修改的只有一行將libs= -l$(db2path)/lib -l$(db2path)/lib/db2修改為libs= -l $(db2path)/lib $(db2path)/lib/db2api.lib當然,你還需要更具環境的不同,修改makefile的其他部分,比如db2path的值啊,這些就是在不同的主機上也需要修改的,并不是windows和unix的區別,不在本文的討論之列。 運行測試程序cygwin使用windows文件系統,進入cygwin環境后 系統的根目錄/其實就是你的cygwin安裝目錄。用戶目錄通常在/home/user,(user是你windows的用戶名) 比如在windows環境中我的cygwin安裝在d:/cygwin 我的用戶目錄是 d:/cygwin/home/rocfu,,如果你在cygwin中使用pwd命令察看當前路徑,會顯示/home/roc. 在用戶目錄下新建db2test子目錄,附件附帶文件 makefile test.sqc,將這三個文件復制到db2test目錄.修改 test.sqc中的下面代碼 strcpy(susername,"db2admin"); strcpy(spasswd,"db2admin"); strcpy(sdbname,"dwctrldb");為你自己的服務器連接(為簡化測試程序,這里并沒有從配置文件中讀取連接信息)執行命令 make all你會發現編譯的結果竟然是一個exe文件,對了,這是在windows下編譯的程序,當然是一個exe文件了。ok 執行該程序,運行結果如下圖總結 完成上述步驟之后,我們有了一個仿真的unix環境,能通過makefile中的小小改動,將源代碼在各種平臺上編譯,當你不能連上主機工作時,完全可以用這個小巧的環境暫時代用。這個環境具有unix/linux高級特性,對于信號、管道、多進程、守護進程完全支持。 還有更重要的,如果希望這個程序在windows下脫離cygwin環境運行,只要把cygwin1.dll復制到windows的system32目錄下即可,這樣,你得程序在一套源碼的情況下,支持兩個環境,何樂而不為。事實上,很多從linux移植到windows的程序就是這么干的。 附件makefile.suffixes: .sqc .c .o gcc=gcccc=gcc embprep=embprep ccflags=-g -mno-cygwin cflags= $(extra_cflags) -i$(db2path)/include -mno-cygwin db2path=/cygdrive/d/db2/sqllib#libs= -l$(db2path)/lib -l$(db2path)/lib/db2 libs= -l $(db2path)/lib $(db2path)/lib/db2api.lib uid=db2adminpwd=db2admindb=dwctrldb billhome=.billbin=.billsrc=$(billhome)billobj=$(billhome)billlib=../lib include=-i. -i$(billhome)/src -i$(billlib) / -i$(db2path)/include / -i/usr/lib -i/usr/local/include / -i/usr/include target1 = $(billbin)/test all:$(target1) .sqc.o: db2 connect to $(db) user $(uid) using $(pwd);/ db2 prep $*.sqc bindfile;/ db2 bind $*.bnd;/ db2 connect reset;/ db2 terminate;/ $(cc) $(include) -o $*.o -c $(ccflags) $(cflags) $(defs) $*.c ; .c.o: $(cc) $ (include) -o $*.o -c $(ccflags) $(cflags) $(libs) $(defs) $*.c --def tandard.def pick_objs1= $(billsrc)/test.o $(billbin)/test: $(comm_objs) $(pick_objs1) $(cc) $(cflags) -o $(target1) $(pick_objs1) $(comm_objs) $(oracle_lib)$(linkflag) $(libs) clean: rm -f *.o $(target1) test.c test.o test.bnd test.sqc/********************************************************************************** 文件名:test.sqc 創建人: roc.fu 日期 2004-03-07 版 本:v1.0 功 能:讀取系統當前時間 描 述:**********************************************************************************/#include <stdio.h>#include <sql.h>#include <sqlenv.h>#include <sqlda.h>#include <sqlca.h>#include <sqladef.h>#include <sqlenv.h> struct sqlca sqlca;char gusername[20];char gpassword[20];char gservername[20];char gtpassword[20]; #ifndef dataerror#define dataerror (sqlca.sqlcode<0 )#endif /************************************************************************************ 功能 :連接數據庫 * 返回值 :0 正常連接 -1 連接失敗* 參數: sdbalias 數據庫名* suser 用戶名* spasswd 密碼***********************************************************************************/int connectdatabase (char *sdbalias,char *suser,char *spasswd){ int rc = 0; char smsg[1024]; exec sql begin declare section ; char db[15] ; char userid[15] ; char passwd[15] ; exec sql end declare section; memset(smsg,0,1024); printf("1/n"); strcpy( db, sdbalias) ; strcpy( userid, suser) ; strcpy( passwd, spasswd) ; if ( strlen(userid) == 0) { printf("2/n"); exec sql connect to :db; } else { printf("用戶名:%s/n",userid); printf("密碼:%s/n",passwd); printf("密碼:%s/n",db); exec sql connect to :db user :userid using :passwd; printf("4/n"); } return 0; } /************************************************************************************ 斷開數據庫連接************************************************************************************/void disconnectdb(){ exec sql connect reset;} int main(int argc, char *argv[]) { int iret; exec sql begin declare section; char susername[100]; char spasswd[100]; char sdbname[100]; char sdatetime[100]; exec sql end declare section; printf("start read config.../n"); strcpy(susername,"db2admin"); strcpy(spasswd,"db2admin"); strcpy(sdbname,"dwctrldb"); if (connectdatabase(sdbname,susername,spasswd)<0) /*連接數據庫*/ { printf("連接數據庫失敗/n"); return -1; } printf("連接數據庫成功!/n"); exec sql select char(current timestamp) into :sdatetime from (values 1) as a; if dataerror { disconnectdb(); return -1; } printf("當前時間%s/n",sdatetime); disconnectdb(); printf("完成/n"); return 0;}