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