1use ffi;
2use statement::{State, Statement};
3use {Result, Value};
4
5pub struct Cursor<'l> {
7 state: Option<State>,
8 values: Option<Vec<Value>>,
9 statement: Statement<'l>,
10}
11
12impl<'l> Cursor<'l> {
13 pub fn bind(&mut self, values: &[Value]) -> Result<()> {
15 self.state = None;
16 try!(self.statement.reset());
17 for (i, value) in values.iter().enumerate() {
18 try!(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(try!(self.statement.next()));
36 return self.next();
37 }
38 }
39 let values = match self.values.take() {
40 Some(mut values) => {
41 for (i, value) in values.iter_mut().enumerate() {
42 match value {
43 &mut Value::Binary(ref mut value) => {
44 *value = try!(self.statement.read(i));
45 }
46 &mut Value::Float(ref mut value) => {
47 *value = try!(self.statement.read(i));
48 }
49 &mut Value::Integer(ref mut value) => {
50 *value = try!(self.statement.read(i));
51 }
52 &mut Value::String(ref mut value) => {
53 *value = try!(self.statement.read(i));
54 }
55 &mut Value::Null => {}
56 }
57 }
58 values
59 }
60 _ => {
61 let count = self.statement.count();
62 let mut values = Vec::with_capacity(count);
63 for i in 0..count {
64 values.push(try!(self.statement.read(i)));
65 }
66 values
67 }
68 };
69 self.state = Some(try!(self.statement.next()));
70 self.values = Some(values);
71 Ok(Some(self.values.as_ref().unwrap()))
72 }
73
74 #[inline]
76 pub fn as_raw(&self) -> *mut ffi::sqlite3_stmt {
77 self.statement.as_raw()
78 }
79}
80
81#[inline]
82pub fn new<'l>(statement: Statement<'l>) -> Cursor<'l> {
83 Cursor {
84 state: None,
85 values: None,
86 statement: statement,
87 }
88}