Skip to main content

rusqlite/
config.rs

1//! Configure database connections
2
3use std::ffi::c_int;
4
5use crate::error::check;
6use crate::ffi;
7use crate::{Connection, Result};
8
9/// Database Connection Configuration Options
10/// See [Database Connection Configuration Options](https://sqlite.org/c3ref/c_dbconfig_enable_fkey.html) for details.
11#[repr(i32)]
12#[derive(Copy, Clone, Debug)]
13#[expect(non_camel_case_types)]
14#[non_exhaustive]
15pub enum DbConfig {
16    //SQLITE_DBCONFIG_MAINDBNAME = 1000, /* const char* */
17    //SQLITE_DBCONFIG_LOOKASIDE = 1001,  /* void* int int */
18    /// Enable or disable the enforcement of foreign key constraints.
19    SQLITE_DBCONFIG_ENABLE_FKEY = ffi::SQLITE_DBCONFIG_ENABLE_FKEY,
20    /// Enable or disable triggers.
21    SQLITE_DBCONFIG_ENABLE_TRIGGER = ffi::SQLITE_DBCONFIG_ENABLE_TRIGGER,
22    /// Enable or disable the `fts3_tokenizer()` function which is part of the
23    /// FTS3 full-text search engine extension.
24    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER = ffi::SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, // 3.12.0
25    //SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION = 1005,
26    /// In WAL mode, enable or disable the checkpoint operation before closing
27    /// the connection.
28    SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE = 1006, // 3.16.2
29    /// Activates or deactivates the query planner stability guarantee (QPSG).
30    SQLITE_DBCONFIG_ENABLE_QPSG = 1007, // 3.20.0
31    /// Includes or excludes output for any operations performed by trigger
32    /// programs from the output of EXPLAIN QUERY PLAN commands.
33    SQLITE_DBCONFIG_TRIGGER_EQP = 1008, // 3.22.0
34    /// Activates or deactivates the "reset" flag for a database connection.
35    /// Run VACUUM with this flag set to reset the database.
36    SQLITE_DBCONFIG_RESET_DATABASE = 1009, // 3.24.0
37    /// Activates or deactivates the "defensive" flag for a database connection.
38    SQLITE_DBCONFIG_DEFENSIVE = 1010, // 3.26.0
39    /// Activates or deactivates the `writable_schema` flag.
40    SQLITE_DBCONFIG_WRITABLE_SCHEMA = 1011, // 3.28.0
41    /// Activates or deactivates the legacy behavior of the ALTER TABLE RENAME
42    /// command.
43    SQLITE_DBCONFIG_LEGACY_ALTER_TABLE = 1012, // 3.29
44    /// Activates or deactivates the legacy double-quoted string literal
45    /// misfeature for DML statements only.
46    SQLITE_DBCONFIG_DQS_DML = 1013, // 3.29.0
47    /// Activates or deactivates the legacy double-quoted string literal
48    /// misfeature for DDL statements.
49    SQLITE_DBCONFIG_DQS_DDL = 1014, // 3.29.0
50    /// Enable or disable views.
51    SQLITE_DBCONFIG_ENABLE_VIEW = 1015, // 3.30.0
52    /// Activates or deactivates the legacy file format flag.
53    SQLITE_DBCONFIG_LEGACY_FILE_FORMAT = 1016, // 3.31.0
54    /// Tells SQLite to assume that database schemas (the contents of the
55    /// `sqlite_master` tables) are untainted by malicious content.
56    SQLITE_DBCONFIG_TRUSTED_SCHEMA = 1017, // 3.31.0
57    /// Sets or clears a flag that enables collection of the
58    /// `sqlite3_stmt_scanstatus_v2()` statistics
59    #[cfg(feature = "modern_sqlite")]
60    SQLITE_DBCONFIG_STMT_SCANSTATUS = 1018, // 3.42.0
61    /// Changes the default order in which tables and indexes are scanned
62    #[cfg(feature = "modern_sqlite")]
63    SQLITE_DBCONFIG_REVERSE_SCANORDER = 1019, // 3.42.0
64    /// Enables or disables the ability of the ATTACH DATABASE SQL command
65    /// to create a new database file if the database filed named in the ATTACH command does not already exist.
66    #[cfg(feature = "modern_sqlite")]
67    SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE = 1020, // 3.49.0
68    /// Enables or disables the ability of the ATTACH DATABASE SQL command to open a database for writing.
69    #[cfg(feature = "modern_sqlite")]
70    SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE = 1021, // 3.49.0
71    /// Enables or disables the ability to include comments in SQL text.
72    #[cfg(feature = "modern_sqlite")]
73    SQLITE_DBCONFIG_ENABLE_COMMENTS = 1022, // 3.49.0
74    /// Determines the number of significant digits that SQLite will attempt to preserve
75    /// when converting floating point numbers (IEEE 754 "doubles") into text.
76    #[cfg(feature = "modern_sqlite")]
77    SQLITE_DBCONFIG_FP_DIGITS = 1023, // 3.53.0
78}
79
80impl Connection {
81    /// Returns the current value of a `config`.
82    ///
83    /// - `SQLITE_DBCONFIG_ENABLE_FKEY`: return `false` or `true` to indicate
84    ///   whether FK enforcement is off or on
85    /// - `SQLITE_DBCONFIG_ENABLE_TRIGGER`: return `false` or `true` to indicate
86    ///   whether triggers are disabled or enabled
87    /// - `SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER`: return `false` or `true` to
88    ///   indicate whether `fts3_tokenizer` are disabled or enabled
89    /// - `SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE`: return `false` to indicate
90    ///   checkpoints-on-close are not disabled or `true` if they are
91    /// - `SQLITE_DBCONFIG_ENABLE_QPSG`: return `false` or `true` to indicate
92    ///   whether the QPSG is disabled or enabled
93    /// - `SQLITE_DBCONFIG_TRIGGER_EQP`: return `false` to indicate
94    ///   output-for-trigger are not disabled or `true` if it is
95    #[inline]
96    pub fn db_config(&self, config: DbConfig) -> Result<bool> {
97        let c = self.db.borrow();
98        unsafe {
99            let mut val = 0;
100            check(ffi::sqlite3_db_config(
101                c.db(),
102                config as c_int,
103                -1,
104                &mut val,
105            ))?;
106            Ok(val != 0)
107        }
108    }
109
110    /// Make configuration changes to a database connection
111    ///
112    /// - `SQLITE_DBCONFIG_ENABLE_FKEY`: `false` to disable FK enforcement,
113    ///   `true` to enable FK enforcement
114    /// - `SQLITE_DBCONFIG_ENABLE_TRIGGER`: `false` to disable triggers, `true`
115    ///   to enable triggers
116    /// - `SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER`: `false` to disable
117    ///   `fts3_tokenizer()`, `true` to enable `fts3_tokenizer()`
118    /// - `SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE`: `false` (the default) to enable
119    ///   checkpoints-on-close, `true` to disable them
120    /// - `SQLITE_DBCONFIG_ENABLE_QPSG`: `false` to disable the QPSG, `true` to
121    ///   enable QPSG
122    /// - `SQLITE_DBCONFIG_TRIGGER_EQP`: `false` to disable output for trigger
123    ///   programs, `true` to enable it
124    #[inline]
125    pub fn set_db_config(&self, config: DbConfig, new_val: bool) -> Result<bool> {
126        let c = self.db.borrow_mut();
127        unsafe {
128            let mut val = 0;
129            check(ffi::sqlite3_db_config(
130                c.db(),
131                config as c_int,
132                new_val as c_int,
133                &mut val,
134            ))?;
135            Ok(val != 0)
136        }
137    }
138}
139
140#[cfg(all(test, not(miri)))]
141mod test {
142    #[cfg(all(target_family = "wasm", target_os = "unknown"))]
143    use wasm_bindgen_test::wasm_bindgen_test as test;
144
145    use super::DbConfig;
146    use crate::{Connection, Result};
147
148    #[test]
149    fn test_db_config() -> Result<()> {
150        let db = Connection::open_in_memory()?;
151
152        let opposite = !db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_FKEY)?;
153        assert_eq!(
154            db.set_db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_FKEY, opposite),
155            Ok(opposite)
156        );
157        assert_eq!(
158            db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_FKEY),
159            Ok(opposite)
160        );
161
162        let opposite = !db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_TRIGGER)?;
163        assert_eq!(
164            db.set_db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_TRIGGER, opposite),
165            Ok(opposite)
166        );
167        assert_eq!(
168            db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_TRIGGER),
169            Ok(opposite)
170        );
171        Ok(())
172    }
173}