sqlite-compressions
Implement SQLite
compression, decompression, and testing functions for Brotli, bzip2, and gzip encodings, as well as
bsdiff4 and raw bsdiff
binary diffing and patching support.
Functions are available as a loadable extension, or as a Rust library.
See also SQLite-hashes extension for MD5, SHA1, SHA224, SHA256, SHA384, SHA512, FNV1a, xxHash
hashing functions.
Usage
This SQLite
extension adds functions for brotli, bzip2, and gzip compressions like gzip(data, [quality])
,
decoding gzip_decode(data)
, and testing gzip_test(data)
functions. Both encoding and decoding functions return
blobs, and the
testing function returns a true/false. The encoding functions can encode text and blob values, but will raise an error
on other types like integers and floating point numbers. All functions will return NULL
if the input data is NULL
.
bsdiff4(source, target)
will return a binary diff between two blobs, and bspatch4(source, diff)
will apply the diff
to the source blob to produce the target blob. The diff and patch functions will raise an error if the input data is not
blobs or if the diff is invalid. If either input is NULL
, the diff and patch functions will return NULL
.
Similar bsdiffraw(source, target)
and bspatchraw(source, diff)
functions are available for raw bsdiff format. Raw
format is not compressed and does not have any magic number prefix. If the internal format provided
by bsdiff crate changes, we will add a separate function for it.
Extension
To use as an extension, load the libsqlite_compressions.so
shared library into SQLite
.
;
);
);
))
Rust library
To use as a Rust library, add sqlite-compressions
to your Cargo.toml
dependencies. Then, register the needed
functions with register_compression_functions(&db)
. This will register all available functions, or you can
use register_gzip_functions(&db)
, register_brotli_functions(&db)
, register_bzip2_functions(&db)
to register just
the needed ones (you may also
disable the default features to reduce compile time and binary size).
use ;
// Connect to SQLite DB and register needed functions
let db = open_in_memory.unwrap;
// can also use encoding-specific ones like register_gzip_functions(&db)
register_compression_functions.unwrap;
// Encode 'password' using GZIP, and dump resulting BLOB as a HEX string
let sql = "SELECT hex(gzip('password'));";
let res: String = db.query_row_and_then.unwrap;
assert_eq!;
// Encode 'password' using Brotli, decode it, and convert the blob to text
let sql = "SELECT CAST(brotli_decode(brotli('password')) AS TEXT);";
let res: String = db.query_row_and_then.unwrap;
assert_eq!;
// Test that Brotli-encoded value is correct.
let sql = "SELECT brotli_test(brotli('password'));";
let res: bool = db.query_row_and_then.unwrap;
assert!;
// Test that diffing source and target blobs can be applied to source to get target.
let sql = "SELECT bspatch4('source', bsdiff4('source', 'target'));";
let res: = db.query_row_and_then.unwrap;
assert_eq!;
// Test that diffing source and target blobs can be applied
// to source to get target when using raw bsdiff format.
let sql = "SELECT bspatchraw('source', bsdiffraw('source', 'target'));";
let res: = db.query_row_and_then.unwrap;
assert_eq!;
Using with SQLx
To use with SQLx, you need to get the raw handle from the
SqliteConnection
and pass it to the registration function.
use Connection;
use register_compression_functions;
use SqliteConnection;
async
Crate features
By default, this crate will compile with all features. You can enable just the ones you need to reduce compile time and binary size.
[]
= { = "0.3", = false, = ["brotli"] }
- trace - enable tracing support, logging all function calls and their arguments
- brotli - enable Brotli compression support
- bzip2 - enable bzip2 compression support
- gzip - enable GZIP compression support
- bsdiff4 - enable bsdiff4 binary diffing and patching support
- bsdiffraw - enable bsdiff binary diffing and patching support using raw format
The loadable_extension
feature should only be used when building
a .so
/ .dylib
/ .dll
extension file that can be loaded directly into sqlite3 executable.
Development
- You must install
sqlite3
andlibsqlite3-dev
, e.g.sudo apt install -y libsqlite3-dev sqlite3
on Ubuntu/Mint. - This project is easier to develop with just, a modern alternative to
make
. Install it withcargo install just
. - To get a list of available commands, run
just
. - To run tests, use
just test
.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT) at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.