use ri::database::{RiDatabasePool, RiDatabaseConfig, RiDBRow};
use ri::core::RiResult;
use serde_json::json;
#[derive(Debug, Clone)]
struct User {
id: i64,
name: String,
email: String,
created_at: chrono::DateTime<chrono::Utc>,
}
fn main() -> RiResult<()> {
println!("=== Ri Database Module Example ===\n");
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let config = RiDatabaseConfig::postgres()
.host("localhost")
.port(5432)
.database("ri")
.user("postgres")
.password("password")
.max_connections(10)
.min_idle_connections(2)
.connection_timeout_secs(30)
.build();
println!("1. Creating connection pool...");
let pool = RiDatabasePool::new(config).await?;
println!(" Connection pool created successfully\n");
println!("2. Creating table...");
let db = pool.get().await?;
db.execute("
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
", &[]).await?;
println!(" Table 'users' created or already exists\n");
println!("3. Inserting new user (Create)...");
let db = pool.get().await?;
let rows = db.execute(
"INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id, name, email, created_at",
&[&"John Doe", &"john@example.com"],
).await?;
if let Some(row) = rows.first() {
println!(" User inserted: id={}, name={}, email={}",
row.get::<i64>("id"),
row.get::<String>("name"),
row.get::<String>("email")
);
}
println!();
println!("4. Querying users (Read)...");
let db = pool.get().await?;
let rows = db.query("SELECT id, name, email FROM users ORDER BY id", &[]).await?;
println!(" Found {} users:", rows.len());
for row in &rows {
println!(" - id={}, name={}, email={}",
row.get::<i64>("id"),
row.get::<String>("name"),
row.get::<String>("email")
);
}
println!();
println!("5. Updating user (Update)...");
let db = pool.get().await?;
let affected = db.execute(
"UPDATE users SET email = $1 WHERE name = $2",
&[&"john.doe@example.com", &"John Doe"],
).await?;
println!(" Updated {} row(s)\n", affected);
println!("6. Using transaction (Rollback demo)...");
let mut tx = pool.begin_transaction().await?;
tx.execute("INSERT INTO users (name, email) VALUES ($1, $2)",
&[&"Test User", &"test@example.com"]).await?;
println!(" Inserted test user in transaction");
tx.rollback().await?;
println!(" Transaction rolled back\n");
println!("7. Verifying no test user was added...");
let db = pool.get().await?;
let rows = db.query("SELECT COUNT(*) as count FROM users WHERE email = $1",
&[&"test@example.com"]).await?;
let count: i64 = rows.first().unwrap().get("count");
println!(" Users with test@example.com: {}\n", count);
println!("8. Batch insert users...");
let db = pool.get().await?;
let users = vec![
vec![json!("Alice"), json!("alice@example.com")],
vec![json!("Bob"), json!("bob@example.com")],
vec![json!("Charlie"), json!("charlie@example.com")],
];
let inserted = db.execute_many(
"INSERT INTO users (name, email) VALUES ($1, $2)",
&users,
).await?;
println!(" Batch inserted {} user(s)\n", inserted);
println!("9. Final user count...");
let db = pool.get().await?;
let rows = db.query("SELECT COUNT(*) as count FROM users", &[]).await?;
let count: i64 = rows.first().unwrap().get("count");
println!(" Total users in database: {}\n", count);
println!("10. Cleanup (Delete test data)...");
let db = pool.get().await?;
db.execute("DELETE FROM users WHERE email LIKE $1",
&[&"%.example.com"]).await?;
println!(" Cleaned up test data\n");
println!("=== Database Example Completed ===");
Ok::<(), RiError>(())
})?
}