forked from richm/scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bdbtest.py
247 lines (223 loc) · 7.39 KB
/
bdbtest.py
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
import sys
import os
import bsddb.db
txn_flags = 0 # bsddb.db.DB_TXN_SNAPSHOT
cur_flags = 0 # bsddb.db.DB_TXN_SNAPSHOT
cur_flags_notxn = 0 # bsddb.db.DB_READ_UNCOMMITTED # bsddb.db.DB_TXN_SNAPSHOT DB_READ_COMMITTED
def print_records(db, txn=None, cur=None):
flags = cur_flags
if txn:
print "records for txn", txn
else:
print "no txn records"
closecur = False
if not cur:
cur = db.cursor(txn, flags)
closecur = True
rec = cur.first()
while rec:
try:
print "\tkey=%s val=%s" % rec
print "\textra=%s" % str(cur.get(bsddb.db.DB_GET_RECNO))
rec = cur.next()
except Exception, ex:
print "caught", ex
break
if closecur:
cur.close()
dbdir = "/var/tmp/dbtest"
try: os.mkdir(dbdir)
except OSError, e:
if e.errno == os.errno.EEXIST: pass
else: raise e
env = bsddb.db.DBEnv()
envflags = bsddb.db.DB_CREATE|bsddb.db.DB_RECOVER|bsddb.db.DB_INIT_LOCK|bsddb.db.DB_INIT_LOG|bsddb.db.DB_INIT_TXN|bsddb.db.DB_INIT_MPOOL|bsddb.db.DB_THREAD
print "open dbenv in", dbdir
env.open(dbdir, envflags)
allow_uncommitted = False
db = bsddb.db.DB(env)
db.set_flags(bsddb.db.DB_DUPSORT|bsddb.db.DB_RECNUM)
dbflags = bsddb.db.DB_CREATE|bsddb.db.DB_AUTO_COMMIT|bsddb.db.DB_THREAD
#dbflags = bsddb.db.DB_CREATE|bsddb.db.DB_AUTO_COMMIT|bsddb.db.DB_THREAD|bsddb.db.DB_MULTIVERSION
if allow_uncommitted:
dbflags = dbflags|bsddb.db.DB_READ_UNCOMMITTED
dbfile = dbdir + "/dbtest.db4"
print "open db", dbfile
db.open(dbfile, dbtype=bsddb.db.DB_BTREE, flags=dbflags)
#seq_flags = bsddb.db.DB_CREATE|bsddb.db.DB_THREAD
#uidseq = bsddb.db.DBSequence(db)
#uidseq.open("uidnumber", None, seq_flags)
#usnseq = bsddb.db.DBSequence(db)
#usnseq.open("usn", None, seq_flags)
def loaddb():
for ii in xrange(0,10):
db.put("key" + str(ii), "data" + str(ii))
flags = bsddb.db.DB_NODUPDATA
# flags = bsddb.db.DB_NOOVERWRITE
for ii in xrange(0,10):
db.put("multikey", "multidata" + str(ii), None, flags)
loaddb()
cur = db.cursor(None, cur_flags_notxn)
print_records(db, None, cur)
def test1():
print "test 1 - abort child txn but commit parent txn"
print_records(db)
print "create parent txn"
partxn = env.txn_begin(None, txn_flags)
print "do a write inside the parent before the child"
db.put("parent before key", "parent before data", partxn)
print_records(db, partxn)
uidnum = uidseq.get(1, partxn)
print "uidnumber is", uidnum
print "create child transaction"
chitxn = env.txn_begin(partxn, txn_flags)
print "do a write inside the child"
db.put("child key", "child data", chitxn)
print_records(db,chitxn)
usnnum = usnseq.get(1, chitxn)
print "usn is", usnnum
print "abort the child txn"
chitxn.abort()
print_records(db,partxn)
print "do a write inside the parent after the child"
db.put("parent after key", "parent after data", partxn)
print_records(db,partxn)
print "commit the transaction"
partxn.commit()
print_records(db)
def test2():
print "test 2 - commit child txn but abort parent txn"
print "create parent txn"
partxn = env.txn_begin(None, txn_flags)
print "do a write inside the parent before the child"
db.put("parent before key2", "parent before data2", partxn)
print_records(db,partxn)
uidnum = uidseq.get(1, partxn)
print "uidnumber is", uidnum
print "create child transaction"
chitxn = env.txn_begin(partxn, txn_flags)
print "do a write inside the child"
db.put("child key2", "child data2", chitxn)
print_records(db,chitxn)
usnnum = usnseq.get(1, chitxn)
print "usn is", usnnum
print "commit the child txn"
chitxn.commit()
print_records(db,partxn)
print "do a write inside the parent after the child"
db.put("parent after key2", "parent after data2", partxn)
print "abort the transaction"
partxn.abort()
print_records(db)
def test3():
print "test 3 - commit child and parent"
print "create parent txn"
partxn = env.txn_begin(None, txn_flags)
print "read records in empty database"
print_records(db, partxn)
#print_records(db)
print "do a write inside the parent before the child"
db.put("parent before key3", "parent before data3", partxn)
#print "run db_stat -C A and press Enter"
#null = sys.stdin.readline()
#print "read records"
print_records(db, partxn)
#print "run db_stat -C A and press Enter"
#null = sys.stdin.readline()
uidnum = uidseq.get(1, partxn)
print "uidnumber is", uidnum
#print_records(db)
print "create child transaction"
chitxn = env.txn_begin(partxn, txn_flags)
print "read records"
print_records(db, chitxn)
print_records(db, partxn)
#print_records(db)
print "do a write inside the child"
db.put("child key3", "child data3", chitxn)
print "read records"
print_records(db, chitxn)
print_records(db, partxn)
#print_records(db)
usnnum = usnseq.get(1, chitxn)
print "usn is", usnnum
print "commit the child txn"
chitxn.commit()
print "read records"
print_records(db, partxn)
#print_records(db)
print "do a write inside the parent after the child"
db.put("parent after key3", "parent after data3", partxn)
print "read records"
print_records(db, partxn)
#print_records(db)
print "commit the transaction"
partxn.commit()
print "read records"
print_records(db)
uidnum = uidseq.get()
print "uidnumber is", uidnum
usnnum = usnseq.get()
print "usn is", usnnum
def test4():
print "attempt to start a new transaction while another transaction is open"
txn1 = env.txn_begin(None, txn_flags)
print "read records in empty database"
print_records(db, txn1)
print "add record with txn1"
db.put("test4 key1", "test4 data1", txn1)
print "read records with txn1"
print_records(db, txn1)
print "start a new transaction"
txn2 = env.txn_begin(None, txn_flags)
print "add record with txn2"
db.put("test4 key2", "test4 data2", txn2)
print "read records with txn2"
print_records(db, txn2)
def test5():
print "attempt to read the db without a txn while another transaction is open"
txn1 = env.txn_begin(None, txn_flags)
print "read records in empty database"
print_records(db, txn1)
print "read records without txn"
print_records(db)
print "add record with txn1"
db.put("test5 key1", "test5 data1", txn1)
print "read records with txn1"
print_records(db, txn1)
print "read records without txn"
print_records(db)
print "commit txn"
txn1.commit()
print "read records without txn"
print_records(db)
def test6():
print "start a read-only cursor notxn, then start a txn"
cur1 = db.cursor(None, cur_flags_notxn)
print "read data using notxn cursor"
print_records(db, None, cur1)
print "create txn"
txn1 = env.txn_begin(None, txn_flags)
print "create txn cursor"
cur2 = db.cursor(txn1, cur_flags)
print "position cursor"
cur2.last()
print "put data using cursor"
cur2.put("txnkey", "txndata", bsddb.db.DB_CURRENT)
print "read data using txn cursor"
print_records(db, None, cur2)
print "modify data inside the txn"
print "read data using notxn cursor"
print_records(db, None, cur1)
print "read data using txn cursor"
print_records(db, None, cur2)
cur1.close()
cur2.close()
txn1.abort()
#test1()
#test2()
#test3()
#test4()
#test5()
#test6()
#loaddb()