BOA+PHP+SQLite之SQLite

三、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 = ../sqlite TOP = .
73行 TCC = gcc -O6 TCC = arm-linux-gcc -O6
81行 AR = ar cr AR = arm-linux-ar cr
83行 RANLIB = ranlib RANLIB = arm-linux-ranlib
86行 MKSHLIB = gcc -shared MKSHLIB = 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 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

相关热门文章

  • SHTML是什么_SSI有什么用...
  • shell中字符串操作
  • 卡尔曼滤波的原理说明...
  • 关于java中的“错误:找不到或...
  • shell中的特殊字符

热门推荐

    -->

    给主人留下些什么吧!~~

    评论热议

    BOA+PHP+SQLite之SQLite

    时间: 2024-10-09 20:08:57

    BOA+PHP+SQLite之SQLite的相关文章

    C#使用System.Data.SQLite操作SQLite

    使用System.Data.SQLite 下载地址:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 得到System.Data.SQLite.dll添加到工程引用: 建表,插入操作 static void Main(string[] args) { SQLiteConnection conn = null; string dbPath = "Data Source =" + Environmen

    Navicat for SQLite 连接Sqlite数据库的方法

    Navicat for SQLite 配备了数据编辑.SQL查询和数据模型工具,并支持所有SQLite对象类型.其主要功能有数据传输.数据同步.导入或导出.报表等.其凭借设计的方便快捷的用户界面,并且用户创建.组织.访问和共享信息都非常的简便快捷,优化SQLite工作流程,提高工作效率.下面我们将给大家介绍介绍Navicat for SQLite 连接Sqlite数据库的方法? 原文:http://www.formysql.com/jiqiao/sqlite-lianjie.html Navic

    Android 保存图片到SQLite,读出SQLite中的图片

    1.bitmap保存到SQLite 中 数据格式: Java代码   db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREMENT,express_no varchar(100),express_name TEXT,express_img BLOB );"); 2.bitmap 变为 Blob Java代码   ContentValues values = new ContentValues(); fi

    Android多线程操作sqlite(Sqlite解决database locked问题)

    参考http://blog.csdn.net/sdsxleon/article/details/18259973  很好 https://github.com/2point0/Android-Database-Locking-Collisions-Example 示例 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=333473 http://bbs.51cto.com/thread-990260-1.html 用事务,速度会很会 方

    SQLite数据操作

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,SQLite引擎不是个程序与之通讯的独立进程,而是连接到程序中成为它的一个主要部分,其主要的通信协议是在编程语言内的直接API调用.这在消耗总量.延迟时间和整体简单性上有着积极的作用.1.Qt操作SQLite数据库Qt提供了与平台以及数据库种类无关的访问数据库接口,支持类型和描述分别有:Driver Type DescriptionQDB2 IBM DB2QIBASE Borland InterBase DriverQMYS

    sqlite 的基本使用1

    mac 下自带的sqlite3 直接在终端键入 sqlite3 即进入 sqlite的交互界面 1,创建数据库 sqlite3 命令 被用来创建新的数据库 比如sqlite3 mydb,即创建了一个mydb的数据库 bogon:db lining$ sqlite3 mydb SQLite version 3.8.10.2 2015-05-20 18:17:19 Enter ".help" for usage hints. sqlite> 进入交互界面之后,如何退出,可以键入.qu

    Android中SQLite的使用

    SQLite是Android中内置的数据库,SQLite是轻量级数据库,支持标准的SQL语法,并且支持ACID事物. 在Android中提供了SQLIteOPenHelper类,帮助我们使用SQLite.SQLite是一个抽象类,其中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须重写.SQLiteOpenHelper 中还有两个非常重要的实例方法, getReadableDatabase() 和getWritableDatabase().这两个方法都可以创建或打开一

    SQLite剖析之C/C++接口

    前言 SQLite3是SQLite一个全新的版本,它虽然是在SQLite2的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API.SQLite3是为了满足以下的需求而开发的: * 支持UTF-16编码 * 用户自定义的文本比较方法 * 可以对BLOBs字段建立索引     由于对于C语言应该用什么数据类型来存放UTF-16编码的字符串并没有一致的规范,因此SQLite使用了普通的void*类型来指向UTF-16编码的字符串. 客户端使用过程中可以把void*映射成适合他们的系统的

    android 数据存储操作之SQLite

    一. SQLite介绍 SQLite是android内置的一个很小的关系型数据库. 二. SQLiteOpenHelper的使用方法 ①SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本.②可以通过继承这个类,实现它的一些方法来对数据库进行一些操作.③所有继承了这个类的类都必须实现下面这样的一个构造方法: public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory fact