diff --git a/src/vtab/mod.rs b/src/vtab/mod.rs index 2e7a11a..c4ae7b3 100644 --- a/src/vtab/mod.rs +++ b/src/vtab/mod.rs @@ -95,21 +95,13 @@ impl IndexInfo { } /// if `argv_index` > 0, constraint is part of argv to xFilter - pub fn set_argv_index(&mut self, constraint_idx: usize, argv_index: libc::c_int) { - unsafe { - let mut constraint_usages = slice::from_raw_parts_mut((*self.0).aConstraintUsage, - (*self.0).nConstraint as usize); - constraint_usages[constraint_idx].argvIndex = argv_index; - } - } - /// if `omit`, do not code a test for this constraint - pub fn set_omit(&mut self, constraint_idx: usize, omit: bool) { - unsafe { - let mut constraint_usages = slice::from_raw_parts_mut((*self.0).aConstraintUsage, - (*self.0).nConstraint as usize); - constraint_usages[constraint_idx].omit = if omit { 1 } else { 0 }; - } + pub fn constraint_usage(&mut self, constraint_idx: usize) -> IndexConstraintUsage { + let mut constraint_usages = unsafe { + slice::from_raw_parts_mut((*self.0).aConstraintUsage, (*self.0).nConstraint as usize) + }; + IndexConstraintUsage(&mut constraint_usages[constraint_idx]) } + /// Number used to identify the index pub fn set_idx_num(&mut self, idx_num: libc::c_int) { unsafe { @@ -168,6 +160,19 @@ impl<'a> IndexConstraint<'a> { } } +pub struct IndexConstraintUsage<'a>(&'a mut ffi::Struct_sqlite3_index_constraint_usage); + +impl<'a> IndexConstraintUsage<'a> { + /// if `argv_index` > 0, constraint is part of argv to xFilter + pub fn set_argv_index(&mut self, argv_index: libc::c_int) { + self.0.argvIndex = argv_index; + } + /// if `omit`, do not code a test for this constraint + pub fn set_omit(&mut self, omit: bool) { + self.0.omit = if omit { 1 } else { 0 }; + } +} + /// Virtual table cursor trait. pub trait VTabCursor>: Sized { /// Accessor to the associated virtual table. diff --git a/src/vtab/series.rs b/src/vtab/series.rs index 9388abb..9dd526b 100644 --- a/src/vtab/series.rs +++ b/src/vtab/series.rs @@ -108,18 +108,21 @@ impl VTab for SeriesTab { let mut num_of_arg = 0; if let Some(start_idx) = start_idx { num_of_arg += 1; - info.set_argv_index(start_idx, num_of_arg); - info.set_omit(start_idx, true); + let mut constraint_usage = info.constraint_usage(start_idx); + constraint_usage.set_argv_index(num_of_arg); + constraint_usage.set_omit(true); } if let Some(stop_idx) = stop_idx { num_of_arg += 1; - info.set_argv_index(stop_idx, num_of_arg); - info.set_omit(stop_idx, true); + let mut constraint_usage = info.constraint_usage(stop_idx); + constraint_usage.set_argv_index(num_of_arg); + constraint_usage.set_omit(true); } if let Some(step_idx) = step_idx { num_of_arg += 1; - info.set_argv_index(step_idx, num_of_arg); - info.set_omit(step_idx, true); + let mut constraint_usage = info.constraint_usage(step_idx); + constraint_usage.set_argv_index(num_of_arg); + constraint_usage.set_omit(true); } if idx_num.contains(BOTH) { // Both start= and stop= boundaries are available.