test-2.6.patch
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. diff -crN test.orig/test.tcl test/test.tcl
  2. *** test.orig/test.tcl Fri Dec 11 14:56:26 1998
  3. --- test/test.tcl Mon Oct  4 15:26:16 1999
  4. ***************
  5. *** 8,13 ****
  6. --- 8,14 ----
  7.   source ./include.tcl
  8.   source ../test/testutils.tcl
  9.   source ../test/byteorder.tcl
  10. + source ../test/upgrade.tcl
  11.   
  12.   set testdir ./TESTDIR
  13.   if { [file exists $testdir] != 1 } {
  14. ***************
  15. *** 114,119 ****
  16. --- 115,124 ----
  17.    global debug_print
  18.    global debug_on
  19.    global runtests
  20. +  global __method
  21. +  set __method $method
  22.    if { $stop == 0 } {
  23.    set stop $runtests
  24.    }
  25. diff -crN test.orig/testutils.tcl test/testutils.tcl
  26. *** test.orig/testutils.tcl Tue Dec 15 07:58:51 1998
  27. --- test/testutils.tcl Wed Oct  6 17:40:45 1999
  28. ***************
  29. *** 680,690 ****
  30. --- 680,698 ----
  31.   
  32.   proc cleanup { dir } {
  33.   source ./include.tcl
  34. + global __method
  35. + global errorInfo
  36.    # Remove the database and environment.
  37.    txn_unlink $dir 1
  38.    memp_unlink $dir 1
  39.    log_unlink $dir 1
  40.    lock_unlink $dir 1
  41. +  catch { exec mkdir -p /work/upgrade/2.6/$__method } res
  42. +  puts $res
  43. +  catch { exec sh -c "mv $dir/*.db /work/upgrade/2.6/$__method" } res
  44. +  puts $res
  45.    set ret [catch { glob $dir/* } result]
  46.    if { $ret == 0 } {
  47.    eval exec $RM -rf $result
  48. diff -crN test.orig/upgrade.tcl test/upgrade.tcl
  49. *** test.orig/upgrade.tcl Wed Dec 31 19:00:00 1969
  50. --- test/upgrade.tcl Mon Oct 18 21:22:39 1999
  51. ***************
  52. *** 0 ****
  53. --- 1,322 ----
  54. + # See the file LICENSE for redistribution information.
  55. + #
  56. + # Copyright (c) 1999
  57. + # Sleepycat Software.  All rights reserved.
  58. + #
  59. + # @(#)upgrade.tcl 11.1 (Sleepycat) 8/23/99
  60. + #
  61. + source ./include.tcl
  62. + global gen_upgrade
  63. + set gen_upgrade 0
  64. + global upgrade_dir
  65. + set upgrade_dir "/work/upgrade/DOTEST"
  66. + global upgrade_be
  67. + global upgrade_method
  68. + proc upgrade { } {
  69. +  source ./include.tcl
  70. +  global upgrade_dir
  71. +  foreach version [glob $upgrade_dir/*] {
  72. +  regexp [^/]*$ $version version
  73. +  foreach method [glob $upgrade_dir/$version/*] {
  74. +  regexp [^/]*$ $method method
  75. +  foreach file [glob $upgrade_dir/$version/$method/*] {
  76. +  puts $file
  77. +  regexp ([^/]*).tar.gz$ $file dummy name
  78. +  foreach endianness {"le" "be"} {
  79. +  puts "Update: $version $method $name $endianness"
  80. +  set ret [catch {_upgrade $upgrade_dir $testdir $version $method $name $endianness 1 1} message]
  81. +  if { $ret != 0 } {
  82. +  puts $message
  83. +  }
  84. +  }
  85. +  }
  86. +  }
  87. +  }
  88. + }
  89. + proc _upgrade { source_dir temp_dir version method file endianness do_db_load_test do_upgrade_test } {
  90. +  source include.tcl
  91. +  global errorInfo
  92. +  cleanup $temp_dir
  93. +  exec tar zxf "$source_dir/$version/$method/$file.tar.gz" -C $temp_dir
  94. +  if { $do_db_load_test } {
  95. +  set ret [catch 
  96. +      {exec ./db_load -f "$temp_dir/$file.dump" 
  97. +      "$temp_dir/upgrade.db"} message]
  98. +  error_check_good 
  99. +      "Update load: $version $method $file $message" $ret 0
  100. +  set ret [catch 
  101. +      {exec ./db_dump -f "$temp_dir/upgrade.dump" 
  102. +      "$temp_dir/upgrade.db"} message]
  103. +  error_check_good 
  104. +      "Update dump: $version $method $file $message" $ret 0
  105. +  error_check_good "Update diff.1.1: $version $method $file" 
  106. +          [catch { exec $CMP "$temp_dir/$file.dump" "$temp_dir/upgrade.dump" } ret] 0
  107. +      error_check_good "Update diff.1.2: $version $method $file" $ret ""
  108. +  }
  109. +  if { $do_upgrade_test } {
  110. +  set ret [catch {berkdb open -upgrade "$temp_dir/$file-$endianness.db"} db]
  111. +  if { $ret == 1 } {
  112. +  if { ![is_substr $errorInfo "version upgrade"] } {
  113. +  set fnl [string first "n" $errorInfo]
  114. +  set theError [string range $errorInfo 0 [expr $fnl - 1]]
  115. +  error $theError
  116. +  }
  117. +  } else {
  118. +      error_check_good dbopen [is_valid_db $db] TRUE
  119. +      error_check_good dbclose [$db close] 0
  120. +      
  121. +      set ret [catch 
  122. +      {exec ./db_dump -f "$temp_dir/upgrade.dump" 
  123. +      "$temp_dir/$file-$endianness.db"} message]
  124. +  error_check_good 
  125. +      "Update dump: $version $method $file $message" $ret 0
  126. +  error_check_good "Update diff.2: $version $method $file" 
  127. +      [catch { exec $CMP "$temp_dir/$file.dump" "$temp_dir/upgrade.dump" } ret] 0
  128. +       error_check_good "Update diff.2: $version $method $file" $ret ""
  129. +  }
  130. +  }
  131. + }
  132. + proc gen_upgrade { dir } {
  133. +  global gen_upgrade
  134. +  global upgrade_dir
  135. +  global upgrade_be
  136. +  global upgrade_method
  137. +  global __method
  138. +  global runtests
  139. +  source ./include.tcl
  140. +  set tclsh_path "/work/db/upgrade/db-2.6.6/build_unix/dbtest"
  141. +  set gen_upgrade 1
  142. +  set upgrade_dir $dir
  143. +  foreach upgrade_be { 0 1 } {
  144. +  foreach i "rrecno" {
  145. +  # "hash btree rbtree hash recno rrecno" 
  146. +  puts "Running $i tests"
  147. +  set upgrade_method $i
  148. +  for { set j 1 } { $j <= $runtests } {incr j} {
  149. +  if [catch {exec $tclsh_path 
  150. +      << "source ../test/test.tcl; 
  151. +      run_method $i $j $j"} res] {
  152. +  puts "FAIL: [format "test%03d" $j] $i"
  153. +  }
  154. +  puts $res
  155. +  set __method $i
  156. +  cleanup $testdir
  157. +  }
  158. +  }
  159. +  }
  160. +  set gen_upgrade 0
  161. + }
  162. + proc upgrade_dump { database file {with_binkey 0} } {
  163. +  source ./include.tcl
  164. +  global errorInfo
  165. +  set is_recno 0
  166. +  set db [dbopen $database 0 0600 DB_UNKNOWN]
  167. +  set dbc [$db cursor 0]
  168. +  set f [open $file w+]
  169. +  fconfigure $f -encoding binary -translation binary
  170. +  #
  171. +  # Get a sorted list of keys
  172. +  #
  173. +  set key_list ""
  174. +  if { [catch {set pair [$dbc get "" $DB_FIRST]}] != 0 } {
  175. +  set pair [$dbc get 0 $DB_FIRST]
  176. +  set is_recno 1
  177. +  }
  178. +  while { 1 } {
  179. +  if { [llength $pair] == 0 } {
  180. +  break
  181. +  }
  182. +  lappend key_list [list [lindex $pair 0]]
  183. +  set pair [$dbc get 0 $DB_NEXT]
  184. +  }
  185. +  # Discard duplicated keys;  we now have a key for each
  186. +  # duplicate, not each unique key, and we don't want to get each
  187. +  # duplicate multiple times when we iterate over key_list. 
  188. +  set uniq_keys {}
  189. +  foreach key $key_list {
  190. +  if { [info exists existence_list($key)] == 0 } {
  191. +  lappend uniq_keys [list $key]
  192. +  }
  193. +  set existence_list($key) 1
  194. +  }
  195. +  set key_list $uniq_keys
  196. +  set key_list [lsort -command _comp $key_list]
  197. +  #foreach llave $key_list {
  198. +  # puts $llave
  199. +  #}
  200. +  #
  201. +  # Get the data for each key
  202. +  #
  203. +  for { set i 0 } { $i < [llength $key_list] } { incr i } {
  204. +  set key [concat [lindex $key_list $i]]
  205. +  # XXX Gross awful hack.  We want to DB_SET in the vast
  206. +  # majority of cases, but DB_SET can't handle binary keys
  207. +  # in the 2.X Tcl interface.  So we look manually and linearly
  208. +  # for the key we want if with_binkey == 1.
  209. +  if { $with_binkey != 1 } {
  210. +  set pair [$dbc get $key $DB_SET]
  211. +  } else {
  212. +  set pair [_search_binkey $key $dbc]
  213. +  }
  214. +  if { $is_recno != 1 } {
  215. +  set key [upgrade_convkey $key $dbc]
  216. +  }
  217. +  #puts "pair:$pair:[lindex $pair 1]"
  218. +  set data [lindex $pair 1]
  219. +  set data [upgrade_convdata $data $dbc]
  220. +  set data_list [list $data]
  221. +  catch { while { $is_recno == 0 } {
  222. +  set pair [$dbc get 0 $DB_NEXT_DUP]
  223. +  if { [llength $pair] == 0 } {
  224. +  break
  225. +  }
  226. +  set data [lindex $pair 1]
  227. +  set data [upgrade_convdata $data $dbc]
  228. +  lappend data_list [list $data]
  229. +  } }
  230. +  set data_list [lsort -command _comp $data_list]
  231. +  puts -nonewline $f [binary format i [string length $key]]
  232. +  puts -nonewline $f $key
  233. +  puts -nonewline $f [binary format i [llength $data_list]]
  234. +  for { set j 0 } { $j < [llength $data_list] } { incr j } {
  235. +  puts -nonewline $f [binary format i [string length [concat [lindex $data_list $j]]]]
  236. +  puts -nonewline $f [concat [lindex $data_list $j]]
  237. +  }
  238. +  }
  239. +  close $f
  240. + }
  241. + proc _comp { a b } {
  242. + # return expr [[concat $a] < [concat $b]]
  243. +  return [string compare [concat $a] [concat $b]]
  244. + }
  245. + # Converts a key to the format of keys in the 3.X Tcl interface
  246. + proc upgrade_convkey { key dbc } {
  247. +  source ./include.tcl
  248. +  # Stick a null on the end.
  249. +  set k "$key"
  250. +  set tmp $testdir/gb0
  251. +  # Attempt a dbc getbinkey to get any additional parts of the key.
  252. +  set dbt [$dbc getbinkey $tmp 0 $DB_CURRENT]
  253. +  set tmpid [open $tmp r]
  254. +  fconfigure $tmpid -encoding binary -translation binary
  255. +  set cont [read $tmpid]
  256. +  set k $k$cont
  257. +  close $tmpid
  258. +  exec $RM -f $tmp
  259. +  return $k
  260. + }
  261. + # Converts a datum to the format of data in the 3.X Tcl interface
  262. + proc upgrade_convdata { data dbc } {
  263. +  source ./include.tcl
  264. +  set is_partial 0
  265. +  # Get the datum out of "data"
  266. +  if { [llength $data] == 1 } {
  267. +  set d [lindex $data 0]
  268. +  } elseif { [llength $data] == 2 } {
  269. +  # It was a partial return;  the first arg is the number of nuls
  270. +  set d [lindex $data 1]
  271. +  set numnul [lindex $data 0]
  272. +  while { $numnul > 0 } {
  273. +  set d "$d"
  274. +  incr numnul -1
  275. +  }
  276. +  # The old Tcl getbin and the old Tcl partial put
  277. +  # interface are incompatible;  we'll wind up returning
  278. +  # the datum twice if we try a getbin now.  So
  279. +  # set a flag to avoid it.
  280. +  set is_partial 1
  281. +  } else {
  282. +  set d $data
  283. +  }
  284. +  if { $is_partial != 1 } {
  285. +  # Stick a null on the end.
  286. +  set d "$d"
  287. +  set tmp $testdir/gb1
  288. +  # Attempt a dbc getbin to get any additional parts of the datum
  289. +  # the Tcl interface has neglected.
  290. +  set dbt [$dbc getbin $tmp 0 $DB_CURRENT]
  291. +  set tmpid [open $tmp r]
  292. +  fconfigure $tmpid -encoding binary -translation binary
  293. +  set cont [read $tmpid]
  294. +  set d $d$cont
  295. +  #puts "$data->$d"
  296. +  close $tmpid
  297. +  }
  298. +  return [list $d]
  299. + }
  300. + # Implement the DB_SET functionality, stupidly, in terms of DB_NEXT and
  301. + # manual comparisons.  We have to use this instead of DB_SET with 
  302. + # binary keys, as the old Tcl interface can't handle binary keys but DB_SET
  303. + # requires them.  So instead, we page through using DB_NEXT, which returns 
  304. + # the binary keys only up to the first null, and compare to our specified
  305. + # key, which is similarly truncated.
  306. + #
  307. + # This is really slow, but is seldom used.
  308. + proc _search_binkey { key dbc } {
  309. +  #puts "doing _search_binkey $key $dbc"
  310. +  source ./include.tcl
  311. +  set dbt [$dbc get 0 $DB_FIRST]
  312. +  while { [llength $dbt] != 0 } {
  313. +  set curkey [lindex $dbt 0]
  314. +  if { [string compare $key $curkey] == 0 } { 
  315. +  return $dbt 
  316. +  }
  317. +  set dbt [$dbc get 0 $DB_NEXT]
  318. +  }
  319. +  # We didn't find it.  Return an empty list.
  320. +  return {}
  321. + }