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

MySQL数据库

开发平台:

Visual C++

  1. #!./perl -w
  2. # ID: %I%, %G%   
  3. use strict ;
  4. BEGIN {
  5.     unless(grep /blib/, @INC) {
  6.         chdir 't' if -d 't';
  7.         @INC = '../lib' if -d '../lib';
  8.     }
  9. }
  10. use BerkeleyDB; 
  11. use File::Path qw(rmtree);
  12. if ($BerkeleyDB::db_ver < 2.005002)
  13. {
  14.     print "1..0 # Skip: join needs Berkeley DB 2.5.2 or latern" ;
  15.     exit 0 ;
  16. }
  17. print "1..37n";
  18. {
  19.     package LexFile ;
  20.     sub new
  21.     {
  22. my $self = shift ;
  23. unlink @_ ;
  24.   bless [ @_ ], $self ;
  25.     }
  26.     sub DESTROY
  27.     {
  28. my $self = shift ;
  29. unlink @{ $self } ;
  30.     }
  31. }
  32. sub ok
  33. {
  34.     my $no = shift ;
  35.     my $result = shift ;
  36.  
  37.     print "not " unless $result ;
  38.     print "ok $non" ;
  39. }
  40. my $Dfile1 = "dbhash1.tmp";
  41. my $Dfile2 = "dbhash2.tmp";
  42. my $Dfile3 = "dbhash3.tmp";
  43. unlink $Dfile1, $Dfile2, $Dfile3 ;
  44. umask(0) ;
  45. sub addData
  46. {
  47.     my $db = shift ;
  48.     my @data = @_ ;
  49.     die "addData odd datan" unless @data /2 != 0 ;
  50.     my ($k, $v) ;
  51.     my $ret = 0 ;
  52.     while (@data) {
  53.         $k = shift @data ;
  54.         $v = shift @data ;
  55.         $ret += $db->db_put($k, $v) ;
  56.     }
  57.     return ($ret == 0) ;
  58. }
  59. {
  60.     # error cases
  61.     my $lex = new LexFile $Dfile1, $Dfile2, $Dfile3 ;
  62.     my %hash1 ;
  63.     my $value ;
  64.     my $status ;
  65.     my $cursor ;
  66.     ok 1, my $db1 = tie %hash1, 'BerkeleyDB::Hash', 
  67. -Filename => $Dfile1,
  68.                                 -Flags     => DB_CREATE,
  69.                                 -DupCompare   => sub { $_[0] lt $_[1] },
  70.                                 -Property  => DB_DUP|DB_DUPSORT ;
  71.     # no cursors supplied
  72.     eval '$cursor = $db1->db_join() ;' ;
  73.     ok 2, $@ =~ /Usage: $db->BerkeleyDB::Common::db_joinQ([cursors], flags=0)/;
  74.     # empty list
  75.     eval '$cursor = $db1->db_join([]) ;' ;
  76.     ok 3, $@ =~ /db_join: No cursors in parameter list/;
  77.     # cursor list, isn't a []
  78.     eval '$cursor = $db1->db_join({}) ;' ;
  79.     ok 4, $@ =~ /cursors is not an array reference at/ ;
  80.     eval '$cursor = $db1->db_join(1) ;' ;
  81.     ok 5, $@ =~ /cursors is not an array reference at/ ;
  82. }
  83. {
  84.     # test a 2-way & 3-way join
  85.     my $lex = new LexFile $Dfile1, $Dfile2, $Dfile3 ;
  86.     my %hash1 ;
  87.     my %hash2 ;
  88.     my %hash3 ;
  89.     my $value ;
  90.     my $status ;
  91.     my $home = "./fred" ;
  92.     rmtree $home if -e $home ;
  93.     ok 6, mkdir($home, 0777) ;
  94.     ok 7, my $env = new BerkeleyDB::Env -Home => $home,
  95.      -Flags => DB_CREATE|DB_INIT_TXN
  96.    |DB_INIT_MPOOL;
  97.    #|DB_INIT_MPOOL| DB_INIT_LOCK;
  98.     ok 8, my $txn = $env->txn_begin() ;
  99.     ok 9, my $db1 = tie %hash1, 'BerkeleyDB::Hash', 
  100. -Filename => $Dfile1,
  101.                                 -Flags     => DB_CREATE,
  102.                                 -DupCompare   => sub { $_[0] cmp $_[1] },
  103.                                 -Property  => DB_DUP|DB_DUPSORT,
  104.         -Env     => $env,
  105.      -Txn    => $txn  ;
  106. ;
  107.     ok 10, my $db2 = tie %hash2, 'BerkeleyDB::Hash', 
  108. -Filename => $Dfile2,
  109.                                 -Flags     => DB_CREATE,
  110.                                 -DupCompare   => sub { $_[0] cmp $_[1] },
  111.                                 -Property  => DB_DUP|DB_DUPSORT,
  112.         -Env     => $env,
  113.      -Txn    => $txn  ;
  114.     ok 11, my $db3 = tie %hash3, 'BerkeleyDB::Btree', 
  115. -Filename => $Dfile3,
  116.                                 -Flags     => DB_CREATE,
  117.                                 -DupCompare   => sub { $_[0] cmp $_[1] },
  118.                                 -Property  => DB_DUP|DB_DUPSORT,
  119.         -Env     => $env,
  120.      -Txn    => $txn  ;
  121.     
  122.     ok 12, addData($db1, qw(  apple Convenience
  123.      peach Shopway
  124. pear Farmer
  125. raspberry Shopway
  126. strawberry Shopway
  127. gooseberry Farmer
  128. blueberry Farmer
  129.      ));
  130.     ok 13, addData($db2, qw(  red apple
  131.      red raspberry
  132.      red strawberry
  133. yellow peach
  134. yellow pear
  135. green gooseberry
  136. blue blueberry)) ;
  137.     ok 14, addData($db3, qw(  expensive apple
  138.      reasonable raspberry
  139.      expensive strawberry
  140. reasonable peach
  141. reasonable pear
  142. expensive gooseberry
  143. reasonable blueberry)) ;
  144.     ok 15, my $cursor2 = $db2->db_cursor() ;
  145.     my $k = "red" ;
  146.     my $v = "" ;
  147.     ok 16, $cursor2->c_get($k, $v, DB_SET) == 0 ;
  148.     # Two way Join
  149.     ok 17, my $cursor1 = $db1->db_join([$cursor2]) ;
  150.     my %expected = qw( apple Convenience
  151. raspberry Shopway
  152. strawberry Shopway
  153. ) ;
  154.     # sequence forwards
  155.     while ($cursor1->c_get($k, $v) == 0) {
  156. delete $expected{$k} 
  157.     if defined $expected{$k} && $expected{$k} eq $v ;
  158. #print "[$k] [$v]n" ;
  159.     }
  160.     ok 18, keys %expected == 0 ;
  161.     ok 19, $cursor1->status() == DB_NOTFOUND ;
  162.     # Three way Join
  163.     ok 20, $cursor2 = $db2->db_cursor() ;
  164.     $k = "red" ;
  165.     $v = "" ;
  166.     ok 21, $cursor2->c_get($k, $v, DB_SET) == 0 ;
  167.     ok 22, my $cursor3 = $db3->db_cursor() ;
  168.     $k = "expensive" ;
  169.     $v = "" ;
  170.     ok 23, $cursor3->c_get($k, $v, DB_SET) == 0 ;
  171.     ok 24, $cursor1 = $db1->db_join([$cursor2, $cursor3]) ;
  172.     %expected = qw( apple Convenience
  173. strawberry Shopway
  174. ) ;
  175.     # sequence forwards
  176.     while ($cursor1->c_get($k, $v) == 0) {
  177. delete $expected{$k} 
  178.     if defined $expected{$k} && $expected{$k} eq $v ;
  179. #print "[$k] [$v]n" ;
  180.     }
  181.     ok 25, keys %expected == 0 ;
  182.     ok 26, $cursor1->status() == DB_NOTFOUND ;
  183.     # test DB_JOIN_ITEM
  184.     # #################
  185.     ok 27, $cursor2 = $db2->db_cursor() ;
  186.     $k = "red" ;
  187.     $v = "" ;
  188.     ok 28, $cursor2->c_get($k, $v, DB_SET) == 0 ;
  189.  
  190.     ok 29, $cursor3 = $db3->db_cursor() ;
  191.     $k = "expensive" ;
  192.     $v = "" ;
  193.     ok 30, $cursor3->c_get($k, $v, DB_SET) == 0 ;
  194.     ok 31, $cursor1 = $db1->db_join([$cursor2, $cursor3]) ;
  195.  
  196.     %expected = qw( apple 1
  197.                         strawberry 1
  198.                 ) ;
  199.  
  200.     # sequence forwards
  201.     $k = "" ;
  202.     $v = "" ;
  203.     while ($cursor1->c_get($k, $v, DB_JOIN_ITEM) == 0) {
  204.         delete $expected{$k}
  205.             if defined $expected{$k} ;
  206.         #print "[$k]n" ;
  207.     }
  208.     ok 32, keys %expected == 0 ;
  209.     ok 33, $cursor1->status() == DB_NOTFOUND ;
  210.     ok 34, $cursor1->c_close() == 0 ;
  211.     ok 35, $cursor2->c_close() == 0 ;
  212.     ok 36, $cursor3->c_close() == 0 ;
  213.     ok 37, ($status = $txn->txn_commit) == 0;
  214.     undef $txn ;
  215.     #undef $cursor1;
  216.     #undef $cursor2;
  217.     #undef $cursor3;
  218.     undef $db1 ;
  219.     undef $db2 ;
  220.     undef $db3 ;
  221.     undef $env ;
  222.     untie %hash1 ;
  223.     untie %hash2 ;
  224.     untie %hash3 ;
  225.     rmtree $home ;
  226. }