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);
                    }
                }
            }
            
        }
        /*
        for t in self.record.iter(){
            if let Some(r)=d.insert(t.activity,t.term_begin,t.term_end){
                
            }
        }*/
    }
}