Skip to main content

stress_mixed/
stress_mixed.rs

1use std::time::Instant;
2
3use cartel_sqlite::{Connection, params};
4
5fn main() -> cartel_sqlite::Result<()> {
6    let iterations: usize = std::env::args()
7        .nth(1)
8        .and_then(|v| v.parse().ok())
9        .unwrap_or(10_000);
10
11    let conn = Connection::open_in_memory()?;
12    conn.execute_batch("CREATE TABLE kv (id INTEGER PRIMARY KEY, v INTEGER NOT NULL)")?;
13
14    let started = Instant::now();
15    for i in 0..iterations {
16        let value = (i as i64) % 1024;
17        conn.execute("INSERT INTO kv (v) VALUES (?1)", params![value])?;
18
19        if i % 8 == 0 {
20            let count: i64 =
21                conn.query_row("SELECT COUNT(*) FROM kv WHERE v >= 0", [], |row| row.get(0))?;
22            assert!(count > 0, "expected positive row count");
23        }
24    }
25
26    let tx = conn.unchecked_transaction()?;
27    tx.execute("UPDATE kv SET v = v + 1 WHERE (id % 2) = 0", [])?;
28    tx.commit()?;
29
30    let elapsed = started.elapsed();
31    let throughput = iterations as f64 / elapsed.as_secs_f64();
32    println!(
33        "sqlite mixed stress: iterations={iterations} elapsed_ms={} throughput_ops_s={throughput:.0}",
34        elapsed.as_millis()
35    );
36    Ok(())
37}