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

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: test087.tcl,v 11.6 2000/12/11 17:24:55 sue Exp $
  7. #
  8. # DB Test 87: Test of cursor stability on duplicate pages w/aborts.
  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 test087 { method {pagesize 512} {ndups 50} {tnum 87} args } {
  24. source ./include.tcl
  25. global alphabet
  26. set omethod [convert_method $method]
  27. set args [convert_args $method $args]
  28. puts "Test0$tnum $omethod ($args): "
  29. set eindex [lsearch -exact $args "-env"]
  30. #
  31. # If we are using an env, then return
  32. if { $eindex != -1 } {
  33. puts "Environment specified;  skipping."
  34. return
  35. }
  36. set pgindex [lsearch -exact $args "-pagesize"]
  37. if { $pgindex != -1 } {
  38. puts "Test087: skipping for specific pagesizes"
  39. return
  40. }
  41. env_cleanup $testdir
  42. set testfile test0$tnum.db
  43. set key "the key"
  44. append args " -pagesize $pagesize -dup"
  45. if { [is_record_based $method] || [is_rbtree $method] } {
  46. puts "Skipping for method $method."
  47. return
  48. } else {
  49. puts "Cursor stability on dup. pages w/ aborts."
  50. }
  51. set env [berkdb env -create -home $testdir -txn]
  52. error_check_good env_create [is_valid_env $env] TRUE
  53. set db [eval {berkdb_open -env $env 
  54.      -create -mode 0644} $omethod $args $testfile]
  55. error_check_good "db open" [is_valid_db $db] TRUE
  56. # Number of outstanding keys.
  57. set keys 0
  58. puts "tTest0$tnum.a.1: Initializing put loop; $ndups dups, short data."
  59. set txn [$env txn]
  60. error_check_good txn [is_valid_txn $txn $env] TRUE
  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 -txn $txn $key $datum] 0
  64. set is_long($i) 0
  65. incr keys
  66. }
  67. error_check_good txn_commit [$txn commit] 0
  68. puts "tTest0$tnum.a.2: Initializing cursor get loop; $keys dups."
  69. set txn [$env txn]
  70. error_check_good txn [is_valid_txn $txn $env] TRUE
  71. for { set i 0 } { $i < $keys } { incr i } {
  72. set datum [makedatum_t73 $i 0]
  73. set dbc($i) [$db cursor -txn $txn]
  74. error_check_good "db cursor ($i)"
  75.     [is_valid_cursor $dbc($i) $db] TRUE
  76. error_check_good "dbc get -get_both ($i)"
  77.     [$dbc($i) get -get_both $key $datum]
  78.     [list [list $key $datum]]
  79. }
  80. puts "tTest0$tnum.b: Cursor put (DB_KEYLAST); $ndups new dups,
  81.     short data."
  82. set ctxn [$env txn -parent $txn]
  83. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  84. for { set i 0 } { $i < $ndups } { incr i } {
  85. # !!! keys contains the number of the next dup
  86. # to be added (since they start from zero)
  87. set datum [makedatum_t73 $keys 0]
  88. set curs [$db cursor -txn $ctxn]
  89. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  90.     TRUE
  91. error_check_good "c_put(DB_KEYLAST, $keys)"
  92.     [$curs put -keylast $key $datum] 0
  93. # We can't do a verification while a child txn is active,
  94. # or we'll run into trouble when DEBUG_ROP is enabled.
  95. # If this test has trouble, though, uncommenting this
  96. # might be illuminating--it makes things a bit more rigorous
  97. # and works fine when DEBUG_ROP is not enabled.
  98. # verify_t73 is_long dbc $keys $key
  99. error_check_good curs_close [$curs close] 0
  100. }
  101. error_check_good ctxn_abort [$ctxn abort] 0
  102. verify_t73 is_long dbc $keys $key
  103. puts "tTest0$tnum.c: Cursor put (DB_KEYFIRST); $ndups new dups,
  104.     short data."
  105. set ctxn [$env txn -parent $txn]
  106. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  107. for { set i 0 } { $i < $ndups } { incr i } {
  108. # !!! keys contains the number of the next dup
  109. # to be added (since they start from zero)
  110. set datum [makedatum_t73 $keys 0]
  111. set curs [$db cursor -txn $ctxn]
  112. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  113.     TRUE
  114. error_check_good "c_put(DB_KEYFIRST, $keys)"
  115.     [$curs put -keyfirst $key $datum] 0
  116. # verify_t73 is_long dbc $keys $key
  117. error_check_good curs_close [$curs close] 0
  118. }
  119. # verify_t73 is_long dbc $keys $key
  120. # verify_t73 is_long dbc $keys $key
  121. error_check_good ctxn_abort [$ctxn abort] 0
  122. verify_t73 is_long dbc $keys $key
  123. puts "tTest0$tnum.d: Cursor put (DB_AFTER) first to last;
  124.     $keys new dups, short data"
  125. # We want to add a datum after each key from 0 to the current
  126. # value of $keys, which we thus need to save.
  127. set ctxn [$env txn -parent $txn]
  128. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  129. set keysnow $keys
  130. for { set i 0 } { $i < $keysnow } { incr i } {
  131. set datum [makedatum_t73 $keys 0]
  132. set curs [$db cursor -txn $ctxn]
  133. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  134.     TRUE
  135. # Which datum to insert this guy after.
  136. set curdatum [makedatum_t73 $i 0]
  137. error_check_good "c_get(DB_GET_BOTH, $i)"
  138.     [$curs get -get_both $key $curdatum]
  139.     [list [list $key $curdatum]]
  140. error_check_good "c_put(DB_AFTER, $i)"
  141.     [$curs put -after $datum] 0
  142. # verify_t73 is_long dbc $keys $key
  143. error_check_good curs_close [$curs close] 0
  144. }
  145. error_check_good ctxn_abort [$ctxn abort] 0
  146. verify_t73 is_long dbc $keys $key
  147. puts "tTest0$tnum.e: Cursor put (DB_BEFORE) last to first;
  148.     $keys new dups, short data"
  149. set ctxn [$env txn -parent $txn]
  150. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  151. for { set i [expr $keys - 1] } { $i >= 0 } { incr i -1 } {
  152. set datum [makedatum_t73 $keys 0]
  153. set curs [$db cursor -txn $ctxn]
  154. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  155.     TRUE
  156. # Which datum to insert this guy before.
  157. set curdatum [makedatum_t73 $i 0]
  158. error_check_good "c_get(DB_GET_BOTH, $i)"
  159.     [$curs get -get_both $key $curdatum]
  160.     [list [list $key $curdatum]]
  161. error_check_good "c_put(DB_BEFORE, $i)"
  162.     [$curs put -before $datum] 0
  163. # verify_t73 is_long dbc $keys $key
  164. error_check_good curs_close [$curs close] 0
  165. }
  166. error_check_good ctxn_abort [$ctxn abort] 0
  167. verify_t73 is_long dbc $keys $key
  168. puts "tTest0$tnum.f: Cursor put (DB_CURRENT), first to last,
  169.     growing $keys data."
  170. set ctxn [$env txn -parent $txn]
  171. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  172. for { set i 0 } { $i < $keysnow } { incr i } {
  173. set olddatum [makedatum_t73 $i 0]
  174. set newdatum [makedatum_t73 $i 1]
  175. set curs [$db cursor -txn $ctxn]
  176. error_check_good "db cursor create" [is_valid_cursor $curs $db]
  177.     TRUE
  178. error_check_good "c_get(DB_GET_BOTH, $i)"
  179.     [$curs get -get_both $key $olddatum]
  180.     [list [list $key $olddatum]]
  181. error_check_good "c_put(DB_CURRENT, $i)"
  182.     [$curs put -current $newdatum] 0
  183. set is_long($i) 1
  184. # verify_t73 is_long dbc $keys $key
  185. error_check_good curs_close [$curs close] 0
  186. }
  187. error_check_good ctxn_abort [$ctxn abort] 0
  188. for { set i 0 } { $i < $keysnow } { incr i } {
  189. set is_long($i) 0
  190. }
  191. verify_t73 is_long dbc $keys $key
  192. # Now delete the first item, abort the deletion, and make sure
  193. # we're still sane.
  194. puts "tTest0$tnum.g: Cursor delete first item, then abort delete."
  195. set ctxn [$env txn -parent $txn]
  196. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  197. set curs [$db cursor -txn $ctxn]
  198. error_check_good "db cursor create" [is_valid_cursor $curs $db] TRUE
  199. set datum [makedatum_t73 0 0]
  200. error_check_good "c_get(DB_GET_BOTH, 0)"
  201.     [$curs get -get_both $key $datum] [list [list $key $datum]]
  202. error_check_good "c_del(0)" [$curs del] 0
  203. error_check_good curs_close [$curs close] 0
  204. error_check_good ctxn_abort [$ctxn abort] 0
  205. verify_t73 is_long dbc $keys $key
  206. # Ditto, for the last item.
  207. puts "tTest0$tnum.h: Cursor delete last item, then abort delete."
  208. set ctxn [$env txn -parent $txn]
  209. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  210. set curs [$db cursor -txn $ctxn]
  211. error_check_good "db cursor create" [is_valid_cursor $curs $db] TRUE
  212. set datum [makedatum_t73 [expr $keys - 1] 0]
  213. error_check_good "c_get(DB_GET_BOTH, [expr $keys - 1])"
  214.     [$curs get -get_both $key $datum] [list [list $key $datum]]
  215. error_check_good "c_del(0)" [$curs del] 0
  216. error_check_good curs_close [$curs close] 0
  217. error_check_good ctxn_abort [$ctxn abort] 0
  218. verify_t73 is_long dbc $keys $key
  219. # Ditto, for all the items.
  220. puts "tTest0$tnum.i: Cursor delete all items, then abort delete."
  221. set ctxn [$env txn -parent $txn]
  222. error_check_good ctxn($i) [is_valid_txn $ctxn $env] TRUE
  223. set curs [$db cursor -txn $ctxn]
  224. error_check_good "db cursor create" [is_valid_cursor $curs $db] TRUE
  225. set datum [makedatum_t73 0 0]
  226. error_check_good "c_get(DB_GET_BOTH, 0)"
  227.     [$curs get -get_both $key $datum] [list [list $key $datum]]
  228. error_check_good "c_del(0)" [$curs del] 0
  229. for { set i 1 } { $i < $keys } { incr i } {
  230. error_check_good "c_get(DB_NEXT, $i)"
  231.     [$curs get -next] [list [list $key [makedatum_t73 $i 0]]]
  232. error_check_good "c_del($i)" [$curs del] 0
  233. }
  234. error_check_good curs_close [$curs close] 0
  235. error_check_good ctxn_abort [$ctxn abort] 0
  236. verify_t73 is_long dbc $keys $key
  237. # Close cursors.
  238. puts "tTest0$tnum.j: Closing cursors."
  239. for { set i 0 } { $i < $keys } { incr i } {
  240. error_check_good "dbc close ($i)" [$dbc($i) close] 0
  241. }
  242. error_check_good txn_commit [$txn commit] 0
  243. error_check_good "db close" [$db close] 0
  244. error_check_good "env close" [$env close] 0
  245. }