基于FS2410的SQLite移植

前端之家收集整理的这篇文章主要介绍了基于FS2410的SQLite移植前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
一、引言 @H_404_4@ 本文将简要介绍如何在FS2410平台上移植sqlite嵌入式数据库sqlite是一个采用C语言开发的嵌入式数据库引擎。在不至于引起混淆的情况下,本文也将其简称为QLite3。数据库的目标是实现对数据的存储、检索等功能。传统的数据库产品除提供了基本的查询添加删除功能外,也提供了很多高级特性,如触发器、存储过程、数据备份恢复等。但实际上用到这些高级功能的时候并不多,应用中频繁用到的还是数据库的基本功能。于是,在一些特殊的应用场合,传统的数据库就显得过于臃肿了。在这种情况下,嵌入式数据库开始崭露头角。嵌入式数据库是一种具备了基本数据库特性的数据文件,它与传统数据库的区别是:嵌入式数据库采用程序方式直接驱动,而传统数据库则采用引擎响应方式驱动。嵌入式数据库的体积通常都很小,这使得嵌入式数据库常常应用在移动设备上。由于性能卓越,所以在高性能的应用上也经常见到嵌入式数据库的身影。sqlite是一种嵌入式数据库sqlite的目标是尽量简单,因此它抛弃了传统企业级数据库的种种复杂特性,只实现那些对于数据库而言非常必要的功能。尽管简单性是sqlite追求的首要目标,但是其功能性能都非常出色。它具有这样一些特点[1]:支持ACID事务(ACID是Atomic、Consistent、Isolated、Durable的缩写);零配置,不需要任何管理性的配置过程;实现了大部分sqlArray2标准;所有数据存放在一个单独的文件之中,支持文件大小最高可达2TB;数据库可以在不同字节序的机器之间共享;体积小,在去掉可选功能的情况下,代码体积小于150KB,即使加入所有可选功能代码大小也不超过250KB;系统开销小,检索效率高,执行常规数据库操作时速度比客户/服务器类型的数据库快;简单易用的API接口;可以和Tcl、Python、C/C++、Java、Ruby、Lua、Perl、PHP等多种语言绑定;自包含,不依赖于外部支持;良好注释的代码代码测试覆盖率达Array5%以上;开放源码,可以用于任何合法用途。由于这样一些杰出的优点,sqlite获得了由Google与O’Reilly举办的2005 Open Source Award!由于sqlite具有功能强大、接口简单、速度快、占用空间小这样一些特殊的优点,因此特别适合于应用在嵌入式环境中。sqlite在手机、PDA、机顶盒等设备上已获得了广泛应用。本文将说明如何在ARM-Linux内核的基础上移植sqlite3。

二、移植过程

首先我从sqlite-amalgamation-3.6.1.tar.gz下载3.6.1源码,sqlite官方网为:http://sqlite.org。源码我放在/home/sqlite/目录下,在进行移植之前确定已经安装好交叉编译环境(我安装的是arm-linux-gnu-gcc 3.4.5).@H_404_4@ (1)解压sqlite-amalgamation-3.6.1.tar.gz@H_404_4@ /home/sqlite/#tar zxf sqlite-amalgamation-3.6.1.tar.gz @H_404_4@ (2)进入解压出来的sqlite目录,创建sqlite-3.6.1目录,并进入该目录@H_404_4@ /home/sqlite/sqlite-amalgamation-3.6.1#mkdir sqlite-3.6.1@H_404_4@ (3)并且在此创建等会要安装的目录,在此我将把sqlite安装到/home/目录,于是创建/home/sqlite-arm目录@H_404_4@ /home/sqlite/sqlite-amalgamation-3.6.1#mkdir /home/sqlite-arm@H_404_4@ (4)接着输入以下命令:@H_404_4@ sqlite-3.6.1#../configure --prefix=/home/sqlite-arm --host=arm-linux-gnu@H_404_4@ configure:是软件的组态设置文件,产生对应平台的Makefile文件,--prefix:表示产生的文件的存放目录--host指定软件运行的系统平台 在此指定的是交叉编译工具链的前缀@H_404_4@ (5)接着进行编译并进行安装@H_404_4@ sqlite-3.6.1# ls@H_404_4@ config.log config.status libtool Makefile@H_404_4@ sqlite-3.6.1#make \\根据Makefile的内容 编译出符合平台的可执行文件@H_404_4@ sqlite-3.6.1#make install \\安装编译成功的软件@H_404_4@ (6)执行完以上命令就会在/home/sqlite-arm/目录下产生:bin,include,lib@H_404_4@ sqlite-3.6.1#ls /home/sqlite-arm@H_404_4@ bin include lib@H_404_4@ (7)可以分别使用如下命令把动态库文件的调试信息给剥离,减少文件所占有的空间@H_404_4@ sqlite-3.6.1#cd /home/sqlite-arm@H_404_4@ sqlite-arm#cd lib@H_404_4@ sqlite-arm/lib#ls@H_404_4@ libsqlite3.a libsqlite3.so libsqlite3.so.0.8.6@H_404_4@ libsqlite3.la libsqlite3.so.0@H_404_4@ sqlite-arm/lib#arm-linux-gnu-strip libsqlite3.so.0.8.6@H_404_4@ sqlite-arm/lib#cd ../bin@H_404_4@ sqlite-arm/bin# ls@H_404_4@ sqlite3@H_404_4@ sqlite-arm/bin#arm-linux-gnu-strip sqlite3@H_404_4@ (8)最后把整个/home/sqlite-arm目录拷贝到板子的网络文件系统中,在此我的板子NFS文件系统在/rootfs/filesystem/@H_404_4@ sqlite-arm/bin#cd ../../@H_404_4@ home#cp sqlite-arm /rootfs/filesystem/home/ -a记得加-a,这样就会把软链接一起拷贝)@H_404_4@ home#cd /rootfs/filesystem/home/@H_404_4@ /rootfs/filesystem/home# ls@H_404_4@ caoyi sqlite-arm@H_404_4@ /rootfs/filesystem/home#cd sqlite-arm@H_404_4@ /rootfs/filesystem/home/sqlite-arm#ls@H_404_4@ bin include lib@H_404_4@ (9)把需要的动态库拷贝到根文件系统的/lib目录中@H_404_4@ rootfs/filesystem/home/sqlite-arm# cp ./lib/* ../../lib/ -a@H_404_4@ 这样动态编译的程序就不会因为找不到库文件而烦恼啦!@H_404_4@ 至此已经移植好了sqlite3。可执行文件在bin目录,include目录包含一些头文件,lib目录包含一些动态库。@H_404_4@ 三、测试

(1)以下#开头的是在开发板终端命令@H_404_4@ # cd /home@H_404_4@ # ls@H_404_4@ adc fadc shyi sqlite-arm@H_404_4@ # cd sqlite-arm/@H_404_4@ # ls@H_404_4@ bin include lib@H_404_4@ # cd bin/@H_404_4@ # ls@H_404_4@ sqlite3@H_404_4@ # ./sqlite3@H_404_4@ sqlite version 3.6.1@H_404_4@ Enter ".help" for instructions@H_404_4@ Enter sql statements terminated with a ";"@H_404_4@ sqlite>@H_404_4@ 这时表示成功,不过此时再也不能做其它事了,只有重启开发板。@H_404_4@ (2)下面,编写两个连接sqlite数据库的C程序,在fs2410上运行:@H_404_4@ 测试程序一:@H_404_4@ /rootfs/filesystem/home# vim test1.c (主机上编写哦)

#include <stdio.h>@H_404_4@ #include "sqlite3.h"

int main(void)@H_404_4@ {@H_404_4@ sqlite3 *db = NULL;@H_404_4@ int rc;

rc = sqlite3_open("test.db",&db);

if(rc) {@H_404_4@ fprintf(stderr,"Can't open database: %

s\n",sqlite3_errmsg(db));@H_404_4@ sqlite3_close(db);@H_404_4@ exit(1);@H_404_4@ }@H_404_4@ else {@H_404_4@ printf("Open test.db successfully!\n");@H_404_4@ }

sqlite3_close(db);

return 0;@H_404_4@ }

@H_404_4@ 交叉编译:

/rootfs/filesystem/home# arm-linux-gnu-gcc -I./sqlite-arm/include/ -L./sqlite-arm/lib/ test.c -o test -lsqlite3@H_404_4@ -I指定要包含的头文件路径,-L指定动态库的路径,-lsqlite3动态库的名字。在终端进入根文件系统的/home目录中执行:@H_404_4@ # ./test@H_404_4@ Open test.db successfully!@H_404_4@ 这时会出现一个test.db文件。@H_404_4@ 我们再写个包含连接数据库,创建表,插入数据等sql语句的C语言程序。@H_404_4@ 测试程序二:@H_404_4@ /rootfs/filesystem/home# vim test2.c (这是官方测试程序,主机上编写哦)

#include <stdio.h>@H_404_4@ #include "sqlite3.h"@H_404_4@ @H_404_4@ static int callback(void *NotUsed,int argc,char **argv,char

**azColName)@H_404_4@ {@H_404_4@ inti;@H_404_4@ for (i = 0; i < argc; i++) { @H_404_4@ printf("%s = %s\n",azColName,argv[i] ? argv[i] :

"NULL");@H_404_4@ }@H_404_4@ printf("\n"); @H_404_4@ return 0;@H_404_4@ }

int main(int argc,char **argv)@H_404_4@ {@H_404_4@ sqlite3 *db;@H_404_4@ char *zErrMsg = 0;@H_404_4@ int rc;

if (argc != 3) {@H_404_4@ fprintf(stderr,"Usage: %s database_name sql-

statement\n",arg@H_404_4@ v[0]);@H_404_4@ exit(1);@H_404_4@ }@H_404_4@ rc = sqlite3_open(argv[1],&db); @H_404_4@ if (rc) {@H_404_4@ fprintf(stderr,"Can't open database: %s\n",

sqlite3_errmsg(d@H_404_4@ b));@H_404_4@ sqlite3_close(db);@H_404_4@ exit(1);@H_404_4@ }@H_404_4@ rc = sqlite3_exec(db,argv[2],callback,&zErrMsg);@H_404_4@ if (rc != sqlITE_OK) {@H_404_4@ fprintf(stderr,"sql error: %s\n",zErrMsg);@H_404_4@ sqlite3_free(zErrMsg);@H_404_4@ }@H_404_4@ sqlite3_close(db);@H_404_4@ @H_404_4@ return 0;@H_404_4@ }

交叉编译:@H_404_4@ /rootfs/filesystem/home# arm-linux-gnu-gcc -I./sqlite-arm/include/ -L./sqlite-arm/lib/ test2.c -o test2 -lsqlite3

接下来就可以测试test程序了。test程序接受两个参数:第一个参数为数据库文件名,第二个参数为要执行的sql语句。程序中与sqlite3的API相关的地方主要有四个:第27行的sqlite3_open(),第33行的sqlite3_exec(),第30行和第38行的sqlite3_close(),第36行的sqlite3_free()。关于sqlite3的API接口请参考上几篇文章。@H_404_4@ 下面是测试test程序的完整过程@H_404_4@ # ./test2 test.db "create table tb(name varchar(10),number smallint);"@H_404_4@ # ./test2 test.db "insert into tb values('caoyi',1);"@H_404_4@ # ./test2 test.db "insert into tb values('huayun',2);"@H_404_4@ # ./test2 test.db "select * from tb;"@H_404_4@ @ = caoyi@H_404_4@ @ = 1

@ = huayun@H_404_4@ @ = 2@H_404_4@ 解释一下上面所用的测试命令:第一条命令在test.db这个数据库文件中创建了一个tb表,表中包含两个字段,字段name是一个变长字符串,字段number的类型为smallint;第二条命令向数据库的tbl0表中插入了一条记录(‘caoyi’,1);第三条命令向数据库的tb表中插入了一条记录(‘huayun’,2);第四条命令则是查询表tb中的所有内容,与预期的一样,这条命令打印除了数据库中的两条刚插入的记录。由此可以得出结论,这几条命令确实都已经按照预期的目标工作了。同时,在向数据库中插入上面所示的数据之后,可以看到数据库文件test.db大小已经发生了变化:@H_404_4@ 之前:@H_404_4@ rootfs/filesystem/home# ll -h test.db@H_404_4@ -rw-r--r-- 1 root root 1 2011-09-17 02:01 test.db@H_404_4@ 现在:@H_404_4@ rootfs/filesystem/home# ll -h test.db@H_404_4@ -rw-r--r-- 1 root root 2.0K 2011-09-17 02:04 test.db

@H_404_4@ 此时数据库文件test.db的大小为2K。自此,sqlite3数据库在FS2410评估板上移植完成。测试结果表明数据库能够正常工作。@H_404_4@ 四、结论 sqlite是一个优秀的嵌入式数据库。本文详细描述了如何将sqlite3移植到ARM-Linux平台上,并对移植后的sqlite3进行了简单的测试。sqlite功能强大、效率高、零配置、体积小等诸多优点使得它很适用于嵌入式移动设备环境中。因此本文给出的移植sqlite3的细节具有积极意义。由于sqlite3采用C语言开发,因此可移植性非常好。本文所讨论的方法稍加修改也可适用于其它操作系统平台。

原文链接:https://www.f2er.com/sqlite/202519.html

猜你在找的Sqlite相关文章