use roomrs::{LiveQuery, dao, database, entity, params};
use std::time::Duration;
#[entity(table = "logs")]
#[derive(Debug, Clone)]
struct Log {
#[pk(autoincrement)]
id: i64,
msg: String,
}
#[dao]
trait LogDao {
#[insert]
fn add(&self, l: &Log) -> roomrs::Result<i64>;
}
#[database(entities(Log), daos(LogDao), version = 1)]
struct Db;
const PAGE: i64 = 5;
fn recv<T: Clone + Send + 'static>(q: &LiveQuery<T>) -> T {
q.recv_timeout(Duration::from_secs(2))
.expect("수신")
.expect("emit")
}
fn main() -> roomrs::Result<()> {
let db = Db::builder().in_memory().build()?;
let h = db.run_sync();
for i in 1..=12 {
h.log_dao().add(&Log {
id: 0,
msg: format!("이벤트 {i:02}"),
})?;
}
let page: LiveQuery<Vec<Log>> = h.watch_all(
"SELECT * FROM logs ORDER BY id LIMIT ?1 OFFSET ?2",
params![PAGE, 0i64],
);
let total: LiveQuery<i64> = h.watch_scalar("SELECT COUNT(*) FROM logs", params![]);
println!("총 {}건", recv(&total));
println!(
"1페이지: {:?}",
recv(&page).iter().map(|l| &l.msg).collect::<Vec<_>>()
);
page.rebind(params![PAGE, PAGE])?;
println!(
"2페이지: {:?}",
recv(&page).iter().map(|l| &l.msg).collect::<Vec<_>>()
);
page.rebind(params![PAGE, 2 * PAGE])?;
println!(
"3페이지: {:?}",
recv(&page).iter().map(|l| &l.msg).collect::<Vec<_>>()
);
h.log_dao().add(&Log {
id: 0,
msg: "이벤트 13 (신규)".into(),
})?;
println!(
"write 후 3페이지: {:?}",
recv(&page).iter().map(|l| &l.msg).collect::<Vec<_>>()
);
println!("write 후 총 {}건", recv(&total));
Ok(())
}