pub struct Rows { /* private fields */ }Expand description
Iterator of typed Row values produced by a SELECT query.
Today Rows is backed by an eager Vec<Vec<Value>> — the cursor
abstraction in Phase 5a’s follow-up will swap this for a lazy
walker that streams rows off the B-Tree without materializing
them upfront. The Rows::next API is designed for that: it
returns Result<Option<Row>> rather than Option<Result<Row>>,
so a mid-stream I/O error surfaces cleanly.
Implementations§
Source§impl Rows
impl Rows
Sourcepub fn next(&mut self) -> Result<Option<Row<'_>>>
pub fn next(&mut self) -> Result<Option<Row<'_>>>
Advances to the next row. Returns Ok(None) when the query is
exhausted, Ok(Some(row)) otherwise, Err(_) on an I/O or
decode failure (relevant once Phase 5a’s cursor work lands —
today this is always Ok(_)).
Examples found in repository?
14fn main() -> Result<()> {
15 let mut conn = Connection::open_in_memory()?;
16
17 conn.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);")?;
18 conn.execute("INSERT INTO users (name, age) VALUES ('alice', 30);")?;
19 conn.execute("INSERT INTO users (name, age) VALUES ('bob', 25);")?;
20 conn.execute("INSERT INTO users (name, age) VALUES ('charlie', 40);")?;
21
22 println!("All users:");
23 let stmt = conn.prepare("SELECT id, name, age FROM users;")?;
24 let mut rows = stmt.query()?;
25 while let Some(row) = rows.next()? {
26 let id: i64 = row.get_by_name("id")?;
27 let name: String = row.get_by_name("name")?;
28 // `Option<i64>` wraps NULL cleanly — `age` is declared
29 // nullable so the typed accessor surfaces None when absent.
30 let age: Option<i64> = row.get_by_name("age")?;
31 println!(
32 " {} — {} ({})",
33 id,
34 name,
35 age.map(|a| a.to_string())
36 .unwrap_or_else(|| "NULL".to_string())
37 );
38 }
39
40 // Transactions: BEGIN + INSERT + ROLLBACK leaves the table untouched.
41 conn.execute("BEGIN;")?;
42 conn.execute("INSERT INTO users (name, age) VALUES ('will_vanish', 99);")?;
43 println!("\nMid-transaction row count: {}", count_users(&mut conn)?);
44 conn.execute("ROLLBACK;")?;
45 println!(
46 "Post-rollback row count: {} (unchanged)",
47 count_users(&mut conn)?
48 );
49
50 Ok(())
51}Sourcepub fn collect_all(self) -> Result<Vec<OwnedRow>>
pub fn collect_all(self) -> Result<Vec<OwnedRow>>
Collects every remaining row into a Vec<Row>. Convenient for
small result sets; avoid on large queries — that’s what the
streaming Rows::next API is for.