kontrak_sqlite/
cursor.rs

1use ffi;
2use statement::{State, Statement};
3use {Result, Value};
4
5/// An iterator over rows.
6pub struct Cursor<'l> {
7    state: Option<State>,
8    values: Option<Vec<Value>>,
9    statement: Statement<'l>,
10}
11
12impl<'l> Cursor<'l> {
13    /// Bind values to all parameters.
14    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    /// 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(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    /// Return the raw pointer.
75    #[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}