嵌入式開發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)_第1頁
嵌入式開發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)_第2頁
嵌入式開發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)_第3頁
嵌入式開發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)_第4頁
嵌入式開發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

嵌入式開發(fā)教程基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)引言1Linux下常見的數(shù)據(jù)庫技術(shù)分析(1)PostgreSQL(2)MySQL(3)mSQL(miniSQL)(4)BerkeleyDB(5)SQLite2嵌入式開發(fā)對數(shù)據(jù)庫的需求特點3SQLite的體系結(jié)構(gòu)及開發(fā)技術(shù)3.1體系結(jié)構(gòu)3.2SQLite開發(fā)技術(shù)4SQLite在armLinux平臺上的實現(xiàn)5SQLite的應用開發(fā)6總結(jié)隨著嵌入式系統(tǒng)的廣泛應用和用戶對數(shù)據(jù)處理和管理需求的不斷提高,各種智能設(shè)備和數(shù)據(jù)庫技術(shù)的緊密結(jié)合已經(jīng)得到了各方面的重視。不久的將來嵌入式數(shù)據(jù)庫將無處不在。縱觀目前國際、國內(nèi)嵌入式數(shù)據(jù)庫的應用情況,目前基于嵌入式數(shù)據(jù)庫應用的市場已經(jīng)進入加速發(fā)展的階段。引言基于Linux平臺的數(shù)據(jù)庫非常多,大型的商用數(shù)據(jù)庫有Oracle、Sybase、Informix、Informix、IBMDB2等;中小型的更是不勝枚舉,以下是常見的幾種。1嵌入式開發(fā)教程Linux下常見的數(shù)據(jù)庫技術(shù)分析PostgreSQL是世界上最優(yōu)秀的開放源碼的數(shù)據(jù)庫之一,是完全免費的數(shù)據(jù)庫,不需要任何版權(quán)費用和購買費。因此,它是許多Linux發(fā)行版本的首選,例如:Redhat、TurboLinux都預裝了PostgreSQL。PostgreSQL兼容性很強,如果是SQL92兼容的,移植PostgreSQL非常簡單和快捷。(1)嵌入式開發(fā)教程PostgreSQLMySQL是多用戶、多進程的SQLdatabaseserver。MySQL包括一個serverdaemon(mysqld)和clientprograms與libraries的client/server實現(xiàn)工具;比較適合小而簡單的數(shù)據(jù)庫,對復雜的操作要求支持不是很好。MySQL的licensingpolicy:如果你是普通的最終用戶,使用MySQL不需要付錢;但如果是直接或間接地出售MySQL的服務程序或相關(guān)產(chǎn)品,或是在一些客戶端維護MySQLserver并收取費用,或是在發(fā)行版中包括MySQL,就需要獲得許可。

*本課題是2003年河南省杰出人才創(chuàng)新基金項目(0321000300),獲得了河南省科技廳的資金支持。(2)嵌入式開發(fā)教程MySQLmSQL是一個單用戶數(shù)據(jù)庫管理系統(tǒng)。由于它的短小精悍,使其開發(fā)的應用系統(tǒng)特別受到互聯(lián)網(wǎng)用戶青睞。mSQL并非是完全的freeware,若是在大學中使用此一軟件,或是為了學術(shù)研究與慈善等非營利性目的,才能免費得到使用權(quán)(freelicense),否則就得付費注冊才能得到正式的版權(quán)。(3)嵌入式開發(fā)教程mSQL(miniSQL)BerkeleyDB是一個開放源代碼的嵌入式數(shù)據(jù)庫管理系統(tǒng),能夠為應用程序提供高性能的數(shù)據(jù)管理服務。應用它,程序員只需要調(diào)用一些簡單的API就可以完成對數(shù)據(jù)的訪問和管理。與常用的數(shù)據(jù)庫管理系統(tǒng)(如MySQL和Oracle等)有所不同,在BerkeleyDB中并沒有數(shù)據(jù)庫服務器的概念。應用程序不需要事先同數(shù)據(jù)庫服務建立起網(wǎng)絡連接,而是通過內(nèi)嵌在程序中的BerkeleyDB函數(shù)庫來完成對數(shù)據(jù)的保存、查詢、修改和刪除等操作。(4)嵌入式開發(fā)教程BerkeleyDBSQLite支持絕大多數(shù)標準的SQL92語句,采用單文件存放數(shù)據(jù)庫,速度又比MySQL快上1~2倍(官方的數(shù)據(jù)),存儲量也不是問題。在操作語句上更類似關(guān)系型數(shù)據(jù)庫的產(chǎn)品使用,非常方便。SQLite的版權(quán)允許無任何限制的應用,包括商業(yè)性的產(chǎn)品。在PHP5中已經(jīng)集成了這個輕巧的嵌入式數(shù)據(jù)庫產(chǎn)品。(5)嵌入式開發(fā)教程SQLite在眾多的數(shù)據(jù)庫中,如何選擇適用于嵌入式系統(tǒng)的數(shù)據(jù)庫呢?嵌入式系統(tǒng)開發(fā)環(huán)境決定了其對數(shù)據(jù)庫需求的特點。(1)適當?shù)捏w積嵌入式系統(tǒng)對于數(shù)據(jù)的存儲與程序的運行一般都有較強的空間限制,所以適用于嵌入式系統(tǒng)使用的數(shù)據(jù)庫首先應該有一個適當?shù)捏w積。(2)較強的功能嵌入式開發(fā)中有很多應用,用戶需求決定了開發(fā)中需要有一個大小適中且功能齊備的數(shù)據(jù)庫來實現(xiàn)對數(shù)據(jù)的管理。對開發(fā)人員來說,要求采用的數(shù)據(jù)庫技術(shù)提供完備開發(fā)的文檔而且易于開發(fā)。(3)開源的代碼作為產(chǎn)品的開發(fā),開源的代碼不僅可以減少產(chǎn)品的生產(chǎn)成本,更重要的是為產(chǎn)品的維護完善和穩(wěn)定運行都提供了最為徹底的解決手段。2嵌入式開發(fā)對數(shù)據(jù)庫的需求特點上面介紹的數(shù)據(jù)庫技術(shù)中,Oracle、Sybase、Informix、IBMDB2等功能強大,系統(tǒng)體積龐大,要求付費使用,僅適用于作為大型商業(yè)數(shù)據(jù)庫。MySQL在保持中等體積的情況下,提供了較為適用的功能已經(jīng)成為中小規(guī)模數(shù)據(jù)庫應用的首選,但商業(yè)應用也要收費,而且對于嵌入式開發(fā)來說空間占用仍然太大,目前還不適用。

mSQL是一種簡化的SQL數(shù)據(jù)庫,短小精悍,開發(fā)方便,適用于嵌入式開發(fā);但mSQL只有30天的使用期限,并非完全的開源。余下的開放源碼數(shù)據(jù)庫中,PostgreSQL是Linux下最完善的開源SQL數(shù)據(jù)庫,但體積也較大。BerkeleyDB作為完全開源的嵌入式數(shù)據(jù)庫速度極快,可靠性高;但學習起來有一定難度,必然會加大開發(fā)成本。

SQLite則簡單易用,速度也很快,同時提供了豐富的數(shù)據(jù)庫接口,功能雖較BerkeleyDB略有遜色,但在開源社區(qū)的推動下差距正在縮小。它的設(shè)計思想是小型、快速和最小化的管理。這對于需要一個數(shù)據(jù)庫用于存儲數(shù)據(jù),但又不想花太多時間來調(diào)整數(shù)據(jù)性能的開發(fā)人員很適用。實際上在很多情況下,并不需要存儲程序或復雜的表之間的關(guān)聯(lián)。這時會發(fā)現(xiàn)SQLite在大小和功能之間找到了一個理想的平衡點。完全的開源代碼使其可以稱得上是理想的“嵌入式數(shù)據(jù)庫”。嵌入式開發(fā)教程SQLite是D·理查德·希普開發(fā)出來的用一個小型C庫實現(xiàn)的一種強有力的嵌入式關(guān)系數(shù)據(jù)庫管理體制。它提供了對SQL92的大多數(shù)支持:支持多表和索引、事務、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動。這個庫有很強的內(nèi)聚性,通過不到25000行的ANSIC代碼實現(xiàn),而且可以自由地應用于任何目的甚至包括商業(yè)應用。此外它還是高速、有效和可升級的,可以運行于從arm/Linux到SPARC/Solaris的多種硬件平臺。3嵌入式開發(fā)教程SQLite的體系結(jié)構(gòu)及開發(fā)技術(shù)圖1SQLite體系結(jié)構(gòu)SQLite有一種優(yōu)雅、標準化的設(shè)計。它可以分成8個主要子系統(tǒng),如圖1所示,其中有一些相當接近于關(guān)系數(shù)據(jù)庫管理。在圖1的頂層是標記處理器(tokenizer)和分析器(parser)。SQLite有自己高度優(yōu)化的分析生成器(檸檬分析器),可以快速地生產(chǎn)出高效率的代碼,而且依靠它新穎的設(shè)計對內(nèi)存泄漏有著特別的抵抗力。在底部是基于Knuth經(jīng)過優(yōu)化的B樹。這樣可以運行在可調(diào)整的頁面緩沖(pagecache)上,有助于將對磁盤的查找減到最小。再往下是頁面高速緩存。它作用在OS的抽象層之上,這樣的安排有助于數(shù)據(jù)庫的移動。體系結(jié)構(gòu)的核心是虛擬數(shù)據(jù)庫引擎(VDBE)。VDBE完成與數(shù)據(jù)操作相關(guān)的全部操作并且是客戶和儲存之間信息進行交換的中間單元。從各個方面來看,它都是SQLite的核心。在SQL語句被分析之后,VDBE開始起作用。代碼生成器將分析樹翻譯成一個袖珍程序,隨后這些袖珍程序又被組合成用VDBE的虛擬機器語言表示的一系列指令。如此往復,VDBE執(zhí)行每條指令,最終完成SQL語句指定的查詢要求。3.1嵌入式開發(fā)教程體系結(jié)構(gòu)VDBE的機器語言由圍繞于數(shù)據(jù)庫管理128個操作碼(opcode)組成。對于打開表,查詢索引、存儲和刪除記錄和很多其他數(shù)據(jù)庫操作都有對應的操作碼。在VDBE里的每條指令由1個操作碼和3個操作數(shù)(operand)組成。一些指令使用全部(3個)操作數(shù);也有些可能一個也未使用。這完全取決于指令的性質(zhì)。例如Open指令,用于打開一個表的指針,使用了全部(3個)操作數(shù):第1個操作數(shù)(P1)包含指針的ID號。第2操作數(shù)(P2)指出表的根位置(或者表的首頁位置);而第3個操作數(shù)則是表的名字。對于Rollback指令則根本不需要操作數(shù)。為了進行一次RollbackVDBE,僅需知道是否要做Rollback\[1\]。嵌入式開發(fā)教程SQLite的API極其易于使用,只需要三個用來執(zhí)行SQL和獲得數(shù)據(jù)的函數(shù)。它還是可以擴展的,允許程序員自定義函數(shù)然后以callback的形式集合進去。C語言API是腳本接口的基礎(chǔ),如已經(jīng)發(fā)布的(Tcl接口)。開放源碼團體已經(jīng)擴展了眾多的客戶接口、適配器、驅(qū)動等,這就使得其他語言對SQLite的使用也成為可能。使用C語言API只需要三步。首先,要提供文件名和訪問模式用來調(diào)用sqlite_open()連接數(shù)據(jù)庫。然后,執(zhí)行一個callback函數(shù),SQLite通過對每個記錄執(zhí)行callback函數(shù)獲得從數(shù)據(jù)庫那里得到的結(jié)果。最后,如果想執(zhí)行一個SQL查詢并獲得一個callback函數(shù)的指針,可以調(diào)用sqlite_exec()。除此之外還需要錯誤代碼檢查。SQLite可以通過對一個主鍵聲明它為INTEGERPRIMARYKEY成為能夠自動增加的主鍵,實現(xiàn)自增字段。

SQLite還提供了存取二進制大對象(BLOBs)的方法,在線程安全、數(shù)據(jù)庫管理、API的擴展等方面也都提供了強大方便的技術(shù)支持。3.2嵌入式開發(fā)教程SQLite開發(fā)技術(shù)SQLite嵌入式數(shù)據(jù)庫提供了以源碼發(fā)布的方式,要在眾多的硬件平臺進行移植,可以根據(jù)不同平臺對源碼進行交叉編譯來實現(xiàn)。編譯主要有以下幾個步驟\[2\]:

①到/的cvs中下載最新的源代碼包,解壓后將生成sqlite目錄,另外新建并轉(zhuǎn)到一個與sqlite目錄平行的同級目錄,如make目錄。

②用“echo$PATH”命令查看PATH中是否已經(jīng)包含交叉編譯工具armlinuxgcc。

③為了在ARMLinux下能正常運行sqlite,需要對sqlite/src/sqliteInt.h作一定的修改,以確保btree(B樹)有正確的變量大小,如“ptr”和“char*”。不同體系結(jié)構(gòu)的Linux,如x86和ARM,會有些差別。對于armLinux可以找到如下部分:#ifndefINTPTR_TYPE

#ifSQLITE_PTR_SZ==44嵌入式開發(fā)教程SQLite在armLinux平臺上的實現(xiàn)

#defineINTPTR_TYPEint

#else

#defineINTPTR_TYPElonglong

#endif在上面的代碼前加上一句#defineSQLITE_PTR_SZ4這樣后面的“typedefINTPTR_TYPEptr;”就是定義的“int”類型,而不是“l(fā)onglong”。

④使用configure進行一些配置。修改sqlite目錄下的configure,讓configure不去檢查交叉編譯環(huán)境。由于篇幅有限不再詳述。

⑤修改Makefile文件。將代碼行BCC=armlinuxgccgO2改成BCC=gccgO2。另外,一般是以靜態(tài)鏈接的形式將sqlite放到armLinux的硬件板上運行的,所以繼續(xù)修改Makefile,找到標記為sqlite:的代碼段,將其中的libsqlite.la改成.libs/libsqlite.a。做完上述修改,用make生成sqlite、libsqlite.a、libsqlite.so。為了減小執(zhí)行文件大小可以用strip處理,去掉其中的調(diào)試信息。嵌入式開發(fā)教程

⑥在ARM板上運行sqlite。將sqlite拷貝到arm板上,方法很多,需要根據(jù)具體的情況來選擇。如ftp、cmdftp、wget等。將sqlite下載到arm板的/tmp目錄,因為此目錄是可寫的。修改權(quán)限并運行:chmod+wxsqlite

./sqlitetest.sqlite會出現(xiàn)sqlite>如果一切正常,現(xiàn)在sqlite已經(jīng)在armLinux下跑了起來,然后就可以基于此進行進一步的應用開發(fā)了。嵌入式開發(fā)教程家庭網(wǎng)絡中央控制器以arm微處理器為中心建立硬件平臺,對外通過寬帶Ethernet、Modem與Internet連接,對內(nèi)將家用電器通過內(nèi)部無線局域網(wǎng)連接成一體,通過遠程Web瀏覽器、本地觸摸屏以及電話語音三種方式實現(xiàn)對家用電器的狀態(tài)查詢和控制。多樣化的數(shù)據(jù)存儲與管理需要有一個后臺數(shù)據(jù)庫來支撐,SQLite無疑是一個合適的選擇。下面就其應用程序的編寫方式作一個簡單的介紹。為了講解方便,下面例程通過程序代碼生成了數(shù)據(jù)庫sysdb及其中的一個表格user,也可以用sqlite命令行或者sqlitebrowse等圖形化工具建立數(shù)據(jù)庫。

#include<string.h>

#include"sqlite.h"

intcallback(void*p_data,intnum_fields,char**p_fields,

char**p_col_names);5嵌入式開發(fā)教程SQLite的應用開發(fā)

main(){

FILE*inp_fp;

intret;

intnrecs=0;

char*errmsg;

sqlite*p_db;

unsignedchar*sqlcommand;

unsignedchar*sqlcreatedb;

sqlcommand="select*fromuser;";

sqlcreatedb="createtableuser(idnumeric,nametext);";

/*建立數(shù)據(jù)庫*/

if((inp_fp=fopen("./sysdb","r"))==NULL){

printf("Cannotfinddatabasefile!\\n");嵌入式開發(fā)教程

printf("Recoverthedatabasefile...\\n");

p_db=sqlite_open("./sysdb",0777,0);

sqlite_exec(p_db,sqlcreatedb,0,0,0);

printf("Thedatabasefilehavebeenrecorvered!\\n");

sqlite_close(p_db);

}

/*打開數(shù)據(jù)庫*/

sqlite*p_db=sqlite_open("./sysdb",0777,0);

/*選擇user表中的所有記錄.*/

ret=sqlite_exec(p_db,sqlcommand,callback,&nrecs,

errmsg);嵌入式開發(fā)教程

if(ret!=SQLITE_OK){

printf("Error

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論