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 SQLITE_DBCONFIG_STMT_SCANSTATUS = 1018, // 3.42.0
60 /// Changes the default order in which tables and indexes are scanned
61 SQLITE_DBCONFIG_REVERSE_SCANORDER = 1019, // 3.42.0
62 /// Enables or disables the ability of the ATTACH DATABASE SQL command
63 /// to create a new database file if the database filed named in the ATTACH command does not already exist.
64 #[cfg(feature = "modern_sqlite")]
65 SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE = 1020, // 3.49.0
66 /// Enables or disables the ability of the ATTACH DATABASE SQL command to open a database for writing.
67 #[cfg(feature = "modern_sqlite")]
68 SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE = 1021, // 3.49.0
69 /// Enables or disables the ability to include comments in SQL text.
70 #[cfg(feature = "modern_sqlite")]
71 SQLITE_DBCONFIG_ENABLE_COMMENTS = 1022, // 3.49.0
72 /// Determines the number of significant digits that SQLite will attempt to preserve
73 /// when converting floating point numbers (IEEE 754 "doubles") into text.
74 #[cfg(feature = "modern_sqlite")]
75 SQLITE_DBCONFIG_FP_DIGITS = 1023, // 3.53.0
76}
77
78impl Connection {
79 /// Returns the current value of a `config`.
80 ///
81 /// - `SQLITE_DBCONFIG_ENABLE_FKEY`: return `false` or `true` to indicate
82 /// whether FK enforcement is off or on
83 /// - `SQLITE_DBCONFIG_ENABLE_TRIGGER`: return `false` or `true` to indicate
84 /// whether triggers are disabled or enabled
85 /// - `SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER`: return `false` or `true` to
86 /// indicate whether `fts3_tokenizer` are disabled or enabled
87 /// - `SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE`: return `false` to indicate
88 /// checkpoints-on-close are not disabled or `true` if they are
89 /// - `SQLITE_DBCONFIG_ENABLE_QPSG`: return `false` or `true` to indicate
90 /// whether the QPSG is disabled or enabled
91 /// - `SQLITE_DBCONFIG_TRIGGER_EQP`: return `false` to indicate
92 /// output-for-trigger are not disabled or `true` if it is
93 #[inline]
94 pub fn db_config(&self, config: DbConfig) -> Result<bool> {
95 let c = self.db.borrow();
96 unsafe {
97 let mut val = 0;
98 check(ffi::sqlite3_db_config(
99 c.db(),
100 config as c_int,
101 -1,
102 &mut val,
103 ))?;
104 Ok(val != 0)
105 }
106 }
107
108 /// Make configuration changes to a database connection
109 ///
110 /// - `SQLITE_DBCONFIG_ENABLE_FKEY`: `false` to disable FK enforcement,
111 /// `true` to enable FK enforcement
112 /// - `SQLITE_DBCONFIG_ENABLE_TRIGGER`: `false` to disable triggers, `true`
113 /// to enable triggers
114 /// - `SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER`: `false` to disable
115 /// `fts3_tokenizer()`, `true` to enable `fts3_tokenizer()`
116 /// - `SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE`: `false` (the default) to enable
117 /// checkpoints-on-close, `true` to disable them
118 /// - `SQLITE_DBCONFIG_ENABLE_QPSG`: `false` to disable the QPSG, `true` to
119 /// enable QPSG
120 /// - `SQLITE_DBCONFIG_TRIGGER_EQP`: `false` to disable output for trigger
121 /// programs, `true` to enable it
122 #[inline]
123 pub fn set_db_config(&self, config: DbConfig, new_val: bool) -> Result<bool> {
124 let c = self.db.borrow_mut();
125 unsafe {
126 let mut val = 0;
127 check(ffi::sqlite3_db_config(
128 c.db(),
129 config as c_int,
130 c_int::from(new_val),
131 &mut val,
132 ))?;
133 Ok(val != 0)
134 }
135 }
136}
137
138#[cfg(all(test, not(miri)))]
139mod test {
140 #[cfg(all(target_family = "wasm", target_os = "unknown"))]
141 use wasm_bindgen_test::wasm_bindgen_test as test;
142
143 use super::DbConfig;
144 use crate::{Connection, Result};
145
146 #[test]
147 fn test_db_config() -> Result<()> {
148 let db = Connection::open_in_memory()?;
149
150 let opposite = !db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_FKEY)?;
151 assert_eq!(
152 db.set_db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_FKEY, opposite),
153 Ok(opposite)
154 );
155 assert_eq!(
156 db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_FKEY),
157 Ok(opposite)
158 );
159
160 let opposite = !db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_TRIGGER)?;
161 assert_eq!(
162 db.set_db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_TRIGGER, opposite),
163 Ok(opposite)
164 );
165 assert_eq!(
166 db.db_config(DbConfig::SQLITE_DBCONFIG_ENABLE_TRIGGER),
167 Ok(opposite)
168 );
169 Ok(())
170 }
171}