資源描述:
《sqlite3源程序分析_v100》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、SQLite3源程序分析作者:空轉(zhuǎn)本文分析的SQLite版本為3.6.18?,F(xiàn)在已經(jīng)變成3.6.20了,但本文中所涉及的內(nèi)容變化不大。讀者最好能下載一個源程序,然后將本文與源程序?qū)φ臻喿x。這樣也有利于發(fā)現(xiàn)本文的錯誤,說實話吧,我寫的時候是連分析帶猜的,錯誤肯定很多。參考文獻:1-TheDefinitiveGuidetoSQLite.MichaelOwens:比較經(jīng)典的SQLite著作。我邊看邊翻譯了其中的部分內(nèi)容,但翻得不好,大家還是看原文吧。2-SQLite文件格式分析_v102.空轉(zhuǎn):我寫的,寫得
2、特好?,F(xiàn)在是v102版,跟前面的版本相比增加了不少背景知識,對文件格式的介紹算是很全面了??幢疚闹?,應(yīng)該先瀏覽一下此參考文獻。1.SQLite3程序分析1.1.主程序流程所謂“主程序”是指SQLite所提供的命令行處理程序(CLP)。通過對它的分析可以對SQLite源程序建立整體概念,比一上來就直接分析單獨API的處理過程要容易。CLP的主要程序都在shell.c中。CLP的執(zhí)行流程很簡單:循環(huán)接受用戶輸入的SQL命令,處理SQL命令。命令的執(zhí)行都是調(diào)用sqlite3_exec()函數(shù)完成,也就是采
3、用的是“執(zhí)行封裝的Query”的形式[1]。程序定義了一個功能比較強大的回叫函數(shù)來處理SQL命令執(zhí)行的返回結(jié)果:staticintcallback(void*pArg,intnArg,char**azArg,char**azCol);程序定義了9種回顯的形式,通過一個callback_data結(jié)構(gòu)來對回顯參數(shù)進行配置。1.1.1.程序主函數(shù)程序的main()函數(shù)在shell.c的尾部,簡化后的main()函數(shù)的執(zhí)行過程主要分為5步:1.設(shè)置回顯參數(shù)2.取數(shù)據(jù)庫文件名3.打開數(shù)據(jù)庫4.循環(huán)處理SQL命令
4、5.關(guān)閉數(shù)據(jù)庫如下:intmain(intargc,char**argv){structcallback_datadata;//回顯參數(shù)intrc=0;Argv0=argv[0];main_init(&data);//設(shè)置默認(rèn)的回顯形式//取數(shù)據(jù)庫文件名,如沒有,默認(rèn)為內(nèi)存數(shù)據(jù)庫data.zDbFilename=argv[1];data.out=stdout;/*如果數(shù)據(jù)庫文件存在,則打開它。**如果不存在,先不打開(現(xiàn)在什么都不做),**可以防止用戶因錯誤的輸入而創(chuàng)建空文件。*/if(access(
5、data.zDbFilename,0)==0){open_db(&data);}printf("SQLiteversion%s""Enter".help"forinstructions""EnterSQLstatementsterminatedwitha";"",sqlite3_libversion());rc=process_input(&data,0);if(db){//關(guān)閉數(shù)據(jù)庫if(sqlite3_close(db)!=SQLITE_OK){fprintf(stderr,"
6、errorclosingdatabase:%s",sqlite3_errmsg(db));}}returnrc;}說明:上述函數(shù)與源程序相比做了很大的簡化,去掉的部分不是不重要的,而是“可以不解釋”的。實用程序的流程一般都是復(fù)雜的,SQLite也不例外。本文按照自己的主線進行介紹,只求能說明問題(自圓其說),主線之外的東西,不管重不重要,都盡量忽略。后面的函數(shù)也存在這樣情況,就不再說明了?;仫@參數(shù)的設(shè)置就不再介紹了,參考源程序的callback()函數(shù)和callback_data結(jié)構(gòu),有關(guān)回叫函數(shù)
7、的使用見參考文獻一。下面介紹數(shù)據(jù)庫的打開過程。1.1.1.打開數(shù)據(jù)庫數(shù)據(jù)庫文件的打開過程在SQLite的權(quán)威文檔中有介紹,過程如下圖:圖1-1數(shù)據(jù)庫文件的打開過程在CLP中打開數(shù)據(jù)庫,比上圖又多了兩層,其調(diào)用層次如下:1-main():位于shell.c。從命令行參數(shù)中得到數(shù)據(jù)庫名,如果數(shù)據(jù)庫文件存在,則打開它。2-open_db():位于shell.c。功能:確認(rèn)數(shù)據(jù)庫是否已經(jīng)打開。如果已打開,則什么都不做。如果沒有,則打開它。如果打開失敗,輸出一個錯誤信息。3-sqlite3_open():位于m
8、ain.c。功能:打開一個數(shù)據(jù)庫。該函數(shù)中只包含對opendatabase()的調(diào)用,但調(diào)用的參數(shù)與sqlite3_open_v2()所使用的參數(shù)不同。4-opendatabase():位于main.c。功能:這個函數(shù)為sqlite3_open()和sqlite3_open16()工作,打開一個數(shù)據(jù)庫。數(shù)據(jù)庫文件名"zFilename"采用UTF-8編碼。先生成各類標(biāo)志什么的,然后生成默認(rèn)的排序法。當(dāng)需要生成數(shù)據(jù)庫后臺驅(qū)動時,調(diào)用sqlite3Btree