test073.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: test073.tcl,v 11.17 2000/12/11 17:24:55 sue Exp $
  7. #
  8. # DB Test 73: Test of cursor stability on duplicate pages.
  9. # Does the following:
  10. #    a. Initialize things by DB->putting ndups dups and
  11. #       setting a reference cursor to point to each.
  12. #    b. c_put ndups dups (and correspondingly expanding
  13. #       the set of reference cursors) after the last one, making sure
  14. #       after each step that all the reference cursors still point to
  15. #       the right item.
  16. #    c. Ditto, but before the first one.
  17. #    d. Ditto, but after each one in sequence first to last.
  18. #    e. Ditto, but after each one in sequence from last to first.
  19. #       occur relative to the new datum)
  20. #    f. Ditto for the two sequence tests, only doing a
  21. #       DBC->c_put(DB_CURRENT) of a larger datum instead of adding a
  22. #       new one.
  23. proc test073 { method {pagesize 512} {ndups 50} {tnum 73} args } {
  24. source ./include.tcl
  25. global alphabet
  26. set omethod [convert_method $method]
  27. set args [convert_args $method $args]
  28. set eindex [lsearch -exact $args "-env"]
  29. #
  30. # If we are using an env, then testfile should just be the db name.
  31. # Otherwise it is the test directory and the name.
  32. if { $eindex == -1 } {
  33. set testfile $testdir/test0$tnum.db
  34. set env NULL
  35. } else {
  36. set testfile test0$tnum.db
  37. incr eindex
  38. set env [lindex $args $eindex]
  39. }
  40. cleanup $testdir $env
  41. set key "the key"
  42. puts -nonewline "Test0$tnum $omethod ($args): "
  43. if { [is_record_based $method] || [is_rbtree $method] } {
  44. puts "Skipping for method $method."
  45. return
  46. } else {
  47. puts "cursor stability on duplicate pages."
  48. }
  49. set pgindex [lsearch -exact $args "-pagesize"]
  50. if { $pgindex != -1 } {
  51. puts "Test073: skipping for specific pagesizes"
  52. return
  53. }
  54. append args " -pagesize $pagesize -dup"
  55. set db [eval {berkdb_open 
  56.      -create -truncate -mode 0644} $omethod $args $testfile]
  57. error_check_good "db open" [is_valid_db $db] TRUE
  58. # Number of outstanding keys.
  59. set keys 0
  60. puts "tTest0$tnum.a.1: Initializing put loop; $ndups dups, short data."
  61. for { set i 0 } { $i < $ndups } { incr i } {
  62. set datum [makedatum_t73 $i 0]
  63. error_check_good "db put ($i)" [$db put $key $datum] 0
  64. set is_long($i) 0
  65. incr keys
  66. }
  67. puts "tTest0$tnum.a.2: Initializing cursor get loop; $keys dups."
  68. for { set i 0 } { $i < $keys } { incr i } {
  69. set datum [makedatum_t73 $i 0]
  70. set dbc($i) [$db cursor]
  71. error_check_good "db cursor ($i)"
  72.     [is_valid_cursor $dbc($i) $db] TRUE
  73. error_check_good "dbc get -get_both ($i)"
  74.     [$dbc($i) get -get_both $key $datum]
  75.     [list [list $key $datum]]
  76. }
  77. puts "tTest0$tnum.b: Cursor put (DB_KEYLAST); $ndups new dups,
  78.     short data."
  79. for { set i 0 } { $i < $ndups } { incr i } {
  80. # !!! keys contains the number of the next dup
  81. # to be added (since they start from zero)
  82. set datum [makedatum_t73 $keys 0]
  83. set curs [$db cursor]
  84. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  85.     TRUE
  86. error_check_good "c_put(DB_KEYLAST, $keys)"
  87.     [$curs put -keylast $key $datum] 0
  88. set dbc($keys) $curs
  89. set is_long($keys) 0
  90. incr keys
  91. verify_t73 is_long dbc $keys $key
  92. }
  93. puts "tTest0$tnum.c: Cursor put (DB_KEYFIRST); $ndups new dups,
  94.     short data."
  95. for { set i 0 } { $i < $ndups } { incr i } {
  96. # !!! keys contains the number of the next dup
  97. # to be added (since they start from zero)
  98. set datum [makedatum_t73 $keys 0]
  99. set curs [$db cursor]
  100. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  101.     TRUE
  102. error_check_good "c_put(DB_KEYFIRST, $keys)"
  103.     [$curs put -keyfirst $key $datum] 0
  104. set dbc($keys) $curs
  105. set is_long($keys) 0
  106. incr keys
  107. verify_t73 is_long dbc $keys $key
  108. }
  109. puts "tTest0$tnum.d: Cursor put (DB_AFTER) first to last;
  110.     $keys new dups, short data"
  111. # We want to add a datum after each key from 0 to the current
  112. # value of $keys, which we thus need to save.
  113. set keysnow $keys
  114. for { set i 0 } { $i < $keysnow } { incr i } {
  115. set datum [makedatum_t73 $keys 0]
  116. set curs [$db cursor]
  117. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  118.     TRUE
  119. # Which datum to insert this guy after.
  120. set curdatum [makedatum_t73 $i 0]
  121. error_check_good "c_get(DB_GET_BOTH, $i)"
  122.     [$curs get -get_both $key $curdatum]
  123.     [list [list $key $curdatum]]
  124. error_check_good "c_put(DB_AFTER, $i)"
  125.     [$curs put -after $datum] 0
  126. set dbc($keys) $curs
  127. set is_long($keys) 0
  128. incr keys
  129. verify_t73 is_long dbc $keys $key
  130. }
  131. puts "tTest0$tnum.e: Cursor put (DB_BEFORE) last to first;
  132.     $keys new dups, short data"
  133. for { set i [expr $keys - 1] } { $i >= 0 } { incr i -1 } {
  134. set datum [makedatum_t73 $keys 0]
  135. set curs [$db cursor]
  136. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  137.     TRUE
  138. # Which datum to insert this guy before.
  139. set curdatum [makedatum_t73 $i 0]
  140. error_check_good "c_get(DB_GET_BOTH, $i)"
  141.     [$curs get -get_both $key $curdatum]
  142.     [list [list $key $curdatum]]
  143. error_check_good "c_put(DB_BEFORE, $i)"
  144.     [$curs put -before $datum] 0
  145. set dbc($keys) $curs
  146. set is_long($keys) 0
  147. incr keys
  148. if { $i % 10 == 1 } {
  149. verify_t73 is_long dbc $keys $key
  150. }
  151. }
  152. verify_t73 is_long dbc $keys $key
  153. puts "tTest0$tnum.f: Cursor put (DB_CURRENT), first to last,
  154.     growing $keys data."
  155. set keysnow $keys
  156. for { set i 0 } { $i < $keysnow } { incr i } {
  157. set olddatum [makedatum_t73 $i 0]
  158. set newdatum [makedatum_t73 $i 1]
  159. set curs [$db cursor]
  160. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  161.     TRUE
  162. error_check_good "c_get(DB_GET_BOTH, $i)"
  163.     [$curs get -get_both $key $olddatum]
  164.     [list [list $key $olddatum]]
  165. error_check_good "c_put(DB_CURRENT, $i)"
  166.     [$curs put -current $newdatum] 0
  167. error_check_good "cursor close" [$curs close] 0
  168. set is_long($i) 1
  169. if { $i % 10 == 1 } {
  170. verify_t73 is_long dbc $keys $key
  171. }
  172. }
  173. verify_t73 is_long dbc $keys $key
  174. # Close cursors.
  175. puts "tTest0$tnum.g: Closing cursors."
  176. for { set i 0 } { $i < $keys } { incr i } {
  177. error_check_good "dbc close ($i)" [$dbc($i) close] 0
  178. }
  179. error_check_good "db close" [$db close] 0
  180. }
  181. # !!!: This procedure is also used by test087.
  182. proc makedatum_t73 { num is_long } {
  183. global alphabet
  184. if { $is_long == 1 } {
  185. set a $alphabet$alphabet$alphabet
  186. } else {
  187. set a abcdefghijklm
  188. }
  189. # format won't do leading zeros, alas.
  190. if { $num / 1000 > 0 } {
  191. set i $num
  192. } elseif { $num / 100 > 0 } {
  193. set i 0$num
  194. } elseif { $num / 10 > 0 } {
  195. set i 00$num
  196. } else {
  197. set i 000$num
  198. }
  199. return $i$a
  200. }
  201. # !!!: This procedure is also used by test087.
  202. proc verify_t73 { is_long_array curs_array numkeys key } {
  203. upvar $is_long_array is_long
  204. upvar $curs_array dbc
  205. upvar db db
  206. #useful for debugging, perhaps.
  207. eval $db sync
  208. for { set j 0 } { $j < $numkeys } { incr j } {
  209. set dbt [$dbc($j) get -current]
  210. set k [lindex [lindex $dbt 0] 0]
  211. set d [lindex [lindex $dbt 0] 1]
  212. error_check_good
  213.     "cursor $j key correctness (with $numkeys total items)"
  214.     $k $key
  215. error_check_good
  216.     "cursor $j data correctness (with $numkeys total items)"
  217.     $d [makedatum_t73 $j $is_long($j)]
  218. }
  219. }