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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
use std::path::Path; mod connect; mod journal_mode; mod parse; mod synchronous; use crate::connection::LogSettings; pub use journal_mode::SqliteJournalMode; use std::{borrow::Cow, time::Duration}; pub use synchronous::SqliteSynchronous; /// Options and flags which can be used to configure a SQLite connection. /// /// A value of `SqliteConnectOptions` can be parsed from a connection URI, /// as described by [SQLite](https://www.sqlite.org/uri.html). /// /// | URI | Description | /// | -- | -- | /// `sqlite::memory:` | Open an in-memory database. | /// `sqlite:data.db` | Open the file `data.db` in the current directory. | /// `sqlite://data.db` | Open the file `data.db` in the current directory. | /// `sqlite:///data.db` | Open the file `data.db` from the root (`/`) directory. | /// `sqlite://data.db?mode=ro` | Open the file `data.db` for read-only access. | /// /// # Example /// /// ```rust,no_run /// # use sqlx_core as sqlx; /// # use sqlx_core::connection::ConnectOptions; /// # use sqlx_core::error::Error; /// use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode}; /// use std::str::FromStr; /// /// # fn main() { /// # #[cfg(feature = "_rt-async-std")] /// # sqlx_rt::async_std::task::block_on::<_, Result<(), Error>>(async move { /// let conn = SqliteConnectOptions::from_str("sqlite://data.db")? /// .journal_mode(SqliteJournalMode::Wal) /// .read_only(true) /// .connect().await?; /// # Ok(()) /// # }).unwrap(); /// # } /// ``` #[derive(Clone, Debug)] pub struct SqliteConnectOptions { pub(crate) filename: Cow<'static, Path>, pub(crate) in_memory: bool, pub(crate) read_only: bool, pub(crate) create_if_missing: bool, pub(crate) journal_mode: SqliteJournalMode, pub(crate) foreign_keys: bool, pub(crate) shared_cache: bool, pub(crate) statement_cache_capacity: usize, pub(crate) busy_timeout: Duration, pub(crate) log_settings: LogSettings, pub(crate) synchronous: SqliteSynchronous, } impl Default for SqliteConnectOptions { fn default() -> Self { Self::new() } } impl SqliteConnectOptions { pub fn new() -> Self { Self { filename: Cow::Borrowed(Path::new(":memory:")), in_memory: false, read_only: false, create_if_missing: false, foreign_keys: true, shared_cache: false, statement_cache_capacity: 100, journal_mode: SqliteJournalMode::Wal, busy_timeout: Duration::from_secs(5), log_settings: Default::default(), synchronous: SqliteSynchronous::Full, } } /// Sets the name of the database file. pub fn filename(mut self, filename: impl AsRef<Path>) -> Self { self.filename = Cow::Owned(filename.as_ref().to_owned()); self } /// Set the enforcement of [foreign key constriants](https://www.sqlite.org/pragma.html#pragma_foreign_keys). /// /// By default, this is enabled. pub fn foreign_keys(mut self, on: bool) -> Self { self.foreign_keys = on; self } /// Sets the [journal mode](https://www.sqlite.org/pragma.html#pragma_journal_mode) for the database connection. /// /// The default journal mode is WAL. For most use cases this can be significantly faster but /// there are [disadvantages](https://www.sqlite.org/wal.html). pub fn journal_mode(mut self, mode: SqliteJournalMode) -> Self { self.journal_mode = mode; self } /// Sets the [access mode](https://www.sqlite.org/c3ref/open.html) to open the database /// for read-only access. pub fn read_only(mut self, read_only: bool) -> Self { self.read_only = read_only; self } /// Sets the [access mode](https://www.sqlite.org/c3ref/open.html) to create the database file /// if the file does not exist. /// /// By default, a new file **will not be** created if one is not found. pub fn create_if_missing(mut self, create: bool) -> Self { self.create_if_missing = create; self } /// Sets the capacity of the connection's statement cache in a number of stored /// distinct statements. Caching is handled using LRU, meaning when the /// amount of queries hits the defined limit, the oldest statement will get /// dropped. /// /// The default cache capacity is 100 statements. pub fn statement_cache_capacity(mut self, capacity: usize) -> Self { self.statement_cache_capacity = capacity; self } /// Sets a timeout value to wait when the database is locked, before /// returning a busy timeout error. /// /// The default busy timeout is 5 seconds. pub fn busy_timeout(mut self, timeout: Duration) -> Self { self.busy_timeout = timeout; self } /// Sets the [synchronous](https://www.sqlite.org/pragma.html#pragma_synchronous) setting for the database connection. /// /// The default synchronous settings is FULL. However, if durability is not a concern, /// then NORMAL is normally all one needs in WAL mode. pub fn synchronous(mut self, synchronous: SqliteSynchronous) -> Self { self.synchronous = synchronous; self } }