日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
基于A(yíng)RM-Linux的SQLite嵌入式數(shù)據(jù)庫(kù)技術(shù)
基于A(yíng)RM-Linux的SQLite嵌入式數(shù)據(jù)庫(kù)技術(shù)
 更新時(shí)間:2008-8-18 10:00:05  點(diǎn)擊數(shù):21
【字體: 字體顏色

VDBE 的機(jī)器語(yǔ)言由圍繞于數(shù)據(jù)庫(kù)管理 128 個(gè)操作碼(opcode)組成。對(duì)于打開(kāi)表,查詢(xún)索引、存儲(chǔ)和刪除記錄和很多其他數(shù)據(jù)庫(kù)操作都有對(duì)應(yīng)的操作碼。在VDBE里的每條指令由1個(gè)操作碼和3個(gè)操作數(shù)(operand)組成。一些指令使用全部(3個(gè))操作數(shù);也有些可能一個(gè)也未使用。這完全取決于指令的性質(zhì)。例如Open指令,用于打開(kāi)一個(gè)表的指針,使用了全部(3個(gè))操作數(shù):第1個(gè)操作數(shù)(P1)包含指針的ID號(hào)。第2操作數(shù)(P2)指出表的根位置(或者表的首頁(yè)位置);而第3個(gè)操作數(shù)則是表的名字。對(duì)于Rollback指令則根本不需要操作數(shù)。為了進(jìn)行一次Rollback VDBE,僅需知道是否要做Rollback\[1\]。
3.2SQLite開(kāi)發(fā)技術(shù)
SQLite的API極其易于使用,只需要三個(gè)用來(lái)執(zhí)行SQL和獲得數(shù)據(jù)的函數(shù)。它還是可以擴(kuò)展的,允許程序員自定義函數(shù)然后以callback的形式集合進(jìn)去。C語(yǔ)言API是腳本接口的基礎(chǔ),如已經(jīng)發(fā)布的(Tcl接口)。開(kāi)放源碼團(tuán)體已經(jīng)擴(kuò)展了眾多的客戶(hù)接口、適配器、驅(qū)動(dòng)等,這就使得其他語(yǔ)言對(duì)SQLite的使用也成為可能。
使用C語(yǔ)言API只需要三步。首先,要提供文件名和訪(fǎng)問(wèn)模式用來(lái)調(diào)用sqlite _open()連接數(shù)據(jù)庫(kù)。然后,執(zhí)行一個(gè)callback函數(shù),SQLite通過(guò)對(duì)每個(gè)記錄執(zhí)行callback函數(shù)獲得從數(shù)據(jù)庫(kù)那里得到的結(jié)果。最后,如果想執(zhí)行一個(gè)SQL查詢(xún)并獲得一個(gè)callback函數(shù)的指針,可以調(diào)用sqlite_exec()。除此之外還需要錯(cuò)誤代碼檢查。SQLite可以通過(guò)對(duì)一個(gè)主鍵聲明它為INTEGER PRIMARY KEY成為能夠自動(dòng)增加的主鍵,實(shí)現(xiàn)自增字段。
SQLite還提供了存取二進(jìn)制大對(duì)象(BLOBs)的方法,在線(xiàn)程安全、數(shù)據(jù)庫(kù)管理、API的擴(kuò)展等方面也都提供了強(qiáng)大方便的技術(shù)支持。
4SQLite在A(yíng)RMLinux平臺(tái)上的實(shí)現(xiàn)
SQLite嵌入式數(shù)據(jù)庫(kù)提供了以源碼發(fā)布的方式,要在眾多的硬件平臺(tái)進(jìn)行移植,可以根據(jù)不同平臺(tái)對(duì)源碼進(jìn)行交叉編譯來(lái)實(shí)現(xiàn)。編譯主要有以下幾個(gè)步驟\[2\]:
① 到http://www.sqlite.org/的cvs中下載最新的源代碼包,解壓后將生成sqlite目錄,另外新建并轉(zhuǎn)到一個(gè)與sqlite目錄平行的同級(jí)目錄,如make目錄。
② 用“echo $PATH”命令查看PATH中是否已經(jīng)包含交叉編譯工具armlinuxgcc。
③ 為了在A(yíng)RMLinux下能正常運(yùn)行sqlite,需要對(duì)sqlite/src/sqliteInt.h作一定的修改,以確保btree(B樹(shù))有正確的變量大小,如“ptr”和“char*”。不同體系結(jié)構(gòu)的Linux,如x86和ARM,會(huì)有些差別。對(duì)于A(yíng)RM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”類(lèi)型,而不是“l(fā)ong long”。
④ 使用configure進(jìn)行一些配置。修改sqlite目錄下的configure,讓configure不去檢查交叉編譯環(huán)境。由于篇幅有限不再詳述。
⑤ 修改Makefile文件。將代碼行 BCC = armlinuxgccgO2改成BCC = gccgO2。另外,一般是以靜態(tài)鏈接的形式將sqlite放到ARMLinux的硬件板上運(yùn)行的,所以繼續(xù)修改Makefile,找到標(biāo)記為sqlite:的代碼段,將其中的libsqlite.la改成.libs/libsqlite.a。做完上述修改,用make生成sqlite、libsqlite.a、libsqlite.so。為了減小執(zhí)行文件大小可以用strip處理,去掉其中的調(diào)試信息。
⑥ 在A(yíng)RM板上運(yùn)行sqlite。將sqlite拷貝到ARM板上,方法很多,需要根據(jù)具體的情況來(lái)選擇。如ftp、cmdftp、wget等。將sqlite下載到ARM板的/tmp目錄,因?yàn)榇四夸浭强蓪?xiě)的。修改權(quán)限并運(yùn)行:chmod +wx sqlite
./sqlite test.sqlite 會(huì)出現(xiàn)sqlite> 如果一切正常,現(xiàn)在sqlite已經(jīng)在A(yíng)RMLinux下跑了起來(lái),然后就可以基于此進(jìn)行進(jìn)一步的應(yīng)用開(kāi)發(fā)了。
5SQLite的應(yīng)用開(kāi)發(fā)
家庭網(wǎng)絡(luò)中央控制器以ARM微處理器為中心建立硬件平臺(tái),對(duì)外通過(guò)寬帶Ethernet、Modem與Internet連接,對(duì)內(nèi)將家用電器通過(guò)內(nèi)部無(wú)線(xiàn)局域網(wǎng)連接成一體,通過(guò)遠(yuǎn)程Web瀏覽器、本地觸摸屏以及電話(huà)語(yǔ)音三種方式實(shí)現(xiàn)對(duì)家用電器的狀態(tài)查詢(xún)和控制。多樣化的數(shù)據(jù)存儲(chǔ)與管理需要有一個(gè)后臺(tái)數(shù)據(jù)庫(kù)來(lái)支撐,SQLite無(wú)疑是一個(gè)合適的選擇。下面就其應(yīng)用程序的編寫(xiě)方式作一個(gè)簡(jiǎn)單的介紹。
為了講解方便,下面例程通過(guò)程序代碼生成了數(shù)據(jù)庫(kù)sysdb及其中的一個(gè)表格user,也可以用sqlite命令行或者sqlitebrowse等圖形化工具建立數(shù)據(jù)庫(kù)。#include <string.h>
#include "sqlite.h"
int callback( void *p_data, int num_fields, char **p_fields,
char **p_col_names);
main(){
FILE *inp_fp;
int ret;
int nrecs = 0;
char *errmsg;
sqlite *p_db;
unsigned char *sqlcommand;
unsigned char * sqlcreatedb;
sqlcommand="select * from user ;" ;
sqlcreatedb="create table user(id numeric, name text);";
/*建立數(shù)據(jù)庫(kù)*/
if ((inp_fp = fopen("./sysdb", "r"))==NULL) {
printf("Cannot find database file !\\n");
printf("Recover the database file ...\\n");
p_db=sqlite_open("./sysdb",0777,0);
sqlite_exec(p_db,sqlcreatedb,0,0,0);
printf("The database file have been recorvered!\\n");
sqlite_close(p_db);
}
/*打開(kāi)數(shù)據(jù)庫(kù)*/
sqlite* p_db=sqlite_open("./sysdb", 0777, 0);
/*選擇 user表中的所有記錄. */
ret=sqlite_exec(p_db,sqlcommand,callback, &nrecs,
errmsg);
if(ret!=SQLITE_OK){
printf("Error on SELECT: %s.\\n", errmsg);
}
else{
printf("Retrieved %i records.\\n", nrecs);
}
/* 關(guān)閉數(shù)據(jù)庫(kù)*/
sqlite_close(p_db);
}
int callback( void *p_data, int num_fields, char**p_fields,
char **p_col_names){
int i;
int *p_rn = (int*)p_data;
(*p_rn)++;
for(i=0; i < num_fields; i++){
printf("%s " p_fields\[i\]);
}
return 0;
}然后利用sqlite.h、libsqlite.a、libsqlite.so,根據(jù)需要進(jìn)行交叉編譯即可。
上例僅是一個(gè)簡(jiǎn)單的程序段,可以根據(jù)需要構(gòu)造自己的數(shù)據(jù)庫(kù)和callback函數(shù),用來(lái)實(shí)現(xiàn)具體的功能。支持SQLite的第三方極多,在項(xiàng)目實(shí)際開(kāi)發(fā)中還針對(duì)QT利用qtsqliteplugin插件開(kāi)發(fā)了圖形程序,用以實(shí)現(xiàn)通過(guò)觸摸屏的本地交互界面,利用移植的Web服務(wù)器編寫(xiě)了CGI程序,實(shí)現(xiàn)了B/S模式的遠(yuǎn)程訪(fǎng)問(wèn)。
6總結(jié)
在經(jīng)過(guò)大量的分析對(duì)比之后,針對(duì)嵌入式系統(tǒng)開(kāi)發(fā)的特點(diǎn),從眾多數(shù)據(jù)庫(kù)發(fā)行版中選出非常適用的嵌入式數(shù)據(jù)庫(kù)SQLite。在A(yíng)RMLinux下完成了對(duì)SQLite的編譯,并基于此在項(xiàng)目中作了進(jìn)一步的開(kāi)發(fā)工作。實(shí)踐證明,SQLite能夠出色地完成嵌入式系統(tǒng)中的數(shù)據(jù)庫(kù)應(yīng)用需求。
參考文獻(xiàn)
1Michael Owens. Embedding an SQL Database with SQLite. Linux Journal, 20030601
2How To Compile. http://www.sqlite.org/
3薛啟康. Linux環(huán)境下的數(shù)據(jù)庫(kù). 中國(guó)計(jì)算機(jī)報(bào), 2001總期號(hào):1009

  • 上一篇: 電子系統(tǒng)EDA集成開(kāi)發(fā)環(huán)境框架結(jié)構(gòu)
  • 下一篇: 新型 RFI/EMI 抑制電容器具有 500Vac 及 300Vac 的額定電壓
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話(huà):0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1