專利名稱:一種Sqlite刪除記錄結(jié)構(gòu)重組方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種Sqlite刪除記錄結(jié)構(gòu)重組方法。
背景技術(shù):
Sqlite數(shù)據(jù)庫是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設(shè)計(jì)目標(biāo)是嵌入式的, 而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,能夠支持Windows/ Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結(jié)合,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。因此,Sqlite數(shù)據(jù)庫在計(jì)算機(jī)領(lǐng)域中得到了廣泛的應(yīng)用。在計(jì)算機(jī)領(lǐng)域中,有時候需要對已經(jīng)刪除的數(shù)據(jù)進(jìn)行重組恢復(fù),當(dāng)前國內(nèi)外對于 Sqlite數(shù)據(jù)庫刪除數(shù)據(jù)的通用解析的研究比較少,目前市場上的通用解析產(chǎn)品具有很大的局限性,以下為使說明更加清楚,結(jié)合附圖簡要介紹Sqlite刪除記錄前后的結(jié)構(gòu)。圖1所示為未刪除的Sqlite記錄結(jié)構(gòu)示意圖。由頭部到尾部,該記錄依次包括 記錄總長度11、R0WID12、頭部索引總長度13、N個索引域14和N個數(shù)據(jù)域15。其中,記錄總長度11和R0WID12是變長整數(shù),占用的空間大小為1-9字節(jié),頭部索引總長度13是N個索引14和頭部索引總長度13占用的空間總大小。N個數(shù)據(jù)域15與N個索引域14 一一對應(yīng),S卩第i個(i = 1,2,. . .,N)索引域14中的索引INDEXi記錄了第i個數(shù)據(jù)域中的數(shù)據(jù) DATAi占用的空間大小。圖2所示為刪除后的Sqlite記錄結(jié)構(gòu)示意圖。刪除記錄后,該已刪除記錄稱為空閑節(jié)點(diǎn),未刪除前記錄的前4個字節(jié)將被改寫,如圖2所示,刪除后的Sqlite記錄的前兩個字節(jié)被改寫為指向下一個空閑節(jié)點(diǎn)的指針21,第3-4個字節(jié)則用于表示該空閑節(jié)點(diǎn)的大小 22 (下文中記為FTL),從第5個字節(jié)開始,Sqlite記錄的內(nèi)容和被刪除前記錄中第5個字節(jié)之后的內(nèi)容不變。顯然,刪除的記錄結(jié)構(gòu)之所以能夠被重組,是因?yàn)橛涗泟h除后,原紀(jì)錄中只有前4個字節(jié)覆蓋,而第4個字節(jié)后面的內(nèi)容沒有改寫或清空。從上述說明可知記錄的刪除可能造成原Sqlite記錄中的索引1被覆蓋或者部分被覆蓋,因此,現(xiàn)有的Sqlite刪除記錄結(jié)構(gòu)重組方法只能解析格式完整的刪除記錄,而當(dāng)頭部索引被覆蓋或者存在偽索引時,該方法無法正常重組已刪除記錄,這樣影響了刪除記錄重組的準(zhǔn)確性和全面性。此外,目前沒有相關(guān)的公開技術(shù)文檔或?qū)@岬侥軌蚪鉀Q這一問題,因此需要一種具有高準(zhǔn)確性和全面性的Sqlite刪除記錄結(jié)構(gòu)重組方法。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種Sqlite刪除記錄結(jié)構(gòu)重組方法,用以解決現(xiàn)有的刪除記錄結(jié)構(gòu)重組方法只能解析格式完整的刪除記錄,而不能正常重組頭部索引被覆蓋或存在為索引情況下已刪除記錄的問題。本發(fā)明提供了一種全新的刪除記錄的結(jié)構(gòu)重組方法, 該方法準(zhǔn)確性高、實(shí)用性強(qiáng)、可以適用于所有Sqlite數(shù)據(jù)庫。為了實(shí)現(xiàn)上述目的,本發(fā)明提供一種Sqlite刪除記錄結(jié)構(gòu)重組方法,該方法包括以下步驟步驟一設(shè)置滑動窗口初始偏移值offset為5 ;步驟二 學(xué)習(xí)待重組的記錄所屬數(shù)據(jù)表結(jié)構(gòu)并依此界定滑動窗口 ;步驟三計(jì)算所述滑動窗口的值Value (window)和所述待重組的記錄中整個數(shù)據(jù)域的大小 Length(DATA);步驟四判斷所述Value (window)和Length (DATA)的值是否相等,若是,則執(zhí)行步驟A,否則執(zhí)行步驟B;步驟A 根據(jù)所述滑動窗口中最后一個小窗口的位置和所述待重組的記錄的結(jié)構(gòu)重組已刪除記錄,結(jié)束流程。步驟B:判斷所述offset取值是否已達(dá)其預(yù)定上限,若是,則嘗試碎片重組并結(jié)束流程;否則,令offset = offset+1,并返回執(zhí)行步驟三;其中,所述滑動窗口包括至少兩個小窗口,并按照與所述待重組的記錄中字節(jié)排序相同的方向排列所述至少兩個小窗口。所述步驟二包括讀取所述待重組的記錄中數(shù)據(jù)N的值以及變長整數(shù)值,將所述滑動窗口的小窗口數(shù)設(shè)置為所述N,并指定所述滑動窗口的每個小窗口剛好可以容納一個變長整數(shù),設(shè)定所述offset的取值上限。所述滑動窗口的值Value (window)為該滑動窗口中的所有小窗口對應(yīng)的數(shù)據(jù)域占用的空間大小之和。所述待重組的記錄中整個數(shù)據(jù)域的大小Length(DATA)滿足關(guān)系式Length(DATA) = FTL-Length(window)-4其中,F(xiàn)TL為所述待重組的記錄中第3至4個字節(jié)表示的數(shù)值,Length (window)為所述滑動窗口的整體大小值。所述令offset = offset+1包括使整個滑動窗口沿第一個小窗口指向最后一個小窗口的方向移動一個小窗口位置。較佳地,在上述Sqlite刪除記錄結(jié)構(gòu)重組方法中,預(yù)先設(shè)定結(jié)構(gòu)約束的過濾條件;在所述步驟A之前還包括判斷所述滑動窗口中所有小窗口 Wi是否滿足所述結(jié)構(gòu)約束的過濾條件,若是則執(zhí)行步驟A,否則執(zhí)行步驟B。步驟B中所述嘗試碎片重組并結(jié)束流程, 包括步驟Bl 結(jié)合結(jié)構(gòu)約束嘗試頭部碎片重組;步驟B2 判斷頭部碎片重組是否成功,若是,則結(jié)束流程,否則,結(jié)合結(jié)構(gòu)約束嘗試尾部碎片重組,嘗試完后結(jié)束流程。所述結(jié)構(gòu)約束的過濾條件包括=Sqlite頁大小帶來的約束、Sqlite類型值約束、 數(shù)據(jù)類型約束和字符編碼約束中的一項(xiàng)或多項(xiàng)。本發(fā)明提供的Sqlite刪除記錄結(jié)構(gòu)重組方法創(chuàng)造性的引入變長滑動窗口機(jī)制和子滑動窗口機(jī)制用于刪除記錄重組,無需人工分析介入,能夠自動判斷是記錄是否為碎片, 準(zhǔn)確定位索引和內(nèi)容,并且準(zhǔn)確地重組刪除記錄。對于添加了結(jié)構(gòu)約束的方法,在滑動窗口中引入可擴(kuò)展的約束集,不僅能重組相對完整的刪除記錄,也能重組頭部碎片的記錄和尾部碎片的記錄。本發(fā)明實(shí)施例提供的Sqlite刪除記錄結(jié)構(gòu)重組方法對刪除記錄結(jié)構(gòu)重組的準(zhǔn)確性很高,實(shí)現(xiàn)簡單,環(huán)境適應(yīng)性強(qiáng),并且該方法不局限于某一個數(shù)據(jù)庫,而是對所有數(shù)據(jù)庫的刪除記錄結(jié)構(gòu)重組都適用,具有很強(qiáng)的通用性。由于Sqlite的使用呈廣泛化趨勢,該方法的重要性不言而喻,預(yù)計(jì)該方法將對數(shù)據(jù)庫信息安全技術(shù)產(chǎn)生一定影響,也為其它數(shù)據(jù)庫類型的刪除記錄重組甚至數(shù)據(jù)恢復(fù)提供嶄新思路。
圖1為未刪除的Sqlite記錄結(jié)構(gòu)示意圖;圖2為刪除后的Sqlite記錄結(jié)構(gòu)示意圖;圖3為本發(fā)明實(shí)施例提供的一種基于數(shù)據(jù)分析的變長滑動窗口結(jié)構(gòu)示意圖;圖4為本發(fā)明實(shí)施例提供的一種基于圖3所示滑動窗口的Sqlite刪除記錄結(jié)構(gòu)重組方法流程圖;圖5為本發(fā)明實(shí)施例提供的一種基于變長滑動窗口和結(jié)構(gòu)約束的Sqlite刪除記錄結(jié)構(gòu)重組方法流程圖。
具體實(shí)施例方式為解決現(xiàn)有技術(shù)中存在的問題,本發(fā)明實(shí)施例提供一種Sqlite刪除記錄結(jié)構(gòu)重組方法,并且針對頭部索引被覆蓋或者存在偽索引的情況,引入了 Sqlite數(shù)據(jù)表的結(jié)構(gòu)約束,以提高Sqlite刪除記錄重組的準(zhǔn)確性。以下先簡要介紹基于Sqlite記錄結(jié)構(gòu)的變長滑動窗口機(jī)制?;瑒哟翱谑侵冈跀?shù)據(jù)流上設(shè)定的一個區(qū)間,該區(qū)間只包括數(shù)據(jù)流最近的部分?jǐn)?shù)據(jù),隨著新數(shù)據(jù)的到來,窗口向前移動,用新的數(shù)據(jù)替換舊的數(shù)據(jù)。無論是傳統(tǒng)的基于實(shí)際和元組的定長滑動窗口機(jī)制,還是現(xiàn)有的基于系統(tǒng)資源的變長滑動窗口機(jī)制,都是應(yīng)用于數(shù)據(jù)流的流量控制和分析控制上,很難應(yīng)用于數(shù)據(jù)流的數(shù)據(jù)分析上,特別是根據(jù)數(shù)據(jù)的分布情況而實(shí)時調(diào)整滑動窗口的大小。因此,本發(fā)明實(shí)施例提出了一種基于數(shù)據(jù)分析的變長滑動窗口,用于分析并重組Sqlite刪除記錄。以下結(jié)合附圖具體說明本發(fā)明實(shí)施例。圖3為本發(fā)明實(shí)施例提供的一種基于數(shù)據(jù)分析的變長滑動窗口結(jié)構(gòu)示意圖,如圖 3所示,該滑動窗口(以下記為window)劃分為N個小窗(N為大于等于2的正整數(shù)),按照與待重組的記錄中字節(jié)排序相同的方向排列這N個小窗口,即按照與待重組的記錄中字節(jié)排序相同的方向這N個小窗順序記為W1, W2, ...,Wn,每個小窗口 Wi都是變長的,其中,i在 1至N之間取值。為方便實(shí)施,如果指定每個Wi剛好容納一個變長整數(shù),則可以計(jì)算整個滑動窗口的值和大小。整個滑動窗口的值為
NValue(window) = ^val(JVl)( 1)
i=\整個滑動窗口的大小為
NLength(window)= YjSize(Wl)(2)
/=1這里設(shè)定每個Wi表示原Sqlite記錄中的索引INDEXi,并且設(shè)定val (Wi)為INDEXi 對應(yīng)的數(shù)據(jù)DATAiK占用的空間的大小。這樣就可以計(jì)算整個數(shù)據(jù)域的大小Length (DATA) = FTL-Length (window)-4(3)式(3)中4表示為紀(jì)錄被刪除后被覆蓋的前4個字節(jié)。如果滿足關(guān)系式
5
Value (window) = Length (DATA)(4)就表示\有可能是INDE\。圖4為本發(fā)明實(shí)施例提供的一種基于圖3所示滑動窗口的Sqlite刪除記錄結(jié)構(gòu)重組方法流程圖,該方法包括以下步驟S401 設(shè)置滑動窗口初始偏移值offset為5。此步驟中,由于刪除記錄的前4個字節(jié)已經(jīng)和原紀(jì)錄不一致,而刪除記錄的第5個字節(jié)開始之后的內(nèi)容和原紀(jì)錄一致,因此, 此處設(shè)置滑動窗口的初始偏移值offset = 5。S402 學(xué)習(xí)待重組的記錄所屬數(shù)據(jù)表結(jié)構(gòu)并依此界定滑動窗口。此步驟中的“界定”是指讀取待重組的記錄中數(shù)據(jù)N的值以及變長整數(shù)值,并根據(jù)所述N值和變長整數(shù)特性界定滑動窗口,即將滑動窗口的小窗數(shù)設(shè)置為所述N值,并指定每個小窗Wi剛好可以容納一個變長整數(shù)。此外,還界定滑動窗口的off set取值上限。S403 計(jì)算Value&indow)和Length(DATA)的值。此步驟中根據(jù)前面所述公式 (1)至(3)計(jì)算出 Value (window)和 Length (DATA)的值。S404 判斷Value (window)和Length (DATA)的值是否相等,若是,則執(zhí)行S405,否則執(zhí)行S407。S405 根據(jù)當(dāng)前滑動窗口的Wn值和S402中預(yù)先學(xué)習(xí)的待重組的記錄結(jié)構(gòu)重組已刪除記錄結(jié)構(gòu),結(jié)束流程。S407 判斷當(dāng)前offset取值是否已達(dá)其預(yù)定上限,若是,則執(zhí)行S408,否則執(zhí)行 S410。S408 嘗試碎片重組,嘗試完后結(jié)束流程。S410 令 offset = offset+Ι,返回執(zhí)行 S403。此步驟中,令 offset = offset+1 即使整個滑動窗口的最后一個小窗口 Wn向前移動到WN+1處,并且其他每個小窗向Wn方向移動一個小窗口位置,即最終滑動窗口的第一個小窗口巧向前縮進(jìn)到W2處,并且重新分配子滑動窗口的名字Wi — Wi+1,i = [1,...,N]。圖4所示方法雖然能夠重組Sqlite刪除記錄,但是僅經(jīng)過一次滿足公式(4)得到的Wn值得準(zhǔn)確性有可能不夠高,為進(jìn)一步增強(qiáng)Sqlite刪除記錄重組的準(zhǔn)確性,本發(fā)明實(shí)施例在變長滑動窗口的基礎(chǔ)上,引入結(jié)構(gòu)約束機(jī)制,進(jìn)一步增強(qiáng)了 Sqlite刪除記錄重組的準(zhǔn)確性和可靠性。本發(fā)明實(shí)施例引入的結(jié)構(gòu)約束機(jī)制是指一個可擴(kuò)展的結(jié)構(gòu)約束的集合,不僅能用于增強(qiáng)刪除記錄重組的準(zhǔn)確性,而且還能夠在盡可能的情況下嘗試重組已經(jīng)被覆蓋的記錄碎片,包括頭部被覆蓋的記錄碎片和尾部被覆蓋的記錄碎片??刹捎玫慕Y(jié)構(gòu)約束可以為 Sqlite頁大小帶來的約束、Sqlite類型值約束、數(shù)據(jù)類型約束或其他擴(kuò)展的約束。其中,Sqlite頁大小帶來的約束指由于Sqlite頁的大小限制,所有的類型對應(yīng)的INDE&占用的空間大小也將受到相應(yīng)的限制。因?yàn)樵赟qlite文件初始頁中有定義了 Sqlite頁的大小,該值用2個字節(jié)來表示,所以除非記錄使用溢出頁,否則INDE)(i大小的最大值將為2。Sqlite類型值約束指所有的類型對應(yīng)的INDE&的原始數(shù)值不能是當(dāng)前未定義的值,如10、11等。數(shù)據(jù)類型約束指INTEGER類型約束、TEXT類型約束、BLOB類型約束等類型的約束。其他擴(kuò)展約束比如字符編碼約束等,此外后續(xù)可以繼續(xù)擴(kuò)展相關(guān)的約束。圖5為本發(fā)明實(shí)施例提供的一種基于變長滑動窗口和結(jié)構(gòu)約束的Sqlite刪除記錄結(jié)構(gòu)重組方法流程圖,該方法包括以下步驟S401 設(shè)置滑動窗口初始偏移值offset為5。S402 學(xué)習(xí)數(shù)據(jù)表結(jié)構(gòu)并依此界定滑動窗口。S403 計(jì)算 Value (window)和 Length (DATA)的值。S404 判斷Value (window)和Length (DATA)的值是否相等,若是,則執(zhí)行S501,否則執(zhí)行S407。S501 判斷當(dāng)前滑動窗口的Wn值是否滿足結(jié)構(gòu)約束的過濾條件,若是則執(zhí)行 S405,否則執(zhí)行S407。S405 根據(jù)當(dāng)前滑動窗口的Wn值和S402中預(yù)先學(xué)習(xí)的數(shù)據(jù)表結(jié)構(gòu)重組刪除記錄結(jié)構(gòu),結(jié)束流程。S407 判斷當(dāng)前offset取值是否已達(dá)其預(yù)定上限,若是,則執(zhí)行S503,否則執(zhí)行 S410。S410 令 offset = offset+1,返回執(zhí)行 S403。S503 結(jié)合結(jié)構(gòu)約束嘗試頭部碎片重組。S504 判斷頭部碎片重組是否成功,若是,則結(jié)束流程,否則,執(zhí)行S505。S505 結(jié)合結(jié)構(gòu)約束嘗試尾部碎片重組,嘗試完后結(jié)束流程。圖5中,與圖4具有相同附圖標(biāo)記的步驟和圖4中該步驟的實(shí)施方式相同,此處不再贅述。上述步驟S503中,頭部碎片重組可分為兩種情況,一種是確定尾部被覆蓋,另一種是不能確定尾部是否被覆蓋。對于第一種情況,可以利用縮小一格的變長滑動窗口來嘗試確定INDE)(n的位置,此時滑動窗口在圖3中表示為從W2到Wn部分。此時整個滑動窗口的值為
權(quán)利要求
1.一種Sqlite刪除記錄結(jié)構(gòu)重組方法,其特征在于,該方法包括以下步驟 步驟一設(shè)置滑動窗口初始偏移值offset為5 ;步驟二 學(xué)習(xí)待重組的記錄所屬數(shù)據(jù)表結(jié)構(gòu)并依此界定滑動窗口 ; 步驟三計(jì)算所述滑動窗口的值Value&indow)和所述待重組的記錄中整個數(shù)據(jù)域的大小 Length(DATA);步驟四判斷所述Value (window)和Length (DATA)的值是否相等,若是,則執(zhí)行步驟 A,否則執(zhí)行步驟B。步驟A 根據(jù)所述滑動窗口中最后一個小窗口的位置和所述待重組的記錄的結(jié)構(gòu)重組已刪除記錄,結(jié)束流程。步驟B 判斷所述offset取值是否已達(dá)其預(yù)定上限,若是,則嘗試碎片重組并結(jié)束流程;否則,令offset = offset+1,并返回執(zhí)行步驟三;其中,所述滑動窗口包括至少兩個小窗口,并按照與所述待重組的記錄中字節(jié)排序相同的方向排列所述至少兩個小窗口。
2.如權(quán)利要求1所述的方法,其特征在于,所述步驟二包括讀取所述待重組的記錄中數(shù)據(jù)N的值以及變長整數(shù)值,將所述滑動窗口的小窗口數(shù)設(shè)置為所述N,并指定所述滑動窗口的每個小窗口剛好可以容納一個變長整數(shù),設(shè)定所述offset的取值上限。
3.如權(quán)利要求1所述的方法,其特征在于,所述滑動窗口的值Value&indow)為該滑動窗口中的所有小窗口對應(yīng)的數(shù)據(jù)域占用的空間大小之和。
4.如權(quán)利要求1所述的方法,其特征在于,所述待重組的記錄中整個數(shù)據(jù)域的大小 Length (DATA)滿足關(guān)系式Length (DATA) = FTL-Length(window)-4其中,F(xiàn)TL為所述待重組的記錄中第3至4個字節(jié)表示的數(shù)值,Length (window)為所述滑動窗口的整體大小值。
5.如權(quán)利要求1所述的方法,其特征在于,所述令offset= offset+1包括使整個滑動窗口沿第一個小窗口指向最后一個小窗口的方向移動一個小窗口位置。
6.如權(quán)利要求1至5任一項(xiàng)所述的方法,其特征在于,預(yù)先設(shè)定結(jié)構(gòu)約束的過濾條件; 在所述步驟A之前還包括判斷所述滑動窗口中所有小窗口是否滿足所述結(jié)構(gòu)約束的過濾條件,若是則執(zhí)行步驟A,否則執(zhí)行步驟B ;步驟B中所述嘗試碎片重組并結(jié)束流程,包括以下步驟 步驟Bl 結(jié)合結(jié)構(gòu)約束嘗試頭部碎片重組;步驟B2 判斷頭部碎片重組是否成功,若是,則結(jié)束流程,否則,結(jié)合結(jié)構(gòu)約束嘗試尾部碎片重組,嘗試完后結(jié)束流程。
7.如權(quán)利要求6所述的方法,其特征在于,所述結(jié)構(gòu)約束的過濾條件包括=Sqlite頁大小帶來的約束、Sqlite類型值約束、數(shù)據(jù)類型約束和字符編碼約束中的一項(xiàng)或多項(xiàng)。
全文摘要
本發(fā)明提供的一種Sqlite刪除記錄結(jié)構(gòu)重組方法,包括步驟一設(shè)置滑動窗口初始偏移值offset為5;步驟二學(xué)習(xí)待重組的記錄所屬數(shù)據(jù)表結(jié)構(gòu)并依此界定滑動窗口;步驟三計(jì)算所述滑動窗口的值和所述待重組的記錄中整個數(shù)據(jù)域的大小,步驟四判斷步驟三計(jì)算的兩個值是否相等,若是,則根據(jù)所述滑動窗口中最后一個小窗口的位置和所述待重組的記錄的結(jié)構(gòu)重組已刪除記錄,結(jié)束流程,否則判斷所述offset取值是否已達(dá)其預(yù)定上限,若是,則嘗試碎片重組并結(jié)束流程;否則,令offset=offset+1,并返回執(zhí)行步驟三。本發(fā)明提供的Sqlite刪除記錄結(jié)構(gòu)重組方法的重組結(jié)果準(zhǔn)確性高、實(shí)用性強(qiáng)、可以適用于所有Sqlite數(shù)據(jù)庫。
文檔編號G06F17/30GK102298634SQ20111026685
公開日2011年12月28日 申請日期2011年9月9日 優(yōu)先權(quán)日2011年9月9日
發(fā)明者吳世雄, 方均灘, 羅佳, 陳明輝 申請人:廈門市美亞柏科信息股份有限公司