SQLite 封存器

文件
登入

SQLAR - SQLite 封存器

這個儲存庫包含「SQLite 封存器」程式的原始碼。這個程式(命名為「sqlar」)的操作方式與「zip」非常相似,不同之處在於它建立的壓縮封存檔儲存在 SQLite 資料庫中,而不是 ZIP 封存檔中。

這樣做的動機是為了查看 SQLite 資料庫檔案與包含相同內容的 ZIP 封存檔相比,檔案大小增加了多少。答案取決於檔案名稱,但 2% 似乎是一個合理的猜測。換句話說,將檔案作為壓縮的 Blob 儲存在 SQLite 資料庫檔案中,產生的檔案大小只比使用相同壓縮方式將相同檔案儲存在 ZIP 封存檔中大約 2%。

編譯

在 Unix 系統上,只需輸入「make」。SQLite 原始碼已包含在內。需要 zlib 壓縮函式庫才能建置。

用法

建立封存檔

    sqlar ARCHIVE FILES...

所有在 FILES... 中指定的檔案都將被添加到封存檔中。如果封存檔中已存在同名檔案,則會被取代。如果任何指定的 FILES 是一個目錄,則會遞迴掃描該目錄。

檢視封存檔的內容

    sqlar -l ARCHIVE

解壓縮封存檔的內容

    sqlar -x ARCHIVE [FILES...]

如果提供了 FILES 參數,則只會解壓縮指定的檔案。如果沒有 FILES 參數,則會解壓縮所有檔案。

所有指令都可以加上 -v 參數以獲得詳細輸出。例如:

    sqlar -v ARCHIVE FILES..
    sqlar -lv ARCHIVE
    sqlar -xv ARCHIVE

檔案通常會使用 zlib 壓縮,然後再以 BLOB 形式儲存在資料庫中。但是,如果檔案無法壓縮或是在命令列上使用了 -n 選項,則檔案會以其在磁碟上的原始狀態儲存在資料庫中,而不會進行壓縮。

儲存

資料庫結構如下:

    CREATE TABLE sqlar(
      name TEXT PRIMARY KEY,  -- name of the file
      mode INT,               -- access permissions
      mtime INT,              -- last modification time
      sz INT,                 -- original file size
      data BLOB               -- compressed content
    );

目錄和空檔案的 sqlar.sz 皆為 0。可以透過 sqlar.data 是否為 NULL 來區分目錄和空檔案。如果 length(sqlar.blob) < sqlar.sz,則檔案已壓縮;如果 length(sqlar.blob) == sqlar.sz,則檔案以純文字形式儲存。

符號連結的 sqlar.sz 設定為 -1,連結目標以文字值儲存在 sqlar.data 欄位中。

SQLAR 使用「zlib 格式」進行壓縮。ZIP 使用原始 deflate 格式。兩者的區別在於 zlib 格式包含一個兩個位元組的壓縮類型識別標頭 (0x78 0x9c) 和一個 4 位元組的校驗和。因此,SQLAR 的「資料」總是比 ZIP 的等效資料大 6 個位元組。SQLAR 程式使用 zlib 格式而不是稍小的原始 deflate 格式,因為這是 zlib 文件 建議的做法。

SQLAR 未來可能會擴展以支援 deflate 以外的其他壓縮格式。如果是這樣,資料欄位將包含新的標頭值,以識別使用新格式壓縮的項目。

Fuse 檔案系統

可以使用本專案包含的「sqlarfs」工具,將 SQLite 封存檔掛載為 Fuse 檔案系統

要建置「sqlarfs」工具,請執行:

    make sqlarfs

然後,要將 SQLite 封存檔掛載為檔案系統,請執行:

    mkdir ~/fuse
    ./sqlarfs ARCHIVE_NAME -f ~/fuse

當然,請將 ARCHIVE_NAME 替換為要掛載的 SQLite 封存檔的檔名。-f 選項使 sqlarfs 在前景中執行,因此您可以透過按下中斷鍵(通常是 Ctrl-C)來卸載檔案系統。