~ubuntu-branches/ubuntu/maverick/evolution-data-server/maverick-proposed

« back to all changes in this revision

Viewing changes to libdb/perl/BerkeleyDB/t/btree.t

  • Committer: Bazaar Package Importer
  • Author(s): Didier Roche
  • Date: 2010-05-17 17:02:06 UTC
  • mfrom: (1.1.79 upstream) (1.6.12 experimental)
  • Revision ID: james.westby@ubuntu.com-20100517170206-4ufr52vwrhh26yh0
Tags: 2.30.1-1ubuntu1
* Merge from debian experimental. Remaining change:
  (LP: #42199, #229669, #173703, #360344, #508494)
  + debian/control:
    - add Vcs-Bzr tag
    - don't use libgnome
    - Use Breaks instead of Conflicts against evolution 2.25 and earlier.
  + debian/evolution-data-server.install,
    debian/patches/45_libcamel_providers_version.patch:
    - use the upstream versioning, not a Debian-specific one 
  + debian/libedata-book1.2-dev.install, debian/libebackend-1.2-dev.install,
    debian/libcamel1.2-dev.install, debian/libedataserverui1.2-dev.install:
    - install html documentation
  + debian/rules:
    - don't build documentation it's shipped with the tarball

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!./perl -w
2
 
 
3
 
# ID: %I%, %G%   
4
 
 
5
 
use strict ;
6
 
 
7
 
BEGIN {
8
 
    unless(grep /blib/, @INC) {
9
 
        chdir 't' if -d 't';
10
 
        @INC = '../lib' if -d '../lib';
11
 
    }
12
 
}
13
 
 
14
 
use BerkeleyDB; 
15
 
use t::util ;
16
 
 
17
 
print "1..244\n";
18
 
 
19
 
my $Dfile = "dbhash.tmp";
20
 
my $Dfile2 = "dbhash2.tmp";
21
 
my $Dfile3 = "dbhash3.tmp";
22
 
unlink $Dfile;
23
 
 
24
 
umask(0) ;
25
 
 
26
 
 
27
 
# Check for invalid parameters
28
 
{
29
 
    # Check for invalid parameters
30
 
    my $db ;
31
 
    eval ' $db = new BerkeleyDB::Btree  -Stupid => 3 ; ' ;
32
 
    ok 1, $@ =~ /unknown key value\(s\) Stupid/  ;
33
 
 
34
 
    eval ' $db = new BerkeleyDB::Btree -Bad => 2, -Mode => 0345, -Stupid => 3; ' ;
35
 
    ok 2, $@ =~ /unknown key value\(s\) (Bad |Stupid ){2}/  ;
36
 
 
37
 
    eval ' $db = new BerkeleyDB::Btree -Env => 2 ' ;
38
 
    ok 3, $@ =~ /^Env not of type BerkeleyDB::Env/ ;
39
 
 
40
 
    eval ' $db = new BerkeleyDB::Btree -Txn => "x" ' ;
41
 
    ok 4, $@ =~ /^Txn not of type BerkeleyDB::Txn/ ;
42
 
 
43
 
    my $obj = bless [], "main" ;
44
 
    eval ' $db = new BerkeleyDB::Btree -Env => $obj ' ;
45
 
    ok 5, $@ =~ /^Env not of type BerkeleyDB::Env/ ;
46
 
}
47
 
 
48
 
# Now check the interface to Btree
49
 
 
50
 
{
51
 
    my $lex = new LexFile $Dfile ;
52
 
 
53
 
    ok 6, my $db = new BerkeleyDB::Btree -Filename => $Dfile, 
54
 
                                    -Flags    => DB_CREATE ;
55
 
 
56
 
    # Add a k/v pair
57
 
    my $value ;
58
 
    my $status ;
59
 
    ok 7, $db->db_put("some key", "some value") == 0  ;
60
 
    ok 8, $db->status() == 0 ;
61
 
    ok 9, $db->db_get("some key", $value) == 0 ;
62
 
    ok 10, $value eq "some value" ;
63
 
    ok 11, $db->db_put("key", "value") == 0  ;
64
 
    ok 12, $db->db_get("key", $value) == 0 ;
65
 
    ok 13, $value eq "value" ;
66
 
    ok 14, $db->db_del("some key") == 0 ;
67
 
    ok 15, ($status = $db->db_get("some key", $value)) == DB_NOTFOUND ;
68
 
    ok 16, $db->status() == DB_NOTFOUND ;
69
 
    ok 17, $db->status() eq $DB_errors{'DB_NOTFOUND'} ;
70
 
 
71
 
    ok 18, $db->db_sync() == 0 ;
72
 
 
73
 
    # Check NOOVERWRITE will make put fail when attempting to overwrite
74
 
    # an existing record.
75
 
 
76
 
    ok 19, $db->db_put( 'key', 'x', DB_NOOVERWRITE) == DB_KEYEXIST ;
77
 
    ok 20, $db->status() eq $DB_errors{'DB_KEYEXIST'} ;
78
 
    ok 21, $db->status() == DB_KEYEXIST ;
79
 
 
80
 
 
81
 
    # check that the value of the key  has not been changed by the
82
 
    # previous test
83
 
    ok 22, $db->db_get("key", $value) == 0 ;
84
 
    ok 23, $value eq "value" ;
85
 
 
86
 
    # test DB_GET_BOTH
87
 
    my ($k, $v) = ("key", "value") ;
88
 
    ok 24, $db->db_get($k, $v, DB_GET_BOTH) == 0 ;
89
 
 
90
 
    ($k, $v) = ("key", "fred") ;
91
 
    ok 25, $db->db_get($k, $v, DB_GET_BOTH) == DB_NOTFOUND ;
92
 
 
93
 
    ($k, $v) = ("another", "value") ;
94
 
    ok 26, $db->db_get($k, $v, DB_GET_BOTH) == DB_NOTFOUND ;
95
 
 
96
 
 
97
 
}
98
 
 
99
 
{
100
 
    # Check simple env works with a hash.
101
 
    my $lex = new LexFile $Dfile ;
102
 
 
103
 
    my $home = "./fred" ;
104
 
    ok 27, my $lexD = new LexDir($home) ;
105
 
 
106
 
    ok 28, my $env = new BerkeleyDB::Env -Flags => DB_CREATE|DB_INIT_MPOOL,
107
 
                                         -Home => $home ;
108
 
    ok 29, my $db = new BerkeleyDB::Btree -Filename => $Dfile, 
109
 
                                    -Env      => $env,
110
 
                                    -Flags    => DB_CREATE ;
111
 
 
112
 
    # Add a k/v pair
113
 
    my $value ;
114
 
    ok 30, $db->db_put("some key", "some value") == 0 ;
115
 
    ok 31, $db->db_get("some key", $value) == 0 ;
116
 
    ok 32, $value eq "some value" ;
117
 
    undef $db ;
118
 
    undef $env ;
119
 
}
120
 
 
121
 
 
122
 
{
123
 
    # cursors
124
 
 
125
 
    my $lex = new LexFile $Dfile ;
126
 
    my %hash ;
127
 
    my ($k, $v) ;
128
 
    ok 33, my $db = new BerkeleyDB::Btree -Filename => $Dfile, 
129
 
                                     -Flags    => DB_CREATE ;
130
 
 
131
 
    # create some data
132
 
    my %data =  (
133
 
                "red"   => 2,
134
 
                "green" => "house",
135
 
                "blue"  => "sea",
136
 
                ) ;
137
 
 
138
 
    my $ret = 0 ;
139
 
    while (($k, $v) = each %data) {
140
 
        $ret += $db->db_put($k, $v) ;
141
 
    }
142
 
    ok 34, $ret == 0 ;
143
 
 
144
 
    # create the cursor
145
 
    ok 35, my $cursor = $db->db_cursor() ;
146
 
 
147
 
    $k = $v = "" ;
148
 
    my %copy = %data ;
149
 
    my $extras = 0 ;
150
 
    # sequence forwards
151
 
    while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
152
 
        if ( $copy{$k} eq $v ) 
153
 
            { delete $copy{$k} }
154
 
        else
155
 
            { ++ $extras }
156
 
    }
157
 
    ok 36, $cursor->status() == DB_NOTFOUND ;
158
 
    ok 37, $cursor->status() eq $DB_errors{'DB_NOTFOUND'};
159
 
    ok 38, keys %copy == 0 ;
160
 
    ok 39, $extras == 0 ;
161
 
 
162
 
    # sequence backwards
163
 
    %copy = %data ;
164
 
    $extras = 0 ;
165
 
    my $status ;
166
 
    for ( $status = $cursor->c_get($k, $v, DB_LAST) ;
167
 
          $status == 0 ;
168
 
          $status = $cursor->c_get($k, $v, DB_PREV)) {
169
 
        if ( $copy{$k} eq $v ) 
170
 
            { delete $copy{$k} }
171
 
        else
172
 
            { ++ $extras }
173
 
    }
174
 
    ok 40, $status == DB_NOTFOUND ;
175
 
    ok 41, $status eq $DB_errors{'DB_NOTFOUND'};
176
 
    ok 42, $cursor->status() == $status ;
177
 
    ok 43, $cursor->status() eq $status ;
178
 
    ok 44, keys %copy == 0 ;
179
 
    ok 45, $extras == 0 ;
180
 
 
181
 
    ($k, $v) = ("green", "house") ;
182
 
    ok 46, $cursor->c_get($k, $v, DB_GET_BOTH) == 0 ;
183
 
 
184
 
    ($k, $v) = ("green", "door") ;
185
 
    ok 47, $cursor->c_get($k, $v, DB_GET_BOTH) == DB_NOTFOUND ;
186
 
 
187
 
    ($k, $v) = ("black", "house") ;
188
 
    ok 48, $cursor->c_get($k, $v, DB_GET_BOTH) == DB_NOTFOUND ;
189
 
 
190
 
}
191
 
 
192
 
{
193
 
    # Tied Hash interface
194
 
 
195
 
    my $lex = new LexFile $Dfile ;
196
 
    my %hash ;
197
 
    ok 49, tie %hash, 'BerkeleyDB::Btree', -Filename => $Dfile,
198
 
                                      -Flags    => DB_CREATE ;
199
 
 
200
 
    # check "each" with an empty database
201
 
    my $count = 0 ;
202
 
    while (my ($k, $v) = each %hash) {
203
 
        ++ $count ;
204
 
    }
205
 
    ok 50, (tied %hash)->status() == DB_NOTFOUND ;
206
 
    ok 51, $count == 0 ;
207
 
 
208
 
    # Add a k/v pair
209
 
    my $value ;
210
 
    $hash{"some key"} = "some value";
211
 
    ok 52, (tied %hash)->status() == 0 ;
212
 
    ok 53, $hash{"some key"} eq "some value";
213
 
    ok 54, defined $hash{"some key"} ;
214
 
    ok 55, (tied %hash)->status() == 0 ;
215
 
    ok 56, exists $hash{"some key"} ;
216
 
    ok 57, !defined $hash{"jimmy"} ;
217
 
    ok 58, (tied %hash)->status() == DB_NOTFOUND ;
218
 
    ok 59, !exists $hash{"jimmy"} ;
219
 
    ok 60, (tied %hash)->status() == DB_NOTFOUND ;
220
 
 
221
 
    delete $hash{"some key"} ;
222
 
    ok 61, (tied %hash)->status() == 0 ;
223
 
    ok 62, ! defined $hash{"some key"} ;
224
 
    ok 63, (tied %hash)->status() == DB_NOTFOUND ;
225
 
    ok 64, ! exists $hash{"some key"} ;
226
 
    ok 65, (tied %hash)->status() == DB_NOTFOUND ;
227
 
 
228
 
    $hash{1} = 2 ;
229
 
    $hash{10} = 20 ;
230
 
    $hash{1000} = 2000 ;
231
 
 
232
 
    my ($keys, $values) = (0,0);
233
 
    $count = 0 ;
234
 
    while (my ($k, $v) = each %hash) {
235
 
        $keys += $k ;
236
 
        $values += $v ;
237
 
        ++ $count ;
238
 
    }
239
 
    ok 66, $count == 3 ;
240
 
    ok 67, $keys == 1011 ;
241
 
    ok 68, $values == 2022 ;
242
 
 
243
 
    # now clear the hash
244
 
    %hash = () ;
245
 
    ok 69, keys %hash == 0 ;
246
 
 
247
 
    untie %hash ;
248
 
}
249
 
 
250
 
{
251
 
    # override default compare
252
 
    my $lex = new LexFile $Dfile, $Dfile2, $Dfile3 ;
253
 
    my $value ;
254
 
    my (%h, %g, %k) ;
255
 
    my @Keys = qw( 0123 12 -1234 9 987654321 def  ) ; 
256
 
    ok 70, tie %h, "BerkeleyDB::Btree", -Filename => $Dfile, 
257
 
                                     -Compare   => sub { $_[0] <=> $_[1] },
258
 
                                     -Flags    => DB_CREATE ;
259
 
 
260
 
    ok 71, tie %g, 'BerkeleyDB::Btree', -Filename => $Dfile2, 
261
 
                                     -Compare   => sub { $_[0] cmp $_[1] },
262
 
                                     -Flags    => DB_CREATE ;
263
 
 
264
 
    ok 72, tie %k, 'BerkeleyDB::Btree', -Filename => $Dfile3, 
265
 
                                   -Compare   => sub { length $_[0] <=> length $_[1] },
266
 
                                   -Flags    => DB_CREATE ;
267
 
 
268
 
    my @srt_1 ;
269
 
    { local $^W = 0 ;
270
 
      @srt_1 = sort { $a <=> $b } @Keys ; 
271
 
    }
272
 
    my @srt_2 = sort { $a cmp $b } @Keys ;
273
 
    my @srt_3 = sort { length $a <=> length $b } @Keys ;
274
 
 
275
 
    foreach (@Keys) {
276
 
        local $^W = 0 ;
277
 
        $h{$_} = 1 ; 
278
 
        $g{$_} = 1 ;
279
 
        $k{$_} = 1 ;
280
 
    }
281
 
 
282
 
    sub ArrayCompare
283
 
    {
284
 
        my($a, $b) = @_ ;
285
 
    
286
 
        return 0 if @$a != @$b ;
287
 
    
288
 
        foreach (1 .. length @$a)
289
 
        {
290
 
            return 0 unless $$a[$_] eq $$b[$_] ;
291
 
        }
292
 
 
293
 
        1 ;
294
 
    }
295
 
 
296
 
    ok 73, ArrayCompare (\@srt_1, [keys %h]);
297
 
    ok 74, ArrayCompare (\@srt_2, [keys %g]);
298
 
    ok 75, ArrayCompare (\@srt_3, [keys %k]);
299
 
 
300
 
}
301
 
 
302
 
{
303
 
    # override default compare, with duplicates, don't sort values
304
 
    my $lex = new LexFile $Dfile, $Dfile2, $Dfile3 ;
305
 
    my $value ;
306
 
    my (%h, %g, %k) ;
307
 
    my @Keys   = qw( 0123 9 12 -1234 9 987654321 def  ) ; 
308
 
    my @Values = qw( 1    0 3   dd   x abc       0    ) ; 
309
 
    ok 76, tie %h, "BerkeleyDB::Btree", -Filename => $Dfile, 
310
 
                                     -Compare   => sub { $_[0] <=> $_[1] },
311
 
                                     -Property  => DB_DUP,
312
 
                                     -Flags    => DB_CREATE ;
313
 
 
314
 
    ok 77, tie %g, 'BerkeleyDB::Btree', -Filename => $Dfile2, 
315
 
                                     -Compare   => sub { $_[0] cmp $_[1] },
316
 
                                     -Property  => DB_DUP,
317
 
                                     -Flags    => DB_CREATE ;
318
 
 
319
 
    ok 78, tie %k, 'BerkeleyDB::Btree', -Filename => $Dfile3, 
320
 
                                   -Compare   => sub { length $_[0] <=> length $_[1] },
321
 
                                   -Property  => DB_DUP,
322
 
                                   -Flags    => DB_CREATE ;
323
 
 
324
 
    my @srt_1 ;
325
 
    { local $^W = 0 ;
326
 
      @srt_1 = sort { $a <=> $b } @Keys ; 
327
 
    }
328
 
    my @srt_2 = sort { $a cmp $b } @Keys ;
329
 
    my @srt_3 = sort { length $a <=> length $b } @Keys ;
330
 
 
331
 
    foreach (@Keys) {
332
 
        local $^W = 0 ;
333
 
        my $value = shift @Values ;
334
 
        $h{$_} = $value ; 
335
 
        $g{$_} = $value ;
336
 
        $k{$_} = $value ;
337
 
    }
338
 
 
339
 
    sub getValues
340
 
    {
341
 
         my $hash = shift ;
342
 
         my $db = tied %$hash ;
343
 
         my $cursor = $db->db_cursor() ;
344
 
         my @values = () ;
345
 
         my ($k, $v) = (0,0) ;
346
 
         while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
347
 
             push @values, $v ;
348
 
         }
349
 
         return @values ;
350
 
    }
351
 
 
352
 
    ok 79, ArrayCompare (\@srt_1, [keys %h]);
353
 
    ok 80, ArrayCompare (\@srt_2, [keys %g]);
354
 
    ok 81, ArrayCompare (\@srt_3, [keys %k]);
355
 
    ok 82, ArrayCompare ([qw(dd 0 0 x 3 1 abc)], [getValues \%h]);
356
 
    ok 83, ArrayCompare ([qw(dd 1 0 3 x abc 0)], [getValues \%g]);
357
 
    ok 84, ArrayCompare ([qw(0 x 3 0 1 dd abc)], [getValues \%k]);
358
 
 
359
 
    # test DB_DUP_NEXT
360
 
    ok 85, my $cur = (tied %g)->db_cursor() ;
361
 
    my ($k, $v) = (9, "") ;
362
 
    ok 86, $cur->c_get($k, $v, DB_SET) == 0 ;
363
 
    ok 87, $k == 9 && $v == 0 ;
364
 
    ok 88, $cur->c_get($k, $v, DB_NEXT_DUP) == 0 ;
365
 
    ok 89, $k == 9 && $v eq "x" ;
366
 
    ok 90, $cur->c_get($k, $v, DB_NEXT_DUP) == DB_NOTFOUND ;
367
 
}
368
 
 
369
 
{
370
 
    # override default compare, with duplicates, sort values
371
 
    my $lex = new LexFile $Dfile, $Dfile2;
372
 
    my $value ;
373
 
    my (%h, %g) ;
374
 
    my @Keys   = qw( 0123 9 12 -1234 9 987654321 9 def  ) ; 
375
 
    my @Values = qw( 1    11 3   dd   x abc      2 0    ) ; 
376
 
    ok 91, tie %h, "BerkeleyDB::Btree", -Filename => $Dfile, 
377
 
                                     -Compare   => sub { $_[0] <=> $_[1] },
378
 
                                     -DupCompare   => sub { $_[0] cmp $_[1] },
379
 
                                     -Property  => DB_DUP,
380
 
                                     -Flags    => DB_CREATE ;
381
 
 
382
 
    ok 92, tie %g, 'BerkeleyDB::Btree', -Filename => $Dfile2, 
383
 
                                     -Compare   => sub { $_[0] cmp $_[1] },
384
 
                                     -DupCompare   => sub { $_[0] <=> $_[1] },
385
 
                                     -Property  => DB_DUP,
386
 
                                     
387
 
                                     
388
 
                                     
389
 
                                     -Flags    => DB_CREATE ;
390
 
 
391
 
    my @srt_1 ;
392
 
    { local $^W = 0 ;
393
 
      @srt_1 = sort { $a <=> $b } @Keys ; 
394
 
    }
395
 
    my @srt_2 = sort { $a cmp $b } @Keys ;
396
 
 
397
 
    foreach (@Keys) {
398
 
        local $^W = 0 ;
399
 
        my $value = shift @Values ;
400
 
        $h{$_} = $value ; 
401
 
        $g{$_} = $value ;
402
 
    }
403
 
 
404
 
    ok 93, ArrayCompare (\@srt_1, [keys %h]);
405
 
    ok 94, ArrayCompare (\@srt_2, [keys %g]);
406
 
    ok 95, ArrayCompare ([qw(dd 1 3 x 2 11 abc 0)], [getValues \%g]);
407
 
    ok 96, ArrayCompare ([qw(dd 0 11 2 x 3 1 abc)], [getValues \%h]);
408
 
 
409
 
}
410
 
 
411
 
{
412
 
    # get_dup etc
413
 
    my $lex = new LexFile $Dfile;
414
 
    my %hh ;
415
 
 
416
 
    ok 97, my $YY = tie %hh, "BerkeleyDB::Btree", -Filename => $Dfile, 
417
 
                                     -DupCompare   => sub { $_[0] cmp $_[1] },
418
 
                                     -Property  => DB_DUP,
419
 
                                     -Flags    => DB_CREATE ;
420
 
 
421
 
    $hh{'Wall'} = 'Larry' ;
422
 
    $hh{'Wall'} = 'Stone' ; # Note the duplicate key
423
 
    $hh{'Wall'} = 'Brick' ; # Note the duplicate key
424
 
    $hh{'Smith'} = 'John' ;
425
 
    $hh{'mouse'} = 'mickey' ;
426
 
    
427
 
    # first work in scalar context
428
 
    ok 98, scalar $YY->get_dup('Unknown') == 0 ;
429
 
    ok 99, scalar $YY->get_dup('Smith') == 1 ;
430
 
    ok 100, scalar $YY->get_dup('Wall') == 3 ;
431
 
    
432
 
    # now in list context
433
 
    my @unknown = $YY->get_dup('Unknown') ;
434
 
    ok 101, "@unknown" eq "" ;
435
 
    
436
 
    my @smith = $YY->get_dup('Smith') ;
437
 
    ok 102, "@smith" eq "John" ;
438
 
    
439
 
    {
440
 
    my @wall = $YY->get_dup('Wall') ;
441
 
    my %wall ;
442
 
    @wall{@wall} = @wall ;
443
 
    ok 103, (@wall == 3 && $wall{'Larry'} && $wall{'Stone'} && $wall{'Brick'});
444
 
    }
445
 
    
446
 
    # hash
447
 
    my %unknown = $YY->get_dup('Unknown', 1) ;
448
 
    ok 104, keys %unknown == 0 ;
449
 
    
450
 
    my %smith = $YY->get_dup('Smith', 1) ;
451
 
    ok 105, keys %smith == 1 && $smith{'John'} ;
452
 
    
453
 
    my %wall = $YY->get_dup('Wall', 1) ;
454
 
    ok 106, keys %wall == 3 && $wall{'Larry'} == 1 && $wall{'Stone'} == 1 
455
 
                && $wall{'Brick'} == 1 ;
456
 
    
457
 
    undef $YY ;
458
 
    untie %hh ;
459
 
 
460
 
}
461
 
 
462
 
{
463
 
    # in-memory file
464
 
 
465
 
    my $lex = new LexFile $Dfile ;
466
 
    my %hash ;
467
 
    my $fd ;
468
 
    my $value ;
469
 
    ok 107, my $db = tie %hash, 'BerkeleyDB::Btree' ;
470
 
 
471
 
    ok 108, $db->db_put("some key", "some value") == 0  ;
472
 
    ok 109, $db->db_get("some key", $value) == 0 ;
473
 
    ok 110, $value eq "some value" ;
474
 
 
475
 
}
476
 
 
477
 
{
478
 
    # partial
479
 
    # check works via API
480
 
 
481
 
    my $lex = new LexFile $Dfile ;
482
 
    my $value ;
483
 
    ok 111, my $db = new BerkeleyDB::Btree, -Filename => $Dfile,
484
 
                                               -Flags    => DB_CREATE ;
485
 
 
486
 
    # create some data
487
 
    my %data =  (
488
 
                "red"   => "boat",
489
 
                "green" => "house",
490
 
                "blue"  => "sea",
491
 
                ) ;
492
 
 
493
 
    my $ret = 0 ;
494
 
    while (my ($k, $v) = each %data) {
495
 
        $ret += $db->db_put($k, $v) ;
496
 
    }
497
 
    ok 112, $ret == 0 ;
498
 
 
499
 
 
500
 
    # do a partial get
501
 
    my ($pon, $off, $len) = $db->partial_set(0,2) ;
502
 
    ok 113, ! $pon && $off == 0 && $len == 0 ;
503
 
    ok 114, $db->db_get("red", $value) == 0 && $value eq "bo" ;
504
 
    ok 115, $db->db_get("green", $value) == 0 && $value eq "ho" ;
505
 
    ok 116, $db->db_get("blue", $value) == 0 && $value eq "se" ;
506
 
 
507
 
    # do a partial get, off end of data
508
 
    ($pon, $off, $len) = $db->partial_set(3,2) ;
509
 
    ok 117, $pon ;
510
 
    ok 118, $off == 0 ;
511
 
    ok 119, $len == 2 ;
512
 
    ok 120, $db->db_get("red", $value) == 0 && $value eq "t" ;
513
 
    ok 121, $db->db_get("green", $value) == 0 && $value eq "se" ;
514
 
    ok 122, $db->db_get("blue", $value) == 0 && $value eq "" ;
515
 
 
516
 
    # switch of partial mode
517
 
    ($pon, $off, $len) = $db->partial_clear() ;
518
 
    ok 123, $pon ;
519
 
    ok 124, $off == 3 ;
520
 
    ok 125, $len == 2 ;
521
 
    ok 126, $db->db_get("red", $value) == 0 && $value eq "boat" ;
522
 
    ok 127, $db->db_get("green", $value) == 0 && $value eq "house" ;
523
 
    ok 128, $db->db_get("blue", $value) == 0 && $value eq "sea" ;
524
 
 
525
 
    # now partial put
526
 
    $db->partial_set(0,2) ;
527
 
    ok 129, $db->db_put("red", "") == 0 ;
528
 
    ok 130, $db->db_put("green", "AB") == 0 ;
529
 
    ok 131, $db->db_put("blue", "XYZ") == 0 ;
530
 
    ok 132, $db->db_put("new", "KLM") == 0 ;
531
 
 
532
 
    ($pon, $off, $len) = $db->partial_clear() ;
533
 
    ok 133, $pon ;
534
 
    ok 134, $off == 0 ;
535
 
    ok 135, $len == 2 ;
536
 
    ok 136, $db->db_get("red", $value) == 0 && $value eq "at" ;
537
 
    ok 137, $db->db_get("green", $value) == 0 && $value eq "ABuse" ;
538
 
    ok 138, $db->db_get("blue", $value) == 0 && $value eq "XYZa" ;
539
 
    ok 139, $db->db_get("new", $value) == 0 && $value eq "KLM" ;
540
 
 
541
 
    # now partial put
542
 
    ($pon, $off, $len) = $db->partial_set(3,2) ;
543
 
    ok 140, ! $pon ;
544
 
    ok 141, $off == 0 ;
545
 
    ok 142, $len == 0 ;
546
 
    ok 143, $db->db_put("red", "PPP") == 0 ;
547
 
    ok 144, $db->db_put("green", "Q") == 0 ;
548
 
    ok 145, $db->db_put("blue", "XYZ") == 0 ;
549
 
    ok 146, $db->db_put("new", "TU") == 0 ;
550
 
 
551
 
    $db->partial_clear() ;
552
 
    ok 147, $db->db_get("red", $value) == 0 && $value eq "at\0PPP" ;
553
 
    ok 148, $db->db_get("green", $value) == 0 && $value eq "ABuQ" ;
554
 
    ok 149, $db->db_get("blue", $value) == 0 && $value eq "XYZXYZ" ;
555
 
    ok 150, $db->db_get("new", $value) == 0 && $value eq "KLMTU" ;
556
 
}
557
 
 
558
 
{
559
 
    # partial
560
 
    # check works via tied hash 
561
 
 
562
 
    my $lex = new LexFile $Dfile ;
563
 
    my %hash ;
564
 
    my $value ;
565
 
    ok 151, my $db = tie %hash, 'BerkeleyDB::Btree', -Filename => $Dfile,
566
 
                                               -Flags    => DB_CREATE ;
567
 
 
568
 
    # create some data
569
 
    my %data =  (
570
 
                "red"   => "boat",
571
 
                "green" => "house",
572
 
                "blue"  => "sea",
573
 
                ) ;
574
 
 
575
 
    while (my ($k, $v) = each %data) {
576
 
        $hash{$k} = $v ;
577
 
    }
578
 
 
579
 
 
580
 
    # do a partial get
581
 
    $db->partial_set(0,2) ;
582
 
    ok 152, $hash{"red"} eq "bo" ;
583
 
    ok 153, $hash{"green"} eq "ho" ;
584
 
    ok 154, $hash{"blue"}  eq "se" ;
585
 
 
586
 
    # do a partial get, off end of data
587
 
    $db->partial_set(3,2) ;
588
 
    ok 155, $hash{"red"} eq "t" ;
589
 
    ok 156, $hash{"green"} eq "se" ;
590
 
    ok 157, $hash{"blue"} eq "" ;
591
 
 
592
 
    # switch of partial mode
593
 
    $db->partial_clear() ;
594
 
    ok 158, $hash{"red"} eq "boat" ;
595
 
    ok 159, $hash{"green"} eq "house" ;
596
 
    ok 160, $hash{"blue"} eq "sea" ;
597
 
 
598
 
    # now partial put
599
 
    $db->partial_set(0,2) ;
600
 
    ok 161, $hash{"red"} = "" ;
601
 
    ok 162, $hash{"green"} = "AB" ;
602
 
    ok 163, $hash{"blue"} = "XYZ" ;
603
 
    ok 164, $hash{"new"} = "KLM" ;
604
 
 
605
 
    $db->partial_clear() ;
606
 
    ok 165, $hash{"red"} eq "at" ;
607
 
    ok 166, $hash{"green"} eq "ABuse" ;
608
 
    ok 167, $hash{"blue"} eq "XYZa" ;
609
 
    ok 168, $hash{"new"} eq "KLM" ;
610
 
 
611
 
    # now partial put
612
 
    $db->partial_set(3,2) ;
613
 
    ok 169, $hash{"red"} = "PPP" ;
614
 
    ok 170, $hash{"green"} = "Q" ;
615
 
    ok 171, $hash{"blue"} = "XYZ" ;
616
 
    ok 172, $hash{"new"} = "TU" ;
617
 
 
618
 
    $db->partial_clear() ;
619
 
    ok 173, $hash{"red"} eq "at\0PPP" ;
620
 
    ok 174, $hash{"green"} eq "ABuQ" ;
621
 
    ok 175, $hash{"blue"} eq "XYZXYZ" ;
622
 
    ok 176, $hash{"new"} eq "KLMTU" ;
623
 
}
624
 
 
625
 
{
626
 
    # transaction
627
 
 
628
 
    my $lex = new LexFile $Dfile ;
629
 
    my %hash ;
630
 
    my $value ;
631
 
 
632
 
    my $home = "./fred" ;
633
 
    ok 177, my $lexD = new LexDir($home) ;
634
 
    ok 178, my $env = new BerkeleyDB::Env -Home => $home,
635
 
                                     -Flags => DB_CREATE|DB_INIT_TXN|
636
 
                                                DB_INIT_MPOOL|DB_INIT_LOCK ;
637
 
    ok 179, my $txn = $env->txn_begin() ;
638
 
    ok 180, my $db1 = tie %hash, 'BerkeleyDB::Btree', -Filename => $Dfile,
639
 
                                               -Flags    =>  DB_CREATE ,
640
 
                                               -Env      => $env,
641
 
                                               -Txn      => $txn ;
642
 
 
643
 
    ok 181, (my $Z = $txn->txn_commit()) == 0 ;
644
 
    ok 182, $txn = $env->txn_begin() ;
645
 
    $db1->Txn($txn);
646
 
    
647
 
    # create some data
648
 
    my %data =  (
649
 
                "red"   => "boat",
650
 
                "green" => "house",
651
 
                "blue"  => "sea",
652
 
                ) ;
653
 
 
654
 
    my $ret = 0 ;
655
 
    while (my ($k, $v) = each %data) {
656
 
        $ret += $db1->db_put($k, $v) ;
657
 
    }
658
 
    ok 183, $ret == 0 ;
659
 
 
660
 
    # should be able to see all the records
661
 
 
662
 
    ok 184, my $cursor = $db1->db_cursor() ;
663
 
    my ($k, $v) = ("", "") ;
664
 
    my $count = 0 ;
665
 
    # sequence forwards
666
 
    while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
667
 
        ++ $count ;
668
 
    }
669
 
    ok 185, $count == 3 ;
670
 
    undef $cursor ;
671
 
 
672
 
    # now abort the transaction
673
 
    #ok 151, $txn->txn_abort() == 0 ;
674
 
    ok 186, ($Z = $txn->txn_abort()) == 0 ;
675
 
 
676
 
    # there shouldn't be any records in the database
677
 
    $count = 0 ;
678
 
    # sequence forwards
679
 
    ok 187, $cursor = $db1->db_cursor() ;
680
 
    while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
681
 
        ++ $count ;
682
 
    }
683
 
    ok 188, $count == 0 ;
684
 
 
685
 
    undef $txn ;
686
 
    undef $cursor ;
687
 
    undef $db1 ;
688
 
    undef $env ;
689
 
    untie %hash ;
690
 
}
691
 
 
692
 
{
693
 
    # DB_DUP
694
 
 
695
 
    my $lex = new LexFile $Dfile ;
696
 
    my %hash ;
697
 
    ok 189, my $db = tie %hash, 'BerkeleyDB::Btree', -Filename => $Dfile,
698
 
                                      -Property  => DB_DUP,
699
 
                                      -Flags    => DB_CREATE ;
700
 
 
701
 
    $hash{'Wall'} = 'Larry' ;
702
 
    $hash{'Wall'} = 'Stone' ;
703
 
    $hash{'Smith'} = 'John' ;
704
 
    $hash{'Wall'} = 'Brick' ;
705
 
    $hash{'Wall'} = 'Brick' ;
706
 
    $hash{'mouse'} = 'mickey' ;
707
 
 
708
 
    ok 190, keys %hash == 6 ;
709
 
 
710
 
    # create a cursor
711
 
    ok 191, my $cursor = $db->db_cursor() ;
712
 
 
713
 
    my $key = "Wall" ;
714
 
    my $value ;
715
 
    ok 192, $cursor->c_get($key, $value, DB_SET) == 0 ;
716
 
    ok 193, $key eq "Wall" && $value eq "Larry" ;
717
 
    ok 194, $cursor->c_get($key, $value, DB_NEXT) == 0 ;
718
 
    ok 195, $key eq "Wall" && $value eq "Stone" ;
719
 
    ok 196, $cursor->c_get($key, $value, DB_NEXT) == 0 ;
720
 
    ok 197, $key eq "Wall" && $value eq "Brick" ;
721
 
    ok 198, $cursor->c_get($key, $value, DB_NEXT) == 0 ;
722
 
    ok 199, $key eq "Wall" && $value eq "Brick" ;
723
 
 
724
 
    #my $ref = $db->db_stat() ; 
725
 
    #ok 200, ($ref->{bt_flags} | DB_DUP) == DB_DUP ;
726
 
#print "bt_flags " . $ref->{bt_flags} . " DB_DUP " . DB_DUP ."\n";
727
 
 
728
 
    undef $db ;
729
 
    undef $cursor ;
730
 
    untie %hash ;
731
 
 
732
 
}
733
 
 
734
 
{
735
 
    # db_stat
736
 
 
737
 
    my $lex = new LexFile $Dfile ;
738
 
    my $recs = ($BerkeleyDB::db_version >= 3.1 ? "bt_ndata" : "bt_nrecs") ;
739
 
    my %hash ;
740
 
    my ($k, $v) ;
741
 
    ok 200, my $db = new BerkeleyDB::Btree -Filename => $Dfile, 
742
 
                                     -Flags    => DB_CREATE,
743
 
                                        -Minkey =>3 ,
744
 
                                        -Pagesize       => 2 **12 
745
 
                                        ;
746
 
 
747
 
    my $ref = $db->db_stat() ; 
748
 
    ok 201, $ref->{$recs} == 0;
749
 
    ok 202, $ref->{'bt_minkey'} == 3;
750
 
    ok 203, $ref->{'bt_pagesize'} == 2 ** 12;
751
 
 
752
 
    # create some data
753
 
    my %data =  (
754
 
                "red"   => 2,
755
 
                "green" => "house",
756
 
                "blue"  => "sea",
757
 
                ) ;
758
 
 
759
 
    my $ret = 0 ;
760
 
    while (($k, $v) = each %data) {
761
 
        $ret += $db->db_put($k, $v) ;
762
 
    }
763
 
    ok 204, $ret == 0 ;
764
 
 
765
 
    $ref = $db->db_stat() ; 
766
 
    ok 205, $ref->{$recs} == 3;
767
 
}
768
 
 
769
 
{
770
 
   # sub-class test
771
 
 
772
 
   package Another ;
773
 
 
774
 
   use strict ;
775
 
 
776
 
   open(FILE, ">SubDB.pm") or die "Cannot open SubDB.pm: $!\n" ;
777
 
   print FILE <<'EOM' ;
778
 
 
779
 
   package SubDB ;
780
 
 
781
 
   use strict ;
782
 
   use vars qw( @ISA @EXPORT) ;
783
 
 
784
 
   require Exporter ;
785
 
   use BerkeleyDB;
786
 
   @ISA=qw(BerkeleyDB::Btree);
787
 
   @EXPORT = @BerkeleyDB::EXPORT ;
788
 
 
789
 
   sub db_put { 
790
 
        my $self = shift ;
791
 
        my $key = shift ;
792
 
        my $value = shift ;
793
 
        $self->SUPER::db_put($key, $value * 3) ;
794
 
   }
795
 
 
796
 
   sub db_get { 
797
 
        my $self = shift ;
798
 
        $self->SUPER::db_get($_[0], $_[1]) ;
799
 
        $_[1] -= 2 ;
800
 
   }
801
 
 
802
 
   sub A_new_method
803
 
   {
804
 
        my $self = shift ;
805
 
        my $key = shift ;
806
 
        my $value = $self->FETCH($key) ;
807
 
        return "[[$value]]" ;
808
 
   }
809
 
 
810
 
   1 ;
811
 
EOM
812
 
 
813
 
    close FILE ;
814
 
 
815
 
    BEGIN { push @INC, '.'; }    
816
 
    eval 'use SubDB ; ';
817
 
    main::ok 206, $@ eq "" ;
818
 
    my %h ;
819
 
    my $X ;
820
 
    eval '
821
 
        $X = tie(%h, "SubDB", -Filename => "dbbtree.tmp", 
822
 
                        -Flags => DB_CREATE,
823
 
                        -Mode => 0640 );
824
 
        ' ;
825
 
 
826
 
    main::ok 207, $@ eq "" && $X ;
827
 
 
828
 
    my $ret = eval '$h{"fred"} = 3 ; return $h{"fred"} ' ;
829
 
    main::ok 208, $@ eq "" ;
830
 
    main::ok 209, $ret == 7 ;
831
 
 
832
 
    my $value = 0;
833
 
    $ret = eval '$X->db_put("joe", 4) ; $X->db_get("joe", $value) ; return $value' ;
834
 
    main::ok 210, $@ eq "" ;
835
 
    main::ok 211, $ret == 10 ;
836
 
 
837
 
    $ret = eval ' DB_NEXT eq main::DB_NEXT ' ;
838
 
    main::ok 212, $@ eq ""  ;
839
 
    main::ok 213, $ret == 1 ;
840
 
 
841
 
    $ret = eval '$X->A_new_method("joe") ' ;
842
 
    main::ok 214, $@ eq "" ;
843
 
    main::ok 215, $ret eq "[[10]]" ;
844
 
 
845
 
    undef $X;
846
 
    untie %h;
847
 
    unlink "SubDB.pm", "dbbtree.tmp" ;
848
 
 
849
 
}
850
 
 
851
 
{
852
 
    # DB_RECNUM, DB_SET_RECNO & DB_GET_RECNO
853
 
 
854
 
    my $lex = new LexFile $Dfile ;
855
 
    my %hash ;
856
 
    my ($k, $v) = ("", "");
857
 
    ok 216, my $db = new BerkeleyDB::Btree 
858
 
                                -Filename  => $Dfile, 
859
 
                                -Flags     => DB_CREATE,
860
 
                                -Property  => DB_RECNUM ;
861
 
 
862
 
 
863
 
    # create some data
864
 
    my @data =  (
865
 
                "A zero",
866
 
                "B one",
867
 
                "C two",
868
 
                "D three",
869
 
                "E four"
870
 
                ) ;
871
 
 
872
 
    my $ix = 0 ;
873
 
    my $ret = 0 ;
874
 
    foreach (@data) {
875
 
        $ret += $db->db_put($_, $ix) ;
876
 
        ++ $ix ;
877
 
    }
878
 
    ok 217, $ret == 0 ;
879
 
 
880
 
    # db_get & DB_SET_RECNO
881
 
    $k = 1 ;
882
 
    ok 218, $db->db_get($k, $v, DB_SET_RECNO) == 0;
883
 
    ok 219, $k eq "B one" && $v == 1 ;
884
 
 
885
 
    $k = 3 ;
886
 
    ok 220, $db->db_get($k, $v, DB_SET_RECNO) == 0;
887
 
    ok 221, $k eq "D three" && $v == 3 ;
888
 
 
889
 
    $k = 4 ;
890
 
    ok 222, $db->db_get($k, $v, DB_SET_RECNO) == 0;
891
 
    ok 223, $k eq "E four" && $v == 4 ;
892
 
 
893
 
    $k = 0 ;
894
 
    ok 224, $db->db_get($k, $v, DB_SET_RECNO) == 0;
895
 
    ok 225, $k eq "A zero" && $v == 0 ;
896
 
 
897
 
    # cursor & DB_SET_RECNO
898
 
 
899
 
    # create the cursor
900
 
    ok 226, my $cursor = $db->db_cursor() ;
901
 
 
902
 
    $k = 2 ;
903
 
    ok 227, $db->db_get($k, $v, DB_SET_RECNO) == 0;
904
 
    ok 228, $k eq "C two" && $v == 2 ;
905
 
 
906
 
    $k = 0 ;
907
 
    ok 229, $cursor->c_get($k, $v, DB_SET_RECNO) == 0;
908
 
    ok 230, $k eq "A zero" && $v == 0 ;
909
 
 
910
 
    $k = 3 ;
911
 
    ok 231, $db->db_get($k, $v, DB_SET_RECNO) == 0;
912
 
    ok 232, $k eq "D three" && $v == 3 ;
913
 
 
914
 
    # cursor & DB_GET_RECNO
915
 
    ok 233, $cursor->c_get($k, $v, DB_FIRST) == 0 ;
916
 
    ok 234, $k eq "A zero" && $v == 0 ;
917
 
    ok 235, $cursor->c_get($k, $v, DB_GET_RECNO) == 0;
918
 
    ok 236, $v == 0 ;
919
 
 
920
 
    ok 237, $cursor->c_get($k, $v, DB_NEXT) == 0 ;
921
 
    ok 238, $k eq "B one" && $v == 1 ;
922
 
    ok 239, $cursor->c_get($k, $v, DB_GET_RECNO) == 0;
923
 
    ok 240, $v == 1 ;
924
 
 
925
 
    ok 241, $cursor->c_get($k, $v, DB_LAST) == 0 ;
926
 
    ok 242, $k eq "E four" && $v == 4 ;
927
 
    ok 243, $cursor->c_get($k, $v, DB_GET_RECNO) == 0;
928
 
    ok 244, $v == 4 ;
929
 
 
930
 
}
931