1# The new MK 2.3 commit-aside feature, in Python
2#
3# Expected output:
4# 1 2 3 ok
5
6import os
7import Mk4py
8mk = Mk4py
9
10def t1(): # add several rows using commit-aside
11  try: os.remove("_f.mk")
12  except: pass
13  try: os.remove("_f.mka")
14  except: pass
15
16  db = mk.storage("_f.mk", 1)
17  vw = db.getas("a[i:I]")
18  vw.append(i=111)
19  vw.append(i=222)
20  vw.append(i=333)
21  db.commit()
22  del db
23
24  db = mk.storage("_f.mk", 0)
25  vw = db.view("a")
26  assert len(vw) == 3
27
28  dba = mk.storage("_f.mka", 1)
29  db.aside(dba)
30  vw = db.view("a")
31  assert len(vw) == 3
32
33  vw.append(i=444)
34  vw.append(i=555)
35  assert len(vw) == 5
36
37  db.commit()
38  dba.commit()
39  del db
40  del dba
41
42  db = mk.storage("_f.mk", 0)
43  vw = db.view("a")
44  assert len(vw) == 3 # now it has three rows
45  assert vw[0].i == 111
46  assert vw[1].i == 222
47  assert vw[2].i == 333
48
49  dba = mk.storage("_f.mka", 0)
50  db.aside(dba)
51  vw = db.view("a")
52  assert len(vw) == 5 # now it has five :)
53  assert vw[0].i == 111
54  assert vw[1].i == 222
55  assert vw[2].i == 333
56  assert vw[3].i == 444
57  assert vw[4].i == 555
58
59def t2(): # add second property using commit-aside
60  try: os.remove("_f.mk")
61  except: pass
62  try: os.remove("_f.mka")
63  except: pass
64
65  db = mk.storage("_f.mk", 1)
66  vw = db.getas("a[i:I]")
67  vw.append(i=111)
68  db.commit()
69  del db
70
71  db = mk.storage("_f.mk", 0)
72  vw = db.view("a")
73  assert len(vw) == 1
74
75  dba = mk.storage("_f.mka", 1)
76  db.aside(dba)
77  vw = db.getas("a[i:I,j:I]")
78  assert len(vw) == 1
79
80  vw.append(i=222,j=333)
81  assert len(vw) == 2
82
83  db.commit()
84  dba.commit()
85  del db
86  del dba
87
88  db = mk.storage("_f.mk", 0)
89  vw = db.view("a")
90  assert len(vw) == 1 # now it has one property and row
91  assert len(vw.structure()) == 1
92  assert vw[0].i == 111
93
94  dba = mk.storage("_f.mka", 0)
95  db.aside(dba)
96  vw = db.view("a")
97  assert len(vw) == 2 # now it has two of both :)
98  assert len(vw.structure()) == 2
99  assert vw[0].i == 111
100  assert vw[0].j == 0
101  assert vw[1].i == 222
102  assert vw[1].j == 333
103
104def t3(): # remove second property using commit-aside
105  try: os.remove("_f.mk")
106  except: pass
107  try: os.remove("_f.mka")
108  except: pass
109
110  db = mk.storage("_f.mk", 1)
111  vw = db.getas("a[i:I,j:I]")
112  vw.append(i=111,j=222)
113  db.commit()
114  del db
115
116  db = mk.storage("_f.mk", 0)
117  vw = db.view("a")
118  assert len(vw) == 1
119
120  dba = mk.storage("_f.mka", 1)
121  db.aside(dba)
122  vw = db.getas("a[i:I]")
123  assert len(vw) == 1
124
125  db.commit()
126  dba.commit()
127  del db
128  del dba
129
130  db = mk.storage("_f.mk", 0)
131  vw = db.view("a")
132  assert len(vw) == 1
133  assert len(vw.structure()) == 2 # now you see j
134  assert vw[0].i == 111
135  assert vw[0].j == 222
136
137  dba = mk.storage("_f.mka", 0)
138  db.aside(dba)
139  vw = db.view("a")
140  assert len(vw) == 1
141  assert len(vw.structure()) == 1 # now you don't :)
142  assert vw[0].i == 111
143
144print 1,
145t1()
146print 2,
147t2()
148print 3,
149t3()
150print "ok"
151
152os.remove("_f.mk")
153os.remove("_f.mka")
154