fce_sqlite_connector/
cursor.rs1use sqlite3_connector as ffi;
2use statement::{State, Statement};
3use {Result, Value};
4
5pub struct Cursor {
7 state: Option<State>,
8 values: Option<Vec<Value>>,
9 statement: Statement,
10}
11
12impl Cursor {
13 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 #[inline]
25 pub fn count(&self) -> usize {
26 self.statement.count()
27 }
28
29 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 #[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}