From 7ff9d4056ba612b0014ee28c2386ceb7f8557428 Mon Sep 17 00:00:00 2001 From: Gwenael Treguier Date: Wed, 5 Aug 2015 22:07:49 +0200 Subject: [PATCH] Add SqliteStatement.named_query. --- src/named_params.rs | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/named_params.rs b/src/named_params.rs index b8e78fa..e196830 100644 --- a/src/named_params.rs +++ b/src/named_params.rs @@ -4,7 +4,7 @@ use libc::{c_int}; use super::ffi; -use {SqliteResult, SqliteError, SqliteConnection, SqliteStatement}; +use {SqliteResult, SqliteError, SqliteConnection, SqliteStatement, SqliteRows}; use types::{ToSql}; impl SqliteConnection { @@ -44,16 +44,33 @@ impl<'conn> SqliteStatement<'conn> { /// `sqlite3_changes`). pub fn named_execute(&mut self, params: &[(&str, &ToSql)]) -> SqliteResult { unsafe { - for &(name, value) in params { - let i = try!(self.parameter_index(name).ok_or(SqliteError{ - code: ffi::SQLITE_MISUSE, - message: format!("Invalid parameter name: {}", name) - })); - try!(self.conn.decode_result(value.bind_parameter(self.stmt, i))); - } + try!(self.bind_named_parameters(params)); self.execute_() } } + + /// Execute the prepared statement with named parameter(s), returning an iterator over the resulting rows. + pub fn named_query<'a>(&'a mut self, params: &[(&str, &ToSql)]) -> SqliteResult> { + self.reset_if_needed(); + + unsafe { + try!(self.bind_named_parameters(params)); + } + + self.needs_reset = true; + Ok(SqliteRows::new(self)) + } + + unsafe fn bind_named_parameters(&mut self, params: &[(&str, &ToSql)]) -> SqliteResult<()> { + for &(name, value) in params { + let i = try!(self.parameter_index(name).ok_or(SqliteError{ + code: ffi::SQLITE_MISUSE, + message: format!("Invalid parameter name: {}", name) + })); + try!(self.conn.decode_result(value.bind_parameter(self.stmt, i))); + } + Ok(()) + } } #[cfg(test)] @@ -69,4 +86,14 @@ mod test { let mut stmt = db.prepare("INSERT INTO test (id, name, flag) VALUES (:id, :name, :flag)").unwrap(); stmt.named_execute(&[(":name", &"one")]).unwrap(); } + + #[test] + fn test_named_query() { + let db = SqliteConnection::open_in_memory().unwrap(); + let sql = "CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, flag INTEGER)"; + db.execute_batch(sql).unwrap(); + + let mut stmt = db.prepare("SELECT * FROM test where name = :name").unwrap(); + stmt.named_query(&[(":name", &"one")]).unwrap(); + } } \ No newline at end of file