Refactor: Extract match to get an expected row into its own method.

This commit is contained in:
John Gallagher 2015-12-10 20:48:38 -05:00
parent b7468b2c4b
commit 0051ff47a6
2 changed files with 23 additions and 35 deletions

View File

@ -369,20 +369,12 @@ impl SqliteConnection {
/// underlying SQLite call fails. /// underlying SQLite call fails.
pub fn query_row<T, F>(&self, sql: &str, params: &[&ToSql], f: F) -> SqliteResult<T> pub fn query_row<T, F>(&self, sql: &str, params: &[&ToSql], f: F) -> SqliteResult<T>
where F: FnOnce(SqliteRow) -> T where F: FnOnce(SqliteRow) -> T
{ {
let mut stmt = try!(self.prepare(sql)); let mut stmt = try!(self.prepare(sql));
let mut rows = try!(stmt.query(params)); let mut rows = try!(stmt.query(params));
match rows.next() { rows.get_expected_row().map(f)
Some(row) => row.map(f), }
None => {
Err(SqliteError {
code: ffi::SQLITE_NOTICE,
message: "Query did not return a row".to_string(),
})
}
}
}
/// Convenience method to execute a query that is expected to return a single row, /// Convenience method to execute a query that is expected to return a single row,
/// and execute a mapping via `f` on that returned row with the possibility of failure. /// and execute a mapping via `f` on that returned row with the possibility of failure.
@ -408,20 +400,12 @@ impl SqliteConnection {
pub fn query_row_and_then<T, E, F>(&self, sql: &str, params: &[&ToSql], f: F) -> Result<T, E> pub fn query_row_and_then<T, E, F>(&self, sql: &str, params: &[&ToSql], f: F) -> Result<T, E>
where F: FnOnce(SqliteRow) -> Result<T, E>, where F: FnOnce(SqliteRow) -> Result<T, E>,
E: convert::From<SqliteError> E: convert::From<SqliteError>
{ {
let mut stmt = try!(self.prepare(sql)); let mut stmt = try!(self.prepare(sql));
let mut rows = try!(stmt.query(params)); let mut rows = try!(stmt.query(params));
match rows.next() { rows.get_expected_row().map_err(E::from).and_then(f)
Some(row) => row.map_err(E::from).and_then(f), }
None => {
Err(E::from(SqliteError {
code: ffi::SQLITE_NOTICE,
message: "Query did not return a row".to_string(),
}))
}
}
}
/// Convenience method to execute a query that is expected to return a single row. /// Convenience method to execute a query that is expected to return a single row.
/// ///
@ -1049,6 +1033,18 @@ impl<'stmt> SqliteRows<'stmt> {
failed: false, failed: false,
} }
} }
fn get_expected_row(&mut self) -> SqliteResult<SqliteRow<'stmt>> {
match self.next() {
Some(row) => row,
None => {
Err(SqliteError {
code: ffi::SQLITE_NOTICE,
message: "Query did not return a row".to_string(),
})
}
}
}
} }
impl<'stmt> Iterator for SqliteRows<'stmt> { impl<'stmt> Iterator for SqliteRows<'stmt> {

View File

@ -48,15 +48,7 @@ impl SqliteConnection {
let mut stmt = try!(self.prepare(sql)); let mut stmt = try!(self.prepare(sql));
let mut rows = try!(stmt.query_named(params)); let mut rows = try!(stmt.query_named(params));
match rows.next() { rows.get_expected_row().map(f)
Some(row) => row.map(f),
None => {
Err(SqliteError {
code: ffi::SQLITE_NOTICE,
message: "Query did not return a row".to_string(),
})
}
}
} }
} }