subdb.t
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!./perl -w
  2. use strict ;
  3. BEGIN {
  4.     unless(grep /blib/, @INC) {
  5.         chdir 't' if -d 't';
  6.         @INC = '../lib' if -d '../lib';
  7.     }
  8. }
  9. use BerkeleyDB; 
  10. use File::Path qw(rmtree);
  11. BEGIN 
  12. {
  13.     if ($BerkeleyDB::db_version < 3) {
  14. print "1..0 # Skipping test, this needs Berkeley DB 3.x or bettern" ;
  15. exit 0 ;
  16.     }
  17. }
  18. print "1..43n";
  19. my %DB_errors = (
  20. 'DB_INCOMPLETE' => "DB_INCOMPLETE: Sync was unable to complete",
  21. 'DB_KEYEMPTY' => "DB_KEYEMPTY: Non-existent key/data pair",
  22. 'DB_KEYEXIST' => "DB_KEYEXIST: Key/data pair already exists",
  23. 'DB_LOCK_DEADLOCK' => "DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock",
  24. 'DB_LOCK_NOTGRANTED' => "DB_LOCK_NOTGRANTED: Lock not granted",
  25. 'DB_NOTFOUND' => "DB_NOTFOUND: No matching key/data pair found",
  26. 'DB_OLD_VERSION' => "DB_OLDVERSION: Database requires a version upgrade",
  27. 'DB_RUNRECOVERY' => "DB_RUNRECOVERY: Fatal error, run database recovery",
  28. ) ;
  29. {
  30.     package LexFile ;
  31.     sub new
  32.     {
  33. my $self = shift ;
  34. unlink @_ ;
  35.   bless [ @_ ], $self ;
  36.     }
  37.     sub DESTROY
  38.     {
  39. my $self = shift ;
  40. unlink @{ $self } ;
  41.     }
  42. }
  43. sub ok
  44. {
  45.     my $no = shift ;
  46.     my $result = shift ;
  47.  
  48.     print "not " unless $result ;
  49.     print "ok $non" ;
  50. }
  51. sub addData
  52. {
  53.     my $db = shift ;
  54.     my @data = @_ ;
  55.     die "addData odd datan" unless @data /2 != 0 ;
  56.     my ($k, $v) ;
  57.     my $ret = 0 ;
  58.     while (@data) {
  59.         $k = shift @data ;
  60.         $v = shift @data ;
  61.         $ret += $db->db_put($k, $v) ;
  62.     }
  63.     return ($ret == 0) ;
  64. }
  65. my $Dfile = "dbhash.tmp";
  66. my $Dfile2 = "dbhash2.tmp";
  67. my $Dfile3 = "dbhash3.tmp";
  68. unlink $Dfile;
  69. umask(0) ;
  70. # Berkeley DB 3.x specific functionality
  71. # Check for invalid parameters
  72. {
  73.     # Check for invalid parameters
  74.     my $db ;
  75.     eval ' BerkeleyDB::db_remove  -Stupid => 3 ; ' ;
  76.     ok 1, $@ =~ /unknown key value(s) Stupid/  ;
  77.     eval ' BerkeleyDB::db_remove -Bad => 2, -Filename => "fred", -Stupid => 3; ' ;
  78.     ok 2, $@ =~ /unknown key value(s) (Bad |Stupid ){2}/  ;
  79.     eval ' BerkeleyDB::db_remove -Filename => "a", -Env => 2 ' ;
  80.     ok 3, $@ =~ /^Env not of type BerkeleyDB::Env/ ;
  81.     eval ' BerkeleyDB::db_remove -Subname => "a"' ;
  82.     ok 4, $@ =~ /^Must specify a filename/ ;
  83.     my $obj = bless [], "main" ;
  84.     eval ' BerkeleyDB::db_remove -Filename => "x", -Env => $obj ' ;
  85.     ok 5, $@ =~ /^Env not of type BerkeleyDB::Env/ ;
  86. }
  87. {
  88.     # subdatabases
  89.     # opening a subdatabse in an exsiting database that doesn't have
  90.     # subdatabases at all should fail
  91.     my $lex = new LexFile $Dfile ;
  92.     ok 6, my $db = new BerkeleyDB::Hash -Filename => $Dfile, 
  93.         -Flags    => DB_CREATE ;
  94.     # Add a k/v pair
  95.     my %data = qw(
  96.      red sky
  97. blue sea
  98. black heart
  99. yellow belley
  100. green grass
  101.      ) ;
  102.     ok 7, addData($db, %data) ;
  103.     undef $db ;
  104.     $db = new BerkeleyDB::Hash -Filename => $Dfile, 
  105.        -Subname  => "fred" ;
  106.     ok 8, ! $db ;     
  107.     ok 9, -e $Dfile ;
  108.     ok 10, ! BerkeleyDB::db_remove(-Filename => $Dfile)  ;
  109. }
  110. {
  111.     # subdatabases
  112.     # opening a subdatabse in an exsiting database that does have
  113.     # subdatabases at all, but not this one
  114.     my $lex = new LexFile $Dfile ;
  115.     ok 11, my $db = new BerkeleyDB::Hash -Filename => $Dfile, 
  116.          -Subname  => "fred" ,
  117.          -Flags    => DB_CREATE ;
  118.     # Add a k/v pair
  119.     my %data = qw(
  120.      red sky
  121. blue sea
  122. black heart
  123. yellow belley
  124. green grass
  125.      ) ;
  126.     ok 12, addData($db, %data) ;
  127.     undef $db ;
  128.     $db = new BerkeleyDB::Hash -Filename => $Dfile, 
  129.     -Subname  => "joe" ;
  130.     ok 13, !$db ;     
  131. }
  132. {
  133.     # subdatabases
  134.     my $lex = new LexFile $Dfile ;
  135.     ok 14, my $db = new BerkeleyDB::Hash -Filename => $Dfile, 
  136.         -Subname  => "fred" ,
  137.         -Flags    => DB_CREATE ;
  138.     # Add a k/v pair
  139.     my %data = qw(
  140.      red sky
  141. blue sea
  142. black heart
  143. yellow belley
  144. green grass
  145.      ) ;
  146.     ok 15, addData($db, %data) ;
  147.     undef $db ;
  148.     ok 16, $db = new BerkeleyDB::Hash -Filename => $Dfile, 
  149.     -Subname  => "fred" ;
  150.     ok 17, my $cursor = $db->db_cursor() ;
  151.     my ($k, $v) = ("", "") ;
  152.     my $status ;
  153.     while (($status = $cursor->c_get($k, $v, DB_NEXT)) == 0) {
  154.         if ($data{$k} eq $v) {
  155.     delete $data{$k} ;
  156. }
  157.     }
  158.     ok 18, $status == DB_NOTFOUND ;
  159.     ok 19, keys %data == 0 ;
  160. }
  161. {
  162.     # subdatabases
  163.     # opening a database with multiple subdatabases - handle should be a list
  164.     # of the subdatabase names
  165.     my $lex = new LexFile $Dfile ;
  166.   
  167.     ok 20, my $db1 = new BerkeleyDB::Hash -Filename => $Dfile, 
  168.         -Subname  => "fred" ,
  169.         -Flags    => DB_CREATE ;
  170.     ok 21, my $db2 = new BerkeleyDB::Btree -Filename => $Dfile, 
  171.         -Subname  => "joe" ,
  172.         -Flags    => DB_CREATE ;
  173.     # Add a k/v pair
  174.     my %data = qw(
  175.      red sky
  176. blue sea
  177. black heart
  178. yellow belley
  179. green grass
  180.      ) ;
  181.     ok 22, addData($db1, %data) ;
  182.     ok 23, addData($db2, %data) ;
  183.     undef $db1 ;
  184.     undef $db2 ;
  185.   
  186.     ok 24, my $db = new BerkeleyDB::Unknown -Filename => $Dfile ,
  187.          -Flags    => DB_RDONLY ;
  188.     #my $type = $db->type() ; print "type $typen" ;
  189.     ok 25, my $cursor = $db->db_cursor() ;
  190.     my ($k, $v) = ("", "") ;
  191.     my $status ;
  192.     my @dbnames = () ;
  193.     while (($status = $cursor->c_get($k, $v, DB_NEXT)) == 0) {
  194.         push @dbnames, $k ;
  195.     }
  196.     ok 26, $status == DB_NOTFOUND ;
  197.     ok 27, join(",", sort @dbnames) eq "fred,joe" ;
  198.     undef $db ;
  199.     ok 28, BerkeleyDB::db_remove(-Filename => $Dfile, -Subname => "harry") != 0;
  200.     ok 29, BerkeleyDB::db_remove(-Filename => $Dfile, -Subname => "fred") == 0 ;
  201.     
  202.     # should only be one subdatabase
  203.     ok 30, $db = new BerkeleyDB::Unknown -Filename => $Dfile ,
  204.          -Flags    => DB_RDONLY ;
  205.     ok 31, $cursor = $db->db_cursor() ;
  206.     @dbnames = () ;
  207.     while (($status = $cursor->c_get($k, $v, DB_NEXT)) == 0) {
  208.         push @dbnames, $k ;
  209.     }
  210.     ok 32, $status == DB_NOTFOUND ;
  211.     ok 33, join(",", sort @dbnames) eq "joe" ;
  212.     undef $db ;
  213.     # can't delete an already deleted subdatabase
  214.     ok 34, BerkeleyDB::db_remove(-Filename => $Dfile, -Subname => "fred") != 0;
  215.     
  216.     ok 35, BerkeleyDB::db_remove(-Filename => $Dfile, -Subname => "joe") == 0 ;
  217.     
  218.     # should only be one subdatabase
  219.     ok 36, $db = new BerkeleyDB::Unknown -Filename => $Dfile ,
  220.          -Flags    => DB_RDONLY ;
  221.     ok 37, $cursor = $db->db_cursor() ;
  222.     @dbnames = () ;
  223.     while (($status = $cursor->c_get($k, $v, DB_NEXT)) == 0) {
  224.         push @dbnames, $k ;
  225.     }
  226.     ok 38, $status == DB_NOTFOUND ;
  227.     ok 39, @dbnames == 0 ;
  228.     undef $db ;
  229.     ok 40, -e $Dfile ;
  230.     ok 41, BerkeleyDB::db_remove(-Filename => $Dfile)  == 0 ;
  231.     ok 42, ! -e $Dfile ;
  232.     ok 43, BerkeleyDB::db_remove(-Filename => $Dfile) != 0 ;
  233. }
  234. # db_remove with env