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

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 1996, 1997, 1998, 1999, 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: test054.tcl,v 11.15 2000/08/25 14:21:57 sue Exp $
  7. #
  8. # Test054:
  9. #
  10. # This test checks for cursor maintenance in the presence of deletes.
  11. # There are N different scenarios to tests:
  12. # 1. No duplicates.  Cursor A deletes a key, do a  GET for the key.
  13. # 2. No duplicates.  Cursor is positioned right before key K, Delete K,
  14. #    do a next on the cursor.
  15. # 3. No duplicates.  Cursor is positioned on key K, do a regular delete of K.
  16. #    do a current get on K.
  17. # 4. Repeat 3 but do a next instead of current.
  18. #
  19. # 5. Duplicates. Cursor A is on the first item of a duplicate set, A
  20. #    does a delete.  Then we do a non-cursor get.
  21. # 6. Duplicates.  Cursor A is in a duplicate set and deletes the item.
  22. #    do a delete of the entire Key. Test cursor current.
  23. # 7. Continue last test and try cursor next.
  24. # 8. Duplicates.  Cursor A is in a duplicate set and deletes the item.
  25. #    Cursor B is in the same duplicate set and deletes a different item.
  26. #    Verify that the cursor is in the right place.
  27. # 9. Cursors A and B are in the place in the same duplicate set.  A deletes
  28. #    its item.  Do current on B.
  29. # 10. Continue 8 and do a next on B.
  30. proc test054 { method args } {
  31. global errorInfo
  32. source ./include.tcl
  33. set args [convert_args $method $args]
  34. set omethod [convert_method $method]
  35. append args " -create -truncate -mode 0644"
  36. puts "Test054 ($method $args):
  37.     interspersed cursor and normal operations"
  38. if { [is_record_based $method] == 1 } {
  39. puts "Test054 skipping for method $method"
  40. return
  41. }
  42. # Create the database and open the dictionary
  43. set eindex [lsearch -exact $args "-env"]
  44. #
  45. # If we are using an env, then testfile should just be the db name.
  46. # Otherwise it is the test directory and the name.
  47. if { $eindex == -1 } {
  48. set testfile $testdir/test054.db
  49. set env NULL
  50. } else {
  51. set testfile test054.db
  52. incr eindex
  53. set env [lindex $args $eindex]
  54. }
  55. cleanup $testdir $env
  56. set flags ""
  57. set txn ""
  58. puts "tTest054.a: No Duplicate Tests"
  59. set db [eval {berkdb_open} $args {$omethod $testfile}]
  60. error_check_good db_open:nodup [is_valid_db $db] TRUE
  61. set curs [eval {$db cursor} $txn]
  62. error_check_good curs_open:nodup [is_substr $curs $db] 1
  63. # Put three keys in the database
  64. for { set key 1 } { $key <= 3 } {incr key} {
  65. set r [eval {$db put} $txn $flags {$key datum$key}]
  66. error_check_good put $r 0
  67. }
  68. # Retrieve keys sequentially so we can figure out their order
  69. set i 1
  70. for {set d [$curs get -first] } 
  71.     {[llength $d] != 0 } 
  72.  {set d [$curs get -next] } {
  73. set key_set($i) [lindex [lindex $d 0] 0]
  74. incr i
  75. }
  76. # TEST CASE 1
  77. puts "tTest054.a1: Delete w/cursor, regular get"
  78. # Now set the cursor on the middle on.
  79. set r [$curs get -set $key_set(2)]
  80. error_check_bad cursor_get:DB_SET [llength $r] 0
  81. set k [lindex [lindex $r 0] 0]
  82. set d [lindex [lindex $r 0] 1]
  83. error_check_good curs_get:DB_SET:key $k $key_set(2)
  84. error_check_good curs_get:DB_SET:data $d datum$key_set(2)
  85. # Now do the delete
  86. set r [eval {$curs del} $txn]
  87. error_check_good curs_del $r 0
  88. # Now do the get
  89. set r [eval {$db get} $txn {$key_set(2)}]
  90. error_check_good get_after_del [llength $r] 0
  91. # Free up the cursor.
  92. error_check_good cursor_close [eval {$curs close}] 0
  93. # TEST CASE 2
  94. puts "tTest054.a2: Cursor before K, delete K, cursor next"
  95. # Replace key 2
  96. set r [eval {$db put} $txn {$key_set(2) datum$key_set(2)}]
  97. error_check_good put $r 0
  98. # Open and position cursor on first item.
  99. set curs [eval {$db cursor} $txn]
  100. error_check_good curs_open:nodup [is_substr $curs $db] 1
  101. # Retrieve keys sequentially so we can figure out their order
  102. set i 1
  103. for {set d [eval {$curs get} -first] } 
  104.     {[llength $d] != 0 } 
  105.  {set d [$curs get -nextdup] } {
  106. set key_set($i) [lindex [lindex $d 0] 0]
  107. incr i
  108. }
  109. set r [eval {$curs get} -set {$key_set(1)} ]
  110. error_check_bad cursor_get:DB_SET [llength $r] 0
  111. set k [lindex [lindex $r 0] 0]
  112. set d [lindex [lindex $r 0] 1]
  113. error_check_good curs_get:DB_SET:key $k $key_set(1)
  114. error_check_good curs_get:DB_SET:data $d datum$key_set(1)
  115. # Now delete (next item) $key_set(2)
  116. error_check_good 
  117.     db_del:$key_set(2) [eval {$db del} $txn {$key_set(2)}] 0
  118. # Now do next on cursor
  119. set r [$curs get -next]
  120. error_check_bad cursor_get:DB_NEXT [llength $r] 0
  121. set k [lindex [lindex $r 0] 0]
  122. set d [lindex [lindex $r 0] 1]
  123. error_check_good curs_get:DB_NEXT:key $k $key_set(3)
  124. error_check_good curs_get:DB_NEXT:data $d datum$key_set(3)
  125. # TEST CASE 3
  126. puts "tTest054.a3: Cursor on K, delete K, cursor current"
  127. # delete item 3
  128. error_check_good 
  129.     db_del:$key_set(3) [eval {$db del} $txn {$key_set(3)}] 0
  130. # NEEDS TO COME BACK IN, BUG CHECK
  131. set ret [$curs get -current]
  132. error_check_good current_after_del $ret [list [list [] []]]
  133. error_check_good cursor_close [$curs close] 0
  134. puts "tTest054.a4: Cursor on K, delete K, cursor next"
  135. # Restore keys 2 and 3
  136. set r [eval {$db put} $txn {$key_set(2) datum$key_set(2)}]
  137. error_check_good put $r 0
  138. set r [eval {$db put} $txn {$key_set(3) datum$key_set(3)}]
  139. error_check_good put $r 0
  140. # Create the new cursor and put it on 1
  141. set curs [eval {$db cursor} $txn]
  142. error_check_good curs_open:nodup [is_substr $curs $db] 1
  143. set r [$curs get -set $key_set(1)]
  144. error_check_bad cursor_get:DB_SET [llength $r] 0
  145. set k [lindex [lindex $r 0] 0]
  146. set d [lindex [lindex $r 0] 1]
  147. error_check_good curs_get:DB_SET:key $k $key_set(1)
  148. error_check_good curs_get:DB_SET:data $d datum$key_set(1)
  149. # Delete 2
  150. error_check_good 
  151.     db_del:$key_set(2) [eval {$db del} $txn {$key_set(2)}] 0
  152. # Now do next on cursor
  153. set r [$curs get -next]
  154. error_check_bad cursor_get:DB_NEXT [llength $r] 0
  155. set k [lindex [lindex $r 0] 0]
  156. set d [lindex [lindex $r 0] 1]
  157. error_check_good curs_get:DB_NEXT:key $k $key_set(3)
  158. error_check_good curs_get:DB_NEXT:data $d datum$key_set(3)
  159. # Close cursor
  160. error_check_good curs_close [$curs close] 0
  161. error_check_good db_close [$db close] 0
  162. # Now get ready for duplicate tests
  163. if { [is_rbtree $method] == 1 } {
  164. puts "Test054: skipping remainder of test for method $method."
  165. return
  166. }
  167. puts "tTest054.b: Duplicate Tests"
  168. append args " -dup"
  169. set db [eval {berkdb_open} $args {$omethod $testfile}]
  170. error_check_good db_open:dup [is_valid_db $db] TRUE
  171. set curs [eval {$db cursor} $txn]
  172. error_check_good curs_open:dup [is_substr $curs $db] 1
  173. # Put three keys in the database
  174. for { set key 1 } { $key <= 3 } {incr key} {
  175. set r [eval {$db put} $txn $flags {$key datum$key}]
  176. error_check_good put $r 0
  177. }
  178. # Retrieve keys sequentially so we can figure out their order
  179. set i 1
  180. for {set d [$curs get -first] } 
  181.     {[llength $d] != 0 } 
  182.  {set d [$curs get -nextdup] } {
  183. set key_set($i) [lindex [lindex $d 0] 0]
  184. incr i
  185. }
  186. # Now put in a bunch of duplicates for key 2
  187. for { set d 1 } { $d <= 5 } {incr d} {
  188. set r [eval {$db put} $txn $flags {$key_set(2) dup_$d}]
  189. error_check_good dup:put $r 0
  190. }
  191. # TEST CASE 5
  192. puts "tTest054.b1: Delete dup w/cursor on first item.  Get on key."
  193. # Now set the cursor on the first of the duplicate set.
  194. set r [eval {$curs get} -set {$key_set(2)}]
  195. error_check_bad cursor_get:DB_SET [llength $r] 0
  196. set k [lindex [lindex $r 0] 0]
  197. set d [lindex [lindex $r 0] 1]
  198. error_check_good curs_get:DB_SET:key $k $key_set(2)
  199. error_check_good curs_get:DB_SET:data $d datum$key_set(2)
  200. # Now do the delete
  201. set r [$curs del]
  202. error_check_good curs_del $r 0
  203. # Now do the get
  204. set r [eval {$db get} $txn {$key_set(2)}]
  205. error_check_good get_after_del [lindex [lindex $r 0] 1] dup_1
  206. # TEST CASE 6
  207. puts "tTest054.b2: Now get the next duplicate from the cursor."
  208. # Now do next on cursor
  209. set r [$curs get -nextdup]
  210. error_check_bad cursor_get:DB_NEXT [llength $r] 0
  211. set k [lindex [lindex $r 0] 0]
  212. set d [lindex [lindex $r 0] 1]
  213. error_check_good curs_get:DB_NEXT:key $k $key_set(2)
  214. error_check_good curs_get:DB_NEXT:data $d dup_1
  215. # TEST CASE 3
  216. puts "tTest054.b3: Two cursors in set; each delete different items"
  217. # Open a new cursor.
  218. set curs2 [eval {$db cursor} $txn]
  219. error_check_good curs_open [is_substr $curs2 $db] 1
  220. # Set on last of duplicate set.
  221. set r [$curs2 get -set $key_set(3)]
  222. error_check_bad cursor_get:DB_SET [llength $r] 0
  223. set k [lindex [lindex $r 0] 0]
  224. set d [lindex [lindex $r 0] 1]
  225. error_check_good curs_get:DB_SET:key $k $key_set(3)
  226. error_check_good curs_get:DB_SET:data $d datum$key_set(3)
  227. set r [$curs2 get -prev]
  228. error_check_bad cursor_get:DB_PREV [llength $r] 0
  229. set k [lindex [lindex $r 0] 0]
  230. set d [lindex [lindex $r 0] 1]
  231. error_check_good curs_get:DB_PREV:key $k $key_set(2)
  232. error_check_good curs_get:DB_PREV:data $d dup_5
  233. # Delete the item at cursor 1 (dup_1)
  234. error_check_good curs1_del [$curs del] 0
  235. # Verify curs1 and curs2
  236. # current should fail
  237. set ret [$curs get -current]
  238. error_check_good 
  239.     curs1_get_after_del $ret [list [list [] []]]
  240. set r [$curs2 get -current]
  241. error_check_bad curs2_get [llength $r] 0
  242. set k [lindex [lindex $r 0] 0]
  243. set d [lindex [lindex $r 0] 1]
  244. error_check_good curs_get:DB_CURRENT:key $k $key_set(2)
  245. error_check_good curs_get:DB_CURRENT:data $d dup_5
  246. # Now delete the item at cursor 2 (dup_5)
  247. error_check_good curs2_del [$curs2 del] 0
  248. # Verify curs1 and curs2
  249. set ret [$curs get -current]
  250. error_check_good curs1_get:del2 $ret [list [list [] []]]
  251. set ret [$curs2 get -current]
  252. error_check_good curs2_get:del2 $ret [list [list [] []]]
  253. # Now verify that next and prev work.
  254. set r [$curs2 get -prev]
  255. error_check_bad cursor_get:DB_PREV [llength $r] 0
  256. set k [lindex [lindex $r 0] 0]
  257. set d [lindex [lindex $r 0] 1]
  258. error_check_good curs_get:DB_PREV:key $k $key_set(2)
  259. error_check_good curs_get:DB_PREV:data $d dup_4
  260. set r [$curs get -next]
  261. error_check_bad cursor_get:DB_NEXT [llength $r] 0
  262. set k [lindex [lindex $r 0] 0]
  263. set d [lindex [lindex $r 0] 1]
  264. error_check_good curs_get:DB_NEXT:key $k $key_set(2)
  265. error_check_good curs_get:DB_NEXT:data $d dup_2
  266. puts "tTest054.b4: Two cursors same item, one delete, one get"
  267. # Move curs2 onto dup_2
  268. set r [$curs2 get -prev]
  269. error_check_bad cursor_get:DB_PREV [llength $r] 0
  270. set k [lindex [lindex $r 0] 0]
  271. set d [lindex [lindex $r 0] 1]
  272. error_check_good curs_get:DB_PREV:key $k $key_set(2)
  273. error_check_good curs_get:DB_PREV:data $d dup_3
  274. set r [$curs2 get -prev]
  275. error_check_bad cursor_get:DB_PREV [llength $r] 0
  276. set k [lindex [lindex $r 0] 0]
  277. set d [lindex [lindex $r 0] 1]
  278. error_check_good curs_get:DB_PREV:key $k $key_set(2)
  279. error_check_good curs_get:DB_PREV:data $d dup_2
  280. # delete on curs 1
  281. error_check_good curs1_del [$curs del] 0
  282. # Verify gets on both 1 and 2
  283. set ret [$curs get -current]
  284. error_check_good 
  285.     curs1_get:deleted $ret [list [list [] []]]
  286. set ret [$curs2 get -current]
  287. error_check_good 
  288.     curs2_get:deleted $ret [list [list [] []]]
  289. puts "tTest054.b5: Now do a next on both cursors"
  290. set r [$curs get -next]
  291. error_check_bad cursor_get:DB_NEXT [llength $r] 0
  292. set k [lindex [lindex $r 0] 0]
  293. set d [lindex [lindex $r 0] 1]
  294. error_check_good curs_get:DB_NEXT:key $k $key_set(2)
  295. error_check_good curs_get:DB_NEXT:data $d dup_3
  296. set r [$curs2 get -next]
  297. error_check_bad cursor_get:DB_NEXT [llength $r] 0
  298. set k [lindex [lindex $r 0] 0]
  299. set d [lindex [lindex $r 0] 1]
  300. error_check_good curs_get:DB_NEXT:key $k $key_set(2)
  301. error_check_good curs_get:DB_NEXT:data $d dup_3
  302. # Close cursor
  303. error_check_good curs_close [$curs close] 0
  304. error_check_good curs2_close [$curs2 close] 0
  305. error_check_good db_close [$db close] 0
  306. }