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