1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 2006,2008 Oracle.  All rights reserved.
4#
5# $Id: env015.tcl,v 12.8 2008/01/08 20:58:53 bostic Exp $
6#
7# TEST	env015
8# TEST	Rename the underlying directory of an env, make sure everything
9# TEST	still works.  Test runs with regular named databases and with
10# TEST	in-memory named databases.
11proc env015 { } {
12	source ./include.tcl
13
14	env_cleanup $testdir
15	set newdir NEWDIR
16
17	puts "Env015: Test of renaming env directories."
18
19	foreach dbtype { inmem ondisk } {
20		puts "\tEnv015.a: Create env."
21		set env [berkdb_env -create -mode 0644 -home $testdir]
22		error_check_good env [is_valid_env $env] TRUE
23
24		puts "\tEnv015.b: Create $dbtype db."
25		if { $dbtype == "inmem" } {
26			set testfile { "" file1.db }
27		} else {
28			set testfile file1.db
29		}
30		set db [eval {berkdb_open} -create -env $env -btree $testfile]
31		error_check_good db_open [is_valid_db $db] TRUE
32		for { set i 0 } { $i < 10 } { incr i } {
33			error_check_good db_put [$db put $i $i] 0
34		}
35
36		# When the database is on disk, we have a file handle open
37		# during the attempt to rename the directory.  As far as we
38		# can tell, Windows doesn't allow this (that is, Windows
39		# doesn't allow directories to be renamed when there is an
40		# open handle inside them).
41		puts "\tEnv015.b: Rename directory."
42		if { $is_windows_test } {
43			file mkdir $newdir
44			eval file rename -force [glob $testdir/*] $newdir
45			fileremove -force $testdir
46		} else {
47			file rename -force $testdir $newdir
48		}
49
50		puts "\tEnv015.c: Database is still available in new directory."
51		for { set i 0 } { $i < 10 } { incr i } {
52			set ret [$db get $i]
53			error_check_good db_get [lindex [lindex $ret 0] 1] $i
54		}
55
56		puts "\tEnv015.d: Can't open database in old directory."
57		catch {set db2 [eval \
58		    {berkdb_open} -env $env -btree $testdir/$testfile]} db2
59		error_check_bad open_fails [is_valid_db $db2] TRUE
60
61		puts \
62	    "\tEnv015.e: Recreate directory with original name and use it."
63		file mkdir $testdir
64		set newenv [berkdb_env -create -mode 0644 -home $testdir]
65		error_check_good newenv [is_valid_env $env] TRUE
66
67		set newdb [berkdb_open -create -env $newenv -btree foo.db]
68		error_check_good newdb_open [is_valid_db $newdb] TRUE
69
70		# There should not be any data in the new db.
71		for { set i 0 } { $i < 10 } { incr i } {
72			set ret [$newdb get $i]
73			error_check_good db_get [llength $ret] 0
74		}
75
76		# Clean up.
77		error_check_good db_close [$db close] 0
78		error_check_good newdb_close [$newdb close] 0
79		error_check_good envclose [$env close] 0
80		error_check_good newenvclose [$newenv close] 0
81		fileremove -f $newdir
82	}
83}
84