mirror of
https://github.com/isar/rusqlite.git
synced 2025-08-19 12:29:34 +08:00
Merge pull request #1462 from gwenn/owning
OwningRows / OwningStatement examples
This commit is contained in:
29
examples/owning_rows.rs
Normal file
29
examples/owning_rows.rs
Normal file
@@ -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(())
|
||||
}
|
27
examples/owning_rows_self_cell.rs
Normal file
27
examples/owning_rows_self_cell.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
extern crate rusqlite;
|
||||
|
||||
use rusqlite::{CachedStatement, Connection, Result, Rows};
|
||||
use self_cell::{self_cell, MutBorrow};
|
||||
|
||||
type RowsRef<'a> = Rows<'a>;
|
||||
|
||||
self_cell!(
|
||||
struct OwningRows<'conn> {
|
||||
owner: MutBorrow<CachedStatement<'conn>>,
|
||||
#[covariant]
|
||||
dependent: RowsRef,
|
||||
}
|
||||
);
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let conn = Connection::open_in_memory()?;
|
||||
let stmt = conn.prepare_cached("SELECT 1")?;
|
||||
let mut or = OwningRows::try_new(MutBorrow::new(stmt), |s| s.borrow_mut().query([]))?;
|
||||
or.with_dependent_mut(|_stmt, rows| -> Result<()> {
|
||||
while let Some(row) = rows.next()? {
|
||||
assert_eq!(Ok(1), row.get(0));
|
||||
}
|
||||
Ok(())
|
||||
})?;
|
||||
Ok(())
|
||||
}
|
30
examples/owning_statement.rs
Normal file
30
examples/owning_statement.rs
Normal file
@@ -0,0 +1,30 @@
|
||||
extern crate rusqlite;
|
||||
use ouroboros::self_referencing;
|
||||
use rusqlite::{CachedStatement, Connection, Result, Rows};
|
||||
|
||||
/// Caveat: single statement at a time for one connection.
|
||||
/// But if you need multiple statements, you can still create your own struct
|
||||
/// with multiple fields (one for each statement).
|
||||
#[self_referencing]
|
||||
struct OwningStatement {
|
||||
conn: Connection,
|
||||
#[borrows(conn)]
|
||||
#[covariant]
|
||||
stmt: CachedStatement<'this>,
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let conn = Connection::open_in_memory()?;
|
||||
|
||||
let mut os = OwningStatementTryBuilder {
|
||||
conn,
|
||||
stmt_builder: |c| c.prepare_cached("SELECT 1"),
|
||||
}
|
||||
.try_build()?;
|
||||
|
||||
let mut rows = os.with_stmt_mut(|stmt| -> Result<Rows<'_>> { stmt.query([]) })?;
|
||||
while let Some(row) = rows.next()? {
|
||||
assert_eq!(Ok(1), row.get(0));
|
||||
}
|
||||
Ok(())
|
||||
}
|
Reference in New Issue
Block a user