1#!./perl -w 2 3use strict ; 4 5 6use lib 't' ; 7 8BEGIN { 9 $ENV{LC_ALL} = 'de_DE@euro'; 10} 11 12use BerkeleyDB; 13use util ; 14 15print "1..53\n"; 16 17my $Dfile = "dbhash.tmp"; 18 19umask(0); 20 21my $version_major = 0; 22 23{ 24 # db version stuff 25 my ($major, $minor, $patch) = (0, 0, 0) ; 26 27 ok 1, my $VER = BerkeleyDB::DB_VERSION_STRING ; 28 ok 2, my $ver = BerkeleyDB::db_version($version_major, $minor, $patch) ; 29 ok 3, $VER eq $ver ; 30 ok 4, $version_major > 1 ; 31 ok 5, defined $minor ; 32 ok 6, defined $patch ; 33} 34 35{ 36 # Check for invalid parameters 37 my $env ; 38 eval ' $env = new BerkeleyDB::Env( -Stupid => 3) ; ' ; 39 ok 7, $@ =~ /unknown key value\(s\) Stupid/ ; 40 41 eval ' $env = new BerkeleyDB::Env( -Bad => 2, -Home => "/tmp", -Stupid => 3) ; ' ; 42 ok 8, $@ =~ /unknown key value\(s\) (Bad,? |Stupid,? ){2}/ ; 43 44 eval ' $env = new BerkeleyDB::Env (-Config => {"fred" => " "} ) ; ' ; 45 ok 9, !$env ; 46 ok 10, $BerkeleyDB::Error =~ /^(illegal name-value pair|Invalid argument)/ ; 47 #print " $BerkeleyDB::Error\n"; 48} 49 50{ 51 # create a very simple environment 52 my $home = "./fred" ; 53 ok 11, my $lexD = new LexDir($home) ; 54 chdir "./fred" ; 55 ok 12, my $env = new BerkeleyDB::Env -Flags => DB_CREATE, 56 @StdErrFile; 57 chdir ".." ; 58 undef $env ; 59} 60 61{ 62 # create an environment with a Home 63 my $home = "./fred" ; 64 ok 13, my $lexD = new LexDir($home) ; 65 ok 14, my $env = new BerkeleyDB::Env -Home => $home, 66 -Flags => DB_CREATE ; 67 68 undef $env ; 69} 70 71{ 72 # make new fail. 73 my $home = "./not_there" ; 74 rmtree $home ; 75 ok 15, ! -d $home ; 76 my $env = new BerkeleyDB::Env -Home => $home, @StdErrFile, 77 -Flags => DB_INIT_LOCK ; 78 ok 16, ! $env ; 79 ok 17, $! != 0 || $^E != 0 ; 80 81 rmtree $home ; 82} 83 84{ 85 # Config 86 use Cwd ; 87 my $cwd = cwd() ; 88 my $home = "$cwd/fred" ; 89 my $data_dir = "$home/data_dir" ; 90 my $log_dir = "$home/log_dir" ; 91 my $data_file = "data.db" ; 92 ok 18, my $lexD = new LexDir($home) ; 93 ok 19, -d $data_dir ? chmod 0777, $data_dir : mkdir($data_dir, 0777) ; 94 ok 20, -d $log_dir ? chmod 0777, $log_dir : mkdir($log_dir, 0777) ; 95 my $env = new BerkeleyDB::Env -Home => $home, @StdErrFile, 96 -Config => { DB_DATA_DIR => $data_dir, 97 DB_LOG_DIR => $log_dir 98 }, 99 -Flags => DB_CREATE|DB_INIT_TXN|DB_INIT_LOG| 100 DB_INIT_MPOOL|DB_INIT_LOCK ; 101 ok 21, $env ; 102 103 ok 22, my $txn = $env->txn_begin() ; 104 105 my %hash ; 106 ok 23, tie %hash, 'BerkeleyDB::Hash', -Filename => $data_file, 107 -Flags => DB_CREATE , 108 -Env => $env, 109 -Txn => $txn ; 110 111 $hash{"abc"} = 123 ; 112 $hash{"def"} = 456 ; 113 114 $txn->txn_commit() ; 115 116 untie %hash ; 117 118 undef $txn ; 119 undef $env ; 120} 121 122sub chkMsg 123{ 124 my $prefix = shift || ''; 125 126 $prefix = "$prefix: " if $prefix; 127 128 my $ErrMsg = join "|", map { "$prefix$_" } 129 'illegal flag specified to (db_open|DB->open)', 130 'DB_AUTO_COMMIT may not be specified in non-transactional environment'; 131 132 return 1 if $BerkeleyDB::Error =~ /^$ErrMsg/ ; 133 warn "# $BerkeleyDB::Error\n" ; 134 return 0; 135} 136 137{ 138 # -ErrFile with a filename 139 my $errfile = "./errfile" ; 140 my $home = "./fred" ; 141 ok 24, my $lexD = new LexDir($home) ; 142 my $lex = new LexFile $errfile ; 143 ok 25, my $env = new BerkeleyDB::Env( -ErrFile => $errfile, 144 -Flags => DB_CREATE, 145 -Home => $home) ; 146 my $db = new BerkeleyDB::Hash -Filename => $Dfile, 147 -Env => $env, 148 -Flags => -1; 149 ok 26, !$db ; 150 151 my $ErrMsg = join "'", 'illegal flag specified to (db_open|DB->open)', 152 'DB_AUTO_COMMIT may not be specified in non-transactional environment'; 153 154 ok 27, chkMsg(); 155 ok 28, -e $errfile ; 156 my $contents = docat($errfile) ; 157 chomp $contents ; 158 ok 29, $BerkeleyDB::Error eq $contents ; 159 160 undef $env ; 161} 162 163{ 164 # -ErrFile with a filehandle 165 use IO::File ; 166 my $errfile = "./errfile" ; 167 my $home = "./fred" ; 168 ok 30, my $lexD = new LexDir($home) ; 169 my $lex = new LexFile $errfile ; 170 my $fh = new IO::File ">$errfile" ; 171 ok 31, my $env = new BerkeleyDB::Env( -ErrFile => $fh, 172 -Flags => DB_CREATE, 173 -Home => $home) ; 174 my $db = new BerkeleyDB::Hash -Filename => $Dfile, 175 -Env => $env, 176 -Flags => -1; 177 ok 32, !$db ; 178 179 ok 33, chkMsg(); 180 ok 34, -e $errfile ; 181 my $contents = docat($errfile) ; 182 chomp $contents ; 183 ok 35, $BerkeleyDB::Error eq $contents ; 184 185 undef $env ; 186} 187 188{ 189 # -ErrPrefix 190 my $home = "./fred" ; 191 ok 36, my $lexD = new LexDir($home) ; 192 my $errfile = "./errfile" ; 193 my $lex = new LexFile $errfile ; 194 ok 37, my $env = new BerkeleyDB::Env( -ErrFile => $errfile, 195 -ErrPrefix => "PREFIX", 196 -Flags => DB_CREATE, 197 -Home => $home) ; 198 my $db = new BerkeleyDB::Hash -Filename => $Dfile, 199 -Env => $env, 200 -Flags => -1; 201 ok 38, !$db ; 202 203 ok 39, chkMsg('PREFIX'); 204 ok 40, -e $errfile ; 205 my $contents = docat($errfile) ; 206 chomp $contents ; 207 ok 41, $BerkeleyDB::Error eq $contents ; 208 209 # change the prefix on the fly 210 my $old = $env->errPrefix("NEW ONE") ; 211 ok 42, $old eq "PREFIX" ; 212 213 $db = new BerkeleyDB::Hash -Filename => $Dfile, 214 -Env => $env, 215 -Flags => -1; 216 ok 43, !$db ; 217 ok 44, chkMsg('NEW ONE'); 218 $contents = docat($errfile) ; 219 chomp $contents ; 220 ok 45, $contents =~ /$BerkeleyDB::Error$/ ; 221 undef $env ; 222} 223 224{ 225 # test db_appexit 226 use Cwd ; 227 my $cwd = cwd() ; 228 my $home = "$cwd/fred" ; 229 my $data_dir = "$home/data_dir" ; 230 my $log_dir = "$home/log_dir" ; 231 my $data_file = "data.db" ; 232 ok 46, my $lexD = new LexDir($home); 233 ok 47, -d $data_dir ? chmod 0777, $data_dir : mkdir($data_dir, 0777) ; 234 ok 48, -d $log_dir ? chmod 0777, $log_dir : mkdir($log_dir, 0777) ; 235 my $env = new BerkeleyDB::Env -Home => $home, @StdErrFile, 236 -Config => { DB_DATA_DIR => $data_dir, 237 DB_LOG_DIR => $log_dir 238 }, 239 -Flags => DB_CREATE|DB_INIT_TXN|DB_INIT_LOG| 240 DB_INIT_MPOOL|DB_INIT_LOCK ; 241 ok 49, $env ; 242 243 ok 50, my $txn_mgr = $env->TxnMgr() ; 244 245 ok 51, $env->db_appexit() == 0 ; 246 247} 248 249{ 250 # attempt to open a new environment without DB_CREATE 251 # should fail with Berkeley DB 3.x or better. 252 253 my $home = "./fred" ; 254 ok 52, my $lexD = new LexDir($home) ; 255 chdir "./fred" ; 256 my $env = new BerkeleyDB::Env -Home => $home, -Flags => DB_CREATE ; 257 ok 53, $version_major == 2 ? $env : ! $env ; 258 259 # The test below is not portable -- the error message returned by 260 # $BerkeleyDB::Error is locale dependant. 261 262 #ok 54, $version_major == 2 ? 1 263 # : $BerkeleyDB::Error =~ /No such file or directory/ ; 264 # or print "# BerkeleyDB::Error is $BerkeleyDB::Error\n"; 265 chdir ".." ; 266 undef $env ; 267} 268 269# test -Verbose 270# test -Flags 271# db_value_set 272