1use mvcc::{Config, Database, Mvcc, Result};
6
7#[derive(Mvcc, Clone, Debug)]
8#[mvcc(table = "accounts")]
9struct Account {
10 #[mvcc(primary_key)]
11 id: u64,
12
13 #[mvcc(index(unique))]
15 owner: String,
16
17 #[mvcc(index)]
19 branch: u32,
20
21 balance: i64,
22}
23
24fn main() -> Result<()> {
25 let db = Database::open(Config::in_memory())?;
26 db.register::<Account>()?;
27
28 db.transaction(|tx| {
32 tx.insert(Account {
33 id: 1,
34 owner: "ada".into(),
35 branch: 10,
36 balance: 500,
37 })?;
38 tx.insert(Account {
39 id: 2,
40 owner: "bob".into(),
41 branch: 10,
42 balance: 250,
43 })?;
44 tx.insert(Account {
45 id: 3,
46 owner: "cleo".into(),
47 branch: 20,
48 balance: 900,
49 })?;
50 Ok(())
51 })?;
52
53 let mut tx = db.begin();
55 let ada = tx.get::<Account>(&1)?.expect("just inserted");
56 println!("ada: branch {}, balance {}", ada.branch, ada.balance);
57
58 drop(tx);
61
62 db.transaction(|tx| {
64 tx.update::<Account>(&1, |a| a.balance -= 100)?;
65 tx.update::<Account>(&2, |a| a.balance += 100)?;
66 Ok(())
67 })?;
68
69 let mut tx = db.begin();
71 println!("\nall accounts:");
72 for account in tx.scan::<Account>()? {
73 println!(
74 " {:>4} {:<6} branch {} {:>5}",
75 account.id, account.owner, account.branch, account.balance
76 );
77 }
78
79 println!("\nbranch 10:");
81 for account in tx.scan_index(Account::BRANCH, 10u32..=10)? {
82 println!(" {} ({})", account.owner, account.balance);
83 }
84 drop(tx);
85
86 let mut tx = db.begin();
88 let duplicate = tx.insert(Account {
89 id: 99,
90 owner: "ada".into(),
91 branch: 30,
92 balance: 0,
93 });
94 println!("\nreusing owner 'ada': {}", duplicate.unwrap_err());
95 drop(tx);
96
97 db.transaction(|tx| {
99 let existed = tx.delete::<Account>(&3)?;
100 println!("deleted cleo: {existed}");
101 Ok(())
102 })?;
103
104 let mut tx = db.begin();
105 println!(
106 "cleo now: {:?}",
107 tx.get::<Account>(&3)?.map(|r| r.to_owned())
108 );
109
110 Ok(())
111}