1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 1999,2008 Oracle.  All rights reserved.
4#
5# $Id: update.tcl,v 12.6 2008/01/08 20:58:53 bostic Exp $
6
7source ./include.tcl
8global update_dir
9set update_dir "$test_path/update_test"
10
11proc update { } {
12	source ./include.tcl
13	global update_dir
14
15	foreach version [glob $update_dir/*] {
16		regexp \[^\/\]*$ $version version
17		foreach method [glob $update_dir/$version/*] {
18			regexp \[^\/\]*$ $method method
19			foreach file [glob $update_dir/$version/$method/*] {
20				regexp (\[^\/\]*)\.tar\.gz$ $file dummy name
21				foreach endianness {"le" "be"} {
22					puts "Update:\
23					    $version $method $name $endianness"
24					set ret [catch {_update $update_dir $testdir $version $method $name $endianness 1 1} message]
25					if { $ret != 0 } {
26						puts $message
27					}
28				}
29			}
30		}
31	}
32}
33
34proc _update { source_dir temp_dir \
35    version method file endianness do_db_load_test do_update_test } {
36	source include.tcl
37	global errorInfo
38
39	cleanup $temp_dir NULL
40
41	exec sh -c \
42"gzcat $source_dir/$version/$method/$file.tar.gz | (cd $temp_dir && tar xf -)"
43
44	if { $do_db_load_test } {
45		set ret [catch \
46		    {exec $util_path/db_load -f "$temp_dir/$file.dump" \
47		    "$temp_dir/update.db"} message]
48		error_check_good \
49		    "Update load: $version $method $file $message" $ret 0
50
51		set ret [catch \
52		    {exec $util_path/db_dump -f "$temp_dir/update.dump" \
53		    "$temp_dir/update.db"} message]
54		error_check_good \
55		    "Update dump: $version $method $file $message" $ret 0
56
57		error_check_good "Update diff.1.1: $version $method $file" \
58		    [filecmp "$temp_dir/$file.dump" "$temp_dir/update.dump"] 0
59		error_check_good \
60		    "Update diff.1.2: $version $method $file" $ret ""
61	}
62
63	if { $do_update_test } {
64		set ret [catch \
65		    {berkdb open -update "$temp_dir/$file-$endianness.db"} db]
66		if { $ret == 1 } {
67			if { ![is_substr $errorInfo "version upgrade"] } {
68				set fnl [string first "\n" $errorInfo]
69				set theError \
70				    [string range $errorInfo 0 [expr $fnl - 1]]
71				error $theError
72			}
73		} else {
74			error_check_good dbopen [is_valid_db $db] TRUE
75			error_check_good dbclose [$db close] 0
76
77			set ret [catch \
78			    {exec $util_path/db_dump -f \
79			    "$temp_dir/update.dump" \
80			    "$temp_dir/$file-$endianness.db"} message]
81			error_check_good "Update\
82			    dump: $version $method $file $message" $ret 0
83
84			error_check_good \
85			    "Update diff.2: $version $method $file" \
86			    [filecmp "$temp_dir/$file.dump" \
87			    "$temp_dir/update.dump"] 0
88			error_check_good \
89			    "Update diff.2: $version $method $file" $ret ""
90		}
91	}
92}
93