Rename SqliteRow -> Row.

This commit is contained in:
John Gallagher 2015-12-12 14:11:24 -05:00
parent b932640181
commit ea5cb41bbf
4 changed files with 23 additions and 19 deletions

View File

@ -6,6 +6,7 @@
* `SqliteResult` is now `Result` * `SqliteResult` is now `Result`
* `SqliteStatement` is now `Statement` * `SqliteStatement` is now `Statement`
* `SqliteRows` is now `Rows` * `SqliteRows` is now `Rows`
* `SqliteRow` is now `Row`
The old, prefixed names are still exported should be considered deprecated. The old, prefixed names are still exported should be considered deprecated.
* Adds a variety of `..._named` methods for executing queries using named placeholder parameters. * Adds a variety of `..._named` methods for executing queries using named placeholder parameters.
* Adds `backup` feature that exposes SQLite's online backup API. * Adds `backup` feature that exposes SQLite's online backup API.

View File

@ -56,7 +56,7 @@ fn main() {
} }
``` ```
### Design of SqliteRows and SqliteRow ### Design of Rows and Row
To retrieve the result rows from a query, SQLite requires you to call To retrieve the result rows from a query, SQLite requires you to call
[sqlite3_step()](https://www.sqlite.org/c3ref/step.html) on a prepared statement. You can only [sqlite3_step()](https://www.sqlite.org/c3ref/step.html) on a prepared statement. You can only
@ -67,7 +67,7 @@ satisfy the [Iterator](http://doc.rust-lang.org/std/iter/trait.Iterator.html) tr
you cannot (as easily) loop over the rows, or use many of the helpful Iterator methods like `map` you cannot (as easily) loop over the rows, or use many of the helpful Iterator methods like `map`
and `filter`. and `filter`.
Instead, Rusqlite's `SqliteRows` handle does conform to `Iterator`. It ensures safety by Instead, Rusqlite's `Rows` handle does conform to `Iterator`. It ensures safety by
performing checks at runtime to ensure you do not try to retrieve the values of a "stale" row, and performing checks at runtime to ensure you do not try to retrieve the values of a "stale" row, and
will panic if you do so. A specific example that will panic: will panic if you do so. A specific example that will panic:
@ -88,7 +88,7 @@ fn bad_function_will_panic(conn: &Connection) -> Result<i64> {
``` ```
There are other, less obvious things that may result in a panic as well, such as calling There are other, less obvious things that may result in a panic as well, such as calling
`collect()` on a `SqliteRows` and then trying to use the collected rows. `collect()` on a `Rows` and then trying to use the collected rows.
Strongly consider using the method `query_map()` instead, if you can. Strongly consider using the method `query_map()` instead, if you can.
`query_map()` returns an iterator over rows-mapped-to-some-type. This `query_map()` returns an iterator over rows-mapped-to-some-type. This

View File

@ -379,7 +379,7 @@ impl Connection {
/// Will return `Err` if `sql` cannot be converted to a C-compatible string or if the /// Will return `Err` if `sql` cannot be converted to a C-compatible string or if the
/// underlying SQLite call fails. /// underlying SQLite call fails.
pub fn query_row<T, F>(&self, sql: &str, params: &[&ToSql], f: F) -> Result<T> pub fn query_row<T, F>(&self, sql: &str, params: &[&ToSql], f: F) -> Result<T>
where F: FnOnce(SqliteRow) -> T where F: FnOnce(Row) -> 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));
@ -409,7 +409,7 @@ impl Connection {
/// Will return `Err` if `sql` cannot be converted to a C-compatible string or if the /// Will return `Err` if `sql` cannot be converted to a C-compatible string or if the
/// underlying SQLite call fails. /// underlying SQLite call fails.
pub fn query_row_and_then<T, E, F>(&self, sql: &str, params: &[&ToSql], f: F) -> result::Result<T, E> pub fn query_row_and_then<T, E, F>(&self, sql: &str, params: &[&ToSql], f: F) -> result::Result<T, E>
where F: FnOnce(SqliteRow) -> result::Result<T, E>, where F: FnOnce(Row) -> result::Result<T, E>,
E: convert::From<Error> E: convert::From<Error>
{ {
let mut stmt = try!(self.prepare(sql)); let mut stmt = try!(self.prepare(sql));
@ -438,7 +438,7 @@ impl Connection {
/// This method should be considered deprecated. Use `query_row` instead, which now /// This method should be considered deprecated. Use `query_row` instead, which now
/// does exactly the same thing. /// does exactly the same thing.
pub fn query_row_safe<T, F>(&self, sql: &str, params: &[&ToSql], f: F) -> Result<T> pub fn query_row_safe<T, F>(&self, sql: &str, params: &[&ToSql], f: F) -> Result<T>
where F: FnOnce(SqliteRow) -> T where F: FnOnce(Row) -> T
{ {
self.query_row(sql, params, f) self.query_row(sql, params, f)
} }
@ -865,7 +865,7 @@ impl<'conn> Statement<'conn> {
params: &[&ToSql], params: &[&ToSql],
f: F) f: F)
-> Result<MappedRows<'a, F>> -> Result<MappedRows<'a, F>>
where F: FnMut(&SqliteRow) -> T where F: FnMut(&Row) -> T
{ {
let row_iter = try!(self.query(params)); let row_iter = try!(self.query(params));
@ -890,7 +890,7 @@ impl<'conn> Statement<'conn> {
f: F) f: F)
-> Result<AndThenRows<'a, F>> -> Result<AndThenRows<'a, F>>
where E: convert::From<Error>, where E: convert::From<Error>,
F: FnMut(&SqliteRow) -> result::Result<T, E> F: FnMut(&Row) -> result::Result<T, E>
{ {
let row_iter = try!(self.query(params)); let row_iter = try!(self.query(params));
@ -968,7 +968,7 @@ pub struct MappedRows<'stmt, F> {
map: F, map: F,
} }
impl<'stmt, T, F> Iterator for MappedRows<'stmt, F> where F: FnMut(&SqliteRow) -> T impl<'stmt, T, F> Iterator for MappedRows<'stmt, F> where F: FnMut(&Row) -> T
{ {
type Item = Result<T>; type Item = Result<T>;
@ -986,7 +986,7 @@ pub struct AndThenRows<'stmt, F> {
impl<'stmt, T, E, F> Iterator for AndThenRows<'stmt, F> impl<'stmt, T, E, F> Iterator for AndThenRows<'stmt, F>
where E: convert::From<Error>, where E: convert::From<Error>,
F: FnMut(&SqliteRow) -> result::Result<T, E> F: FnMut(&Row) -> result::Result<T, E>
{ {
type Item = result::Result<T, E>; type Item = result::Result<T, E>;
@ -1051,7 +1051,7 @@ impl<'stmt> Rows<'stmt> {
} }
} }
fn get_expected_row(&mut self) -> Result<SqliteRow<'stmt>> { fn get_expected_row(&mut self) -> Result<Row<'stmt>> {
match self.next() { match self.next() {
Some(row) => row, Some(row) => row,
None => { None => {
@ -1065,9 +1065,9 @@ impl<'stmt> Rows<'stmt> {
} }
impl<'stmt> Iterator for Rows<'stmt> { impl<'stmt> Iterator for Rows<'stmt> {
type Item = Result<SqliteRow<'stmt>>; type Item = Result<Row<'stmt>>;
fn next(&mut self) -> Option<Result<SqliteRow<'stmt>>> { fn next(&mut self) -> Option<Result<Row<'stmt>>> {
if self.failed { if self.failed {
return None; return None;
} }
@ -1075,7 +1075,7 @@ impl<'stmt> Iterator for Rows<'stmt> {
ffi::SQLITE_ROW => { ffi::SQLITE_ROW => {
let current_row = self.current_row.get() + 1; let current_row = self.current_row.get() + 1;
self.current_row.set(current_row); self.current_row.set(current_row);
Some(Ok(SqliteRow { Some(Ok(Row {
stmt: self.stmt, stmt: self.stmt,
current_row: self.current_row.clone(), current_row: self.current_row.clone(),
row_idx: current_row, row_idx: current_row,
@ -1090,17 +1090,20 @@ impl<'stmt> Iterator for Rows<'stmt> {
} }
} }
/// Old name for `Row`. `SqliteRow` is deprecated.
pub type SqliteRow<'stmt> = Row<'stmt>;
/// A single result row of a query. /// A single result row of a query.
pub struct SqliteRow<'stmt> { pub struct Row<'stmt> {
stmt: &'stmt Statement<'stmt>, stmt: &'stmt Statement<'stmt>,
current_row: Rc<Cell<c_int>>, current_row: Rc<Cell<c_int>>,
row_idx: c_int, row_idx: c_int,
} }
impl<'stmt> SqliteRow<'stmt> { impl<'stmt> Row<'stmt> {
/// Get the value of a particular column of the result row. /// Get the value of a particular column of the result row.
/// ///
/// Note that `SqliteRow` can panic at runtime if you use it incorrectly. When you are /// Note that `Row` can panic at runtime if you use it incorrectly. When you are
/// retrieving the rows of a query, a row becomes stale once you have requested the next row, /// retrieving the rows of a query, a row becomes stale once you have requested the next row,
/// and the values can no longer be retrieved. In general (when using looping over the rows, /// and the values can no longer be retrieved. In general (when using looping over the rows,
/// for example) this isn't an issue, but it means you cannot do something like this: /// for example) this isn't an issue, but it means you cannot do something like this:

View File

@ -2,7 +2,7 @@ use libc::c_int;
use super::ffi; use super::ffi;
use {Result, Error, Connection, Statement, Rows, SqliteRow, str_to_cstring}; use {Result, Error, Connection, Statement, Rows, Row, str_to_cstring};
use types::ToSql; use types::ToSql;
impl Connection { impl Connection {
@ -42,7 +42,7 @@ impl Connection {
params: &[(&str, &ToSql)], params: &[(&str, &ToSql)],
f: F) f: F)
-> Result<T> -> Result<T>
where F: FnOnce(SqliteRow) -> T where F: FnOnce(Row) -> T
{ {
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));