From 0e4f33688745b2ffe71a80fdf0de44a1163d4f2d Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Thu, 2 Jun 2022 23:43:32 +0200 Subject: [PATCH] Horrible implementation of range for sqlite --- src/db/sqlite_adapter.rs | 94 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/src/db/sqlite_adapter.rs b/src/db/sqlite_adapter.rs index bed72e6b..0516f2b7 100644 --- a/src/db/sqlite_adapter.rs +++ b/src/db/sqlite_adapter.rs @@ -132,7 +132,52 @@ impl IDb for SqliteDb { high: Bound<&'r [u8]>, ) -> Result> { let tree = self.get_tree(tree)?; - unimplemented!(); + + let mut sql = format!("SELECT k, v FROM {}", tree); + let mut params: Vec> = vec![]; + + match low { + Bound::Included(b) => { + sql.push_str(" WHERE k >= ?1"); + params.push(b.to_vec()); + } + Bound::Excluded(b) => { + sql.push_str(" WHERE k > ?1"); + params.push(b.to_vec()); + } + Bound::Unbounded => (), + }; + + match high { + Bound::Included(b) => { + if !params.is_empty() { + sql.push_str(" AND k <= ?2"); + } else { + sql.push_str(" WHERE k <= ?1"); + } + params.push(b.to_vec()); + } + Bound::Excluded(b) => { + if !params.is_empty() { + sql.push_str(" AND k < ?2"); + } else { + sql.push_str(" WHERE k < ?1"); + } + params.push(b.to_vec()); + } + Bound::Unbounded => (), + } + sql.push_str(" ORDER BY k ASC"); + + let params = params + .iter() + .map(|x| x as &dyn rusqlite::ToSql) + .collect::>(); + DbValueIterator::new::<&[&dyn rusqlite::ToSql]>( + self.db.lock().unwrap(), + &sql, + params.as_ref(), + ) } fn range_rev<'a, 'r>( &'a self, @@ -141,7 +186,52 @@ impl IDb for SqliteDb { high: Bound<&'r [u8]>, ) -> Result> { let tree = self.get_tree(tree)?; - unimplemented!(); + + let mut sql = format!("SELECT k, v FROM {}", tree); + let mut params: Vec> = vec![]; + + match low { + Bound::Included(b) => { + sql.push_str(" WHERE k >= ?1"); + params.push(b.to_vec()); + } + Bound::Excluded(b) => { + sql.push_str(" WHERE k > ?1"); + params.push(b.to_vec()); + } + Bound::Unbounded => (), + }; + + match high { + Bound::Included(b) => { + if !params.is_empty() { + sql.push_str(" AND k <= ?2"); + } else { + sql.push_str(" WHERE k <= ?1"); + } + params.push(b.to_vec()); + } + Bound::Excluded(b) => { + if !params.is_empty() { + sql.push_str(" AND k < ?2"); + } else { + sql.push_str(" WHERE k < ?1"); + } + params.push(b.to_vec()); + } + Bound::Unbounded => (), + } + sql.push_str(" ORDER BY k DESC"); + + let params = params + .iter() + .map(|x| x as &dyn rusqlite::ToSql) + .collect::>(); + DbValueIterator::new::<&[&dyn rusqlite::ToSql]>( + self.db.lock().unwrap(), + &sql, + params.as_ref(), + ) } // ----