use tegdb::{Database, Result, SqlValue};
use tempfile::NamedTempFile;
fn main() -> Result<()> {
println!("=== TegDB Prepared Statement Demo ===\n");
let temp_file = NamedTempFile::new().expect("Failed to create temp file");
let db_path = temp_file.path();
let mut db = Database::open(format!("file://{}", db_path.display()))?;
println!("✓ Database opened");
db.execute(
"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT(32), age INTEGER, city TEXT(32))",
)?;
println!("✓ Table created");
db.execute("INSERT INTO users (id, name, age, city) VALUES (1, 'Alice', 30, 'New York')")?;
db.execute("INSERT INTO users (id, name, age, city) VALUES (2, 'Bob', 25, 'Los Angeles')")?;
db.execute("INSERT INTO users (id, name, age, city) VALUES (3, 'Carol', 35, 'Chicago')")?;
db.execute("INSERT INTO users (id, name, age, city) VALUES (4, 'David', 28, 'New York')")?;
db.execute("INSERT INTO users (id, name, age, city) VALUES (5, 'Eve', 32, 'Boston')")?;
println!("✓ Test data inserted");
println!("\n1. Preparing SELECT statement with parameters...");
let select_stmt = db.prepare("SELECT name, age FROM users WHERE age > ?1 AND city = ?2")?;
println!(" → Prepared statement: {}", select_stmt.sql());
println!(" → Parameter count: {}", select_stmt.parameter_count());
println!("\n2. Executing prepared SELECT with parameters...");
let params1 = vec![
SqlValue::Integer(30),
SqlValue::Text("New York".to_string()),
];
let result1 = db.query_prepared(&select_stmt, ¶ms1)?;
println!(" → Query: age > 30 AND city = 'New York'");
println!(" → Found {} rows", result1.rows().len());
for row in result1.rows() {
println!(" {row:?}");
}
let params2 = vec![
SqlValue::Integer(25),
SqlValue::Text("Los Angeles".to_string()),
];
let result2 = db.query_prepared(&select_stmt, ¶ms2)?;
println!(" → Query: age > 25 AND city = 'Los Angeles'");
println!(" → Found {} rows", result2.rows().len());
for row in result2.rows() {
println!(" {row:?}");
}
println!("\n3. Preparing INSERT statement with parameters...");
let insert_stmt =
db.prepare("INSERT INTO users (id, name, age, city) VALUES (?1, ?2, ?3, ?4)")?;
println!(" → Prepared statement: {}", insert_stmt.sql());
println!(" → Parameter count: {}", insert_stmt.parameter_count());
let insert_params = vec![
SqlValue::Integer(6),
SqlValue::Text("Frank".to_string()),
SqlValue::Integer(29),
SqlValue::Text("Seattle".to_string()),
];
let affected = db.execute_prepared(&insert_stmt, &insert_params)?;
println!(" → Inserted {affected} rows");
println!("\n4. Preparing UPDATE statement with parameters...");
let update_stmt = db.prepare("UPDATE users SET age = ?1 WHERE name = ?2")?;
println!(" → Prepared statement: {}", update_stmt.sql());
println!(" → Parameter count: {}", update_stmt.parameter_count());
let update_params = vec![SqlValue::Integer(31), SqlValue::Text("Alice".to_string())];
let affected = db.execute_prepared(&update_stmt, &update_params)?;
println!(" → Updated {affected} rows");
println!("\n5. Preparing DELETE statement with parameters...");
let delete_stmt = db.prepare("DELETE FROM users WHERE age < ?1")?;
println!(" → Prepared statement: {}", delete_stmt.sql());
println!(" → Parameter count: {}", delete_stmt.parameter_count());
let delete_params = vec![SqlValue::Integer(30)];
let affected = db.execute_prepared(&delete_stmt, &delete_params)?;
println!(" → Deleted {affected} rows");
println!("\n6. Final query to see remaining data...");
let final_result = db.query("SELECT * FROM users")?;
println!(" → Remaining users:");
for row in final_result.rows() {
println!(" {row:?}");
}
println!("\n✓ Prepared statement demo completed successfully!");
Ok(())
}