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
文件通常在存储为数据库中的 BLOB 之前使用 zlib 进行压缩。但是,如果文件无法压缩或命令行上使用了 -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 IS NULL 与空文件区分开来。如果 length(sqlar.blob)<sqlar.sz,则文件被压缩,如果 length(sqlar.blob)==sqlar.sz,则文件以纯文本形式存储。
符号链接的 sqlar.sz 设置为 -1,链接目标存储在 sqlar.data 字段中的文本值中。
SQLAR 使用“zlib 格式”进行压缩。ZIP 使用原始的 deflate 格式。区别在于 zlib 格式包含一个 2 字节的压缩类型标识头 (0x78 0x9c) 和一个 4 字节的校验和在末尾。因此,SQLAR 的“数据”始终比 ZIP 的等效数据大 6 字节。SQLAR 程序使用 zlib 格式而不是稍微小一点的原始 deflate 格式,因为这是 zlib 文档 中推荐的。
SQLAR 可能会在将来扩展以支持除 deflate 之外的其他压缩格式。如果是这样,数据字段将包含新的标头值以识别使用新格式压缩的条目。
FUSE 文件系统
SQLite 归档文件可以使用“sqlarfs”实用程序(包括此项目)安装为 FUSE 文件系统。
要构建“sqlarfs”实用程序,请运行
make sqlarfs
然后,要将 SQLite 归档文件安装为文件系统,请运行
mkdir ~/fuse
./sqlarfs ARCHIVE_NAME -f ~/fuse
当然,请将 ARCHIVE_NAME 替换为要安装的 SQLite 归档文件的文件名。-f 选项使 sqlarfs 在前台运行,以便您可以通过简单地按下中断键(通常是 Ctrl-C)来卸载文件系统。