diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2015-02-17 17:25:57 +0000 |
---|---|---|
committer | <> | 2015-03-17 16:26:24 +0000 |
commit | 780b92ada9afcf1d58085a83a0b9e6bc982203d1 (patch) | |
tree | 598f8b9fa431b228d29897e798de4ac0c1d3d970 /lang/perl/BerkeleyDB/t/blob.t | |
parent | 7a2660ba9cc2dc03a69ddfcfd95369395cc87444 (diff) | |
download | berkeleydb-master.tar.gz |
Diffstat (limited to 'lang/perl/BerkeleyDB/t/blob.t')
-rw-r--r-- | lang/perl/BerkeleyDB/t/blob.t | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/lang/perl/BerkeleyDB/t/blob.t b/lang/perl/BerkeleyDB/t/blob.t new file mode 100644 index 00000000..6931418a --- /dev/null +++ b/lang/perl/BerkeleyDB/t/blob.t @@ -0,0 +1,166 @@ +#!./perl -w + +use strict ; + +use lib 't'; +use BerkeleyDB; +use util ; +use Test::More; + +plan(skip_all => "this needs Berkeley DB 6.x.x or better\n" ) + if $BerkeleyDB::db_version < 6; + +plan tests => 84; + +my $Dfile = "dbhash.tmp"; +my $Dfile2 = "dbhash2.tmp"; +my $Dfile3 = "dbhash3.tmp"; +unlink $Dfile; + +umask(0) ; + +sub isBlob +{ + my $cursor = shift ; + my $key = shift; + + my $v = ''; + $cursor->partial_set(0,0) ; + $cursor->c_get($key, $v, DB_SET) ; + $cursor->partial_clear() ; + return defined $cursor->db_stream(DB_STREAM_WRITE); +} + +for my $TYPE ( qw(BerkeleyDB::Hash BerkeleyDB::Btree )) +{ + #diag "Test $TYPE"; + my $lex = new LexFile $Dfile ; + my $home = "./fred" ; + my $lexd = new LexDir $home ; + my $threshold = 1234 ; + + ok my $env = new BerkeleyDB::Env + Flags => DB_CREATE|DB_INIT_MPOOL, + #@StdErrFile, + BlobDir => $home, + Home => $home ; + + ok my $db = new $TYPE Filename => $Dfile, + Env => $env, + BlobThreshold => $threshold, + Flags => DB_CREATE ; + + isa_ok $db, $TYPE ; + + ok $env->get_blob_threshold(my $t1) == 0 ; + is $t1, 0," env threshold is 0" ; + + ok $env->get_blob_dir(my $dir1) == 0 ; + is $dir1, $home," env threshold is 0" ; + + ok $db->get_blob_threshold(my $t2) == 0 ; + is $t2, $threshold," db threshold is $threshold" ; + + ok $db->get_blob_dir(my $dir2) == 0 ; + is $dir2, $home, " env threshold is 0" ; + + my $smallData = "a234"; + my $bigData = "x" x ($threshold+1) ; + ok $db->db_put("1", $bigData) == 0 ; + ok $db->db_put("2", $smallData) == 0 ; + + my $v2 ; + ok $db->db_get("1", $v2) == 0 ; + is $v2, $bigData; + + my $v1 ; + ok $db->db_get("2", $v1) == 0 ; + is $v1, $smallData; + + ok my $cursor = $db->db_cursor() ; + + ok isBlob($cursor, "1"); + ok !isBlob($cursor, "2"); + + my $k = "1"; + my $v = ''; + $cursor->partial_set(0,0) ; + ok $cursor->c_get($k, $v, DB_SET) == 0, "set cursor" + or diag "Status is [" . $cursor->status() . "]"; + $cursor->partial_clear() ; + is $k, "1"; + ok my $dbstream = $cursor->db_stream(DB_STREAM_WRITE) + or diag "Status is [" . $cursor->status() . "]"; + isa_ok $dbstream, 'BerkeleyDB::DbStream'; + ok $dbstream->size(my $s) == 0 , "size"; + is $s, length $bigData, "length ok"; + my $new ; + ok $dbstream->read($new, 0, length $bigData) == 0 , "read" + or diag "Status is [" . $cursor->status() . "]"; + is $new, $bigData; + my $newData = "hello world" ; + ok $dbstream->write($newData) == 0 , "write"; + + substr($bigData, 0, length($newData)) = $newData; + + my $new1; + ok $dbstream->read($new, 0, 5) == 0 , "read"; + is $new, "hello"; + + ok $dbstream->close() == 0 , "close"; + + $k = "1"; + my $stream = $cursor->c_get_db_stream($k, DB_SET, DB_STREAM_WRITE) ; + isa_ok $stream, 'BerkeleyDB::DbStream'; + is $k, "1"; + ok $stream->size($s) == 0 , "size"; + is $s, length $bigData, "length ok"; + $new = 'abc'; + ok $stream->read($new, 0, 5) == 0 , "read"; + is $new, "hello"; + ok $stream->close() == 0 , "close"; + + + ok my $cursor1 = $db->db_cursor() ; + my $d1 ; + my $d2 ; + while (1) + { + my $k = ''; + my $v = ''; + $cursor->partial_set(0,0) ; + my $status = $cursor1->c_get($k, $v, DB_NEXT) ; + $cursor->partial_clear(); + + last if $status != 0 ; + + my $stream = $cursor1->db_stream(DB_STREAM_WRITE); + + if (defined $stream) + { + $stream->size(my $s) ; + my $d = ''; + my $delta = 1024; + my $off = 0; + while ($s) + { + $delta = $s if $s - $delta < 0 ; + + $stream->read($d, $off, $delta); + $off += $delta ; + $s -= $delta ; + $d1 .= $d ; + } + + } + else + { + $cursor1->c_get($k, $d2, DB_CURRENT) ; + } + } + + is $d1, $bigData; + is $d2, $smallData; + +} + |