diff --git a/bindings/rust/src/lib.rs b/bindings/rust/src/lib.rs index 0e331caf6..9acc489c9 100644 --- a/bindings/rust/src/lib.rs +++ b/bindings/rust/src/lib.rs @@ -1,10 +1,11 @@ pub mod params; -mod value; +pub mod value; + +pub use value::Value; pub use params::params_from_iter; use crate::params::*; -use crate::value::*; use std::rc::Rc; use std::sync::{Arc, Mutex}; @@ -100,13 +101,13 @@ impl Connection { let stmt = conn.prepare(sql)?; Ok(Statement { - inner: Arc::new(Mutex::new(Rc::new(stmt))), + inner: Arc::new(Mutex::new(stmt)), }) } } pub struct Statement { - inner: Arc>>, + inner: Arc>, } unsafe impl Send for Statement {} @@ -114,8 +115,14 @@ unsafe impl Sync for Statement {} impl Statement { pub async fn query(&mut self, params: impl IntoParams) -> Result { - let _params = params.into_params()?; - todo!(); + let params = params.into_params()?; + match params { + crate::params::Params::None => {} + _ => todo!(), + } + Ok(Rows { + inner: Arc::clone(&self.inner), + }) } pub async fn execute(&mut self, params: impl IntoParams) -> Result { @@ -137,7 +144,7 @@ pub enum Params { pub struct Transaction {} pub struct Rows { - inner: Arc>>, + inner: Arc>, } unsafe impl Send for Rows {} @@ -145,17 +152,36 @@ unsafe impl Sync for Rows {} impl Rows { pub async fn next(&mut self) -> Result> { - todo!(); + let mut stmt = self + .inner + .lock() + .map_err(|e| Error::MutexError(e.to_string()))?; + + match stmt.step() { + Ok(limbo_core::StepResult::Row) => { + let row = stmt.row().unwrap(); + Ok(Some(Row { + values: row.get_values().to_vec(), + })) + } + _ => Ok(None), + } } } -pub struct Row {} +pub struct Row { + values: Vec, +} unsafe impl Send for Row {} unsafe impl Sync for Row {} impl Row { - pub fn get_value(&self, _index: usize) -> Result { - todo!(); + pub fn get_value(&self, index: usize) -> Result { + let value = &self.values[index]; + match value { + limbo_core::OwnedValue::Integer(i) => Ok(Value::Integer(*i)), + _ => todo!(), + } } }