upgrade.tcl
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 1999, 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: upgrade.tcl,v 11.16 2000/10/27 13:23:56 sue Exp $
  7. source ./include.tcl
  8. global upgrade_dir
  9. # set upgrade_dir "$test_path/upgrade_test"
  10. set upgrade_dir "$test_path/upgrade/databases"
  11. global gen_upgrade
  12. set gen_upgrade 0
  13. global upgrade_dir
  14. global upgrade_be
  15. global upgrade_method
  16. proc upgrade { { archived_test_loc "DEFAULT" } } {
  17. source ./include.tcl
  18. global upgrade_dir
  19. set saved_upgrade_dir $upgrade_dir
  20. puts -nonewline "Upgrade test: "
  21. if { $archived_test_loc == "DEFAULT" } {
  22. puts "using default archived databases in $upgrade_dir."
  23. } else {
  24. set upgrade_dir $archived_test_loc
  25. puts "using archived databases in $upgrade_dir."
  26. }
  27. foreach version [glob $upgrade_dir/*] {
  28. if { [string first CVS $version] != -1 } { continue }
  29. regexp [^/]*$ $version version
  30. foreach method [glob $upgrade_dir/$version/*] {
  31. regexp [^/]*$ $method method
  32. foreach file [glob $upgrade_dir/$version/$method/*] {
  33. regexp ([^/]*).tar.gz$ $file dummy name
  34. cleanup $testdir NULL
  35. #puts  "$upgrade_dir/$version/$method/$name.tar.gz"
  36. set curdir [pwd]
  37. cd $testdir
  38. set tarfd [open "|tar xf -" w]
  39. cd $curdir
  40. catch {exec gunzip -c "$upgrade_dir/$version/$method/$name.tar.gz" >@$tarfd}
  41. close $tarfd
  42. set f [open $testdir/$name.tcldump {RDWR CREAT}]
  43. close $f
  44. # It may seem suboptimal to exec a separate
  45. # tclsh for each subtest, but this is
  46. # necessary to keep the testing process
  47. # from consuming a tremendous amount of
  48. # memory.
  49. if { [file exists $testdir/$name-le.db] } {
  50. set ret [catch {exec $tclsh_path
  51.     << "source $test_path/test.tcl;
  52.     _upgrade_test $testdir $version
  53.     $method
  54.     $name le"} message]
  55. puts $message
  56. if { $ret != 0 } {
  57. #exit
  58. }
  59. }
  60. if { [file exists $testdir/$name-be.db] } {
  61. set ret [catch {exec $tclsh_path
  62.     << "source $test_path/test.tcl;
  63.     _upgrade_test $testdir $version
  64.     $method
  65.     $name be"} message]
  66. puts $message
  67. if { $ret != 0 } {
  68. #exit
  69. }
  70. }
  71. set ret [catch {exec $tclsh_path
  72.     << "source $test_path/test.tcl;
  73.     _db_load_test $testdir $version $method
  74.     $name"} message]
  75. puts $message
  76. if { $ret != 0 } {
  77. #exit
  78. }
  79. }
  80. }
  81. }
  82. set upgrade_dir $saved_upgrade_dir
  83. # Don't provide a return value.
  84. return
  85. }
  86. proc _upgrade_test { temp_dir version method file endianness } {
  87. source include.tcl
  88. global errorInfo
  89. puts "Upgrade: $version $method $file $endianness"
  90. set ret [berkdb upgrade "$temp_dir/$file-$endianness.db"]
  91. error_check_good dbupgrade $ret 0
  92. upgrade_dump "$temp_dir/$file-$endianness.db" "$temp_dir/temp.dump"
  93. error_check_good "Upgrade diff.$endianness: $version $method $file" 
  94.     [filecmp "$temp_dir/$file.tcldump" "$temp_dir/temp.dump"] 0
  95. }
  96. proc _db_load_test { temp_dir version method file } {
  97. source include.tcl
  98. global errorInfo
  99. puts "db_load: $version $method $file"
  100. set ret [catch 
  101.     {exec $util_path/db_load -f "$temp_dir/$file.dump" 
  102.     "$temp_dir/upgrade.db"} message]
  103. error_check_good 
  104.     "Upgrade load: $version $method $file $message" $ret 0
  105. upgrade_dump "$temp_dir/upgrade.db" "$temp_dir/temp.dump"
  106. error_check_good "Upgrade diff.1.1: $version $method $file" 
  107.     [filecmp "$temp_dir/$file.tcldump" "$temp_dir/temp.dump"] 0
  108. }
  109. proc gen_upgrade { dir } {
  110. global gen_upgrade
  111. global upgrade_dir
  112. global upgrade_be
  113. global upgrade_method
  114. global runtests
  115. source ./include.tcl
  116. set gen_upgrade 1
  117. set upgrade_dir $dir
  118. foreach upgrade_be { 0 1 } {
  119. foreach i "btree rbtree hash recno rrecno queue frecno" {
  120. puts "Running $i tests"
  121. set upgrade_method $i
  122. set start 1
  123. for { set j $start } { $j <= $runtests } {incr j} {
  124. if [catch {exec $tclsh_path 
  125.     << "source $test_path/test.tcl;
  126.     global upgrade_be;
  127.     set upgrade_be $upgrade_be;
  128.     run_method -$i $j $j"} res] {
  129. puts "FAIL: [format "test%03d" $j] $i"
  130. }
  131. puts $res
  132. cleanup $testdir NULL
  133. }
  134. }
  135. }
  136. set gen_upgrade 0
  137. }
  138. proc upgrade_dump { database file {stripnulls 0} } {
  139. global errorInfo
  140. set db [berkdb open $database]
  141. set dbc [$db cursor]
  142. set f [open $file w+]
  143. fconfigure $f -encoding binary -translation binary
  144. #
  145. # Get a sorted list of keys
  146. #
  147. set key_list ""
  148. set pair [$dbc get -first]
  149. while { 1 } {
  150. if { [llength $pair] == 0 } {
  151. break
  152. }
  153. set k [lindex [lindex $pair 0] 0]
  154. lappend key_list $k
  155. set pair [$dbc get -next]
  156. }
  157. # Discard duplicated keys;  we now have a key for each
  158. # duplicate, not each unique key, and we don't want to get each
  159. # duplicate multiple times when we iterate over key_list.
  160. set uniq_keys ""
  161. foreach key $key_list {
  162. if { [info exists existence_list($key)] == 0 } {
  163. lappend uniq_keys $key
  164. }
  165. set existence_list($key) 1
  166. }
  167. set key_list $uniq_keys
  168. set key_list [lsort -command _comp $key_list]
  169. #
  170. # Get the data for each key
  171. #
  172. set i 0
  173. foreach key $key_list {
  174. set pair [$dbc get -set $key]
  175. if { $stripnulls != 0 } {
  176. # the Tcl interface to db versions before 3.X
  177. # added nulls at the end of all keys and data, so
  178. # we provide functionality to strip that out.
  179. set key [strip_null $key]
  180. }
  181. set data_list {}
  182. catch { while { [llength $pair] != 0 } {
  183. set data [lindex [lindex $pair 0] 1]
  184. if { $stripnulls != 0 } {
  185. set data [strip_null $data]
  186. }
  187. lappend data_list [list $data]
  188. set pair [$dbc get -nextdup]
  189. } }
  190. #lsort -command _comp data_list
  191. set data_list [lsort -command _comp $data_list]
  192. puts -nonewline $f [binary format i [string length $key]]
  193. puts -nonewline $f $key
  194. puts -nonewline $f [binary format i [llength $data_list]]
  195. for { set j 0 } { $j < [llength $data_list] } { incr j } {
  196. puts -nonewline $f [binary format i [string length [concat [lindex $data_list $j]]]]
  197. puts -nonewline $f [concat [lindex $data_list $j]]
  198. }
  199. if { [llength $data_list] == 0 } {
  200. puts "WARNING: zero-length data list"
  201. }
  202. incr i
  203. }
  204. close $f
  205. }
  206. proc _comp { a b } {
  207. if { 0 } {
  208. # XXX
  209. set a [strip_null [concat $a]]
  210. set b [strip_null [concat $b]]
  211. #return [expr [concat $a] < [concat $b]]
  212. } else {
  213. set an [string first "" $a]
  214. set bn [string first "" $b]
  215. if { $an != -1 } {
  216. set a [string range $a 0 [expr $an - 1]]
  217. }
  218. if { $bn != -1 } {
  219. set b [string range $b 0 [expr $bn - 1]]
  220. }
  221. }
  222. #puts "$a $b"
  223. return [string compare $a $b]
  224. }
  225. proc strip_null { str } {
  226. set len [string length $str]
  227. set last [expr $len - 1]
  228. set termchar [string range $str $last $last]
  229. if { [string compare $termchar ] == 0 } {
  230. set ret [string range $str 0 [expr $last - 1]]
  231. } else {
  232. set ret $str
  233. }
  234. return $ret
  235. }