專利名稱:一種SQLite空閑鏈表節(jié)點的解析方法和裝置的制作方法
技術領域:
本發(fā)明涉及計算機數(shù)據(jù)處理技術領域,特別是涉及一種SQLite空閑鏈表節(jié)點的解析方法和裝置。
背景技術:
SQLite數(shù)據(jù)庫是遵守數(shù)據(jù)庫事務正確執(zhí)行四要素-原子性、一致性、隔離性和持久性(ACID, Atomicity、Consistency、Isolation>Durability)的關聯(lián)式數(shù)據(jù)庫管理系統(tǒng), 其設計目標是嵌入式的,目前在很多嵌入式產(chǎn)品得到廣泛使用。主要特點占用系統(tǒng)資源非常低,可支持Windows/Linux/Unix等等主流的操作系統(tǒng),可與很多程序語言相結合,并具有ODBC接口。與Mysql、PostgreSQL這兩款開源數(shù)據(jù)庫管理系統(tǒng)相比,其處理速度更快。傳統(tǒng)的SQLite刪除數(shù)據(jù)解析方法是根據(jù)記錄數(shù)據(jù)的特征來斷定某記錄的大概范圍,從而解析某些關鍵數(shù)據(jù),但是這種方法的弊端是只能針對某一類具體數(shù)據(jù)庫文件(如某類手機中的短信數(shù)據(jù)庫文件),而對于其他的數(shù)據(jù)庫文件(如郵件數(shù)據(jù)庫文件)則需要重新提取數(shù)據(jù)特征并重新解析,無法保證通用性。SQLite數(shù)據(jù)庫刪除數(shù)據(jù)的通用解析,當前國內外研究比較少;目前市場上的通用解析產(chǎn)品具有很大的局限性,特別其多記錄空閑鏈表節(jié)點,或存在記錄碎片和關鍵點碎片的空閑鏈表節(jié)點,無法做到準確定位,解析效果不盡如人意。測試發(fā)現(xiàn)對于存在較多記錄碎片和關鍵點碎片的多記錄空閑鏈表節(jié)點,往往只能解析一條記錄,甚至無法解析任何一條記錄,而且解析結果經(jīng)常由于記錄元組劃分的不準確存在亂碼現(xiàn)象,因此現(xiàn)有技術對多記錄刪除數(shù)據(jù)重組的準確性和全面性均存在問題,無法適于實際應用。
發(fā)明內容
本發(fā)明所要解決的技術問題是提供一種SQLite空閑鏈表節(jié)點的解析方法,可解決現(xiàn)有技術只能對SQLite數(shù)據(jù)庫文件的單記錄刪除結構進行解析的問題。本發(fā)明還提供了一種SQLite空閑鏈表節(jié)點的解析裝置,以保證上述方法在實際中的應用。為了解決上述問題,本發(fā)明公開了一種SQLite空閑鏈表節(jié)點的解析方法,包括 讀取SQLite空閑鏈表節(jié)點;從所述空閑鏈表節(jié)點中查找所有滿足預設條件的記錄關鍵點; 對上述關鍵點進行記錄重組;其中,所述記錄關鍵點為4個字節(jié)組成的二元組〈NFP, FTL>,所述預設條件為value (NFP) >addr (NFP)并且 value (FTL) e (O, PSZ-addr (NFP)];NFP表示指向下一個空閑節(jié)點的指針,由2個字節(jié)組成;FTL是NFP后面的2個字節(jié),表示該空閑節(jié)點的大??;value(NFP)表示NFP指向的位置;addr (NFP)表示NFP本身的偏移地址;value (FTL)表示該空閑節(jié)點的大??;PSZ表示SQLite數(shù)據(jù)庫中數(shù)據(jù)頁的大小。優(yōu)選的,所述查找記錄關鍵點的方法具體為將所述空閑鏈表節(jié)點的偏移地址的初始值設置為O ;從該空閑鏈表節(jié)點中的當前偏移地址處開始讀取4個字節(jié),判斷是否滿足上述2個條件,若是,則當前偏移地址位置對應的二元組〈NFP,F(xiàn)TL>為記錄關鍵點;當前偏移地址增1,重復上述判斷步驟,直至當前偏移地址到達該空閑鏈表節(jié)點的末端。優(yōu)選的,還包括對所述所有關鍵點進行如下處理的步驟若關鍵點〈NFPyFTLp記錄重組或記錄碎片標記不成功,根據(jù)碎片特征調整關鍵點<NFPi; FTLi)的二元組信息,消除可能存在的關鍵點碎片,然后進行記錄重組或記錄碎片標記。優(yōu)選的,還包括對所述關鍵點按從后到前的順序進行如下偽關鍵點識別處理的步驟若關鍵點〈NFPpFTLp重組不成功,且具備碎片重組條件,則進一步判斷〈NFPhATLh〉 是否為重組不成功的節(jié)點,若是,將節(jié)點〈NFPyFTLp向前與節(jié)點〈NFPi+FTD合并,對合并后的節(jié)點〈NFPh, FTLh〉進行記錄重組或記錄碎片標記,若不能滿足記錄重組或者記錄碎片重組的條件,則拆開合并后的節(jié)點〈NFPg,F(xiàn)TLh〉,對<NFPi; FTLi)進行記錄碎片重組; 若關鍵點〈NFPyFTLp重組不成功且不具備碎片重組條件,則進一步判斷〈NFPi+FTLg〉是否為重組成功的節(jié)點;若<NFPi_1, FTD是重組成功的節(jié)點,則檢查<NFPi; FTLi)是否為合并過的節(jié)點,對于合并節(jié)點,拆開合并節(jié)點,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過程;若<NFPi_1, FTLg〉是重組不成功的節(jié)點,將節(jié)點<NFPi; FTLi)向前與節(jié)點 <NFPi_1, FTLi^1)合并,對合并后的節(jié)點〈NFPh,F(xiàn)TLi^1)用權利要求3所述的方法進行記錄重組、記錄碎片標記和關鍵點碎片消除處理,當合并后節(jié)點重組不成功、不具備碎片重組條件、且〈NFPh,F(xiàn)TLiJ的原始狀態(tài)為碎片時,將合并節(jié)點〈NFPh,F(xiàn)TLiJ拆開,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過程。依據(jù)本發(fā)明的另一優(yōu)選實施例,還公開了一種SQLite空閑鏈表節(jié)點的解析裝置, 包括空閑鏈表獲取單元,關鍵點查找單元和記錄重組單元,其中空閑鏈表獲取單元用于讀取SQLite空閑鏈表的節(jié)點;關鍵點查找單元用于從所述空閑鏈表獲取單元讀取的空閑鏈表節(jié)點中查找所有滿足預設條件的記錄關鍵點;上述記錄關鍵點為4個字節(jié)組成的二元組〈NFP, FTL>,所述預設條件為value (NFP) > addr (NFP)并且value (FTL) e (O, PSZ-addr (NFP)]NFP表示指向下一個空閑節(jié)點的指針,由2個字節(jié)組成;FTL是NFP后面的2個字節(jié),表示該空閑節(jié)點的大??;value (NFP)表示NFP指向的位置;addr (NFP)表示NFP本身的偏移地址;value (FTL)表示該空閑節(jié)點的大??;PSZ表示SQLite數(shù)據(jù)庫中數(shù)據(jù)頁的大??;記錄重組單元用于對所述關鍵點查找單元獲得關鍵點進行記錄重組。優(yōu)選的,所述關鍵點查找單元具體包括控制子單元和條件判斷子單元,其中控制子單元用于控制所述條件判斷子單元從偏移地址為O到該空閑鏈表節(jié)點末端的遍歷搜索過程;條件判斷子單元用于從所述空閑鏈表節(jié)點中的當前偏移地址處開始讀取4個字節(jié), 判斷是否滿足所述預設條件,并將滿足所述預設條件的當前偏移地址位置對應的二元組〈NFP,F(xiàn)TL>作為記錄關鍵點。優(yōu)選的,還包括關鍵點碎片消除單元,用于根據(jù)碎片特征調整重組不成功的關鍵點<NFPi; FTLi)的二元組信息,消除可能存在的關鍵點碎片,然后進行記錄重組或記錄碎片優(yōu)選的,還包括記錄碎片重組單元,用于對重組不成功且具備碎片重組條件的關鍵點〈NFPpFTLp作以下處理當該關鍵點的前一個關鍵點〈NFPh,F(xiàn)TLiJ為重組不成功的節(jié)點時,合并節(jié)點〈NFPi+FTLg〉與〈NFPpFTLp,并對合并后的節(jié)點進行記錄重組或記錄碎片標記,若不能滿足記錄重組或記錄碎片重組條件,則拆開合并后的節(jié)點〈NFPg,F(xiàn)TLh〉, 對<NFPi; FTLi)進行記錄碎片重組。優(yōu)選的,還包括偽關鍵點處理單元,用于對重組不成功且不具備碎片重組條件的關鍵點<NFPi; FTLi)進行如下處理當該關鍵點的前一個關鍵點〈NFPh,F(xiàn)TLi^1)為重組成功的節(jié)點時,檢查<NFPi; FTLi)是否為合并過的節(jié)點,對于合并節(jié)點,拆開合并節(jié)點,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過程;當該關鍵點的前一個關鍵點 <NFPi_1, FTLi^1)為重組不成功的節(jié)點時,將<NFPi; FTLi)向前與〈NFPh,F(xiàn)TLi^1)合并,對合并后的節(jié)點〈NFPi+FTLH〉進行記錄重組、記錄碎片標記和碎片消除處理,當合并后節(jié)點重組不成功、不具備碎片重組條件、且<NFPi; FTLi)的原始狀態(tài)為碎片時,將合并節(jié)點<NFPi; FTLi)拆開,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過程。與現(xiàn)有技術相比,本發(fā)明具有以下優(yōu)點本發(fā)明優(yōu)選實施例方案中,基于SQLite數(shù)據(jù)庫文件格式及記錄的刪除和插入規(guī)則,采用SQLite空閑鏈表節(jié)點的刪除記錄二元組信息的通用關鍵點特征識別關鍵點信息, 然后對上述關鍵點中的所有數(shù)據(jù)記錄進行重組,實現(xiàn)快速、準確地解析SQLite空閑鏈表節(jié)點的多記錄元組的發(fā)明目的;另外,由于本發(fā)明優(yōu)選實施例方案采用的是SQLite數(shù)據(jù)庫空閑鏈表的通用特征進行識別處理的,因此,本發(fā)明方案不局限于某一個特定數(shù)據(jù)庫文件 (如手機中的電子郵件數(shù)據(jù)庫)進行解析,而是對所有sqlite數(shù)據(jù)庫的空閑節(jié)點多記錄元組的解析都適用,具有很強的通用性。在本發(fā)明進一步的優(yōu)選實施例中,利用節(jié)點合并和分離方法識別真?zhèn)侮P鍵點,并且自適應消除關鍵點碎片,可增強空閑節(jié)點多記錄元組解析的準確性。
圖I是本發(fā)明SQLite空閑鏈表節(jié)點的解析方法第一實施例的流程圖;圖2是本發(fā)明SQLite空閑鏈表節(jié)點的解析方法第二實施例的流程圖;圖3是本發(fā)明SQLite空閑鏈表節(jié)點的解析裝置一實施例的結構框圖。
具體實施例方式在結合附圖和具體實施方式
對本發(fā)明作進一步詳細的說明之前,首先介紹一下與 SQLite數(shù)據(jù)庫有關的幾個概念。SQLite數(shù)據(jù)庫文件由固定大小的頁(Page)組成,頁的大小為512 32768字節(jié) (必須是2的指數(shù)),默認大小為1024字節(jié)(IKB)。頁的大小可以在創(chuàng)建數(shù)據(jù)庫時設置,數(shù)據(jù)庫對象創(chuàng)建完成后就不能再修改了。頁的類型包括二叉排序樹(Btree)頁、空閑(free)頁和/或溢出頁(overflow) ,Btree還可以是B+tree或B-tree,每一種節(jié)點又可分為主干頁和葉子頁??臻e鏈表節(jié)點位于葉子頁中,由刪除記錄構成,可以是單個刪除記錄,也可以是多個刪除記錄(包括完整記錄和記錄碎片)。單個刪除記錄構成的空閑鏈表節(jié)點的結構如表I所示,其中,前2個字節(jié)表示指向下一個空閑節(jié)點的指針NFP,第3 4字節(jié)表示該空閑節(jié)點的大小FTL。
權利要求
1.一種SQLite空閑鏈表節(jié)點的解析方法,其特征在于,包括讀取SQLite空閑鏈表節(jié)點;從所述空閑鏈表節(jié)點中查找所有滿足預設條件的記錄關鍵點;對上述關鍵點進行記錄重組;其中,所述記錄關鍵點為4個字節(jié)組成的二元組〈NFP,F(xiàn)TL〉,所述預設條件為 value (NFP) > addr(NFP)并且value (FTL) e (O, PSZ-addr(NFP)]NFP表示指向下一個空閑節(jié)點的指針,由2個字節(jié)組成;FTL是NFP后面的2個字節(jié),表示該空閑節(jié)點的大?。?value (NFP)表示NFP指向的位置; addr (NFP)表示NFP本身的偏移地址; value (FTL)表示該空閑節(jié)點的大小;PSZ表示SQLite數(shù)據(jù)庫中數(shù)據(jù)頁的大小。
2.如權利要求I所述的方法,其特征在于,所述查找記錄關鍵點的方法具體為將所述空閑鏈表節(jié)點的偏移地址的初始值設置為O ;從該空閑鏈表節(jié)點中的當前偏移地址處開始讀取4個字節(jié),判斷是否滿足上述2個條件,若是,則當前偏移地址位置對應的二元組〈NFP,F(xiàn)TL>為記錄關鍵點;當前偏移地址增1,重復上述判斷步驟,直至當前偏移地址到達該空閑鏈表節(jié)點的末端。
3.如權利要求I所述的方法,其特征在于,還包括對所述所有關鍵點進行如下處理的步驟若關鍵點<NFPi; FTLi)記錄重組或記錄碎片標記不成功,根據(jù)碎片特征調整關鍵點 <NFPi; FTLi)的二元組信息,消除可能存在的關鍵點碎片,然后進行記錄重組或記錄碎片標記。
4.如權利要求3所述的方法,其特征在于,還包括對所述關鍵點按從后到前的順序進行如下偽關鍵點識別處理的步驟若關鍵點<NFPi; FTLi)重組不成功,且具備碎片重組條件,則進一步判斷〈NFPh,F(xiàn)TLh〉 是否為重組不成功的節(jié)點,若是,將節(jié)點〈NFPyFTLp向前與節(jié)點〈NFPi+FTD合并,對合并后的節(jié)點〈NFPh, FTLh〉進行記錄重組或記錄碎片標記,若不能滿足記錄重組或者記錄碎片重組的條件,則拆開合并后的節(jié)點〈NFPg,F(xiàn)TLh〉,對<NFPi; FTLi)進行記錄碎片重組; 若關鍵點<NFPi; FTLi)重組不成功且不具備碎片重組條件,則進一步判斷〈NFPh, FTLi^1)是否為重組成功的節(jié)點;若〈NFPg,F(xiàn)TD是重組成功的節(jié)點,則檢查<NFPi; FTLi)是否為合并過的節(jié)點,對于合并節(jié)點,拆開合并節(jié)點,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過若〈NFP^,F(xiàn)TLiJ是重組不成功的節(jié)點,將節(jié)點<NFPi; FTL)向前與節(jié)點〈NFP^,F(xiàn)TLj 合并,對合并后的節(jié)點〈NFPh,F(xiàn)TLi^1)用權利要求3所述的方法進行記錄重組、記錄碎片標記和關鍵點碎片消除處理,當合并后節(jié)點重組不成功、不具備碎片重組條件、且〈NFPh, FTD的原始狀態(tài)為碎片時,將合并節(jié)點〈NFPg,F(xiàn)TLiJ拆開,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過程。
5.—種SQLite空閑鏈表節(jié)點的解析裝置,其特征在于,包括空閑鏈表獲取單元,關鍵點查找單元和記錄重組單元,其中空閑鏈表獲取單元用于讀取SQLite空閑鏈表的節(jié)點;關鍵點查找單元用于從所述空閑鏈表獲取單元讀取的空閑鏈表節(jié)點中查找所有滿足預設條件的記錄關鍵點;上述記錄關鍵點為4個字節(jié)組成的二元組〈NFP,F(xiàn)TL〉,所述預設條件為 value (NFP) > addr(NFP)并且value (FTL) G (0,PSZ-addr(NFP)]NFP表示指向下一個空閑節(jié)點的指針,由2個字節(jié)組成;FTL是NFP后面的2個字節(jié),表示該空閑節(jié)點的大??; value (NFP)表示NFP指向的位置; addr (NFP)表示NFP本身的偏移地址; value (FTL)表示該空閑節(jié)點的大小;PSZ表示SQLite數(shù)據(jù)庫中數(shù)據(jù)頁的大??;記錄重組單元用于對所述關鍵點查找單元獲得關鍵點進行記錄重組。
6.如權利要求5所述的裝置,其特征在于,所述關鍵點查找單元具體包括控制子單元和條件判斷子單元,其中控制子單元用于控制所述條件判斷子單元從偏移地址為0到該空閑鏈表節(jié)點末端的遍歷搜索過程;條件判斷子單元用于從所述空閑鏈表節(jié)點中的當前偏移地址處開始讀取4個字節(jié), 判斷是否滿足所述預設條件,并將滿足所述預設條件的當前偏移地址位置對應的二元組 〈NFP,F(xiàn)TL>作為記錄關鍵點。
7.如權利要求5所述的裝置,其特征在于,還包括關鍵點碎片消除單元,用于根據(jù)碎片特征調整重組不成功的關鍵點〈NFP” FTLi)的二元組信息,消除可能存在的關鍵點碎片,然后進行記錄重組或記錄碎片標記。
8.如權利要求7所述的裝置,其特征在于,還包括記錄碎片重組單元,用于對重組不成功且具備碎片重組條件的關鍵點〈NFPy FTLi)作以下處理當該關鍵點的前一個關鍵點 <NFPi_1, FTLiJ為重組不成功的節(jié)點時,合并節(jié)點〈NFP^,F(xiàn)TLiJ與〈NFPp FTLp,并對合并后的節(jié)點進行記錄重組或記錄碎片標記,若不能滿足記錄重組或記錄碎片重組條件,則拆開合并后的節(jié)點〈NFPg,F(xiàn)TL^〉,對〈NFPp FTLi)進行記錄碎片重組。
9.如權利要求7所述的裝置,其特征在于,還包括偽關鍵點處理單元,用于對重組不成功且不具備碎片重組條件的關鍵點〈NFP,,F(xiàn)TLi)進行如下處理當該關鍵點的前一個關鍵點〈NFPi+FTLg〉為重組成功的節(jié)點時,檢查〈NFPpFTLp是否為合并過的節(jié)點,對于合并節(jié)點,拆開合并節(jié)點,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過程;當該關鍵點的前一個關鍵點〈NFPi+FTLg〉為重組不成功的節(jié)點時,將〈NFPpFTLp向前與〈NFPg,F(xiàn)TLi^1)合并,對合并后的節(jié)點〈NFPg,F(xiàn)TLi^1)進行記錄重組、記錄碎片標記和碎片消除處理,當合并后節(jié)點重組不成功、不具備碎片重組條件、且<NFPi; FTLi)的原始狀態(tài)為碎片時,將合并節(jié)點〈NFPy FTLi)拆開,從倒數(shù)第二個被合并節(jié)點開始重復上述偽關鍵點識別處理過程。
全文摘要
本發(fā)明提供了一種SQLite空閑鏈表節(jié)點的解析方法和裝置,所述方法包括讀取SQLite空閑鏈表節(jié)點;從所述空閑鏈表節(jié)點中查找所有滿足預設條件的記錄關鍵點;對上述關鍵點進行記錄重組;其中,所述記錄關鍵點為4個字節(jié)組成的二元組<NFP,F(xiàn)TL>,所述預設條件為value(NFP)>addr(NFP)并且value(FTL)∈(0,PSZ-addr(NFP)]。本發(fā)明基于SQLite數(shù)據(jù)庫文件格式及記錄的刪除和插入規(guī)則,采用刪除記錄二元組信息的通用關鍵點特征識別關鍵點信息,然后對上述關鍵點中的所有數(shù)據(jù)記錄進行重組,實現(xiàn)快速、準確地解析SQLite空閑鏈表節(jié)點的多記錄元組的發(fā)明目的。
文檔編號G06F17/30GK102591941SQ20111044373
公開日2012年7月18日 申請日期2011年12月27日 優(yōu)先權日2011年12月27日
發(fā)明者吳世雄, 方均灘, 陳明輝 申請人:廈門市美亞柏科信息股份有限公司