1 //! `feature = "limits"` Run-Time Limits
2 
3 use std::os::raw::c_int;
4 
5 use crate::ffi;
6 pub use crate::ffi::Limit;
7 
8 use crate::Connection;
9 
10 impl Connection {
11     /// `feature = "limits"` Returns the current value of a limit.
limit(&self, limit: Limit) -> i3212     pub fn limit(&self, limit: Limit) -> i32 {
13         let c = self.db.borrow();
14         unsafe { ffi::sqlite3_limit(c.db(), limit as c_int, -1) }
15     }
16 
17     /// `feature = "limits"` Changes the limit to `new_val`, returning the prior
18     /// value of the limit.
set_limit(&self, limit: Limit, new_val: i32) -> i3219     pub fn set_limit(&self, limit: Limit, new_val: i32) -> i32 {
20         let c = self.db.borrow_mut();
21         unsafe { ffi::sqlite3_limit(c.db(), limit as c_int, new_val) }
22     }
23 }
24 
25 #[cfg(test)]
26 mod test {
27     use crate::ffi::Limit;
28     use crate::Connection;
29 
30     #[test]
test_limit()31     fn test_limit() {
32         let db = Connection::open_in_memory().unwrap();
33         db.set_limit(Limit::SQLITE_LIMIT_LENGTH, 1024);
34         assert_eq!(1024, db.limit(Limit::SQLITE_LIMIT_LENGTH));
35 
36         db.set_limit(Limit::SQLITE_LIMIT_SQL_LENGTH, 1024);
37         assert_eq!(1024, db.limit(Limit::SQLITE_LIMIT_SQL_LENGTH));
38 
39         db.set_limit(Limit::SQLITE_LIMIT_COLUMN, 64);
40         assert_eq!(64, db.limit(Limit::SQLITE_LIMIT_COLUMN));
41 
42         db.set_limit(Limit::SQLITE_LIMIT_EXPR_DEPTH, 256);
43         assert_eq!(256, db.limit(Limit::SQLITE_LIMIT_EXPR_DEPTH));
44 
45         db.set_limit(Limit::SQLITE_LIMIT_COMPOUND_SELECT, 32);
46         assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_COMPOUND_SELECT));
47 
48         db.set_limit(Limit::SQLITE_LIMIT_FUNCTION_ARG, 32);
49         assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_FUNCTION_ARG));
50 
51         db.set_limit(Limit::SQLITE_LIMIT_ATTACHED, 2);
52         assert_eq!(2, db.limit(Limit::SQLITE_LIMIT_ATTACHED));
53 
54         db.set_limit(Limit::SQLITE_LIMIT_LIKE_PATTERN_LENGTH, 128);
55         assert_eq!(128, db.limit(Limit::SQLITE_LIMIT_LIKE_PATTERN_LENGTH));
56 
57         db.set_limit(Limit::SQLITE_LIMIT_VARIABLE_NUMBER, 99);
58         assert_eq!(99, db.limit(Limit::SQLITE_LIMIT_VARIABLE_NUMBER));
59 
60         // SQLITE_LIMIT_TRIGGER_DEPTH was added in SQLite 3.6.18.
61         if crate::version_number() >= 3_006_018 {
62             db.set_limit(Limit::SQLITE_LIMIT_TRIGGER_DEPTH, 32);
63             assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_TRIGGER_DEPTH));
64         }
65 
66         // SQLITE_LIMIT_WORKER_THREADS was added in SQLite 3.8.7.
67         if crate::version_number() >= 3_008_007 {
68             db.set_limit(Limit::SQLITE_LIMIT_WORKER_THREADS, 2);
69             assert_eq!(2, db.limit(Limit::SQLITE_LIMIT_WORKER_THREADS));
70         }
71     }
72 }
73