use hyperdb_api::{Connection, CreateMode, HyperProcess, QueryAs, QueryScalar, Result, Table};
use hyperdb_api_derive::{query_as, query_scalar, FromRow, Table};
#[derive(Debug, FromRow, Table)]
#[hyperdb(table = "users", register)]
#[allow(
dead_code,
reason = "example struct; all fields read via Debug + direct access"
)]
struct User {
#[hyperdb(primary_key)]
id: i64,
name: String,
email: Option<String>,
score: f64,
}
fn main() -> Result<()> {
println!("CREATE TABLE SQL:");
println!(" {}", User::CREATE_SQL);
println!();
let hyper = HyperProcess::new(None, None)?;
let conn = Connection::new(&hyper, "example_ct.hyper", CreateMode::CreateAndReplace)?;
conn.execute_command(User::CREATE_SQL)?;
conn.execute_command(
"INSERT INTO users VALUES \
(1, 'Alice', 'alice@example.com', 95.5), \
(2, 'Bob', NULL, 87.0), \
(3, 'Charlie', 'charlie@example.com', 72.3)",
)?;
let all_users: Vec<User> =
query_as!(User, "SELECT * FROM users ORDER BY id").fetch_all(&conn)?;
println!("All users:");
for u in &all_users {
println!(" {u:?}");
}
let alice: User = query_as!(User, "SELECT * FROM users WHERE id = 1").fetch_one(&conn)?;
println!("\nAlice: {alice:?}");
let ghost: Option<User> =
query_as!(User, "SELECT * FROM users WHERE id = 9999").fetch_optional(&conn)?;
println!("Ghost (should be None): {ghost:?}");
let count: i64 = query_scalar!(i64, "SELECT COUNT(*) FROM users").fetch_one(&conn)?;
println!("\nUser count: {count}");
let names: Vec<String> =
query_scalar!(String, "SELECT name FROM users ORDER BY name").fetch_all(&conn)?;
println!("Names: {names:?}");
let q: QueryAs<User> = query_as!(User, "SELECT * FROM users WHERE score > 80.0");
let high_scorers = q.fetch_all(&conn)?;
println!("\nHigh scorers (score > 80):");
for u in &high_scorers {
println!(" {} ({})", u.name, u.score);
}
let max_q: QueryScalar<f64> = query_scalar!(f64, "SELECT MAX(score) FROM users");
let max_score: Option<f64> = max_q.fetch_optional(&conn)?;
println!("Max score: {max_score:?}");
Ok(())
}