From 1dc144c8c1ba68155ecb82967523057093e9bf83 Mon Sep 17 00:00:00 2001 From: gwenn Date: Sat, 1 Aug 2015 08:09:59 +0200 Subject: [PATCH 1/3] Add test_execute_select. --- src/lib.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f98780b..cd83fe2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -580,7 +580,7 @@ impl<'conn> SqliteStatement<'conn> { /// Get all the column names in the result set of the prepared statement. pub fn column_names(&self) -> Vec<&str> { - let n = unsafe { ffi::sqlite3_column_count(self.stmt) }; + let n = self.column_count(); let mut cols = Vec::with_capacity(n as usize); for i in 0..n { let slice = unsafe { @@ -625,11 +625,13 @@ impl<'conn> SqliteStatement<'conn> { self.needs_reset = true; let r = ffi::sqlite3_step(self.stmt); - match r { - ffi::SQLITE_DONE => Ok(self.conn.changes()), - ffi::SQLITE_ROW => Err(SqliteError{ code: r, - message: "Unexpected row result - did you mean to call query?".to_string() }), - _ => Err(self.conn.decode_result(r).unwrap_err()), + if r == ffi::SQLITE_ROW || self.column_count() != 0 { + Err(SqliteError{ code: r, + message: "Unexpected row result - did you mean to call query?".to_string() }) + } else if r == ffi::SQLITE_DONE { + Ok(self.conn.changes()) + } else { + Err(self.conn.decode_result(r).unwrap_err()) } } } @@ -710,6 +712,10 @@ impl<'conn> SqliteStatement<'conn> { } } + fn column_count(&self) -> c_int { + unsafe { ffi::sqlite3_column_count(self.stmt) } + } + fn finalize_(&mut self) -> SqliteResult<()> { let r = unsafe { ffi::sqlite3_finalize(self.stmt) }; self.stmt = ptr::null_mut(); @@ -895,7 +901,7 @@ impl<'stmt> SqliteRow<'stmt> { message: "Cannot get values from a row after advancing to next row".to_string() }); } unsafe { - if idx < 0 || idx >= ffi::sqlite3_column_count(self.stmt.stmt) { + if idx < 0 || idx >= self.stmt.column_count() { return Err(SqliteError{ code: ffi::SQLITE_MISUSE, message: "Invalid column index".to_string() }); } @@ -993,6 +999,14 @@ mod test { assert_eq!(3i32, db.query_row("SELECT SUM(x) FROM foo", &[], |r| r.get(0)).unwrap()); } + #[test] + fn test_execute_select() { + let db = checked_memory_handle(); + let err = db.execute("SELECT 1 WHERE 1 < ?", &[&1i32]).unwrap_err(); + assert!(err.code == ffi::SQLITE_DONE); + assert!(err.message == "Unexpected row result - did you mean to call query?"); + } + #[test] fn test_prepare_column_names() { let db = checked_memory_handle(); From c31c68d5e3acb41106680c54a0757ae06187f65b Mon Sep 17 00:00:00 2001 From: gwenn Date: Sat, 1 Aug 2015 09:11:31 +0200 Subject: [PATCH 2/3] Only check column count when DONE. --- src/lib.rs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index cd83fe2..9ef89c3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -625,13 +625,18 @@ impl<'conn> SqliteStatement<'conn> { self.needs_reset = true; let r = ffi::sqlite3_step(self.stmt); - if r == ffi::SQLITE_ROW || self.column_count() != 0 { - Err(SqliteError{ code: r, - message: "Unexpected row result - did you mean to call query?".to_string() }) - } else if r == ffi::SQLITE_DONE { - Ok(self.conn.changes()) - } else { - Err(self.conn.decode_result(r).unwrap_err()) + match r { + ffi::SQLITE_DONE => { + if self.column_count() != 0 { + Err(SqliteError{ code: ffi::SQLITE_MISUSE, + message: "Unexpected column count - did you mean to call query?".to_string() }) + } else { + Ok(self.conn.changes()) + } + }, + ffi::SQLITE_ROW => Err(SqliteError{ code: r, + message: "Unexpected row result - did you mean to call query?".to_string() }), + _ => Err(self.conn.decode_result(r).unwrap_err()), } } } @@ -1003,8 +1008,8 @@ mod test { fn test_execute_select() { let db = checked_memory_handle(); let err = db.execute("SELECT 1 WHERE 1 < ?", &[&1i32]).unwrap_err(); - assert!(err.code == ffi::SQLITE_DONE); - assert!(err.message == "Unexpected row result - did you mean to call query?"); + assert!(err.code == ffi::SQLITE_MISUSE); + assert!(err.message == "Unexpected column count - did you mean to call query?"); } #[test] From f91db1b3503a8186d08f797ae0a3e32f2d9129a9 Mon Sep 17 00:00:00 2001 From: gwenn Date: Sat, 1 Aug 2015 10:08:28 +0200 Subject: [PATCH 3/3] Cache column_count (I am not sure it's worth it) --- src/lib.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9ef89c3..0435cb3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -571,16 +571,18 @@ pub struct SqliteStatement<'conn> { conn: &'conn SqliteConnection, stmt: *mut ffi::sqlite3_stmt, needs_reset: bool, + column_count: c_int, } impl<'conn> SqliteStatement<'conn> { fn new(conn: &SqliteConnection, stmt: *mut ffi::sqlite3_stmt) -> SqliteStatement { - SqliteStatement{ conn: conn, stmt: stmt, needs_reset: false } + SqliteStatement{ conn: conn, stmt: stmt, needs_reset: false, + column_count: unsafe { ffi::sqlite3_column_count(stmt) }} } /// Get all the column names in the result set of the prepared statement. pub fn column_names(&self) -> Vec<&str> { - let n = self.column_count(); + let n = self.column_count; let mut cols = Vec::with_capacity(n as usize); for i in 0..n { let slice = unsafe { @@ -627,7 +629,7 @@ impl<'conn> SqliteStatement<'conn> { let r = ffi::sqlite3_step(self.stmt); match r { ffi::SQLITE_DONE => { - if self.column_count() != 0 { + if self.column_count != 0 { Err(SqliteError{ code: ffi::SQLITE_MISUSE, message: "Unexpected column count - did you mean to call query?".to_string() }) } else { @@ -717,10 +719,6 @@ impl<'conn> SqliteStatement<'conn> { } } - fn column_count(&self) -> c_int { - unsafe { ffi::sqlite3_column_count(self.stmt) } - } - fn finalize_(&mut self) -> SqliteResult<()> { let r = unsafe { ffi::sqlite3_finalize(self.stmt) }; self.stmt = ptr::null_mut(); @@ -906,7 +904,7 @@ impl<'stmt> SqliteRow<'stmt> { message: "Cannot get values from a row after advancing to next row".to_string() }); } unsafe { - if idx < 0 || idx >= self.stmt.column_count() { + if idx < 0 || idx >= self.stmt.column_count { return Err(SqliteError{ code: ffi::SQLITE_MISUSE, message: "Invalid column index".to_string() }); }