sqlite_tiny/api/
answer.rs1use crate::{
4 api::{
5 row::Row,
6 types::{PointerMut, PointerMutFlex},
7 },
8 err,
9 error::Error,
10 ffi, Sqlite,
11};
12
13#[derive(Debug)]
15pub struct Answer<'db> {
16 pub(in crate::api) sqlite: &'db Sqlite,
18 pub(in crate::api) raw: PointerMut<ffi::sqlite3_stmt>,
20 pub(in crate::api) has_row: bool,
22}
23impl Answer<'_> {
24 pub fn row(mut self) -> Result<Row<'static>, Error> {
26 if !self.has_row {
28 self.step()?;
30 }
31
32 if !self.has_row {
34 return Err(err!("No result row available"));
36 }
37
38 let row = Row { raw: PointerMutFlex::Owned(self.raw) };
40 Ok(row)
41 }
42
43 pub fn next_row(&mut self) -> Result<Option<Row>, Error> {
45 if !self.has_row {
47 self.step()?;
49 }
50
51 if !self.has_row {
53 return Ok(None);
55 }
56
57 let row = Row { raw: PointerMutFlex::Borrowed(&mut self.raw) };
59 self.has_row = false;
60 Ok(Some(row))
61 }
62
63 pub(in crate::api) fn step(&mut self) -> Result<(), Error> {
65 let retval = unsafe { ffi::sqlite3_step(self.raw.as_ptr()) };
67 let true = matches!(retval, ffi::SQLITE_ROW | ffi::SQLITE_DONE) else {
68 return Err(unsafe { ffi::sqlite3_last_error(retval, self.sqlite.raw.as_ptr()) });
70 };
71
72 self.has_row = retval == ffi::SQLITE_ROW;
74 Ok(())
75 }
76}