1
# See the file LICENSE for redistribution information.
3
# Copyright (c) 1999-2002
4
# Sleepycat Software. All rights reserved.
11
# set upgrade_dir "$test_path/upgrade_test"
12
set upgrade_dir "$test_path/upgrade/databases"
22
proc upgrade { { archived_test_loc "DEFAULT" } } {
26
set saved_upgrade_dir $upgrade_dir
28
puts -nonewline "Upgrade test: "
29
if { $archived_test_loc == "DEFAULT" } {
30
puts "using default archived databases in $upgrade_dir."
32
set upgrade_dir $archived_test_loc
33
puts "using archived databases in $upgrade_dir."
36
foreach version [glob $upgrade_dir/*] {
37
if { [string first CVS $version] != -1 } { continue }
38
regexp \[^\/\]*$ $version version
39
foreach method [glob $upgrade_dir/$version/*] {
40
regexp \[^\/\]*$ $method method
41
foreach file [glob $upgrade_dir/$version/$method/*] {
42
regexp (\[^\/\]*)\.tar\.gz$ $file dummy name
44
cleanup $testdir NULL 1
45
#puts "$upgrade_dir/$version/$method/$name.tar.gz"
48
set tarfd [open "|tar xf -" w]
51
catch {exec gunzip -c "$upgrade_dir/$version/$method/$name.tar.gz" >@$tarfd}
54
set f [open $testdir/$name.tcldump {RDWR CREAT}]
57
# It may seem suboptimal to exec a separate
58
# tclsh for each subtest, but this is
59
# necessary to keep the testing process
60
# from consuming a tremendous amount of
62
if { [file exists $testdir/$name-le.db] } {
63
set ret [catch {exec $tclsh_path\
64
<< "source $test_path/test.tcl;\
65
_upgrade_test $testdir $version\
74
if { [file exists $testdir/$name-be.db] } {
75
set ret [catch {exec $tclsh_path\
76
<< "source $test_path/test.tcl;\
77
_upgrade_test $testdir $version\
86
set ret [catch {exec $tclsh_path\
87
<< "source $test_path/test.tcl;\
88
_db_load_test $testdir $version $method\
98
set upgrade_dir $saved_upgrade_dir
100
# Don't provide a return value.
104
proc _upgrade_test { temp_dir version method file endianness } {
108
puts "Upgrade: $version $method $file $endianness"
110
set ret [berkdb upgrade "$temp_dir/$file-$endianness.db"]
111
error_check_good dbupgrade $ret 0
113
error_check_good dbupgrade_verify [verify_dir $temp_dir "" 0 0 1] 0
115
upgrade_dump "$temp_dir/$file-$endianness.db" "$temp_dir/temp.dump"
117
error_check_good "Upgrade diff.$endianness: $version $method $file" \
118
[filecmp "$temp_dir/$file.tcldump" "$temp_dir/temp.dump"] 0
121
proc _db_load_test { temp_dir version method file } {
125
puts "db_load: $version $method $file"
128
{exec $util_path/db_load -f "$temp_dir/$file.dump" \
129
"$temp_dir/upgrade.db"} message]
131
"Upgrade load: $version $method $file $message" $ret 0
133
upgrade_dump "$temp_dir/upgrade.db" "$temp_dir/temp.dump"
135
error_check_good "Upgrade diff.1.1: $version $method $file" \
136
[filecmp "$temp_dir/$file.tcldump" "$temp_dir/temp.dump"] 0
139
proc gen_upgrade { dir } {
143
global upgrade_method
152
foreach i "btree rbtree hash recno rrecno frecno queue queueext" {
153
puts "Running $i tests"
154
set upgrade_method $i
156
for { set j $start } { $j <= $num_test(test) } { incr j } {
157
set upgrade_name [format "test%03d" $j]
158
if { [info exists parms($upgrade_name)] != 1 } {
162
foreach upgrade_be { 0 1 } {
163
if [catch {exec $tclsh_path \
164
<< "source $test_path/test.tcl;\
165
global gen_upgrade upgrade_be;\
166
global upgrade_method upgrade_name;\
168
set upgrade_be $upgrade_be;\
169
set upgrade_method $upgrade_method;\
170
set upgrade_name $upgrade_name;\
171
run_method -$i $j $j"} res] {
172
puts "FAIL: $upgrade_name $i"
175
cleanup $testdir NULL 1
182
proc upgrade_dump { database file {stripnulls 0} } {
185
set db [berkdb open $database]
188
set f [open $file w+]
189
fconfigure $f -encoding binary -translation binary
192
# Get a sorted list of keys
195
set pair [$dbc get -first]
198
if { [llength $pair] == 0 } {
201
set k [lindex [lindex $pair 0] 0]
203
set pair [$dbc get -next]
206
# Discard duplicated keys; we now have a key for each
207
# duplicate, not each unique key, and we don't want to get each
208
# duplicate multiple times when we iterate over key_list.
210
foreach key $key_list {
211
if { [info exists existence_list($key)] == 0 } {
212
lappend uniq_keys $key
214
set existence_list($key) 1
216
set key_list $uniq_keys
218
set key_list [lsort -command _comp $key_list]
221
# Get the data for each key
224
foreach key $key_list {
225
set pair [$dbc get -set $key]
226
if { $stripnulls != 0 } {
227
# the Tcl interface to db versions before 3.X
228
# added nulls at the end of all keys and data, so
229
# we provide functionality to strip that out.
230
set key [strip_null $key]
233
catch { while { [llength $pair] != 0 } {
234
set data [lindex [lindex $pair 0] 1]
235
if { $stripnulls != 0 } {
236
set data [strip_null $data]
238
lappend data_list [list $data]
239
set pair [$dbc get -nextdup]
241
#lsort -command _comp data_list
242
set data_list [lsort -command _comp $data_list]
243
puts -nonewline $f [binary format i [string length $key]]
244
puts -nonewline $f $key
245
puts -nonewline $f [binary format i [llength $data_list]]
246
for { set j 0 } { $j < [llength $data_list] } { incr j } {
247
puts -nonewline $f [binary format i [string length [concat [lindex $data_list $j]]]]
248
puts -nonewline $f [concat [lindex $data_list $j]]
250
if { [llength $data_list] == 0 } {
251
puts "WARNING: zero-length data list"
257
error_check_good upgrade_dump_c_close [$dbc close] 0
258
error_check_good upgrade_dump_db_close [$db close] 0
264
set a [strip_null [concat $a]]
265
set b [strip_null [concat $b]]
266
#return [expr [concat $a] < [concat $b]]
268
set an [string first "\0" $a]
269
set bn [string first "\0" $b]
272
set a [string range $a 0 [expr $an - 1]]
275
set b [string range $b 0 [expr $bn - 1]]
279
return [string compare $a $b]
282
proc strip_null { str } {
283
set len [string length $str]
284
set last [expr $len - 1]
286
set termchar [string range $str $last $last]
287
if { [string compare $termchar \0] == 0 } {
288
set ret [string range $str 0 [expr $last - 1]]