1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
use versatile_data::Activity;
use versatile_data::Data;
pub struct Collection{
id:u32
,data:Data
}
impl Collection{
pub fn new(id:u32,data:Data)->Collection{
Collection{
id
,data
}
}
pub fn id(&self)->u32{
self.id
}
pub fn data(&self)->&Data{
&self.data
}
pub fn data_mut(&mut self)->&mut Data{
&mut self.data
}
}
pub struct TransactionRecord{
original_row:u32
,activity:Activity
,term_begin:i64
,term_end:i64
,fields:Vec<(String,String)>
}
impl TransactionRecord{
pub fn new(
original_row:u32
,activity:Activity
,term_begin:i64
,term_end:i64
,fields:Vec<(String,String)>
)->TransactionRecord{
TransactionRecord{
original_row
,activity
,term_begin
,term_end
,fields
}
}
}
pub struct Transaction<'a>{
collection_id:u32
,database:&'a mut super::Database
,records:Vec<TransactionRecord>
}
impl<'a> Transaction<'a>{
pub fn new(collection_id:u32,database:&'a mut super::Database)->Transaction{
Transaction{
collection_id
,database
,records:Vec::new()
}
}
pub fn insert(&mut self,activity:Activity,term_begin:i64,term_end:i64,fields:Vec<(String,String)>){
let t=TransactionRecord::new(0,activity,term_begin,term_end,fields);
self.records.push(t);
}
pub fn update(&mut self,row:u32,activity:Activity,term_begin:i64,term_end:i64,fields:Vec<(String,String)>){
let t=TransactionRecord::new(row,activity,term_begin,term_end,fields);
self.records.push(t);
}
pub fn commit(&mut self){
if let Some(mut collection)=self.database.collection_by_id_mut(self.collection_id){
let data=collection.data_mut();
for record in self.records.iter(){
if let Some(row)=if record.original_row==0{
data.insert(record.activity,record.term_begin,record.term_end)
}else{
data.update(record.original_row,record.activity,record.term_begin,record.term_end)
}{
for (fk,fv) in &record.fields{
data.update_field(row,&fk,fv);
}
}
}
}
}
}