mirror of
https://github.com/isar/rusqlite.git
synced 2025-04-01 03:22:58 +08:00
Merge pull request #53 from gwenn/exec_check
Extra check in SqliteStatement.execute
This commit is contained in:
commit
36f577aea6
25
src/lib.rs
25
src/lib.rs
@ -571,16 +571,18 @@ pub struct SqliteStatement<'conn> {
|
|||||||
conn: &'conn SqliteConnection,
|
conn: &'conn SqliteConnection,
|
||||||
stmt: *mut ffi::sqlite3_stmt,
|
stmt: *mut ffi::sqlite3_stmt,
|
||||||
needs_reset: bool,
|
needs_reset: bool,
|
||||||
|
column_count: c_int,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'conn> SqliteStatement<'conn> {
|
impl<'conn> SqliteStatement<'conn> {
|
||||||
fn new(conn: &SqliteConnection, stmt: *mut ffi::sqlite3_stmt) -> SqliteStatement {
|
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.
|
/// Get all the column names in the result set of the prepared statement.
|
||||||
pub fn column_names(&self) -> Vec<&str> {
|
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);
|
let mut cols = Vec::with_capacity(n as usize);
|
||||||
for i in 0..n {
|
for i in 0..n {
|
||||||
let slice = unsafe {
|
let slice = unsafe {
|
||||||
@ -626,7 +628,14 @@ impl<'conn> SqliteStatement<'conn> {
|
|||||||
self.needs_reset = true;
|
self.needs_reset = true;
|
||||||
let r = ffi::sqlite3_step(self.stmt);
|
let r = ffi::sqlite3_step(self.stmt);
|
||||||
match r {
|
match r {
|
||||||
ffi::SQLITE_DONE => Ok(self.conn.changes()),
|
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,
|
ffi::SQLITE_ROW => Err(SqliteError{ code: r,
|
||||||
message: "Unexpected row result - did you mean to call query?".to_string() }),
|
message: "Unexpected row result - did you mean to call query?".to_string() }),
|
||||||
_ => Err(self.conn.decode_result(r).unwrap_err()),
|
_ => Err(self.conn.decode_result(r).unwrap_err()),
|
||||||
@ -895,7 +904,7 @@ impl<'stmt> SqliteRow<'stmt> {
|
|||||||
message: "Cannot get values from a row after advancing to next row".to_string() });
|
message: "Cannot get values from a row after advancing to next row".to_string() });
|
||||||
}
|
}
|
||||||
unsafe {
|
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,
|
return Err(SqliteError{ code: ffi::SQLITE_MISUSE,
|
||||||
message: "Invalid column index".to_string() });
|
message: "Invalid column index".to_string() });
|
||||||
}
|
}
|
||||||
@ -993,6 +1002,14 @@ mod test {
|
|||||||
assert_eq!(3i32, db.query_row("SELECT SUM(x) FROM foo", &[], |r| r.get(0)).unwrap());
|
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_MISUSE);
|
||||||
|
assert!(err.message == "Unexpected column count - did you mean to call query?");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_prepare_column_names() {
|
fn test_prepare_column_names() {
|
||||||
let db = checked_memory_handle();
|
let db = checked_memory_handle();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user