1use std::os::raw::c_int;
4
5use crate::ffi;
6pub use crate::ffi::Limit;
7
8use crate::Connection;
9
10impl Connection {
11 #[inline]
13 pub fn limit(&self, limit: Limit) -> i32 {
14 let c = self.db.borrow();
15 unsafe { ffi::sqlite3_limit(c.db(), limit as c_int, -1) }
16 }
17
18 #[inline]
21 pub fn set_limit(&self, limit: Limit, new_val: i32) -> i32 {
22 let c = self.db.borrow_mut();
23 unsafe { ffi::sqlite3_limit(c.db(), limit as c_int, new_val) }
24 }
25}
26
27#[cfg(test)]
28mod test {
29 use crate::ffi::Limit;
30 use crate::{Connection, Result};
31
32 #[test]
33 fn test_limit() -> Result<()> {
34 let db = Connection::open_in_memory()?;
35 db.set_limit(Limit::SQLITE_LIMIT_LENGTH, 1024);
36 assert_eq!(1024, db.limit(Limit::SQLITE_LIMIT_LENGTH));
37
38 db.set_limit(Limit::SQLITE_LIMIT_SQL_LENGTH, 1024);
39 assert_eq!(1024, db.limit(Limit::SQLITE_LIMIT_SQL_LENGTH));
40
41 db.set_limit(Limit::SQLITE_LIMIT_COLUMN, 64);
42 assert_eq!(64, db.limit(Limit::SQLITE_LIMIT_COLUMN));
43
44 db.set_limit(Limit::SQLITE_LIMIT_EXPR_DEPTH, 256);
45 assert_eq!(256, db.limit(Limit::SQLITE_LIMIT_EXPR_DEPTH));
46
47 db.set_limit(Limit::SQLITE_LIMIT_COMPOUND_SELECT, 32);
48 assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_COMPOUND_SELECT));
49
50 db.set_limit(Limit::SQLITE_LIMIT_FUNCTION_ARG, 32);
51 assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_FUNCTION_ARG));
52
53 db.set_limit(Limit::SQLITE_LIMIT_ATTACHED, 2);
54 assert_eq!(2, db.limit(Limit::SQLITE_LIMIT_ATTACHED));
55
56 db.set_limit(Limit::SQLITE_LIMIT_LIKE_PATTERN_LENGTH, 128);
57 assert_eq!(128, db.limit(Limit::SQLITE_LIMIT_LIKE_PATTERN_LENGTH));
58
59 db.set_limit(Limit::SQLITE_LIMIT_VARIABLE_NUMBER, 99);
60 assert_eq!(99, db.limit(Limit::SQLITE_LIMIT_VARIABLE_NUMBER));
61
62 if crate::version_number() >= 3_006_018 {
64 db.set_limit(Limit::SQLITE_LIMIT_TRIGGER_DEPTH, 32);
65 assert_eq!(32, db.limit(Limit::SQLITE_LIMIT_TRIGGER_DEPTH));
66 }
67
68 if crate::version_number() >= 3_008_007 {
70 db.set_limit(Limit::SQLITE_LIMIT_WORKER_THREADS, 2);
71 assert_eq!(2, db.limit(Limit::SQLITE_LIMIT_WORKER_THREADS));
72 }
73 Ok(())
74 }
75}