diff --git a/Cargo.toml b/Cargo.toml index 562a745..f7987f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -132,6 +132,7 @@ lazy_static = "1.4" regex = "1.5.5" uuid = { version = "1.0", features = ["v4"] } unicase = "2.6.0" +ouroboros = "0.18" # Use `bencher` over criterion because it builds much faster and we don't have # many benchmarks bencher = "0.1" diff --git a/examples/owning_rows.rs b/examples/owning_rows.rs new file mode 100644 index 0000000..38ba3ff --- /dev/null +++ b/examples/owning_rows.rs @@ -0,0 +1,29 @@ +extern crate rusqlite; + +use ouroboros::self_referencing; +use rusqlite::{CachedStatement, Connection, Result, Rows}; + +#[self_referencing] +struct OwningRows<'conn> { + stmt: CachedStatement<'conn>, + #[borrows(mut stmt)] + #[covariant] + rows: Rows<'this>, +} + +fn main() -> Result<()> { + let conn = Connection::open_in_memory()?; + let stmt = conn.prepare_cached("SELECT 1")?; + let mut or = OwningRowsTryBuilder { + stmt, + rows_builder: |s| s.query([]), + } + .try_build()?; + or.with_rows_mut(|rows| -> Result<()> { + while let Some(row) = rows.next()? { + assert_eq!(Ok(1), row.get(0)); + } + Ok(()) + })?; + Ok(()) +}