fce_sqlite_connector/
cursor.rs

1use sqlite3_connector as ffi;
2use statement::{State, Statement};
3use {Result, Value};
4
5/// An iterator over rows.
6pub struct Cursor {
7    state: Option<State>,
8    values: Option<Vec<Value>>,
9    statement: Statement,
10}
11
12impl Cursor {
13    /// Bind values to all parameters.
14    pub fn bind(&mut self, values: &[Value]) -> Result<()> {
15        self.state = None;
16        self.statement.reset()?;
17        for (i, value) in values.iter().enumerate() {
18            self.statement.bind(i + 1, value)?;
19        }
20        Ok(())
21    }
22
23    /// Return the number of columns.
24    #[inline]
25    pub fn count(&self) -> usize {
26        self.statement.count()
27    }
28
29    /// Advance to the next row and read all columns.
30    pub fn next(&mut self) -> Result<Option<&[Value]>> {
31        match self.state {
32            Some(State::Row) => {}
33            Some(State::Done) => return Ok(None),
34            _ => {
35                self.state = Some(self.statement.next()?);
36                return self.next();
37            }
38        }
39        self.values = match self.values.take() {
40            Some(mut values) => {
41                for (i, value) in values.iter_mut().enumerate() {
42                    *value = self.statement.read(i)?;
43                }
44                Some(values)
45            }
46            _ => {
47                let count = self.statement.count();
48                let mut values = Vec::with_capacity(count);
49                for i in 0..count {
50                    values.push(self.statement.read(i)?);
51                }
52                Some(values)
53            }
54        };
55        self.state = Some(self.statement.next()?);
56        Ok(Some(self.values.as_ref().unwrap()))
57    }
58
59    /// Return the raw pointer.
60    #[inline]
61    pub fn as_raw(&self) -> ffi::Sqlite3StmtHandle {
62        self.statement.as_raw()
63    }
64}
65
66#[inline]
67pub fn new(statement: Statement) -> Cursor {
68    Cursor {
69        state: None,
70        values: None,
71        statement,
72    }
73}