sqlite_tiny/api/
answer.rs1use crate::api::ffiext::{self, PointerMut, PointerMutFlex};
4use crate::api::row::Row;
5use crate::error::Error;
6use crate::{err, ffi, Sqlite};
7
8#[derive(Debug)]
10pub struct Answer<'db> {
11 pub(in crate::api) sqlite: &'db Sqlite,
13 pub(in crate::api) raw: PointerMut<ffi::sqlite3_stmt>,
15 pub(in crate::api) has_row: bool,
17}
18impl Answer<'_> {
19 pub fn row(mut self) -> Result<Row<'static>, Error> {
21 if !self.has_row {
23 self.step()?;
25 }
26
27 if !self.has_row {
29 return Err(err!("No result row available"));
31 }
32
33 let row = Row { raw: PointerMutFlex::Owned(self.raw) };
35 Ok(row)
36 }
37
38 pub fn next_row(&mut self) -> Result<Option<Row>, Error> {
40 if !self.has_row {
42 self.step()?;
44 }
45
46 if !self.has_row {
48 return Ok(None);
50 }
51
52 let row = Row { raw: PointerMutFlex::Borrowed(&mut self.raw) };
54 self.has_row = false;
55 Ok(Some(row))
56 }
57
58 pub(in crate::api) fn step(&mut self) -> Result<(), Error> {
60 let retval = unsafe { ffi::sqlite3_step(self.raw.as_ptr()) };
62 let true = matches!(retval, ffi::SQLITE_ROW | ffi::SQLITE_DONE) else {
63 return Err(unsafe { ffiext::sqlite3_last_error(retval, self.sqlite.raw.as_ptr()) });
65 };
66
67 self.has_row = retval == ffi::SQLITE_ROW;
69 Ok(())
70 }
71}