此 crate 可作为 Rust 库或 C 动态库使用。
用法
作为 Rust 库
将此 crate 添加为依赖项并调用 register_offset_vfs 即可,vfs的名称为常量OFFSET_VFS_NAME。
作为 SQLite Runtime Loadable Extension
-
自行编译或下载预编译得到的对应平台的动态链接库文件(由于此 package 很少有变动,因此 ci 不会发布,并非每次 release 都有动态链接库构建,目前的最新发布在此下载)
-
加载并使用扩展,参考下方示例,已验证 sqlcipher 命令行工具和 DB Browser for SQLCipher(Windows) 上均可正常工作,其它 SQLite 操作程序请自行研究如何加载扩展。
示例
sqlcipher 命令行
step by step:
)
; ; ;
;
one-liner:
)
;
DB Browser for SQLite (Windows)
-
从release下载
sqlite_ext_ntqq_db-x86_64-pc-windows-msvc.zip,解压得到里面的dll文件,注意不要修改dll的文件名。 -
打开 DB Browser for SQLite,选择
文件->新建内存数据库,之后的弹窗直接关掉,然后点击工具->加载扩展,选择第1步中的dll文件。 -
提示“扩展已成功加载”,此时再
打开数据库,直接选择 NTQQ 的.db文件,然后正常输入密码、加密方式即可直接打开数据库。
PS:如果不想每次都手动选择加载扩展,也可以到编辑->首选项->扩展 中,在“选择每个数据库要加载的扩展”一栏添加该DLL。不过要注意的是,即便这样也要先新建内存数据库,再去打开文件,因为 sqlbrowser 的设计是在连接建立后才加载扩展,因此必须先建一个memdb来触发扩展加载。
PS2:不建议处理正常数据库时也开着这个扩展,虽然会尽可能fallback到默认VFS,不过由于用于探测是否是QQ数据库的方法很原始,存在一定出错的可能。
注意事项
-
此扩展的设计目标为打开NTQQ数据库,即检测到NTQQ数据库文件特征时自动偏移1024个字节,其他情况会 fallback 到默认vfs。 这一行为通常不会有问题,不过仍然建议您在操作正常数据库时不要加载此扩展。
-
由于 SQLite 扩展的函数入口点名称与库文件名强相关,因此请不要修改文件名。
构建
构建 C 动态链接库
由于此 crate 同时作为 Rust 库,而上游 libsqlite3-sys 的一些 feature 与 loadable_extension 存在冲突。
因此本 crate 也采用 feature 区分,默认情况下,作为 Rust crate,无法构建为 SQLite Runtime Loadable Extension。
要构建为 SQLite 扩展,必须启用 _cdylib feature,虽然在关闭 (从我不知道哪个Rust版本开始,会因为没有panic_handler而无法编译),但由于没有 sqlite extension 入口函数,因此实际无法使用。该特性默认未启用,这是为了保证 Rust crate 的下游依赖的流畅体验。_cdylib 特性时也会生成 .so/.dll 产物
请注意,不能使用 --workspace 和 --features _cdylib 一起构建,因为workspace crate 有一个与 libsqlite3-sys 的 loadable_extension 不兼容的 sqlcipher 特性。
因此 workspace 构建只能成功二者其一,要么是得到一个不可用的扩展库,要么是由于 feature 冲突 workspace crate 编译失败,这是符合预期的行为。
要在当前目录下构建可用的 C 动态库:
RUSTFLAGS="-C panic=abort"
如果要在 workspace 目录下构建,必须指定package:
RUSTFLAGS="-C panic=abort"