1#![forbid(unsafe_code)]
2
3pub mod error;
11pub mod executor;
12pub mod listener;
13pub mod pool;
14pub mod singleflight;
15#[cfg(feature = "sqlite")]
16pub mod sqlite_pool;
17pub mod stream;
18pub mod test_support;
19pub mod transaction;
20pub mod types;
21pub mod util;
22
23pub mod driver {
26 pub use bsql_driver_postgres::arena::{acquire_arena, release_arena};
27 pub use bsql_driver_postgres::hash_sql;
28 pub use bsql_driver_postgres::{Arena, Encode, PgDataRow, QueryResult, Row};
29
30 pub use bsql_driver_postgres::codec::decode_str;
32
33 pub use bsql_driver_postgres::codec::{
35 decode_array_bool, decode_array_bytea, decode_array_f32, decode_array_f64,
36 decode_array_i16, decode_array_i32, decode_array_i64, decode_array_str,
37 };
38
39 #[cfg(feature = "decimal")]
41 pub use bsql_driver_postgres::codec::decode_numeric_decimal;
42 #[cfg(feature = "uuid")]
43 pub use bsql_driver_postgres::codec::decode_uuid_type;
44 #[cfg(feature = "chrono")]
45 pub use bsql_driver_postgres::codec::{
46 decode_date_chrono, decode_time_chrono, decode_timestamptz_chrono,
47 };
48 #[cfg(feature = "time")]
49 pub use bsql_driver_postgres::codec::{
50 decode_date_time, decode_time_time, decode_timestamptz_time,
51 };
52}
53
54#[cfg(feature = "sqlite")]
56pub mod driver_sqlite {
57 pub use bsql_driver_sqlite::codec::SqliteEncode;
58 pub use bsql_driver_sqlite::conn::SqliteConnection;
59 pub use bsql_driver_sqlite::ffi::{StepResult, StmtHandle};
60 pub use bsql_driver_sqlite::pool::ParamValue;
61 pub use bsql_driver_sqlite::SqliteError;
62 pub use smallvec::{smallvec, SmallVec};
63
64 pub use bsql_arena::{acquire_arena, Arena, ArenaRows, ValidatedRows};
66
67 pub const SQLITE_NULL: i32 = 5;
70}
71
72#[cfg(feature = "async")]
82#[macro_export]
83#[doc(hidden)]
84macro_rules! __bsql_call {
85 ($expr:expr) => {
86 $expr.await
87 };
88}
89
90#[cfg(not(feature = "async"))]
93#[macro_export]
94#[doc(hidden)]
95macro_rules! __bsql_call {
96 ($expr:expr) => {
97 $expr
98 };
99}
100
101#[cfg(feature = "async")]
104#[macro_export]
105#[doc(hidden)]
106macro_rules! __bsql_fn {
107 ($(#[$meta:meta])* pub fn $($rest:tt)*) => {
108 $(#[$meta])* pub async fn $($rest)*
109 };
110}
111
112#[cfg(not(feature = "async"))]
115#[macro_export]
116#[doc(hidden)]
117macro_rules! __bsql_fn {
118 ($(#[$meta:meta])* pub fn $($rest:tt)*) => {
119 $(#[$meta])* pub fn $($rest)*
120 };
121}
122
123pub use error::{BsqlError, BsqlResult};
124pub use executor::{OwnedResult, QueryTarget};
125pub use listener::{Listener, Notification};
126pub use pool::{Pool, PoolBuilder, PoolConnection, PoolStatus};
127#[cfg(feature = "sqlite")]
128pub use sqlite_pool::{SqlitePool, SqliteStreamingQuery, SqliteTransaction};
129pub use stream::QueryStream;
130pub use transaction::{IsolationLevel, Transaction};
131
132#[doc(hidden)]
135pub fn rapid_hash_str(s: &str) -> u64 {
136 use std::hash::{Hash, Hasher};
137 let mut hasher = rapidhash::quality::RapidHasher::default();
138 s.hash(&mut hasher);
139 hasher.finish()
140}
141
142#[cfg(test)]
143mod tests {
144 use super::*;
145
146 #[test]
147 fn rapid_hash_str_deterministic() {
148 let h1 = rapid_hash_str("SELECT 1");
149 let h2 = rapid_hash_str("SELECT 1");
150 assert_eq!(h1, h2);
151 }
152
153 #[test]
154 fn rapid_hash_str_different_inputs_differ() {
155 let h1 = rapid_hash_str("SELECT 1");
156 let h2 = rapid_hash_str("SELECT 2");
157 assert_ne!(h1, h2);
158 }
159
160 #[test]
161 fn rapid_hash_str_empty_string() {
162 let h = rapid_hash_str("");
163 assert_eq!(h, rapid_hash_str(""));
165 }
166}