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)來卸載檔案系統。