From 7dbc3175f93903a694f47840ab82945590420430 Mon Sep 17 00:00:00 2001 From: gwenn Date: Sun, 3 Mar 2024 18:15:22 +0100 Subject: [PATCH 1/6] Add example of OwningRows using Ouroboros --- Cargo.toml | 1 + examples/owning_rows.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 examples/owning_rows.rs 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(()) +} From 950b73e2de28fd3492772383d31cc9d01391df1a Mon Sep 17 00:00:00 2001 From: gwenn Date: Sun, 3 Mar 2024 19:04:16 +0100 Subject: [PATCH 2/6] Add example of OwningStatement using ouroboros --- examples/owning_statement.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 examples/owning_statement.rs diff --git a/examples/owning_statement.rs b/examples/owning_statement.rs new file mode 100644 index 0000000..544edaa --- /dev/null +++ b/examples/owning_statement.rs @@ -0,0 +1,27 @@ +extern crate rusqlite; +use ouroboros::self_referencing; +use rusqlite::{CachedStatement, Connection, Result, Rows}; + +#[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> { stmt.query([]) })?; + while let Some(row) = rows.next()? { + assert_eq!(Ok(1), row.get(0)); + } + Ok(()) +} From 05699d38cea47039f264e42809f8dddea9968385 Mon Sep 17 00:00:00 2001 From: gwenn Date: Sun, 3 Mar 2024 19:53:10 +0100 Subject: [PATCH 3/6] Make codecov ignore examples --- codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codecov.yml b/codecov.yml index 7a4789e..639cb2b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,4 +1,5 @@ ignore: + - "examples" - "libsqlite3-sys/bindgen-bindings" - "libsqlite3-sys/sqlite3" coverage: From ee17272a041136ef083342f967bec80783f9d272 Mon Sep 17 00:00:00 2001 From: gwenn Date: Sat, 9 Mar 2024 11:54:37 +0100 Subject: [PATCH 4/6] Owning statement caveat --- examples/owning_statement.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/owning_statement.rs b/examples/owning_statement.rs index 544edaa..cc45c33 100644 --- a/examples/owning_statement.rs +++ b/examples/owning_statement.rs @@ -2,6 +2,9 @@ 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, From 93787c68551f8526cd5cec71d0a9967814f94e7e Mon Sep 17 00:00:00 2001 From: gwenn Date: Sun, 29 Sep 2024 16:06:36 +0200 Subject: [PATCH 5/6] Add example of OwningRows using self_cell --- Cargo.toml | 1 + examples/owning_rows_self_cell.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 examples/owning_rows_self_cell.rs diff --git a/Cargo.toml b/Cargo.toml index 99b6d7c..9318b6b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -146,6 +146,7 @@ regex = "1.5.5" uuid = { version = "1.0", features = ["v4"] } unicase = "2.6.0" ouroboros = "0.18" +self_cell = { git = "https://github.com/Voultapher/self_cell.git" } # 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_self_cell.rs b/examples/owning_rows_self_cell.rs new file mode 100644 index 0000000..1e42212 --- /dev/null +++ b/examples/owning_rows_self_cell.rs @@ -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>, + #[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(()) +} From 447e9daef994ff11de93f1f8feb79dce8cbe90b7 Mon Sep 17 00:00:00 2001 From: gwenn Date: Fri, 6 Dec 2024 18:30:43 +0100 Subject: [PATCH 6/6] Bump self_cell version to 1.1.0 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9318b6b..b6b77f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -146,7 +146,7 @@ regex = "1.5.5" uuid = { version = "1.0", features = ["v4"] } unicase = "2.6.0" ouroboros = "0.18" -self_cell = { git = "https://github.com/Voultapher/self_cell.git" } +self_cell = "1.1.0" # Use `bencher` over criterion because it builds much faster, # and we don't have many benchmarks bencher = "0.1"