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

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: test023.tcl,v 11.13 2000/08/25 14:21:55 sue Exp $
  7. #
  8. # Duplicate delete test.
  9. # Add a key with duplicates (first time on-page, second time off-page)
  10. # Number the dups.
  11. # Delete dups and make sure that CURRENT/NEXT/PREV work correctly.
  12. proc test023 { method args } {
  13. global alphabet
  14. global dupnum
  15. global dupstr
  16. global errorInfo
  17. source ./include.tcl
  18. set args [convert_args $method $args]
  19. set omethod [convert_method $method]
  20. puts "Test023: $method delete duplicates/check cursor operations"
  21. if { [is_record_based $method] == 1 || 
  22.     [is_rbtree $method] == 1 } {
  23. puts "Test023: skipping for method $omethod"
  24. return
  25. }
  26. # Create the database and open the dictionary
  27. set eindex [lsearch -exact $args "-env"]
  28. #
  29. # If we are using an env, then testfile should just be the db name.
  30. # Otherwise it is the test directory and the name.
  31. if { $eindex == -1 } {
  32. set testfile $testdir/test023.db
  33. set env NULL
  34. } else {
  35. set testfile test023.db
  36. incr eindex
  37. set env [lindex $args $eindex]
  38. }
  39. set t1 $testdir/t1
  40. cleanup $testdir $env
  41. set db [eval {berkdb_open 
  42.     -create -truncate -mode 0644 -dup} $args {$omethod $testfile}]
  43. error_check_good dbopen [is_valid_db $db] TRUE
  44. set pflags ""
  45. set gflags ""
  46. set txn ""
  47. set dbc [eval {$db cursor} $txn]
  48. error_check_good db_cursor [is_substr $dbc $db] 1
  49. foreach i { onpage offpage } {
  50. if { $i == "onpage" } {
  51. set dupstr DUP
  52. } else {
  53. set dupstr [repeat $alphabet 50]
  54. }
  55. puts "tTest023.a: Insert key w/$i dups"
  56. set key "duplicate_val_test"
  57. for { set count 0 } { $count < 20 } { incr count } {
  58. set ret 
  59.     [eval {$db put} $txn $pflags {$key $count$dupstr}]
  60. error_check_good db_put $ret 0
  61. }
  62. # Now let's get all the items and make sure they look OK.
  63. puts "tTest023.b: Check initial duplicates"
  64. set dupnum 0
  65. dump_file $db $txn $t1 test023.check
  66. # Delete a couple of random items (FIRST, LAST one in middle)
  67. # Make sure that current returns an error and that NEXT and
  68. # PREV do the right things.
  69. set ret [$dbc get -set $key]
  70. error_check_bad dbc_get:SET [llength $ret] 0
  71. puts "tTest023.c: Delete first and try gets"
  72. # This should be the first duplicate
  73. error_check_good 
  74.     dbc_get:SET $ret [list [list duplicate_val_test 0$dupstr]]
  75. # Now delete it.
  76. set ret [$dbc del]
  77. error_check_good dbc_del:FIRST $ret 0
  78. # Now current should fail
  79. set ret [$dbc get -current]
  80. error_check_good dbc_get:CURRENT $ret [list [list [] []]]
  81. # Now Prev should fail
  82. set ret [$dbc get -prev]
  83. error_check_good dbc_get:prev0 [llength $ret] 0
  84. # Now 10 nexts should work to get us in the middle
  85. for { set j 1 } { $j <= 10 } { incr j } {
  86. set ret [$dbc get -next]
  87. error_check_good 
  88.     dbc_get:next [llength [lindex $ret 0]] 2
  89. error_check_good 
  90.     dbc_get:next [lindex [lindex $ret 0] 1] $j$dupstr
  91. }
  92. puts "tTest023.d: Delete middle and try gets"
  93. # Now do the delete on the current key.
  94. set ret [$dbc del]
  95. error_check_good dbc_del:10 $ret 0
  96. # Now current should fail
  97. set ret [$dbc get -current]
  98. error_check_good 
  99.     dbc_get:deleted $ret [list [list [] []]]
  100. # Prev and Next should work
  101. set ret [$dbc get -next]
  102. error_check_good dbc_get:next [llength [lindex $ret 0]] 2
  103. error_check_good 
  104.     dbc_get:next [lindex [lindex $ret 0] 1] 11$dupstr
  105. set ret [$dbc get -prev]
  106. error_check_good dbc_get:next [llength [lindex $ret 0]] 2
  107. error_check_good 
  108.     dbc_get:next [lindex [lindex $ret 0] 1] 9$dupstr
  109. # Now go to the last one
  110. for { set j 11 } { $j <= 19 } { incr j } {
  111. set ret [$dbc get -next]
  112. error_check_good 
  113.     dbc_get:next [llength [lindex $ret 0]] 2
  114. error_check_good 
  115.     dbc_get:next [lindex [lindex $ret 0] 1] $j$dupstr
  116. }
  117. puts "tTest023.e: Delete last and try gets"
  118. # Now do the delete on the current key.
  119. set ret [$dbc del]
  120. error_check_good dbc_del:LAST $ret 0
  121. # Now current should fail
  122. set ret [$dbc get -current]
  123. error_check_good 
  124.     dbc_get:deleted $ret [list [list [] []]]
  125. # Next should fail
  126. set ret [$dbc get -next]
  127. error_check_good dbc_get:next19 [llength $ret] 0
  128. # Prev should work
  129. set ret [$dbc get -prev]
  130. error_check_good dbc_get:next [llength [lindex $ret 0]] 2
  131. error_check_good 
  132.     dbc_get:next [lindex [lindex $ret 0] 1] 18$dupstr
  133. # Now overwrite the current one, then count the number
  134. # of data items to make sure that we have the right number.
  135. puts "tTest023.f: Count keys, overwrite current, count again"
  136. # At this point we should have 17 keys the (initial 20 minus
  137. # 3 deletes)
  138. set dbc2 [$db cursor]
  139. error_check_good db_cursor:2 [is_substr $dbc2 $db] 1
  140. set count_check 0
  141. for { set rec [$dbc2 get -first] } {
  142.     [llength $rec] != 0 } { set rec [$dbc2 get -next] } {
  143. incr count_check
  144. }
  145. error_check_good numdups $count_check 17
  146. set ret [$dbc put -current OVERWRITE]
  147. error_check_good dbc_put:current $ret 0
  148. set count_check 0
  149. for { set rec [$dbc2 get -first] } {
  150.     [llength $rec] != 0 } { set rec [$dbc2 get -next] } {
  151. incr count_check
  152. }
  153. error_check_good numdups $count_check 17
  154. # Done, delete all the keys for next iteration
  155. set ret [eval {$db del} $txn {$key}]
  156. error_check_good db_delete $ret 0
  157. # database should be empty
  158. set ret [$dbc get -first]
  159. error_check_good first_after_empty [llength $ret] 0
  160. }
  161. error_check_good dbc_close [$dbc close] 0
  162. error_check_good db_close [$db close] 0
  163. }
  164. # Check function for test023; keys and data are identical
  165. proc test023.check { key data } {
  166. global dupnum
  167. global dupstr
  168. error_check_good "bad key" $key duplicate_val_test
  169. error_check_good "data mismatch for $key" $data $dupnum$dupstr
  170. incr dupnum
  171. }