line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#!/usr/bin/perl |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
package KiokuDB::Test::Fixture::TXN; |
4
|
2
|
|
|
2
|
|
1773
|
use Moose; |
|
2
|
|
|
|
|
6
|
|
|
2
|
|
|
|
|
13
|
|
5
|
|
|
|
|
|
|
|
6
|
2
|
|
|
2
|
|
9843
|
use Test::More; |
|
2
|
|
|
|
|
6
|
|
|
2
|
|
|
|
|
17
|
|
7
|
2
|
|
|
2
|
|
518
|
use Test::Exception; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
14
|
|
8
|
|
|
|
|
|
|
|
9
|
2
|
|
|
2
|
|
385
|
use namespace::clean -except => 'meta'; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
17
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
extends qw(KiokuDB::Test::Fixture::Small); |
12
|
|
|
|
|
|
|
|
13
|
2
|
|
|
2
|
|
822
|
use constant required_backend_roles => qw(TXN); |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
2209
|
|
14
|
|
|
|
|
|
|
|
15
|
14
|
|
|
14
|
0
|
29
|
sub sort { 150 } |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
around populate => sub { |
18
|
|
|
|
|
|
|
my ( $next, $self, @args ) = @_; |
19
|
|
|
|
|
|
|
$self->txn_do(sub { $self->$next(@args) }); |
20
|
|
|
|
|
|
|
}; |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
sub verify { |
23
|
33
|
|
|
33
|
0
|
83
|
my $self = shift; |
24
|
|
|
|
|
|
|
|
25
|
33
|
|
|
|
|
1084
|
my $l = $self->directory->live_objects; |
26
|
|
|
|
|
|
|
|
27
|
33
|
|
|
|
|
959
|
$self->exists_ok($self->joe); |
28
|
|
|
|
|
|
|
|
29
|
33
|
|
|
|
|
14036
|
my $keep = $self->directory->live_objects->keep_entries; |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
{ |
32
|
33
|
|
|
|
|
65
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
275
|
|
33
|
|
|
|
|
|
|
|
34
|
33
|
|
|
|
|
958
|
my $joe = $self->lookup_ok( $self->joe ); |
35
|
|
|
|
|
|
|
|
36
|
33
|
|
|
|
|
1336
|
is( $joe->name, "joe", "name attr" ); |
37
|
|
|
|
|
|
|
|
38
|
33
|
|
|
|
|
9965
|
my $entry = $l->objects_to_entries($joe); |
39
|
|
|
|
|
|
|
|
40
|
33
|
100
|
|
|
|
263
|
isa_ok( $entry, "KiokuDB::Entry" ) if $keep; |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
lives_ok { |
43
|
|
|
|
|
|
|
$self->txn_do(sub { |
44
|
33
|
|
|
|
|
1086
|
$joe->name("HALLO"); |
45
|
33
|
|
|
|
|
238
|
$self->update_ok($joe); |
46
|
|
|
|
|
|
|
|
47
|
33
|
100
|
|
|
|
243
|
if ( $keep ) { |
48
|
17
|
|
|
|
|
84
|
my $updated_entry = $l->objects_to_entries($joe); |
49
|
|
|
|
|
|
|
|
50
|
17
|
|
|
|
|
115
|
isnt( $updated_entry, $entry, "entry updated" ); |
51
|
17
|
|
|
|
|
5585
|
is( $updated_entry->prev, $entry, "parent of updated is orig" ); |
52
|
|
|
|
|
|
|
} |
53
|
33
|
|
|
33
|
|
1284
|
}); |
54
|
33
|
|
|
|
|
6376
|
} "successful transaction"; |
55
|
|
|
|
|
|
|
|
56
|
33
|
100
|
|
|
|
11590
|
if ( $keep ) { |
57
|
17
|
|
|
|
|
75
|
my $updated_entry = $l->objects_to_entries($joe); |
58
|
|
|
|
|
|
|
|
59
|
17
|
|
|
|
|
106
|
isnt( $updated_entry, $entry, "entry updated" ); |
60
|
17
|
|
|
|
|
5643
|
is( $updated_entry->prev, $entry, "parent of updated is orig" ); |
61
|
|
|
|
|
|
|
} |
62
|
|
|
|
|
|
|
|
63
|
33
|
|
|
|
|
6279
|
is( $joe->name, "HALLO", "name attr" ); |
64
|
|
|
|
|
|
|
|
65
|
33
|
|
|
|
|
11357
|
undef $joe; |
66
|
|
|
|
|
|
|
} |
67
|
|
|
|
|
|
|
|
68
|
33
|
|
|
|
|
388
|
$self->no_live_objects; |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
{ |
71
|
33
|
|
|
|
|
61
|
{ |
72
|
33
|
|
|
|
|
57
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
290
|
|
73
|
|
|
|
|
|
|
|
74
|
33
|
|
|
|
|
1152
|
my $joe = $self->lookup_ok( $self->joe ); |
75
|
|
|
|
|
|
|
|
76
|
33
|
|
|
|
|
221
|
my $entry = $l->objects_to_entries($joe); |
77
|
|
|
|
|
|
|
|
78
|
33
|
100
|
|
|
|
189
|
isa_ok( $entry, "KiokuDB::Entry" ) if $keep; |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
throws_ok { |
81
|
|
|
|
|
|
|
$self->txn_do(sub { |
82
|
33
|
|
|
|
|
1104
|
$joe->name("YASE"); |
83
|
33
|
|
|
|
|
268
|
$self->update_ok($joe); |
84
|
|
|
|
|
|
|
|
85
|
33
|
100
|
|
|
|
224
|
if ( $keep ) { |
86
|
17
|
|
|
|
|
75
|
my $updated_entry = $l->objects_to_entries($joe); |
87
|
|
|
|
|
|
|
|
88
|
17
|
|
|
|
|
113
|
isnt( $updated_entry, $entry, "entry updated" ); |
89
|
17
|
|
|
|
|
5663
|
is( $updated_entry->prev, $entry, "parent of updated is orig" ); |
90
|
|
|
|
|
|
|
} |
91
|
|
|
|
|
|
|
|
92
|
33
|
|
|
|
|
5261
|
die "foo"; |
93
|
33
|
|
|
33
|
|
1370
|
}); |
94
|
33
|
|
|
|
|
6457
|
} qr/foo/, "failed transaction"; |
95
|
|
|
|
|
|
|
|
96
|
33
|
100
|
|
|
|
11047
|
if ( $keep ) { |
97
|
17
|
|
|
|
|
68
|
my $updated_entry = $l->objects_to_entries($joe); |
98
|
|
|
|
|
|
|
|
99
|
17
|
|
|
|
|
67
|
is( $updated_entry, $entry, "entry rolled back" ); |
100
|
|
|
|
|
|
|
} |
101
|
|
|
|
|
|
|
|
102
|
33
|
|
|
|
|
6426
|
is( $joe->name, "YASE", "name not rolled back in live object" ); |
103
|
|
|
|
|
|
|
|
104
|
33
|
|
|
|
|
11039
|
undef $joe; |
105
|
|
|
|
|
|
|
} |
106
|
|
|
|
|
|
|
|
107
|
33
|
|
|
|
|
338
|
$self->no_live_objects; |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
{ |
110
|
33
|
|
|
|
|
68
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
278
|
|
111
|
|
|
|
|
|
|
|
112
|
33
|
|
|
|
|
1145
|
my $joe = $self->lookup_ok( $self->joe ); |
113
|
|
|
|
|
|
|
|
114
|
33
|
|
|
|
|
1341
|
is( $joe->name, "HALLO", "name rolled back in DB" ); |
115
|
|
|
|
|
|
|
|
116
|
33
|
|
|
|
|
11475
|
undef $joe; |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
|
119
|
33
|
|
|
|
|
343
|
$self->no_live_objects; |
120
|
|
|
|
|
|
|
} |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
# txn_do nesting should still work, even if nested transactions are not supported |
123
|
|
|
|
|
|
|
{ |
124
|
33
|
|
|
|
|
72
|
{ |
125
|
33
|
|
|
|
|
57
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
270
|
|
126
|
|
|
|
|
|
|
|
127
|
33
|
|
|
|
|
1097
|
my $joe = $self->lookup_ok( $self->joe ); |
128
|
|
|
|
|
|
|
|
129
|
33
|
|
|
|
|
1274
|
is( $joe->name, "HALLO", "name attr" ); |
130
|
|
|
|
|
|
|
|
131
|
33
|
|
|
|
|
10399
|
my $entry = $l->objects_to_entries($joe); |
132
|
|
|
|
|
|
|
|
133
|
33
|
100
|
|
|
|
182
|
isa_ok( $entry, "KiokuDB::Entry" ) if $keep; |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
throws_ok { |
136
|
|
|
|
|
|
|
$self->txn_do(sub { |
137
|
33
|
|
|
|
|
1106
|
$joe->name("lalalala"); |
138
|
33
|
|
|
|
|
238
|
$self->update_ok($joe); |
139
|
|
|
|
|
|
|
$self->txn_do(sub { |
140
|
33
|
|
|
|
|
1107
|
$joe->name("oi"); |
141
|
33
|
|
|
|
|
256
|
$self->update_ok($joe); |
142
|
|
|
|
|
|
|
|
143
|
33
|
100
|
|
|
|
205
|
if ( $keep ) { |
144
|
17
|
|
|
|
|
96
|
my $updated_entry = $l->objects_to_entries($joe); |
145
|
|
|
|
|
|
|
|
146
|
17
|
|
|
|
|
110
|
isnt( $updated_entry, $entry, "entry updated" ); |
147
|
17
|
|
|
|
|
6001
|
is( $updated_entry->prev->prev, $entry, "parent of parent of updated is orig" ); |
148
|
|
|
|
|
|
|
} |
149
|
|
|
|
|
|
|
|
150
|
33
|
|
|
|
|
5923
|
die "foo"; |
151
|
33
|
|
|
|
|
575
|
}); |
152
|
33
|
|
|
33
|
|
1342
|
}); |
153
|
33
|
|
|
|
|
6612
|
} qr/foo/, "failed transaction"; |
154
|
|
|
|
|
|
|
|
155
|
33
|
100
|
|
|
|
12221
|
if ( $keep ) { |
156
|
17
|
|
|
|
|
68
|
my $updated_entry = $l->objects_to_entries($joe); |
157
|
|
|
|
|
|
|
|
158
|
17
|
|
|
|
|
76
|
is( $updated_entry, $entry, "entry rolled back" ); |
159
|
|
|
|
|
|
|
} |
160
|
|
|
|
|
|
|
|
161
|
33
|
|
|
|
|
7058
|
is( $joe->name, "oi", "name attr of object" ); |
162
|
|
|
|
|
|
|
|
163
|
33
|
|
|
|
|
11649
|
undef $joe; |
164
|
|
|
|
|
|
|
} |
165
|
|
|
|
|
|
|
|
166
|
33
|
|
|
|
|
357
|
$self->no_live_objects; |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
{ |
169
|
33
|
|
|
|
|
60
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
283
|
|
170
|
|
|
|
|
|
|
|
171
|
33
|
|
|
|
|
1138
|
my $joe = $self->lookup_ok( $self->joe ); |
172
|
|
|
|
|
|
|
|
173
|
33
|
|
|
|
|
1304
|
is( $joe->name, "HALLO", "name rolled back in DB" ); |
174
|
|
|
|
|
|
|
|
175
|
33
|
|
|
|
|
11692
|
undef $joe; |
176
|
|
|
|
|
|
|
} |
177
|
|
|
|
|
|
|
|
178
|
33
|
|
|
|
|
340
|
$self->no_live_objects; |
179
|
|
|
|
|
|
|
} |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
{ |
182
|
33
|
|
|
|
|
61
|
$self->txn_do( scope => 1, body => sub { |
183
|
33
|
|
|
33
|
|
250
|
my $s = $self->new_scope; |
184
|
|
|
|
|
|
|
{ |
185
|
33
|
|
|
|
|
80
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
138
|
|
186
|
|
|
|
|
|
|
|
187
|
33
|
|
|
|
|
1171
|
my $joe = $self->lookup_ok( $self->joe ); |
188
|
|
|
|
|
|
|
|
189
|
33
|
|
|
|
|
1337
|
$joe->name("YASE"); |
190
|
33
|
|
|
|
|
291
|
$self->update_ok($joe); |
191
|
|
|
|
|
|
|
} |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
$self->no_live_entries |
194
|
33
|
50
|
|
|
|
1079
|
unless $self->backend->does("KiokuDB::Backend::Role::TXN::Memory"); |
195
|
33
|
|
|
|
|
491
|
}); |
196
|
|
|
|
|
|
|
|
197
|
33
|
50
|
|
|
|
1073
|
$self->no_live_entries |
198
|
|
|
|
|
|
|
unless $self->backend->does("KiokuDB::Backend::Role::TXN::Memory"); |
199
|
|
|
|
|
|
|
} |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
{ |
202
|
33
|
|
|
|
|
1207
|
{ |
203
|
33
|
|
|
|
|
57
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
280
|
|
204
|
|
|
|
|
|
|
|
205
|
33
|
|
|
|
|
1203
|
my $joe = $self->lookup_ok( $self->joe ); |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
throws_ok { |
208
|
|
|
|
|
|
|
$self->txn_do(sub { |
209
|
33
|
|
|
|
|
261
|
$self->delete_ok($joe); |
210
|
33
|
|
|
|
|
1469
|
$self->deleted_ok($self->joe); |
211
|
33
|
|
|
|
|
11327
|
die "foo"; |
212
|
33
|
|
|
33
|
|
1418
|
}); |
213
|
33
|
|
|
|
|
462
|
} qr/foo/, "failed transaction"; |
214
|
|
|
|
|
|
|
|
215
|
33
|
|
|
|
|
13084
|
$self->exists_ok($self->joe); |
216
|
|
|
|
|
|
|
|
217
|
33
|
|
|
|
|
12188
|
undef $joe; |
218
|
|
|
|
|
|
|
} |
219
|
|
|
|
|
|
|
|
220
|
33
|
|
|
|
|
291
|
$self->no_live_objects; |
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
{ |
223
|
33
|
|
|
|
|
60
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
262
|
|
224
|
|
|
|
|
|
|
|
225
|
33
|
|
|
|
|
1056
|
$self->exists_ok($self->joe); |
226
|
|
|
|
|
|
|
|
227
|
33
|
|
|
|
|
12545
|
$self->lookup_ok( $self->joe ); |
228
|
|
|
|
|
|
|
} |
229
|
|
|
|
|
|
|
|
230
|
33
|
|
|
|
|
336
|
$self->no_live_objects; |
231
|
|
|
|
|
|
|
} |
232
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
{ |
234
|
33
|
|
|
|
|
65
|
{ |
235
|
33
|
|
|
|
|
60
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
331
|
|
236
|
|
|
|
|
|
|
|
237
|
|
|
|
|
|
|
throws_ok { |
238
|
|
|
|
|
|
|
$self->txn_do(sub { |
239
|
33
|
|
|
|
|
1265
|
$self->delete_ok($self->joe); |
240
|
33
|
|
|
|
|
1424
|
$self->deleted_ok($self->joe); |
241
|
33
|
|
|
|
|
10581
|
die "foo"; |
242
|
33
|
|
|
33
|
|
1358
|
}); |
243
|
33
|
|
|
|
|
435
|
} qr/foo/, "failed transaction"; |
244
|
|
|
|
|
|
|
|
245
|
33
|
|
|
|
|
12431
|
$self->exists_ok($self->joe); |
246
|
|
|
|
|
|
|
} |
247
|
|
|
|
|
|
|
|
248
|
33
|
|
|
|
|
308
|
$self->no_live_objects; |
249
|
|
|
|
|
|
|
|
250
|
33
|
|
|
|
|
921
|
$self->exists_ok($self->joe); |
251
|
|
|
|
|
|
|
} |
252
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
{ |
254
|
33
|
|
|
|
|
10609
|
{ |
255
|
33
|
|
|
|
|
75
|
my $s = $self->new_scope; |
|
33
|
|
|
|
|
246
|
|
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
$self->txn_do(sub { |
258
|
33
|
|
|
33
|
|
1103
|
$self->delete_ok($self->joe); |
259
|
33
|
|
|
|
|
1430
|
$self->deleted_ok($self->joe); |
260
|
33
|
|
|
|
|
401
|
}); |
261
|
|
|
|
|
|
|
|
262
|
33
|
|
|
|
|
1828
|
$self->deleted_ok($self->joe); |
263
|
|
|
|
|
|
|
} |
264
|
|
|
|
|
|
|
|
265
|
33
|
|
|
|
|
270
|
$self->no_live_objects; |
266
|
|
|
|
|
|
|
|
267
|
33
|
|
|
|
|
915
|
$self->deleted_ok($self->joe); |
268
|
|
|
|
|
|
|
} |
269
|
|
|
|
|
|
|
} |
270
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
__PACKAGE__->meta->make_immutable; |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
__PACKAGE__ |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
__END__ |