mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
279 lines
6.7 KiB
Tcl
279 lines
6.7 KiB
Tcl
# See the file LICENSE for redistribution information.
|
|
#
|
|
# Copyright (c) 1999, 2000
|
|
# Sleepycat Software. All rights reserved.
|
|
#
|
|
# $Id: upgrade.tcl,v 11.16 2000/10/27 13:23:56 sue Exp $
|
|
|
|
source ./include.tcl
|
|
|
|
global upgrade_dir
|
|
# set upgrade_dir "$test_path/upgrade_test"
|
|
set upgrade_dir "$test_path/upgrade/databases"
|
|
|
|
global gen_upgrade
|
|
set gen_upgrade 0
|
|
|
|
global upgrade_dir
|
|
global upgrade_be
|
|
global upgrade_method
|
|
|
|
proc upgrade { { archived_test_loc "DEFAULT" } } {
|
|
source ./include.tcl
|
|
global upgrade_dir
|
|
|
|
set saved_upgrade_dir $upgrade_dir
|
|
|
|
puts -nonewline "Upgrade test: "
|
|
if { $archived_test_loc == "DEFAULT" } {
|
|
puts "using default archived databases in $upgrade_dir."
|
|
} else {
|
|
set upgrade_dir $archived_test_loc
|
|
puts "using archived databases in $upgrade_dir."
|
|
}
|
|
|
|
foreach version [glob $upgrade_dir/*] {
|
|
if { [string first CVS $version] != -1 } { continue }
|
|
regexp \[^\/\]*$ $version version
|
|
foreach method [glob $upgrade_dir/$version/*] {
|
|
regexp \[^\/\]*$ $method method
|
|
foreach file [glob $upgrade_dir/$version/$method/*] {
|
|
regexp (\[^\/\]*)\.tar\.gz$ $file dummy name
|
|
|
|
cleanup $testdir NULL
|
|
#puts "$upgrade_dir/$version/$method/$name.tar.gz"
|
|
set curdir [pwd]
|
|
cd $testdir
|
|
set tarfd [open "|tar xf -" w]
|
|
cd $curdir
|
|
|
|
catch {exec gunzip -c "$upgrade_dir/$version/$method/$name.tar.gz" >@$tarfd}
|
|
close $tarfd
|
|
|
|
set f [open $testdir/$name.tcldump {RDWR CREAT}]
|
|
close $f
|
|
|
|
# It may seem suboptimal to exec a separate
|
|
# tclsh for each subtest, but this is
|
|
# necessary to keep the testing process
|
|
# from consuming a tremendous amount of
|
|
# memory.
|
|
if { [file exists $testdir/$name-le.db] } {
|
|
set ret [catch {exec $tclsh_path\
|
|
<< "source $test_path/test.tcl;\
|
|
_upgrade_test $testdir $version\
|
|
$method\
|
|
$name le"} message]
|
|
puts $message
|
|
if { $ret != 0 } {
|
|
#exit
|
|
}
|
|
}
|
|
|
|
if { [file exists $testdir/$name-be.db] } {
|
|
set ret [catch {exec $tclsh_path\
|
|
<< "source $test_path/test.tcl;\
|
|
_upgrade_test $testdir $version\
|
|
$method\
|
|
$name be"} message]
|
|
puts $message
|
|
if { $ret != 0 } {
|
|
#exit
|
|
}
|
|
}
|
|
|
|
set ret [catch {exec $tclsh_path\
|
|
<< "source $test_path/test.tcl;\
|
|
_db_load_test $testdir $version $method\
|
|
$name"} message]
|
|
puts $message
|
|
if { $ret != 0 } {
|
|
#exit
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
set upgrade_dir $saved_upgrade_dir
|
|
|
|
# Don't provide a return value.
|
|
return
|
|
}
|
|
|
|
proc _upgrade_test { temp_dir version method file endianness } {
|
|
source include.tcl
|
|
global errorInfo
|
|
|
|
puts "Upgrade: $version $method $file $endianness"
|
|
|
|
set ret [berkdb upgrade "$temp_dir/$file-$endianness.db"]
|
|
error_check_good dbupgrade $ret 0
|
|
|
|
upgrade_dump "$temp_dir/$file-$endianness.db" "$temp_dir/temp.dump"
|
|
|
|
error_check_good "Upgrade diff.$endianness: $version $method $file" \
|
|
[filecmp "$temp_dir/$file.tcldump" "$temp_dir/temp.dump"] 0
|
|
}
|
|
|
|
proc _db_load_test { temp_dir version method file } {
|
|
source include.tcl
|
|
global errorInfo
|
|
|
|
puts "db_load: $version $method $file"
|
|
|
|
set ret [catch \
|
|
{exec $util_path/db_load -f "$temp_dir/$file.dump" \
|
|
"$temp_dir/upgrade.db"} message]
|
|
error_check_good \
|
|
"Upgrade load: $version $method $file $message" $ret 0
|
|
|
|
upgrade_dump "$temp_dir/upgrade.db" "$temp_dir/temp.dump"
|
|
|
|
error_check_good "Upgrade diff.1.1: $version $method $file" \
|
|
[filecmp "$temp_dir/$file.tcldump" "$temp_dir/temp.dump"] 0
|
|
}
|
|
|
|
proc gen_upgrade { dir } {
|
|
global gen_upgrade
|
|
global upgrade_dir
|
|
global upgrade_be
|
|
global upgrade_method
|
|
global runtests
|
|
source ./include.tcl
|
|
|
|
set gen_upgrade 1
|
|
set upgrade_dir $dir
|
|
|
|
foreach upgrade_be { 0 1 } {
|
|
foreach i "btree rbtree hash recno rrecno queue frecno" {
|
|
puts "Running $i tests"
|
|
set upgrade_method $i
|
|
set start 1
|
|
for { set j $start } { $j <= $runtests } {incr j} {
|
|
if [catch {exec $tclsh_path \
|
|
<< "source $test_path/test.tcl;\
|
|
global upgrade_be;\
|
|
set upgrade_be $upgrade_be;\
|
|
run_method -$i $j $j"} res] {
|
|
puts "FAIL: [format "test%03d" $j] $i"
|
|
}
|
|
puts $res
|
|
cleanup $testdir NULL
|
|
}
|
|
}
|
|
}
|
|
|
|
set gen_upgrade 0
|
|
}
|
|
|
|
proc upgrade_dump { database file {stripnulls 0} } {
|
|
global errorInfo
|
|
|
|
set db [berkdb open $database]
|
|
set dbc [$db cursor]
|
|
|
|
set f [open $file w+]
|
|
fconfigure $f -encoding binary -translation binary
|
|
|
|
#
|
|
# Get a sorted list of keys
|
|
#
|
|
set key_list ""
|
|
set pair [$dbc get -first]
|
|
|
|
while { 1 } {
|
|
if { [llength $pair] == 0 } {
|
|
break
|
|
}
|
|
set k [lindex [lindex $pair 0] 0]
|
|
lappend key_list $k
|
|
set pair [$dbc get -next]
|
|
}
|
|
|
|
# Discard duplicated keys; we now have a key for each
|
|
# duplicate, not each unique key, and we don't want to get each
|
|
# duplicate multiple times when we iterate over key_list.
|
|
set uniq_keys ""
|
|
foreach key $key_list {
|
|
if { [info exists existence_list($key)] == 0 } {
|
|
lappend uniq_keys $key
|
|
}
|
|
set existence_list($key) 1
|
|
}
|
|
set key_list $uniq_keys
|
|
|
|
set key_list [lsort -command _comp $key_list]
|
|
|
|
#
|
|
# Get the data for each key
|
|
#
|
|
set i 0
|
|
foreach key $key_list {
|
|
set pair [$dbc get -set $key]
|
|
if { $stripnulls != 0 } {
|
|
# the Tcl interface to db versions before 3.X
|
|
# added nulls at the end of all keys and data, so
|
|
# we provide functionality to strip that out.
|
|
set key [strip_null $key]
|
|
}
|
|
set data_list {}
|
|
catch { while { [llength $pair] != 0 } {
|
|
set data [lindex [lindex $pair 0] 1]
|
|
if { $stripnulls != 0 } {
|
|
set data [strip_null $data]
|
|
}
|
|
lappend data_list [list $data]
|
|
set pair [$dbc get -nextdup]
|
|
} }
|
|
#lsort -command _comp data_list
|
|
set data_list [lsort -command _comp $data_list]
|
|
puts -nonewline $f [binary format i [string length $key]]
|
|
puts -nonewline $f $key
|
|
puts -nonewline $f [binary format i [llength $data_list]]
|
|
for { set j 0 } { $j < [llength $data_list] } { incr j } {
|
|
puts -nonewline $f [binary format i [string length [concat [lindex $data_list $j]]]]
|
|
puts -nonewline $f [concat [lindex $data_list $j]]
|
|
}
|
|
if { [llength $data_list] == 0 } {
|
|
puts "WARNING: zero-length data list"
|
|
}
|
|
incr i
|
|
}
|
|
|
|
close $f
|
|
}
|
|
|
|
proc _comp { a b } {
|
|
if { 0 } {
|
|
# XXX
|
|
set a [strip_null [concat $a]]
|
|
set b [strip_null [concat $b]]
|
|
#return [expr [concat $a] < [concat $b]]
|
|
} else {
|
|
set an [string first "\0" $a]
|
|
set bn [string first "\0" $b]
|
|
|
|
if { $an != -1 } {
|
|
set a [string range $a 0 [expr $an - 1]]
|
|
}
|
|
if { $bn != -1 } {
|
|
set b [string range $b 0 [expr $bn - 1]]
|
|
}
|
|
}
|
|
#puts "$a $b"
|
|
return [string compare $a $b]
|
|
}
|
|
|
|
proc strip_null { str } {
|
|
set len [string length $str]
|
|
set last [expr $len - 1]
|
|
|
|
set termchar [string range $str $last $last]
|
|
if { [string compare $termchar \0] == 0 } {
|
|
set ret [string range $str 0 [expr $last - 1]]
|
|
} else {
|
|
set ret $str
|
|
}
|
|
|
|
return $ret
|
|
}
|