use crate::api::ffiext::{self, PointerMut, PointerMutFlex};
use crate::api::row::Row;
use crate::error::Error;
use crate::{err, ffi, Sqlite};
#[derive(Debug)]
pub struct Answer<'db> {
pub(in crate::api) sqlite: &'db Sqlite,
pub(in crate::api) raw: PointerMut<ffi::sqlite3_stmt>,
pub(in crate::api) has_row: bool,
}
impl Answer<'_> {
pub fn row(mut self) -> Result<Row<'static>, Error> {
if !self.has_row {
self.step()?;
}
if !self.has_row {
return Err(err!("No result row available"));
}
let row = Row { raw: PointerMutFlex::Owned(self.raw) };
Ok(row)
}
pub fn next_row<'a>(&'a mut self) -> Result<Option<Row<'a>>, Error> {
if !self.has_row {
self.step()?;
}
if !self.has_row {
return Ok(None);
}
let row = Row { raw: PointerMutFlex::Borrowed(&mut self.raw) };
self.has_row = false;
Ok(Some(row))
}
pub(in crate::api) fn step(&mut self) -> Result<(), Error> {
let retval = unsafe { ffi::sqlite3_step(self.raw.as_ptr()) };
let true = matches!(retval, ffi::SQLITE_ROW | ffi::SQLITE_DONE) else {
return Err(unsafe { ffiext::sqlite3_last_error(retval, self.sqlite.raw.as_ptr()) });
};
self.has_row = retval == ffi::SQLITE_ROW;
Ok(())
}
}