sqlite_hashes/
lib.rs

1#![cfg_attr(feature = "default", doc = include_str!("../README.md"))]
2//
3// Unsafe code is required for cdylib, so only use it for this crate
4#![forbid(unsafe_code)]
5
6#[cfg(not(any(
7    feature = "md5",
8    feature = "sha1",
9    feature = "sha224",
10    feature = "sha256",
11    feature = "sha384",
12    feature = "sha512",
13    feature = "blake3",
14    feature = "fnv",
15    feature = "xxhash",
16)))]
17compile_error!(
18    "At least one of these features must be enabled: md5,sha1,sha224,sha256,sha384,sha512,blake3,fnv,xxhash"
19);
20
21/// Re-export of the [`rusqlite`](https://crates.io/crates/rusqlite) crate to avoid version conflicts.
22pub use rusqlite;
23
24use crate::rusqlite::{Connection, Result};
25
26mod aggregate;
27
28mod scalar;
29pub use crate::scalar::NamedDigest;
30
31mod state;
32pub use crate::state::HashState;
33
34#[cfg(feature = "md5")]
35mod md5;
36
37#[cfg(feature = "md5")]
38pub use crate::md5::register_md5_functions;
39
40#[cfg(feature = "sha1")]
41mod sha1;
42
43#[cfg(feature = "sha1")]
44pub use crate::sha1::register_sha1_functions;
45
46#[cfg(feature = "sha224")]
47mod sha224;
48
49#[cfg(feature = "sha224")]
50pub use crate::sha224::register_sha224_functions;
51
52#[cfg(feature = "sha256")]
53mod sha256;
54
55#[cfg(feature = "sha256")]
56pub use crate::sha256::register_sha256_functions;
57
58#[cfg(feature = "sha384")]
59mod sha384;
60
61#[cfg(feature = "sha384")]
62pub use crate::sha384::register_sha384_functions;
63
64#[cfg(feature = "sha512")]
65mod sha512;
66
67#[cfg(feature = "sha512")]
68pub use crate::sha512::register_sha512_functions;
69
70#[cfg(feature = "blake3")]
71mod blake3;
72
73#[cfg(feature = "blake3")]
74pub use crate::blake3::register_blake3_functions;
75
76#[cfg(feature = "fnv")]
77mod fnv;
78
79#[cfg(feature = "fnv")]
80pub use crate::fnv::register_fnv_functions;
81
82#[cfg(feature = "xxhash")]
83mod xxhash;
84
85#[cfg(feature = "xxhash")]
86pub use crate::xxhash::register_xxhash_functions;
87
88/// Register all hashing functions for the given `SQLite` connection.
89/// This is a convenience function that calls all of the `register_*_function` functions.
90/// Features must be enabled for the corresponding functions to be registered.
91///
92/// # Example
93///
94/// ```
95/// # use sqlite_hashes::rusqlite::{Connection, Result};
96/// # use sqlite_hashes::register_hash_functions;
97/// # fn main() -> Result<()> {
98/// let db = Connection::open_in_memory()?;
99/// register_hash_functions(&db)?;
100/// # if cfg!(all(feature = "hex", feature = "md5")) {
101/// let hash: String = db.query_row("SELECT md5_hex('hello')", [], |r| r.get(0))?;
102/// assert_eq!(&hash, "5D41402ABC4B2A76B9719D911017C592");
103/// # }
104/// # if cfg!(all(feature = "hex", feature = "sha1")) {
105/// let hash: String = db.query_row("SELECT sha1_hex('hello')", [], |r| r.get(0))?;
106/// assert_eq!(hash, "AAF4C61DDCC5E8A2DABEDE0F3B482CD9AEA9434D");
107/// # }
108/// # if cfg!(all(feature = "hex", feature = "sha224")) {
109/// let hash: String = db.query_row("SELECT sha224_hex('hello')", [], |r| r.get(0))?;
110/// assert_eq!(&hash, "EA09AE9CC6768C50FCEE903ED054556E5BFC8347907F12598AA24193");
111/// # }
112/// # if cfg!(all(feature = "hex", feature = "sha256")) {
113/// let hash: String = db.query_row("SELECT sha256_hex('hello')", [], |r| r.get(0))?;
114/// assert_eq!(&hash, "2CF24DBA5FB0A30E26E83B2AC5B9E29E1B161E5C1FA7425E73043362938B9824");
115/// # }
116/// # if cfg!(all(feature = "hex", feature = "sha384")) {
117/// let hash: String = db.query_row("SELECT sha384_hex('hello')", [], |r| r.get(0))?;
118/// assert_eq!(&hash, "59E1748777448C69DE6B800D7A33BBFB9FF1B463E44354C3553BCDB9C666FA90125A3C79F90397BDF5F6A13DE828684F");
119/// # }
120/// # if cfg!(all(feature = "hex", feature = "sha512")) {
121/// let hash: String = db.query_row("SELECT sha512_hex('hello')", [], |r| r.get(0))?;
122/// assert_eq!(hash, "9B71D224BD62F3785D96D46AD3EA3D73319BFBC2890CAADAE2DFF72519673CA72323C3D99BA5C11D7C7ACC6E14B8C5DA0C4663475C2E5C3ADEF46F73BCDEC043");
123/// # }
124/// # if cfg!(all(feature = "hex", feature = "blake3")) {
125/// let hash: String = db.query_row("SELECT blake3_hex('hello')", [], |r| r.get(0))?;
126/// assert_eq!(hash, "EA8F163DB38682925E4491C5E58D4BB3506EF8C14EB78A86E908C5624A67200F");
127/// # }
128/// # if cfg!(all(feature = "hex", feature = "fnv")) {
129/// let hash: String = db.query_row("SELECT fnv1a_hex('hello')", [], |r| r.get(0))?;
130/// assert_eq!(hash, "A430D84680AABD0B");
131/// # }
132/// # if cfg!(all(feature = "hex", feature = "xxhash")) {
133/// let hash: String = db.query_row("SELECT xxh32_hex('hello')", [], |r| r.get(0))?;
134/// assert_eq!(hash, "FB0077F9");
135/// let hash: String = db.query_row("SELECT xxh64_hex('hello')", [], |r| r.get(0))?;
136/// assert_eq!(hash, "26C7827D889F6DA3");
137/// let hash: String = db.query_row("SELECT xxh3_64_hex('hello')", [], |r| r.get(0))?;
138/// assert_eq!(hash, "9555E8555C62DCFD");
139/// let hash: String = db.query_row("SELECT xxh3_128_hex('hello')", [], |r| r.get(0))?;
140/// assert_eq!(hash, "B5E9C1AD071B3E7FC779CFAA5E523818");
141/// # }
142/// # Ok(())
143/// # }
144/// ```
145pub fn register_hash_functions(conn: &Connection) -> Result<()> {
146    #[cfg(feature = "md5")]
147    register_md5_functions(conn)?;
148    #[cfg(feature = "sha1")]
149    register_sha1_functions(conn)?;
150    #[cfg(feature = "sha224")]
151    register_sha224_functions(conn)?;
152    #[cfg(feature = "sha256")]
153    register_sha256_functions(conn)?;
154    #[cfg(feature = "sha384")]
155    register_sha384_functions(conn)?;
156    #[cfg(feature = "sha512")]
157    register_sha512_functions(conn)?;
158    #[cfg(feature = "blake3")]
159    register_blake3_functions(conn)?;
160    #[cfg(feature = "fnv")]
161    register_fnv_functions(conn)?;
162    #[cfg(feature = "xxhash")]
163    register_xxhash_functions(conn)?;
164
165    Ok(())
166}