標籤:
三、SQLite
在ARM-Linux平台上移植SQLite
(陳雲川 200620603001 [email protected] 四川成都)
摘要:本文首先對嵌入式資料庫SQLite做了簡單的介紹,對移植所採用的軟硬體平台作了簡單的說明。然後以SQLite3為藍本對移植過程中的細節作了詳細的說明,並對移植後的SQLite3資料庫進行了測試。測試結果表明,本文所採取的移植方式是有效。
關鍵字:ARM-Linux、嵌入式、SQLite
Port SQLite to ARM-Linux Platform
(Yun Chuan Chen, 200620603001, [email protected], Chengdu Sichuan)
Abstract: This paper first give a brief introduction to SQLite database and the hardware and software platform to port. Then demonstrate SQLite3’s porting process to ARM-Linux in detail and test the ported SQLite3. The testing result states that the porting method this paper proposed is effective.
Keywords: ARM-Linux、embedded、SQLite
1、引言
本文將簡要介紹如何在ARM-Linux平台上移植SQLite嵌入式資料庫。SQLite是一個採用C語言開發的嵌入式資料庫引擎。SQLite的最新版本是3.3.8,在不至於引起混淆的情況下,本文也將其簡稱為SQLite3。
資料庫的目標是 實現對資料的儲存、檢索等功能。傳統的資料庫產品除提供了基本的查詢、添加、刪除等功能外,也提供了很多進階特性,如觸發器、預存程序、資料備份恢複等。 但實際上用到這些進階功能的時候並不多,應用中頻繁用到的還是資料庫的準系統。於是,在一些特殊的應用場合,傳統的資料庫就顯得過於臃腫了。在這種情況 下,嵌入式資料庫開始嶄露頭角。嵌入式資料庫是一種具備了基本資料庫特性的資料檔案,它與傳統資料庫的區別是:嵌入式資料庫採用程式方式直接驅動,而傳統 資料庫則採用引擎回應程式式驅動。嵌入式資料庫的體積通常都很小,這使得嵌入式資料庫常常應用在行動裝置上。由於效能卓越,所以在高效能的應用上也經常見到 嵌入式資料庫的身影。
SQLite是一種嵌入式資料庫。SQLite的目標是盡量簡單,因此它拋棄了傳統企業級資料庫的種種複雜特性,只實現那些對於資料庫而言非常必要的功能。儘管簡單性是SQLite追求的首要目標,但是其功能和效能都非常出色。它具有這樣一些特點[1]: 支援ACID事務(ACID是Atomic、Consistent、Isolated、Durable的縮寫);零配置,不需要任何管理性的配置過程;實 現了大部分SQL92標準;所有資料存放在一個單獨的檔案之中,支援的檔案大小最高可達2TB;資料庫可以在不同位元組序的機器之間共用;體積小,在去掉可 選功能的情況下,代碼體積小於150KB,即使加入所有可選功能,代碼大小也不超過250KB;系統開銷小,檢索效率高,執行常規資料庫操作時速度比客戶 /伺服器類型的資料庫快;簡單易用的API介面;可以和Tcl、Python、C/C++、Java、Ruby、Lua、Perl、PHP等多種語言綁 定;自包含,不依賴於外部支援;良好注釋的代碼;代碼測試覆蓋率達95%以上;開放源碼,可以用於任何合法用途。由於這樣一些傑出的優點,SQLite獲得了由Google與O’Reilly舉辦的2005 Open Source Award!
由於SQLite具有功能強大、介面簡單、速度快、佔用空間小這樣一些特殊的優點,因此特別適合於應用在嵌入式環境中。SQLite在手機、PDA、機頂盒等裝置上已獲得了廣泛應用。本文將說明如何在ARM-Linux核心的基礎上移植SQLite3。
2、軟硬體平台
本文中採用的硬體平台為Sitsang嵌入式評估板。Sitsang評估板的核心是PXA255嵌入式處理器,PXA255是一款基於Intel XScale微架構的高效能、低功耗嵌入式處理器。Sitsang評估板上配備了Flash儲存空間、LCD、觸控螢幕、USB介面、乙太網路介面、全功能串口(FFUART)、藍芽串口(BTUART)、音頻介面等諸多硬體資源。
底層軟體系統是以ARM-Linux核心為基礎的。Sitsang評估板使用的ARM-Linux是在linux-2.4.19核心上打了patch-2.4.19-sitsang2補丁後編譯而成。
要將SQLite3移植到Sitsang評估板上,除了要有底層作業系統的支援外,還必須要有相應的交叉編譯工具鏈。由於Sitsang評估板採用的是ARM-Linux作為底層作業系統,因此需要首先安裝ARM-Linux工具鏈。關於ARM-Linux工具鏈的安裝可以參閱文獻[4]。ARM-Linux工具鏈通常安裝在/usr/local/arm-linux/bin/目錄下,通常以arm-linux-開頭。本文中將會涉及到的主要是arm-linux-gcc、arm-linux-ar、arm-linux-ranlib這樣三個工具。
3、移植過程
首先從http://sqlite.org下載SQLite 3.3.8。本文中假設將sqlite-3.3.8.tar.gz下載到/root目錄下。然後,通過下列命令解壓縮sqlite-3.3.8.tar.gz並將檔案和目錄從歸檔檔案中抽取出來:
# tar zxvf sqlite-3.3.8.tar.gz
解壓抽取完成之後將會在/root目錄下產生一個sqlite-3.3.8/子目錄,在該目錄中包含了編譯所需要的所有源檔案和配置指令碼。SQLite3的所有原始碼檔案都位於sqlite-3.3.8/src/目錄下。
和在PC環境下編譯SQLite3不同,不能通過sqlite-3.3.8/目錄下的configure指令碼來產生Makefile檔案。取而代之的是必須手動修改Makefile檔案。在sqlite-3.3.8/目錄下有一個Makefile範例檔案Makefile.linux-gcc。首先通過下面的命令拷貝此檔案並重新命名為Makefile:
# cp Makefile.linux-gcc Makefile
接下來,用vim開啟Makefile檔案並手動修改Makefile檔案的內容。首先找到Makefile檔案中的下面這樣一行:
TOP = ../sqlite
將其修改為:
TOP = .
找到下面這樣一行:
TCC = gcc -O6
將其修改為:
TCC = arm-linux-gcc -O6
找到下面這樣一行:
AR = ar cr
將其修改為:
AR = arm-linux-ar cr
找到下面這樣一行:
RANLIB = ranlib
將其修改為:
RANLIB = arm-linux-ranlib
找到下面這樣一行:
MKSHLIB = gcc -shared
將其修改為:
MKSHLIB = arm-linux-gcc -shared
注釋掉下面這一行:
TCL_FLAGS = -I/home/drh/tcltk/8.4linux
注釋掉下面這一行:
LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
原則上,對Makefile的修改主要包括兩個方面: 首先是將編譯器、歸檔工具等換成交叉工具鏈中的對應工具,比如,gcc換成arm-linux-gcc,ar換成ar-linux-ar,ranlib換 成arm-linux-ranlib等等;其次是去掉與TCL相關的編譯選項,因為預設情況下,將會編譯SQLite3的Tcl語言綁定,但是在移植到ARM-Linux的時候並不需要,因此將兩個與TCL有關的行注釋掉。對Makefile的修改總結如表1所示。
表1 Makefile修改情況位置原值修改為
17行TOP = ../sqliteTOP = .
73行TCC = gcc -O6TCC = arm-linux-gcc -O6
81行AR = ar crAR = arm-linux-ar cr
83行RANLIB = ranlibRANLIB = arm-linux-ranlib
86行MKSHLIB = gcc -sharedMKSHLIB = arm-linux-gcc -shared
96行TCL_FLAGS = -I/home/drh/tcltk/8.4linux#TCL_FLAGS = -I/home/drh/tcltk/8.4linux
103行LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl#LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
接下來,還需要修改的一個的檔案是main.mk,因為Makefile包含了這個檔案。找到這個檔案中的下面一行:
select.o table.o tclsqlite.o tokenize.o trigger.o
把它替換成:
select.o table.o tokenize.o trigger.o
也就是把該行上的tclsqlite.o去掉。這樣編譯的時候將不會編譯SQLite3的Tcl語言綁定。
自此,修改工作就完成了,接下來就可以開始編譯SQLite3了,這通過make命令即可完成:
# make
編譯完成之後,將在sqlite3.3.8/目錄下產生庫函數檔案libsqlite3.a和標頭檔sqlite3.h,這就是所需要的兩個檔案了。
4、測試
這裡以SQLite官方網站http://sqlite.org的quick start文檔中的測試程式為例對移植到ARM-Linux上的SQLite3進行測試。該程式清單如下:
1 #include
2 #include
3
4 static int
5 callback(void *NotUsed, int argc, char **argv, char **azColName)
6 {
7 int i;
8
9 for (i = 0; i < argc; i++) {
10 printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
11 }
12 printf("\n");
13 return 0;
14 }
15
16 int
17 main(int argc, char **argv)
18 {
19 sqlite3 *db;
20 char *zErrMsg = 0;
21 int rc;
22
23 if (argc != 3) {
24 fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
25 exit(1);
26 }
27 rc = sqlite3_open(argv[1], &db);
28 if (rc) {
29 fprintf(stderr, "Can‘t open database: %s\n", sqlite3_errmsg(db));
30 sqlite3_close(db);
31 exit(1);
32 }
33 rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
34 if (rc != SQLITE_OK) {
35 fprintf(stderr, "SQL error: %s\n", zErrMsg);
36 sqlite3_free(zErrMsg);
37 }
38 sqlite3_close(db);
39 return 0;
40 }
將此來源程式儲存為test.c,然後,通過如下命令編譯該程式:
# arm-linux-gcc -I /root/sqlite-3.3.8/ -L /root/sqlite-3.3.8 -o test test.c -lsqlite3
上述編譯命令中,-I /root/sqlite-3.3.8指明了標頭檔sqlite3.h所在的目錄,-L /root/sqlite3.3.8 指定了庫函數檔案libsqlite3.a所在的目錄,-o test指定編譯產生的檔案名稱為test,test.c是來源程式檔案,-lsqlite3指明要連結靜態庫檔案libsqlite3.a。編譯完成後,可 以通過NFS或者FTP將test下載到Sitsang評估板上,通過ls命令可以看到test的大小隻有300K左右:
[[email protected] root]$ll -h test
-rwxr-xr-x 1 root root 323.5k Jan 1 00:07 test
接下來就可以測試test程式了。test程式接受兩個參數:第一個參數為資料庫檔案名,第二個參數為要執行的SQL語句。程式中與SQLite3的API相關的地方主要有四個:第27行的sqlite3_open(),第33行的sqlite3_exec(),第30行和第38行的sqlite3_close(),第36行的sqlite3_free()。關於SQLite3的API介面請參閱文獻[1]。
下面是測試test程式的完整過程,需要注意的是由於命令較長,因此每一個命令都分成了多行輸入,這樣看起來要清楚一些:
[[email protected] root]$./test xyz.db "create table
> tbl0(name varchar(10), number smallint);"
[[email protected] root]$./test xyz.db "insert into
> tbl0 values(‘cyc‘, 1);"
[[email protected] root]$./test xyz.db "insert into
> tbl0 values(‘dzy‘, 2);"
[[email protected] root]$./test xyz.db "select *
> from tbl0;"
name = cyc
number = 1
name = dzy
number = 2
解釋一下上面所用的測試命令:第一條命令在 xyz.db這個資料庫檔案中建立了一個tbl0表,表中包含兩個欄位,欄位name是一個變長字串,欄位number的類型為smallint;第二 條命令向資料庫的tbl0表中插入了一條記錄(‘cyc’,1);第三條命令向資料庫的tbl0表中插入了一條記錄(‘dzy’,2);第四條命令則是查 詢表tbl0中的所有內容,與預期的一樣,這條命令列印除了資料庫中的兩條剛插入的記錄。由此可以得出結論,這幾條命令確實都已經按照預期的目標工作了。
同時,在向資料庫中插入上面所示的資料之後,可以看到資料庫檔案xyz.db大小已經發生了變化:
[[email protected] root]$ll -h xyz.db
-rw-r--r-- 1 root root 2.0k Jan 1 00:18 xyz.db
此時資料庫檔案xyz.db的大小為2K。自此,SQLite3資料庫在Sitsang評估板上移植完成。測試結果表明資料庫能夠正常工作。
5、結論
SQLite是一個優秀的嵌入式資料庫。本文詳細描述了如何將SQLite3移植到ARM-Linux平台上,並對移植後的SQLite3進行了簡單的測試。SQLite功能強大、效率高、零配置、體積小等諸多優點使得它很適用於嵌入式行動裝置環境中。因此本文給出的移植SQLite3的細節具有積極意義。由於SQLite3採用C語言開發,因此可移植性非常好。本文所討論的方法稍加修改也可適用於其它作業系統平台。
參考文獻
[1] The Definitive Guide to SQLite。[美]Michael Owens著。Apress,2006
[2] http://sqlite.org
[3] SQLite移植手記。Hily Jiang。www.sqlite.com.cn,2006年11月
[4] Sitsang/PXA255 Evaluation Platform Linux User’s Guide。Intel Ltd,Sep. 2003 閱讀(2178) | 評論(0) | 轉寄(0) | 0
上一篇:BOA+PHP+SQLite之PHP
下一篇:grub 引導 Win 7
相關熱門文章
- 歡迎phplearner在ChinaUnix博...
- 關於php的slow.log無法生效的...
- 歡迎phpsuper在ChinaUnix部落格...
- 歡迎xuefeiphp在ChinaUnix部落格...
- 歡迎xcc_4php在ChinaUnix部落格...
- SHTML是什麼_SSI有什麼用...
- shell中字串操作
- 卡爾曼濾波的原理說明...
- 關於java中的“錯誤:找不到或...
- shell中的特殊字元
- linux dhcp peizhi roc
- 關於Unix檔案的軟連結
- 求教這個命令什麼意思,我是新...
- sed -e "/grep/d" 是什麼意思...
- 誰能夠幫我解決LINUX 2.6 10...
給主人留下些什麼吧!~~ 評論熱議
BOA+PHP+SQLite之SQLite