use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let host = env::var("DM_HOST").unwrap_or_else(|_| "127.0.0.1".to_string());
let port: u16 = env::var("DM_PORT")
.unwrap_or_else(|_| "5236".to_string())
.parse()
.unwrap_or(5236);
let user = env::var("DM_USER").unwrap_or_else(|_| "SYSDBA".to_string());
let pass = env::var("DM_PASS").unwrap_or_else(|_| "SYSDBA".to_string());
let mut client = dameng::Client::new(&host, port);
client.connect(&user, &pass)?;
println!("Connected!\n");
println!("=== Preparing test data ===");
let _ = client.execute("DELETE FROM sample_item WHERE sample_id IN (1, 2, 3)");
let _ = client.execute("DELETE FROM sample_detail WHERE id IN (1, 2, 3)");
let _ = client.execute("DELETE FROM sample WHERE id IN (1, 2, 3)");
println!("\n=== INSERT sample (INT PK + VARCHAR) ===");
client.execute("INSERT INTO sample (ID, NAME) VALUES (1, 'Alice')")?;
client.execute("INSERT INTO sample (ID, NAME) VALUES (2, 'Bob')")?;
client.execute("INSERT INTO sample (ID, NAME) VALUES (3, 'Charlie')")?;
println!("Inserted 3 rows into sample.");
println!("\n=== INSERT sample_detail (VARCHAR NOT NULL) ===");
client.execute(
"INSERT INTO sample_detail (ID, ADDRESS, PHONE) VALUES (1, 'Beijing 123', '13800138000')",
)?;
client.execute(
"INSERT INTO sample_detail (ID, ADDRESS, PHONE) VALUES (2, 'Shanghai 456', '13900139000')",
)?;
println!("Inserted 2 rows into sample_detail (ID=3 missing for LEFT JOIN test).");
println!("\n=== INSERT sample_item (INT + VARCHAR + TIMESTAMP) ===");
client.execute(
"INSERT INTO sample_item (SAMPLE_ID, ITEM_ID, ITEM_NAME, BUY_TIME) VALUES (1, 101, 'Keyboard', '2024-01-15 10:30:00')",
)?;
client.execute(
"INSERT INTO sample_item (SAMPLE_ID, ITEM_ID, ITEM_NAME, BUY_TIME) VALUES (1, 102, 'Mouse', '2024-02-20 14:45:00')",
)?;
client.execute(
"INSERT INTO sample_item (SAMPLE_ID, ITEM_ID, ITEM_NAME, BUY_TIME) VALUES (2, 201, 'Monitor', '2024-03-10 09:00:00')",
)?;
println!("Inserted 3 rows into sample_item.");
println!("\n=== SELECT sample WHERE id = ? ===");
let rs = client.query("SELECT ID, NAME FROM SAMPLE WHERE ID = 1")?;
for row in rs.iter() {
let id = row.get_i32(0).ok().map(|v| format!("{}", v)).unwrap_or_default();
let name = row.get_str(0).ok().unwrap_or_default();
println!(" ID={}, NAME={}", id, name);
}
println!("\n=== SELECT sample WHERE name = ? ===");
let rs = client.query("SELECT ID, NAME FROM SAMPLE WHERE NAME = 'Bob'")?;
for row in rs.iter() {
let id = row.get_i32(0).ok().map(|v| format!("{}", v)).unwrap_or_default();
let name = row.get_str(0).ok().unwrap_or_default();
println!(" ID={}, NAME={}", id, name);
}
println!("\n=== UPDATE with INT + VARCHAR ===");
client.execute(
"UPDATE sample SET NAME = 'Alice Updated' WHERE ID = 1",
)?;
let rs = client.query("SELECT NAME FROM SAMPLE WHERE ID = 1")?;
for row in rs.iter() {
let name = row.get_str(0).ok().unwrap_or_default();
println!(" Updated name: {}", name);
}
client.execute("UPDATE sample SET NAME = 'Alice' WHERE ID = 1")?;
println!("\n=== UPDATE sample_detail (VARCHAR fields) ===");
client.execute(
"UPDATE sample_detail SET ADDRESS = 'Beijing 789', PHONE = '13811111111' WHERE ID = 1",
)?;
println!("\n=== SELECT ADDRESS, PHONE FROM SAMPLE_DETAIL WHERE ID = ? ===");
let rs = client.query(
"SELECT ADDRESS, PHONE FROM SAMPLE_DETAIL WHERE ID = 1",
)?;
for row in rs.iter() {
let addr = row.get_str(0).ok().unwrap_or_default();
let phone = row.get_str(1).ok().unwrap_or_default();
println!(" ADDRESS={}, PHONE={}", addr, phone);
}
println!("\n=== SELECT sample_item WHERE buy_time >= ? ===");
let rs = client.query(
"SELECT SAMPLE_ID, ITEM_ID, ITEM_NAME, BUY_TIME FROM SAMPLE_ITEM WHERE BUY_TIME >= '2024-02-01 00:00:00' ORDER BY BUY_TIME",
)?;
println!(
" Columns: {:?}",
rs.columns.iter().map(|c| &c.name).collect::<Vec<_>>()
);
for row in rs.iter() {
let sid = row.get_i32(0).ok().map(|v| format!("{}", v)).unwrap_or_default();
let iid = row.get_i32(1).ok().map(|v| format!("{}", v)).unwrap_or_default();
let name = row.get_str(2).ok().unwrap_or_default();
let time = row.get_str(3).ok().unwrap_or_default();
println!(" SAMPLE_ID={}, ITEM_ID={}, ITEM_NAME={}, BUY_TIME={}", sid, iid, name, time);
}
println!("\n=== DELETE sample_item WHERE sample_id = ? ===");
client.execute("DELETE FROM sample_item WHERE SAMPLE_ID = 2 AND ITEM_ID = 201")?;
let rs = client.query("SELECT COUNT(*) FROM SAMPLE_ITEM")?;
for row in rs.iter() {
let count = row.get_i32(0).ok().map(|v| format!("{}", v)).unwrap_or_default();
println!(" Remaining items: {}", count);
}
println!("\n=== Cleanup ===");
let _ = client.execute("DELETE FROM sample_item WHERE sample_id IN (1, 2, 3)");
let _ = client.execute("DELETE FROM sample_detail WHERE id IN (1, 2, 3)");
let _ = client.execute("DELETE FROM sample WHERE id IN (1, 2, 3)");
client.commit()?;
println!("\nDone!");
Ok(())
}