>
摘 要:本文先就Linux下的常见数据库技术做了分析,然后指出了嵌入式系统开发中对数据库的需求特点,基于此对SQLite嵌入式数据库的体系结构和开发技术做了论述,最后结合ARM-Linux开发平台讲述了具体的实现方法。
关键词:嵌入式数据库;SQLite;ARM-Linux
引言
随着嵌入式系统的广泛应用和用户对数据的处理及管理需求的不断提高,各种智能设备和数据库技术的紧密结合已经得到了各方面的重视。目前,基于嵌入式数据库应用的市场需求已经进入加速发展的阶段。
图1 SQLite体系结构
Linux 下常见的
数据库技术分析
基于Linux平台的数据库非常多,大型的商用数据库有Oracle、Sybase、Informix、IBM DB2等等,中小型的更是不胜枚举,常见的主要有PostgreSQL、MySQL、mSQL、Berkeley DB、SQLite等等。
大型商业数据库功能强大、系统体积庞大,并要求付费使用。MySQL在保持中等体积的情况下提供了较为适用的功能,已经成为中小规模数据库应用的首选,但商业应用也要收费,而且对于嵌入式开发来说空间占用仍然太大。mSQL是一种简化的SQL数据库,短小精悍,开发方便,适用于嵌入式开发,但它只有30天的使用期限,并非完全的开源。余下的开放源码数据库中,PostgreSQL是Linux下最完善的开源SQL数据库,但体积也较大;Berkeley DB速度极快,可靠性高,但学习起来有一定难度,必然会加大开发成本。
SQLite支持绝大多数标准的SQL92语句,采用单文件存放数据库,速度又比 MySQL 快上 1~2 倍,存储量也不是问题,在操作语句上更类似关系型数据库的使用,其版权允许无任何限制的应用,包括商业性的产品。由于具有这些优良特性,SSQLite已集成至PHP5中。
嵌入式开发对
数据库的需求特点
嵌入式系统开发环境决定了其对数据库的需求有如下特点:
嵌入式系统对于数据的存储与程序的运行一般都有较强的空间限制,所以,适用于嵌入式使用的数据库首先应该有一个适当的体积;
嵌入式开发中有很多应用,用户需求的多样化决定了开发中需要有一个功能齐备的数据库来实现对数据的管理,对开发人员来说,同时还要求采用的数据库技术能够提供完备开发的文档而且易于开发;
作为产品的开发,开源的代码不仅可以减少产品的生产成本,更重要的是为产品的维护完善和稳定运行都提供了最为彻底的解决手段。
SQLite的设计思想是小型、快速和最小化的管理,简单易用,同时提供了丰富的数据库接口,功能虽较Berkeley DB略有逊色,但在开源组织的推动下差距正在缩小。实际上,很多情况并不需要存储过程或复杂的表之间的关联,这时会发现SQLite在大小和功能之间找到了一个理想的平衡点。另外它还允许自由地用于任何目的甚至包括商业应用,完全的开源代码使其可以称得上是理想的嵌入式数据库。
SQLite的体系结构
及开发技术
SQLite 是一个用小型C库实现的嵌入式关系数据库管理体制,有着很强的内聚性。它提供了对SQL92的大多数支持,支持多表和索引、事务、视图、触发以及一系列的用户接口及驱动。此外它还可以运行于从ARM/ Linux到SPARC / Solaris的多种硬件平台。
体系结构
SQLite有一种优雅、标准化的设计。它可以分成8 个主要子系统,如图1所示,其中有一些相当接近于关系数据库管理。
在图的顶层是标记处理器(tokenizer)和分析器(parser)。SQLite 有自己高度优化的分析器生成器,可以快速产生高效率的代码,并对内存泄漏有着特别的抵抗力。
在底部是基于Knuth经过优化的B树,这样就可以运行在可调整的页面缓冲上,有助于将对磁盘的查找减到最小。
再往下是页面高速缓存,它作用在操作系统的抽象层之上,这样的安排有助于数据库的移动。
体系结构的核心是虚拟数据库引擎(VDBE)。VDBE完成与数据操作相关的全部操作,并且是客户和存储之间进行信息交换的中间单元。在SQL语句被分析之后,VDBE 开始起作用。代码生成器将分析树翻译成一个袖珍程序,随后这些袖珍程序又被组合成用VDBE的虚拟机器语言表示的一系列指令。如此往复,VDBE 执行每条指令,最终完成SQL语句指定的查询要求。
SQLite开发技术
SQLite的API极其易于使用,只需要三个用来执行SQL和获得数据的函数。它还是可以扩展的,允许程序员自定义函数然后以callback的形式集合进去。C语言API是其它接口的基础,开放源码团体基于此已经扩展了众多的客户接口,使得其他语言对SQLite的使用也成为可能。
SQLite在
ARM-Linux平台上的实现
SQLite编译技术
SQLite嵌入式数据库提供了以源码发布的方式,根据不同的硬件平台,对源码进行交叉编译即可实现移植,本项目采用的是深圳优龙公司的ARM9核的FS9200开发板,编译过程主要有以下几个步骤:
1)到http://www.sqlite.org/下载最新的源代码包,本项目采用的是sqlite-
2) 用“echo $PATH”命令查看PATH中是否已经包含交叉编译工具arm-linux-gcc,如果没有,请参考相关文档下载安装这些免费工具,本项目采用的是cross-2.95.3.tar.bz2。
3) 不同体系结构的Linux,如x86和ARM,会有些差别,需要对sqlite/src/sqliteInt.h做一定的修改,以确保btree(B树)有正确的变量大小,如“ptr”和“char*”。对于ARM-Linux可以找到如下部分:
#ifndef INTPTR_TYPE
# if SQLITE_PTR_SZ==4
# define INTPTR_TYPE int
# else
# define INTPTR_TYPE long long
# endif
在上面的代码前加上一句:
#define SQLITE_PTR_SZ 4
这样后面的“typedef INTPTR_TYPE ptr”就是定义的“int”类型,而不是“long long”。
4) 使用configure进行一些配置。修改sqlite目录下的configure使其不去检查交叉编译环境,注释掉相应代码行即可,由于篇幅有限不再详述。
5) 修改Makefile文件。
将代码行 BCC = arm-linux-gcc -g -O2改成BCC = gcc -g -O2 。另外,如果要以静态链接的形式将SQLite放到ARM-Linux的硬件板子上运行,则继续修改Makefile,找到标记为sqlite:的代码段,将其中的libsqlite.la改成.libs/libsqlite.a 。做完上述修改,用make生成sqlite、libsqlite.a和libsqlite.so。为了减小执行文件大小可用strip处理,去掉其中的调试信息。
6)在ARM板上运行SQLite
将sqlite下载到arm板的/tmp目录,修改权限并运行:
chmod +wx sqlite
./sqlite test.sqlite
会出现 :
sqlite>
如果一切正常,SQLite已经在ARM-Linux下正常运行,然后就可以基于此进行进一步的应用开发了。
SQLite的应用开发
家庭网络中央控制器以ARM微处理器为中心建立硬件平台,对外通过宽带Ethernet、Modem与Internet连接,对内将家用电器通过内部无线局域网连接成一体,通过远程Web浏览器、本地触摸屏以及电话语音三种方式实现对家用电器的状态查询和控制,多样化的数据存储与管理需要有一个后台数据库来支撑。下面以数据库sysdb及其中的一个表格user为例作简单陈述。
首先用SQLite命令行或者SQLitebrowse等图形化工具建立数据库sysdb及表格user。这样就可以通过提供文件名和访问模式等参数来调用sqlite _open()以连接数据库,如“p_db=sqlite_open(“./sysdb”, 0777,0);”。如果想执行一个SQL查询的话可以调用sqlite_exec(),如“sqlite_exec(p_db, “select * from user ;”, callback, 0,0);”。由于SQLite通过对每个记录执行callback函数获得从数据库那里得到的结果,因此可以根据需要构造自己的callback函数用来实现具体的功能。最后以“sqlite_close(p_db);”语句关闭数据库即可。需要注意的是在程序编写及编译执行时应该注意sqlite.h、libsqlite.a、libsqlite.so的使用。
支持SQLite的第三方极多,在项目实际开发中还针对QT利用qt-sqlite-plugin插件开发了图形程序用以实现通过触摸屏的本地交互界面,利用移植的web服务器编写了CGI程序实现了B/S模式的远程访问。
结语
本文在经过大量的分析对比之后,针对嵌入式系统开发的特点,从众多数据库发行版中选出非常适用的嵌入式数据库SQLite。在ARM-Linux下完成了对SQLite的编译,并基于此在项目中做了进一步的开发工作。实践证明SQLite能够出色地完成嵌入式系统中的数据库应用需求。■
参考文献:
1 Michael Owens. Embedding an SQL Database with SQLite. Linux Journal ,June 01, 2003