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

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: test085.tcl,v 1.4 2000/12/11 17:24:55 sue Exp $
  7. #
  8. # DB Test 85: Test of cursor behavior when a cursor is pointing to a deleted
  9. # btree key which then has duplicates added.
  10. proc test085 { method {pagesize 512} {onp 3} {offp 10} {tnum 85} args } {
  11. source ./include.tcl
  12. global alphabet
  13. set omethod [convert_method $method]
  14. set args [convert_args $method $args]
  15. set eindex [lsearch -exact $args "-env"]
  16. #
  17. # If we are using an env, then testfile should just be the db name.
  18. # Otherwise it is the test directory and the name.
  19. if { $eindex == -1 } {
  20. set testfile $testdir/test0$tnum.db
  21. set env NULL
  22. } else {
  23. set testfile test0$tnum.db
  24. incr eindex
  25. set env [lindex $args $eindex]
  26. }
  27. set pgindex [lsearch -exact $args "-pagesize"]
  28. if { $pgindex != -1 } {
  29. puts "Test085: skipping for specific pagesizes"
  30. return
  31. }
  32. cleanup $testdir $env
  33. # Keys must sort $prekey < $key < $postkey.
  34. set prekey "AA"
  35. set key "BBB"
  36. set postkey "CCCC"
  37. # Make these distinguishable from each other and from the
  38. # alphabets used for the $key's data.
  39. set predatum "1234567890"
  40. set datum $alphabet
  41. set postdatum "0987654321"
  42. append args " -pagesize $pagesize -dup"
  43. puts -nonewline "Test0$tnum $omethod ($args): "
  44. # Skip for all non-btrees.  (Rbtrees don't count as btrees, for
  45. # now, since they don't support dups.)
  46. if { [is_btree $method] != 1 } {
  47. puts "Skipping for method $method."
  48. return
  49. } else {
  50. puts "Duplicates w/ deleted item cursor."
  51. }
  52. # Repeat the test with both on-page and off-page numbers of dups.
  53. foreach ndups "$onp $offp" {
  54. # Put operations we want to test on a cursor set to the 
  55. # deleted item, the key to use with them, and what should 
  56. # come before and after them given a placement of
  57. # the deleted item at the beginning or end of the dupset.
  58. set final [expr $ndups - 1]
  59. set putops {
  60. {{-before} "" $predatum {[test085_ddatum 0]} beginning}
  61. {{-before} "" {[test085_ddatum $final]} $postdatum end}
  62. {{-current} "" $predatum {[test085_ddatum 0]} beginning}
  63. {{-current} "" {[test085_ddatum $final]} $postdatum end}
  64. {{-keyfirst} $key $predatum {[test085_ddatum 0]} beginning}
  65. {{-keyfirst} $key $predatum {[test085_ddatum 0]} end}
  66. {{-keylast} $key {[test085_ddatum $final]} $postdatum beginning}
  67. {{-keylast} $key {[test085_ddatum $final]} $postdatum end}
  68. {{-after} "" $predatum {[test085_ddatum 0]} beginning}
  69. {{-after} "" {[test085_ddatum $final]} $postdatum end}
  70. }
  71. # Get operations we want to test on a cursor set to the
  72. # deleted item, any args to get, and the expected key/data pair.
  73. set getops {
  74. {{-current} "" "" "" beginning}
  75. {{-current} "" "" "" end}
  76. {{-next} "" $key {[test085_ddatum 0]} beginning}
  77. {{-next} "" $postkey $postdatum end}
  78. {{-prev} "" $prekey $predatum beginning}
  79. {{-prev} "" $key {[test085_ddatum $final]} end}
  80. {{-first} "" $prekey $predatum beginning}
  81. {{-first} "" $prekey $predatum end}
  82. {{-last} "" $postkey $postdatum beginning}
  83. {{-last} "" $postkey $postdatum end}
  84. {{-nextdup} "" $key {[test085_ddatum 0]} beginning}
  85. {{-nextdup} "" EMPTYLIST "" end}
  86. {{-nextnodup} "" $postkey $postdatum beginning}
  87. {{-nextnodup} "" $postkey $postdatum end}
  88. {{-prevnodup} "" $prekey $predatum beginning}
  89. {{-prevnodup} "" $prekey $predatum end}
  90. }
  91. foreach pair $getops {
  92. set op [lindex $pair 0]
  93. puts "tTest0$tnum: Get ($op) with $ndups duplicates,
  94.     cursor at the [lindex $pair 4]."
  95. set db [eval {berkdb_open -create 
  96.                -truncate -mode 0644} $omethod $args $testfile]
  97. error_check_good "db open" [is_valid_db $db] TRUE
  98. set dbc [test085_setup $db]
  99. set beginning [expr [string compare 
  100.     [lindex $pair 4] "beginning"] == 0]
  101. for { set i 0 } { $i < $ndups } { incr i } {
  102. if { $beginning } {
  103. error_check_good db_put($i) 
  104.     [$db put $key [test085_ddatum $i]] 0
  105. } else {
  106. set c [$db cursor]
  107. set j [expr $ndups - $i - 1]
  108. error_check_good db_cursor($j) 
  109.     [is_valid_cursor $c $db] TRUE
  110. set d [test085_ddatum $j]
  111. error_check_good dbc_put($j) 
  112.     [$c put -keyfirst $key $d] 0
  113. error_check_good c_close [$c close] 0
  114. }
  115. }
  116. set gargs [lindex $pair 1]
  117. set ekey ""
  118. set edata ""
  119. eval set ekey [lindex $pair 2]
  120. eval set edata [lindex $pair 3]
  121. set dbt [eval $dbc get $op $gargs] 
  122. if { [string compare $ekey EMPTYLIST] == 0 } {
  123. error_check_good dbt($op,$ndups) 
  124.     [llength $dbt] 0
  125. } else {
  126. error_check_good dbt($op,$ndups) $dbt 
  127.     [list [list $ekey $edata]]
  128. }
  129. error_check_good "dbc close" [$dbc close] 0
  130. error_check_good "db close" [$db close] 0
  131. verify_dir $testdir "tt"
  132. }
  133. foreach pair $putops {
  134. # Open and set up database.
  135. set op [lindex $pair 0]
  136. puts "tTest0$tnum: Put ($op) with $ndups duplicates,
  137.     cursor at the [lindex $pair 4]."
  138. set db [eval {berkdb_open -create 
  139.                -truncate -mode 0644} $omethod $args $testfile]
  140. error_check_good "db open" [is_valid_db $db] TRUE
  141. set beginning [expr [string compare 
  142.     [lindex $pair 4] "beginning"] == 0]
  143. set dbc [test085_setup $db]
  144. # Put duplicates.
  145. for { set i 0 } { $i < $ndups } { incr i } {
  146. if { $beginning } {
  147. error_check_good db_put($i) 
  148.     [$db put $key [test085_ddatum $i]] 0
  149. } else {
  150. set c [$db cursor]
  151. set j [expr $ndups - $i - 1]
  152. error_check_good db_cursor($j) 
  153.     [is_valid_cursor $c $db] TRUE
  154. set d [test085_ddatum $j]
  155. error_check_good dbc_put($j) 
  156.     [$c put -keyfirst $key $d] 0
  157. error_check_good c_close [$c close] 0
  158. }
  159. }
  160. # Set up cursors for stability test.
  161. set pre_dbc [$db cursor]
  162. error_check_good pre_set [$pre_dbc get -set $prekey] 
  163.     [list [list $prekey $predatum]]
  164. set post_dbc [$db cursor]
  165. error_check_good post_set [$post_dbc get -set $postkey]
  166.     [list [list $postkey $postdatum]]
  167. set first_dbc [$db cursor]
  168. error_check_good first_set 
  169.     [$first_dbc get -get_both $key [test085_ddatum 0]] 
  170.     [list [list $key [test085_ddatum 0]]]
  171. set last_dbc [$db cursor]
  172. error_check_good last_set 
  173.     [$last_dbc get -get_both $key [test085_ddatum 
  174.     [expr $ndups - 1]]] 
  175.     [list [list $key [test085_ddatum [expr $ndups -1]]]]
  176. set k [lindex $pair 1]
  177. set d_before ""
  178. set d_after ""
  179. eval set d_before [lindex $pair 2]
  180. eval set d_after [lindex $pair 3]
  181. set newdatum "NewDatum"
  182. error_check_good dbc_put($op,$ndups) 
  183.     [eval $dbc put $op $k $newdatum] 0
  184. error_check_good dbc_prev($op,$ndups) 
  185.     [lindex [lindex [$dbc get -prev] 0] 1] 
  186.     $d_before
  187. error_check_good dbc_current($op,$ndups) 
  188.     [lindex [lindex [$dbc get -next] 0] 1] 
  189.     $newdatum
  190. error_check_good dbc_next($op,$ndups) 
  191.     [lindex [lindex [$dbc get -next] 0] 1] 
  192.     $d_after
  193. # Verify stability of pre- and post- cursors.
  194. error_check_good pre_stable [$pre_dbc get -current] 
  195.     [list [list $prekey $predatum]]
  196. error_check_good post_stable [$post_dbc get -current] 
  197.     [list [list $postkey $postdatum]]
  198. error_check_good first_stable 
  199.     [$first_dbc get -current] 
  200.     [list [list $key [test085_ddatum 0]]]
  201. error_check_good last_stable 
  202.     [$last_dbc get -current] 
  203.     [list [list $key [test085_ddatum [expr $ndups -1]]]]
  204. foreach c "$pre_dbc $post_dbc $first_dbc $last_dbc" {
  205. error_check_good ${c}_close [$c close] 0
  206. }
  207. error_check_good "dbc close" [$dbc close] 0
  208. error_check_good "db close" [$db close] 0
  209. verify_dir $testdir "tt"
  210. }
  211. }
  212. }
  213. # Set up the test database;  put $prekey, $key, and $postkey with their 
  214. # respective data, and then delete $key with a new cursor.  Return that
  215. # cursor, still pointing to the deleted item.
  216. proc test085_setup { db } {
  217. upvar key key
  218. upvar prekey prekey
  219. upvar postkey postkey
  220. upvar predatum predatum
  221. upvar postdatum postdatum
  222. # no one else should ever see this one!
  223. set datum "bbbbbbbb"
  224. error_check_good pre_put [$db put $prekey $predatum] 0
  225. error_check_good main_put [$db put $key $datum] 0
  226. error_check_good post_put [$db put $postkey $postdatum] 0
  227. set dbc [$db cursor]
  228. error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
  229. error_check_good dbc_getset [$dbc get -get_both $key $datum] 
  230.     [list [list $key $datum]]
  231. error_check_good dbc_del [$dbc del] 0
  232. return $dbc
  233. }
  234. proc test085_ddatum { a } {
  235. global alphabet
  236. return $a$alphabet
  237. }