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