1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#![cfg_attr(feature = "default", doc = include_str!("../README.md"))]
#![forbid(unsafe_code)]

#[cfg(not(any(feature = "gzip", feature = "brotli",)))]
compile_error!("At least one of the features `gzip`, or `brotli` must be enabled.");

/// Re-export of the [`rusqlite`](https://crates.io/crates/rusqlite) crate to avoid version conflicts.
pub use rusqlite;

use crate::rusqlite::{Connection, Result};

mod common;

#[cfg(feature = "gzip")]
mod gzip;
#[cfg(feature = "gzip")]
pub use crate::gzip::register_gzip_functions;

#[cfg(feature = "brotli")]
mod brotli;
#[cfg(feature = "brotli")]
pub use crate::brotli::register_brotli_functions;

/// Register all compression functions for the given `SQLite` connection.
/// This is a convenience function that calls all of the `register_*_functions` functions.
/// Features must be enabled for the corresponding functions to be registered.
///
/// # Example
///
/// ```
/// # use sqlite_compressions::rusqlite::{Connection, Result};
/// # use sqlite_compressions::register_compression_functions;
/// # fn main() -> Result<()> {
/// let db = Connection::open_in_memory()?;
/// register_compression_functions(&db)?;
/// # if cfg!(feature = "gzip") {
/// let result: String = db.query_row("SELECT hex(gzip('hello'))", [], |r| r.get(0))?;
/// assert_eq!(&result, "1F8B08000000000000FFCB48CDC9C9070086A6103605000000");
/// let result: String = db.query_row("SELECT hex(gzip_decode(gzip(x'0123')))", [], |r| r.get(0))?;
/// assert_eq!(&result, "0123");
/// let result: bool = db.query_row("SELECT gzip_test(gzip(x'0123'))", [], |r| r.get(0))?;
/// assert_eq!(result, true);
/// # }
/// # if cfg!(feature = "brotli") {
/// let result: String = db.query_row("SELECT hex(brotli('hello'))", [], |r| r.get(0))?;
/// assert_eq!(&result, "0B028068656C6C6F03");
/// # }
/// # Ok(())
/// # }
/// ```
pub fn register_compression_functions(conn: &Connection) -> Result<()> {
    #[cfg(feature = "gzip")]
    register_gzip_functions(conn)?;
    #[cfg(feature = "brotli")]
    register_brotli_functions(conn)?;

    Ok(())
}