test072.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: test072.tcl,v 11.13 2000/12/11 17:24:55 sue Exp $
  7. #
  8. # DB Test 72: Test of cursor stability when duplicates are moved off-page.
  9. proc test072 { method {pagesize 512} {ndups 20} {tnum 72} args } {
  10. source ./include.tcl
  11. global alphabet
  12. set omethod [convert_method $method]
  13. set args [convert_args $method $args]
  14. set eindex [lsearch -exact $args "-env"]
  15. #
  16. # If we are using an env, then testfile should just be the db name.
  17. # Otherwise it is the test directory and the name.
  18. if { $eindex == -1 } {
  19. set testfile $testdir/test0$tnum.db
  20. set env NULL
  21. } else {
  22. set testfile test0$tnum.db
  23. incr eindex
  24. set env [lindex $args $eindex]
  25. }
  26. cleanup $testdir $env
  27. # Keys must sort $prekey < $key < $postkey.
  28. set prekey "a key"
  29. set key "the key"
  30. set postkey "z key"
  31. # Make these distinguishable from each other and from the
  32. # alphabets used for the $key's data.
  33. set predatum "1234567890"
  34. set postdatum "0987654321"
  35. append args " -pagesize $pagesize "
  36. puts -nonewline "Test0$tnum $omethod ($args): "
  37. if { [is_record_based $method] || [is_rbtree $method] } {
  38. puts "Skipping for method $method."
  39. return
  40. } else {
  41. puts "n    Test of cursor stability when
  42.     duplicates are moved off-page."
  43. }
  44. set pgindex [lsearch -exact $args "-pagesize"]
  45. if { $pgindex != -1 } {
  46. puts "Test0$tnum: skipping for specific pagesizes"
  47. return
  48. }
  49. foreach dupopt { "-dup" "-dup -dupsort" } {
  50. set db [eval {berkdb_open -create -truncate -mode 0644} 
  51.       $omethod $args $dupopt $testfile]
  52. error_check_good "db open" [is_valid_db $db] TRUE
  53. puts 
  54. "tTest0$tnum.a: ($dupopt) Set up surrounding keys and cursors."
  55. error_check_good pre_put [$db put $prekey $predatum] 0
  56. error_check_good post_put [$db put $postkey $postdatum] 0
  57. set precursor [$db cursor]
  58. error_check_good precursor [is_valid_cursor $precursor 
  59.     $db] TRUE
  60. set postcursor [$db cursor]
  61. error_check_good postcursor [is_valid_cursor $postcursor 
  62.     $db] TRUE
  63. error_check_good preset [$precursor get -set $prekey] 
  64. [list [list $prekey $predatum]]
  65. error_check_good postset [$postcursor get -set $postkey] 
  66. [list [list $postkey $postdatum]]
  67. puts "tTest0$tnum.b: Put/create cursor/verify all cursor loop."
  68. for { set i 0 } { $i < $ndups } { incr i } {
  69. set datum [format "%4d$alphabet" [expr $i + 1000]]
  70. set data($i) $datum
  71. # Uncomment these lines to see intermediate steps.
  72. error_check_good db_sync($i) [$db sync] 0
  73. error_check_good db_dump($i) 
  74.     [catch {exec $util_path/db_dump 
  75. -da $testfile > TESTDIR/out.$i}] 0
  76. error_check_good "db put ($i)" [$db put $key $datum] 0
  77. set dbc($i) [$db cursor]
  78. error_check_good "db cursor ($i)"
  79.     [is_valid_cursor $dbc($i) $db] TRUE
  80. error_check_good "dbc get -get_both ($i)"
  81.     [$dbc($i) get -get_both $key $datum]
  82.     [list [list $key $datum]]
  83. for { set j 0 } { $j < $i } { incr j } {
  84. set dbt [$dbc($j) get -current]
  85. set k [lindex [lindex $dbt 0] 0]
  86. set d [lindex [lindex $dbt 0] 1]
  87. #puts "cursor $j after $i: $d"
  88. eval {$db sync}
  89. error_check_good
  90.     "cursor $j key correctness after $i puts" 
  91.     $k $key
  92. error_check_good
  93.     "cursor $j data correctness after $i puts" 
  94.     $d $data($j)
  95. }
  96. # Check correctness of pre- and post- cursors.  Do an 
  97. # error_check_good on the lengths first so that we don't
  98. # spew garbage as the "got" field and screw up our
  99. # terminal.  (It's happened here.)
  100. set pre_dbt [$precursor get -current]
  101. set post_dbt [$postcursor get -current]
  102. error_check_good 
  103.     "key earlier cursor correctness after $i puts" 
  104.     [string length [lindex [lindex $pre_dbt 0] 0]] 
  105.     [string length $prekey] 
  106. error_check_good 
  107.     "data earlier cursor correctness after $i puts" 
  108.     [string length [lindex [lindex $pre_dbt 0] 1]] 
  109.     [string length $predatum]
  110. error_check_good 
  111.     "key later cursor correctness after $i puts" 
  112.     [string length [lindex [lindex $post_dbt 0] 0]] 
  113.     [string length $postkey] 
  114. error_check_good 
  115.     "data later cursor correctness after $i puts" 
  116.     [string length [lindex [lindex $post_dbt 0] 1]]
  117.     [string length $postdatum]
  118. error_check_good 
  119.     "earlier cursor correctness after $i puts" 
  120.     $pre_dbt [list [list $prekey $predatum]]
  121. error_check_good 
  122.     "later cursor correctness after $i puts" 
  123.     $post_dbt [list [list $postkey $postdatum]]
  124. }
  125. puts "tTest0$tnum.c: Reverse Put/create cursor/verify all cursor loop."
  126. set end [expr $ndups * 2 - 1]
  127. for { set i $end } { $i > $ndups } { set i [expr $i - 1] } {
  128. set datum [format "%4d$alphabet" [expr $i + 1000]]
  129. set data($i) $datum
  130. # Uncomment these lines to see intermediate steps.
  131. error_check_good db_sync($i) [$db sync] 0
  132. error_check_good db_dump($i) 
  133.     [catch {exec $util_path/db_dump 
  134. -da $testfile > TESTDIR/out.$i}] 0
  135. error_check_good "db put ($i)" [$db put $key $datum] 0
  136. set dbc($i) [$db cursor]
  137. error_check_good "db cursor ($i)"
  138.     [is_valid_cursor $dbc($i) $db] TRUE
  139. error_check_good "dbc get -get_both ($i)"
  140.     [$dbc($i) get -get_both $key $datum]
  141.     [list [list $key $datum]]
  142. for { set j $i } { $j < $end } { incr j } {
  143. set dbt [$dbc($j) get -current]
  144. set k [lindex [lindex $dbt 0] 0]
  145. set d [lindex [lindex $dbt 0] 1]
  146. #puts "cursor $j after $i: $d"
  147. eval {$db sync}
  148. error_check_good
  149.     "cursor $j key correctness after $i puts" 
  150.     $k $key
  151. error_check_good
  152.     "cursor $j data correctness after $i puts" 
  153.     $d $data($j)
  154. }
  155. # Check correctness of pre- and post- cursors.  Do an 
  156. # error_check_good on the lengths first so that we don't
  157. # spew garbage as the "got" field and screw up our
  158. # terminal.  (It's happened here.)
  159. set pre_dbt [$precursor get -current]
  160. set post_dbt [$postcursor get -current]
  161. error_check_good 
  162.     "key earlier cursor correctness after $i puts" 
  163.     [string length [lindex [lindex $pre_dbt 0] 0]] 
  164.     [string length $prekey] 
  165. error_check_good 
  166.     "data earlier cursor correctness after $i puts" 
  167.     [string length [lindex [lindex $pre_dbt 0] 1]] 
  168.     [string length $predatum]
  169. error_check_good 
  170.     "key later cursor correctness after $i puts" 
  171.     [string length [lindex [lindex $post_dbt 0] 0]] 
  172.     [string length $postkey] 
  173. error_check_good 
  174.     "data later cursor correctness after $i puts" 
  175.     [string length [lindex [lindex $post_dbt 0] 1]]
  176.     [string length $postdatum]
  177. error_check_good 
  178.     "earlier cursor correctness after $i puts" 
  179.     $pre_dbt [list [list $prekey $predatum]]
  180. error_check_good 
  181.     "later cursor correctness after $i puts" 
  182.     $post_dbt [list [list $postkey $postdatum]]
  183. }
  184. # Close cursors.
  185. puts "tTest0$tnum.d: Closing cursors."
  186. for { set i 0 } { $i < $ndups } { incr i } {
  187. error_check_good "dbc close ($i)" [$dbc($i) close] 0
  188. }
  189. error_check_good "db close" [$db close] 0
  190. }
  191. }