陳剛++侯曉榮
摘要:該文對SQLite數據庫源碼進行了分析、修改和重新編譯,為SQLite數據庫增加了自定義的內置函數,實現了SQLite對系統(tǒng)程序的調用?;诖耍岢霾捎肧QLite數據庫對數據進行檢測并調用系統(tǒng)中的程序對檢測的問題進行處理,適用于嵌入式監(jiān)控系統(tǒng)中的數據檢測和報警問題。該方法利用了數據庫對數據進行檢測和處理,相比編程的方法,減少了程序員的工作量,方便了大批量數據的管理。
關鍵詞:嵌入式;SQLite;數據庫;SQLite;內置函數;監(jiān)控系統(tǒng)
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)06-0001-02
Implementation and Application of SQLite Calling System Program
CHEN Gang, HOU Xiao-rong
(School of Energy Science and Engineering, University of Electronic Science and Technology of China, Chengdu 611731, China)
Abstract: In this paper,the source code of SQLite is analyzed, modified and recompiled. By this way, a new custom built-in function is added to the SQLite, which enable the SQLite database system to call the system programs. Based on this new function, this paper proposes to use SQLite database for data detection and invoking programs to dealing with detected problems, which is suitable for the data detection and alarm handling problems in the embedded monitoring system. This method utilizes the database technology to detect data and handle alarms, which reduces the workload of the programmer and facilitates large amounts of data management compared with the programming method.
Key words: Embedded System ; SQLite; Database; Built-in Function; Monitoring System
1 引言
在嵌入式數據采集與監(jiān)控系統(tǒng)中,需要對數據進行定時檢測,當數據出現異常時,調用程序進行相應的處理。比如,對一個溫度數據采集與監(jiān)控系統(tǒng)而言,當檢測到溫度過高時,需要調用系統(tǒng)控制程序降低溫度,或者調用程序觸發(fā)相關告警裝置,提醒工作人員處理。一般的,監(jiān)控系統(tǒng)中數據的檢測與處理,都是通過編寫程序完成的。但是,當數據量非常大的時候,程序的數據判斷和處理工作會非常多,代碼量巨大,不方便程序的開發(fā)和管理。
針對以上問題,本文通過對SQLite源碼進行修改和重新編譯,實現了SQLite數據庫對系統(tǒng)程序的調用?;诖?,提出通過SQLite數據庫解決監(jiān)控系統(tǒng)中的數據檢測和處理問題:如圖1所示,利用SQLite的觸發(fā)器對存儲的數據進行判斷,當數據異常時,觸發(fā)相關程序進行處理。該方法通過設計數據庫觸發(fā)器檢測和處理數據,相比編程的方法,不用編寫繁雜的判斷處理代碼,可以方便大量數據的監(jiān)控管理。
2 SQLite的原理和開發(fā)技術
SQLite是針對嵌入式系統(tǒng)采用ANSIC C語言開發(fā)的輕量級開源數據庫[1],可以在Windows/Linux/Unix等主流操作系統(tǒng)上穩(wěn)定運行。SQLite可以支持多種語言對其進行數據操作,比如C/C++語言、Java、PHP等,相對MySQL等著名的開源數據庫管理系統(tǒng)而言,它的處理速度更快[2]。SQLite第一個Alpha版本最早由D. Richard Hipp在2000年發(fā)布。自發(fā)布以來,SQLite不斷更新,目前已經更新到SQLite3.11.0版本。SQLite是一個基于文件的數據庫,它可以處理所有類型的數據,支持多數的 SQL92 標準。SQLite是一個自包含、零配置的數據庫[3]:一個應用程序在使用SQLite的過程中,SQLite功能會被集成在其中,應用程序和SQLite共用相同的進程,而不是單獨的一個進程;應用程序會直接訪問數據庫文件,而不是通過套接字來交互,這使得SQLite快速和高效。由于SQLite可移植性好,體積小且高效的特性,自發(fā)布以來,SQLite逐步受到關注,在嵌入式、Android、IOS系統(tǒng)中得到廣泛應用。
2.1 SQLite的實現原理
SQLite采用模塊化的設計, 主要由四個部分組成:即內核、SQL 編譯器、后端以及附件。其中內核和SQL編譯器完成SQL語句的接收、提取、執(zhí)行;而后端負責完成SQL指令與系統(tǒng)的對接進而執(zhí)行這些指令;附件用于SQLite的附加功能實現[4]。
2.2 SQLite的內置函數
SQLite 有許多內置函數用于數據的處理,所有函數都是大小寫不敏感的,可以使用這些函數的小寫形式、大寫形式或混合形式來調用它們。目前,官方發(fā)布的SQLite內置函數一般是用于處理字符串或數字數據的,但是,內置函數的功能不局限于此。我們可以通過增加一個自定義的SQLite的內置函數,使SQLite能夠通過該內置函數實現對系統(tǒng)程序的調用。
SQLite內置函數是采用回調的方式實現的:所有內置函數都通過回調函數[5]的定義和注冊實現。在SQLite源碼中,func.c模塊是負責實現內置函數的。SQLite的內置函數(例如count(),substr()函數),都可以在func.c中找到。因此,可以通過在func.c中增加SQLite的回調函數,實現SQLite對外部程序的調用。
3 SQLite實現系統(tǒng)程序調用
目前,官方發(fā)布的SQLite數據庫不支持對系統(tǒng)程序的調用,這限制了SQLite的使用。因此,本節(jié)將根據上述原理,通過在SQLite的func.c模塊中定義和注冊回調函數,并重新編譯SQLite,實現SQLite對系統(tǒng)程序的調用,具體步驟如下所述。
3.1 為SQLite添加內置函數
在SQLite官網上下載sqlite-amalgamation-3090200.zip壓縮包,解壓后得到shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h四個文件。在Windows下使用Visual Studio 2013修改SQLite源碼:
1)在Visual Studio 2013中新建一個空的C++控制臺工程,命名為SQLite;依次添加shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h四個文件到SQLite工程中。
2)在SQLite的func.c模塊,按照回調接口定義:void (*xFunc)(sqlite3_context*,int,sqlite3_value **),在lowerFunc函數下方,增加回調函數sys_execFunc,實現SQLite對系統(tǒng)程序的調用,具體代碼為:
static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){[…]};//lowerFunc定義
static void sys_execFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
const char *c = (char*)sqlite3_value_text(argv[0]); //獲取用戶輸入的系統(tǒng)命令
if (c){system(c); //執(zhí)行系統(tǒng)命令
}
3)在lowerFunc函數的注冊代碼下方,將新增的sys_execFun函數注冊為sys_exec。注冊代碼為: FUNCTION(lower, 1, 0, 0, lowerFunc ) //lowerFunc注冊
FUNCTION(sys_exec,1, 0, 0, sys_execFun)
4)至此,如果沒有語法錯誤,項目可以直接編譯成功,則代碼修改完畢。
3.2 Linux下代碼編譯及測試
代碼修改完成后,可以在Linux系統(tǒng)中對SQLite進行重新編譯,實現SQLite對系統(tǒng)程序的調用。實驗環(huán)境可以為SQLite支持的任意Linux操作系統(tǒng)。為了將問題具體化,這里采用樹莓派2代主板(Debian Linux系統(tǒng))作為實驗環(huán)境,該主板采用Broadcom BCM2836 900MHz ARM Cortex-A7 四核處理器,具有1G的運行內存,可以滿足實驗要求。
參考SQLite官網和文獻[6],對修改后的代碼在Linux下重新編譯。首先,在SQLite官網上下載sqlite-autoconf-3090200.tar.gz壓縮包,Linux下解壓后得到sqlite3.c、sqlite3.h等一系列文件。將其中的sqlite3.c文件替換為之前修改過的sqlite3.c文件。然后依次按照如下的步驟,在Linux系統(tǒng)中編譯程序:
1)進入SQLite源碼目錄,對軟件進行系統(tǒng)配置,即運行命令:
~$ sudo ./configure
2)編譯程序,等待程序生成,即運行命令:
~$ sudo make
3)程序編譯完成后,安裝生成的sqlite3程序,即運行命令:
~$ sudo make install
最后,通過以上操作,SQLite新增了一個名為sys_exec的內置函數。我們可以對新增的sys_exec內置函數進行測試。例如:輸入命令select sys_exec(‘pwd),控制臺將輸出當前目錄;輸入命令select sys_exec(‘ls),控制臺將輸出當前目錄下的文件夾和文件。
4 SQLite實現數據自檢與處理
SQLite的數據自檢與處理可以通過觸發(fā)器實現。SQLite的觸發(fā)器是數據庫的回調函數,它會在指定的數據庫事件發(fā)生時自動執(zhí)行。SQLite觸發(fā)器支持的觸發(fā)操作有:DELETE(刪除)、INSERT(插入) 和 UPDATE(更新),即SQLite支持在數據庫表發(fā)生刪除、插入和更新操作之前或之后,觸發(fā)事先定義的操作。
利用SQLite實現數據自檢和處理的一般方法為:為數據庫表創(chuàng)建一個UPDATE觸發(fā)器,通過SELECT語句和WHERE語句結合使用,實現對數據表的自檢和處理。這樣,當數據更新后,觸發(fā)器通過WHERE子句定位到更新的數據,并對數據進行判斷,如果監(jiān)測到異常,然后通過SELECT語句調用SYS_EXEC內置函數執(zhí)行指定的外部程序,從而實現SQLite對數據庫數據的自檢和處理。
5 結束語
本文提出使用SQLite數據庫對監(jiān)控系統(tǒng)的數據進行檢測和處理。相比編程的方法,該方法利用了數據庫檢測異常數據并調用相關程序進行處理,可以完成很繁重的任務,而不必編寫繁雜的算法。
參考文獻:
[1] 蔡勇,王勇. 嵌入式數據庫SQLite在測控系統(tǒng)設計中的應用[J]. 電子測試,2011(10):89-93.
[2] 韓善鋒,曹鳳海,易昌華. SQLite數據庫在嵌入式程序開發(fā)中的應用[J]. 物探裝備,2011(3):170173+178.
[3] 梁永恩,萬世明,翟敏換. SQLite數據庫在嵌入式系統(tǒng)中的應用研究[J]. 現代計算機(專版),2015(10):60-62.
[4] 黨玉春,翟秀云,陳明通. SQLite系統(tǒng)構架及虛擬機分析[J]. 微型機與應用,2012(10):67-70.
[5] 張海平. C/C++語言中函數指針的深入分析與應用[J]. 電腦編程技巧與維護,2009(22):17-18.
[6] 楊洋. SQLite數據庫在嵌入式系統(tǒng)中的應用實踐[J]. 柳鋼科技,2013(5):41-43.