SQLite移植手記

來源:互聯網
上載者:User

前幾天成功地把Berkeley DB移植到uClinux上,雖然可以正常工作了,但是檔案還是太大了些。今天來試一個稍微小一點的,它叫SQLite。 SQLite實現了大部分SQL92標準的SQL語句,同時支援ACID。還有其它許多特性這裡不做深究,因為這在嵌入式領域來說應該是夠用了。

Hily Jiang
Email&Gtalk: hilyjiang at Gmail
Blog: http://hily.me/blog/

下載:
下載頁面:http://www.sqlite.org/download.html
我使用的還是當前最新版本:sqlite-3.3.7.tar.gz
(寫完的時候已經更新出3.3.8版本了,真快啊……)

安裝:
時間不多,簡單介紹安裝過程:
解壓sqlite到uclinux-dist/user/sqlite/

============ 對uClinux的修改 ============
1. 下載sqlite,解壓到uclinux-dist/user/下
2. 編輯uclinux-dist/user/下的Makefile,增加:

dir_$(CONFIG_USER_SQLITE_SQLITE) += sqlite

3. uclinux-dist/config/Configure.help中增加:

CONFIG_USER_SQLITE_SQLITE SQLite Database.

4. uclinux-dist/config/config.in最後增加:

mainmenu_option next_comment comment 'Database' bool 'sqlite' CONFIG_USER_SQLITE_SQLITE endmenu

============ 對SQLite的修改 ============
1. uclinux-dist/user/sqlite/main.mk中:
TCCX修改為:

TCCX = $(TCC) $(OPTS) $(THREADSAFE) $(USLEEP) -I. -I$(TOP)/src $(CFLAGS)

LIBOBJ修改為(一些模組不需要,比如tcl):

LIBOBJ+= alter.o analyze.o attach.o auth.o btree.o build.o \ callback.o complete.o date.o delete.o \ expr.o func.o hash.o insert.o loadext.o \ main.o opcodes.o os.o os_unix.o \ pager.o parse.o pragma.o prepare.o printf.o random.o \ select.o table.o tokenize.o trigger.o \ update.o util.o vacuum.o \ vdbe.o vdbeapi.o vdbeaux.o vdbefifo.o vdbemem.o \ where.o utf.o legacy.o vtab.o

sqlite3$(EXE)規則部分修改為:

shell.o: $(TOP)/src/shell.c sqlite3.h $(TCCX) $(READLINE_FLAGS) -c $(TOP)/src/shell.c sqlite3$(EXE): shell.o libsqlite3.a $(TCC) $(LDFLAGS) -o $@ shell.o \ libsqlite3.a $(LIBREADLINE) $(THREADLIB) $(LDLIBS)

去掉install,增加:

distclean: clean rm -f config.h

2. 拷貝Makefile.linux-gcc為Makefile,修改如下:

TCC = $(CROSS)gcc AR = $(CROSS)ar cr RANLIB = $(CROSS)ranlib #TCL_FLAGS = -I/home/drh/tcltk/8.4linux #LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl

 

編譯:
在make menuconfig的user application部分可以看到剛添加的Database -->菜單,進入並選擇SQLite,儲存退出後按原先的步驟重新編譯核心即可。如果只需要sqlite的庫,那麼make user_only就可以了。
編譯完成後會在user/sqlite目錄下產生庫libsqlite3.a。

測試一下:
編寫一個測試程式sqlitetest.c,代碼如下(來自官方quick start):

#include <stdio.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i 然後為它寫一個Makefile,大致如下: UCLINUX_PATH = /home/uClinux-dist SQLITE_PATH = $(UCLINUX_PATH)/user/sqlite CROSS = arm-elf- CPU_CFLAGS = -O3 -Wall -mapcs-32 -mtune=arm7tdmi -fno-builtin -msoft-float -Os \ -D__uClinux__ -D__ARM_CPU__ \ -I$(UCLINUX_PATH)/lib/uClibc/include -I$(UCLINUX_PATH)/linux-2.4.x/include \ -I$(SQLITE_PATH) \ -D_DEBUG_ CPU_LDFLAGS = -nostartfiles -Wl, -elf2flt -L$(UCLINUX_PATH)/lib/uClibc/lib CPU_ARFLAGS = r CPU_LDLIBS = $(UCLINUX_PATH)/lib/uClibc/lib/crt0.o $(UCLINUX_PATH)/lib/uClibc/lib/crti.o \ $(UCLINUX_PATH)/lib/uClibc/lib/crtn.o -lc MY_LDFLAGS = -L$(SQLITE_PATH) MY_LDLIBS = -lsqlite3 CFLAGS = $(CPU_CFLAGS) LDFLAGS = $(CPU_LDFLAGS) $(MY_LDFLAGS) LDLIBS = $(CPU_LDLIBS) $(MY_LDLIBS) TOPDIR = ./ CC = $(CROSS)gcc EXEC = sqlitetest CSRC = sqlitetest.c OBJS = $(patsubst %.c,%.o, $(CSRC)) all: $(EXEC) $(OBJS): %.o : %.c $(CC) $(CFLAGS) -c $< -o $@ $(EXEC): $(OBJS) $(CC) $(OBJS) $(LDFLAGS) $(LDLIBS) -o $@ clean: -rm -f $(EXEC) *.elf *.gdb *.o

運行make編譯測試程式,產生的程式大小約300KB:

linux:/home/work/sqlite # ll 總用量 688 drwxr-xr-x 2 root root 264 2006-10-09 11:25 . drwxr-xr-x 4 root root 160 2006-10-09 11:21 .. -rw------- 1 root root 982 2006-10-09 11:25 Makefile -rwxr--r-- 1 root root 315584 2006-10-09 11:25 sqlitetest -rw------- 1 root root 788 2006-10-09 11:21 sqlitetest.c -rwxr-xr-x 1 root root 396538 2006-10-09 11:25 sqlitetest.gdb -rw-r--r-- 1 root root 1600 2006-10-09 11:25 sqlitetest.o

接著將測試程式下載到目標板,測試回合結果如下:

# /home/sqlitetest /home/testdb.db "CREATE TABLE my_table(id int, name varchar(20))" # /home/sqlitetest /home/testdb.db "INSERT INTO my_table values(1, 'jianglj')" # /home/sqlitetest /home/testdb.db "INSERT INTO my_table values(2, 'Hily Jiang')" # /home/sqlitetest /home/testdb.db "SELECT * FROM my_table" id = 1 name = jianglj id = 2 name = Hily Jiang #

 
繼續尋找更小的資料庫,知道的朋友不妨推薦一下

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.