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

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. print "1..50n";
  12. {
  13.     package LexFile ;
  14.     sub new
  15.     {
  16.         my $self = shift ;
  17.         unlink @_ ;
  18.         bless [ @_ ], $self ;
  19.     }
  20.     sub DESTROY
  21.     {
  22.         my $self = shift ;
  23.         unlink @{ $self } ;
  24.     }
  25. }
  26. sub ok
  27. {
  28.     my $no = shift ;
  29.     my $result = shift ;
  30.  
  31.     print "not " unless $result ;
  32.     print "ok $non" ;
  33. }
  34. sub docat
  35. {
  36.     my $file = shift;
  37.     local $/ = undef;
  38.     open(CAT,$file) || die "Cannot open $file:$!";
  39.     my $result = <CAT>;
  40.     close(CAT);
  41.     return $result;
  42. }
  43. my $Dfile = "dbhash.tmp";
  44. umask(0);
  45. {
  46.     # error cases
  47.     my $lex = new LexFile $Dfile ;
  48.     my %hash ;
  49.     my $value ;
  50.     my $home = "./fred" ;
  51.     rmtree $home if -e $home ;
  52.     ok 1, mkdir($home, 0777) ;
  53.     ok 2, my $env = new BerkeleyDB::Env -Home => $home,
  54.      -Flags => DB_CREATE| DB_INIT_MPOOL;
  55.     eval { $env->txn_begin() ; } ;
  56.     ok 3, $@ =~ /^BerkeleyDB Aborting: Transaction Manager not enabled at/ ;
  57.     eval { my $txn_mgr = $env->TxnMgr() ; } ;
  58.     ok 4, $@ =~ /^BerkeleyDB Aborting: Transaction Manager not enabled at/ ;
  59.     undef $env ;
  60.     rmtree $home ;
  61. }
  62. {
  63.     # transaction - abort works
  64.     my $lex = new LexFile $Dfile ;
  65.     my %hash ;
  66.     my $value ;
  67.     my $home = "./fred" ;
  68.     rmtree $home if -e $home ;
  69.     ok 5, mkdir($home, 0777) ;
  70.     ok 6, my $env = new BerkeleyDB::Env -Home => $home,
  71.      -Flags => DB_CREATE|DB_INIT_TXN|
  72.    DB_INIT_MPOOL|DB_INIT_LOCK ;
  73.     ok 7, my $txn = $env->txn_begin() ;
  74.     ok 8, my $db1 = tie %hash, 'BerkeleyDB::Hash', -Filename => $Dfile,
  75.                                                -Flags     => DB_CREATE ,
  76.         -Env     => $env,
  77.      -Txn    => $txn  ;
  78.     
  79.     # create some data
  80.     my %data =  (
  81. "red" => "boat",
  82. "green" => "house",
  83. "blue" => "sea",
  84. ) ;
  85.     my $ret = 0 ;
  86.     while (my ($k, $v) = each %data) {
  87.         $ret += $db1->db_put($k, $v) ;
  88.     }
  89.     ok 9, $ret == 0 ;
  90.     # should be able to see all the records
  91.     ok 10, my $cursor = $db1->db_cursor() ;
  92.     my ($k, $v) = ("", "") ;
  93.     my $count = 0 ;
  94.     # sequence forwards
  95.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  96.         ++ $count ;
  97.     }
  98.     ok 11, $count == 3 ;
  99.     undef $cursor ;
  100.     # now abort the transaction
  101.     ok 12, $txn->txn_abort() == 0 ;
  102.     # there shouldn't be any records in the database
  103.     $count = 0 ;
  104.     # sequence forwards
  105.     ok 13, $cursor = $db1->db_cursor() ;
  106.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  107.         ++ $count ;
  108.     }
  109.     ok 14, $count == 0 ;
  110.     my $stat = $env->txn_stat() ;
  111.     ok 15, $stat->{'st_naborts'} == 1 ;
  112.     undef $txn ;
  113.     undef $cursor ;
  114.     undef $db1 ;
  115.     undef $env ;
  116.     untie %hash ;
  117.     rmtree $home ;
  118. }
  119. {
  120.     # transaction - abort works via txnmgr
  121.     my $lex = new LexFile $Dfile ;
  122.     my %hash ;
  123.     my $value ;
  124.     my $home = "./fred" ;
  125.     rmtree $home if -e $home ;
  126.     ok 16, mkdir($home, 0777) ;
  127.     ok 17, my $env = new BerkeleyDB::Env -Home => $home,
  128.      -Flags => DB_CREATE|DB_INIT_TXN|
  129.    DB_INIT_MPOOL|DB_INIT_LOCK ;
  130.     ok 18, my $txn_mgr = $env->TxnMgr() ;
  131.     ok 19, my $txn = $txn_mgr->txn_begin() ;
  132.     ok 20, my $db1 = tie %hash, 'BerkeleyDB::Hash', -Filename => $Dfile,
  133.                                                -Flags     => DB_CREATE ,
  134.         -Env     => $env,
  135.      -Txn    => $txn  ;
  136.     
  137.     # create some data
  138.     my %data =  (
  139. "red" => "boat",
  140. "green" => "house",
  141. "blue" => "sea",
  142. ) ;
  143.     my $ret = 0 ;
  144.     while (my ($k, $v) = each %data) {
  145.         $ret += $db1->db_put($k, $v) ;
  146.     }
  147.     ok 21, $ret == 0 ;
  148.     # should be able to see all the records
  149.     ok 22, my $cursor = $db1->db_cursor() ;
  150.     my ($k, $v) = ("", "") ;
  151.     my $count = 0 ;
  152.     # sequence forwards
  153.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  154.         ++ $count ;
  155.     }
  156.     ok 23, $count == 3 ;
  157.     undef $cursor ;
  158.     # now abort the transaction
  159.     ok 24, $txn->txn_abort() == 0 ;
  160.     # there shouldn't be any records in the database
  161.     $count = 0 ;
  162.     # sequence forwards
  163.     ok 25, $cursor = $db1->db_cursor() ;
  164.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  165.         ++ $count ;
  166.     }
  167.     ok 26, $count == 0 ;
  168.     my $stat = $txn_mgr->txn_stat() ;
  169.     ok 27, $stat->{'st_naborts'} == 1 ;
  170.     undef $txn ;
  171.     undef $cursor ;
  172.     undef $db1 ;
  173.     undef $txn_mgr ;
  174.     undef $env ;
  175.     untie %hash ;
  176.     rmtree $home ;
  177. }
  178. {
  179.     # transaction - commit works
  180.     my $lex = new LexFile $Dfile ;
  181.     my %hash ;
  182.     my $value ;
  183.     my $home = "./fred" ;
  184.     rmtree $home if -e $home ;
  185.     ok 28, mkdir($home, 0777) ;
  186.     ok 29, my $env = new BerkeleyDB::Env -Home => $home,
  187.      -Flags => DB_CREATE|DB_INIT_TXN|
  188.    DB_INIT_MPOOL|DB_INIT_LOCK ;
  189.     ok 30, my $txn = $env->txn_begin() ;
  190.     ok 31, my $db1 = tie %hash, 'BerkeleyDB::Hash', -Filename => $Dfile,
  191.                                                -Flags     => DB_CREATE ,
  192.         -Env     => $env,
  193.      -Txn    => $txn  ;
  194.     
  195.     # create some data
  196.     my %data =  (
  197. "red" => "boat",
  198. "green" => "house",
  199. "blue" => "sea",
  200. ) ;
  201.     my $ret = 0 ;
  202.     while (my ($k, $v) = each %data) {
  203.         $ret += $db1->db_put($k, $v) ;
  204.     }
  205.     ok 32, $ret == 0 ;
  206.     # should be able to see all the records
  207.     ok 33, my $cursor = $db1->db_cursor() ;
  208.     my ($k, $v) = ("", "") ;
  209.     my $count = 0 ;
  210.     # sequence forwards
  211.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  212.         ++ $count ;
  213.     }
  214.     ok 34, $count == 3 ;
  215.     undef $cursor ;
  216.     # now commit the transaction
  217.     ok 35, $txn->txn_commit() == 0 ;
  218.     $count = 0 ;
  219.     # sequence forwards
  220.     ok 36, $cursor = $db1->db_cursor() ;
  221.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  222.         ++ $count ;
  223.     }
  224.     ok 37, $count == 3 ;
  225.     my $stat = $env->txn_stat() ;
  226.     ok 38, $stat->{'st_naborts'} == 0 ;
  227.     undef $txn ;
  228.     undef $cursor ;
  229.     undef $db1 ;
  230.     undef $env ;
  231.     untie %hash ;
  232.     rmtree $home ;
  233. }
  234. {
  235.     # transaction - commit works via txnmgr
  236.     my $lex = new LexFile $Dfile ;
  237.     my %hash ;
  238.     my $value ;
  239.     my $home = "./fred" ;
  240.     rmtree $home if -e $home ;
  241.     ok 39, mkdir($home, 0777) ;
  242.     ok 40, my $env = new BerkeleyDB::Env -Home => $home,
  243.      -Flags => DB_CREATE|DB_INIT_TXN|
  244.    DB_INIT_MPOOL|DB_INIT_LOCK ;
  245.     ok 41, my $txn_mgr = $env->TxnMgr() ;
  246.     ok 42, my $txn = $txn_mgr->txn_begin() ;
  247.     ok 43, my $db1 = tie %hash, 'BerkeleyDB::Hash', -Filename => $Dfile,
  248.                                                -Flags     => DB_CREATE ,
  249.         -Env     => $env,
  250.      -Txn    => $txn  ;
  251.     
  252.     # create some data
  253.     my %data =  (
  254. "red" => "boat",
  255. "green" => "house",
  256. "blue" => "sea",
  257. ) ;
  258.     my $ret = 0 ;
  259.     while (my ($k, $v) = each %data) {
  260.         $ret += $db1->db_put($k, $v) ;
  261.     }
  262.     ok 44, $ret == 0 ;
  263.     # should be able to see all the records
  264.     ok 45, my $cursor = $db1->db_cursor() ;
  265.     my ($k, $v) = ("", "") ;
  266.     my $count = 0 ;
  267.     # sequence forwards
  268.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  269.         ++ $count ;
  270.     }
  271.     ok 46, $count == 3 ;
  272.     undef $cursor ;
  273.     # now commit the transaction
  274.     ok 47, $txn->txn_commit() == 0 ;
  275.     $count = 0 ;
  276.     # sequence forwards
  277.     ok 48, $cursor = $db1->db_cursor() ;
  278.     while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
  279.         ++ $count ;
  280.     }
  281.     ok 49, $count == 3 ;
  282.     my $stat = $txn_mgr->txn_stat() ;
  283.     ok 50, $stat->{'st_naborts'} == 0 ;
  284.     undef $txn ;
  285.     undef $cursor ;
  286.     undef $db1 ;
  287.     undef $txn_mgr ;
  288.     undef $env ;
  289.     untie %hash ;
  290.     rmtree $home ;
  291. }