sqlx_core/sqlite/
mod.rs

1//! **SQLite** database driver.
2
3// SQLite is a C library. All interactions require FFI which is unsafe.
4// All unsafe blocks should have comments pointing to SQLite docs and ensuring that we maintain
5// invariants.
6#![allow(unsafe_code)]
7
8pub use arguments::{SqliteArgumentValue, SqliteArguments};
9pub use column::SqliteColumn;
10pub use connection::{LockedSqliteHandle, SqliteConnection};
11pub use database::Sqlite;
12pub use error::SqliteError;
13pub use options::{
14    SqliteAutoVacuum, SqliteConnectOptions, SqliteJournalMode, SqliteLockingMode, SqliteSynchronous,
15};
16pub use query_result::SqliteQueryResult;
17pub use row::SqliteRow;
18pub use statement::SqliteStatement;
19use std::sync::atomic::AtomicBool;
20pub use transaction::SqliteTransactionManager;
21pub use type_info::SqliteTypeInfo;
22pub use value::{SqliteValue, SqliteValueRef};
23
24use crate::describe::Describe;
25use crate::error::Error;
26use crate::executor::Executor;
27use crate::sqlite::connection::establish::EstablishParams;
28
29mod arguments;
30mod column;
31mod connection;
32mod database;
33mod error;
34mod options;
35mod query_result;
36mod row;
37mod statement;
38mod transaction;
39mod type_info;
40pub mod types;
41mod value;
42
43#[cfg(feature = "migrate")]
44mod migrate;
45
46#[cfg(feature = "migrate")]
47mod testing;
48
49/// An alias for [`Pool`][crate::pool::Pool], specialized for SQLite.
50pub type SqlitePool = crate::pool::Pool<Sqlite>;
51
52/// An alias for [`PoolOptions`][crate::pool::PoolOptions], specialized for SQLite.
53pub type SqlitePoolOptions = crate::pool::PoolOptions<Sqlite>;
54
55/// An alias for [`Executor<'_, Database = Sqlite>`][Executor].
56pub trait SqliteExecutor<'c>: Executor<'c, Database = Sqlite> {}
57impl<'c, T: Executor<'c, Database = Sqlite>> SqliteExecutor<'c> for T {}
58
59// NOTE: required due to the lack of lazy normalization
60impl_into_arguments_for_arguments!(SqliteArguments<'q>);
61impl_executor_for_pool_connection!(Sqlite, SqliteConnection, SqliteRow);
62impl_executor_for_transaction!(Sqlite, SqliteRow);
63impl_column_index_for_row!(SqliteRow);
64impl_column_index_for_statement!(SqliteStatement);
65impl_acquire!(Sqlite, SqliteConnection);
66impl_into_maybe_pool!(Sqlite, SqliteConnection);
67
68// required because some databases have a different handling of NULL
69impl_encode_for_option!(Sqlite);
70
71/// UNSTABLE: for use by `sqlx-cli` only.
72#[doc(hidden)]
73pub static CREATE_DB_WAL: AtomicBool = AtomicBool::new(true);
74
75/// UNSTABLE: for use by `sqlite_macros` only.
76#[doc(hidden)]
77pub fn describe_blocking(
78    opts: &SqliteConnectOptions,
79    query: &str,
80) -> Result<Describe<Sqlite>, Error> {
81    let params = EstablishParams::from_options(opts)?;
82    let mut conn = params.establish()?;
83
84    // Execute any ancillary `PRAGMA`s
85    connection::execute::iter(&mut conn, &opts.pragma_string(), None, false)?.finish()?;
86
87    connection::describe::describe(&mut conn, query)
88
89    // SQLite database is closed immediately when `conn` is dropped
90}