test028.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: test028.tcl,v 11.12 2000/08/25 14:21:55 sue Exp $
  7. #
  8. # Put after cursor delete test.
  9. proc test028 { method args } {
  10. global dupnum
  11. global dupstr
  12. global alphabet
  13. global errorInfo
  14. source ./include.tcl
  15. set args [convert_args $method $args]
  16. set omethod [convert_method $method]
  17. puts "Test028: $method put after cursor delete test"
  18. if { [is_rbtree $method] == 1 } {
  19. puts "Test028 skipping for method $method"
  20. return
  21. }
  22. if { [is_record_based $method] == 1 } {
  23. set key 10
  24. } else {
  25. append args " -dup"
  26. set key "put_after_cursor_del"
  27. }
  28. # Create the database and open the dictionary
  29. set eindex [lsearch -exact $args "-env"]
  30. #
  31. # If we are using an env, then testfile should just be the db name.
  32. # Otherwise it is the test directory and the name.
  33. if { $eindex == -1 } {
  34. set testfile $testdir/test028.db
  35. set env NULL
  36. } else {
  37. set testfile test028.db
  38. incr eindex
  39. set env [lindex $args $eindex]
  40. }
  41. set t1 $testdir/t1
  42. cleanup $testdir $env
  43. set db [eval {berkdb_open 
  44.      -create -truncate -mode 0644} $args {$omethod $testfile}]
  45. error_check_good dbopen [is_valid_db $db] TRUE
  46. set ndups 20
  47. set txn ""
  48. set pflags ""
  49. set gflags ""
  50. if { [is_record_based $method] == 1 } {
  51. set gflags " -recno"
  52. }
  53. set dbc [eval {$db cursor} $txn]
  54. error_check_good db_cursor [is_substr $dbc $db] 1
  55. foreach i { offpage onpage } {
  56. foreach b { bigitem smallitem } {
  57. if { $i == "onpage" } {
  58. if { $b == "bigitem" } {
  59. set dupstr [repeat $alphabet 100]
  60. } else {
  61. set dupstr DUP
  62. }
  63. } else {
  64. if { $b == "bigitem" } {
  65. set dupstr [repeat $alphabet 100]
  66. } else {
  67. set dupstr [repeat $alphabet 50]
  68. }
  69. }
  70. if { $b == "bigitem" } {
  71. set dupstr [repeat $dupstr 10]
  72. }
  73. puts "tTest028: $i/$b"
  74. puts "tTest028.a: Insert key with single data item"
  75. set ret [eval {$db put} 
  76.     $txn $pflags {$key [chop_data $method $dupstr]}]
  77. error_check_good db_put $ret 0
  78. # Now let's get the item and make sure its OK.
  79. puts "tTest028.b: Check initial entry"
  80. set ret [eval {$db get} $txn $gflags {$key}]
  81. error_check_good db_get 
  82.     $ret [list [list $key [pad_data $method $dupstr]]]
  83. # Now try a put with NOOVERWRITE SET (should be error)
  84. puts "tTest028.c: No_overwrite test"
  85. set ret [eval {$db put} $txn 
  86.     {-nooverwrite $key [chop_data $method $dupstr]}]
  87. error_check_good 
  88.     db_put [is_substr $ret "DB_KEYEXIST"] 1
  89. # Now delete the item with a cursor
  90. puts "tTest028.d: Delete test"
  91. set ret [$dbc get -set $key]
  92. error_check_bad dbc_get:SET [llength $ret] 0
  93. set ret [$dbc del]
  94. error_check_good dbc_del $ret 0
  95. puts "tTest028.e: Reput the item"
  96. set ret [eval {$db put} $txn 
  97.     {-nooverwrite $key [chop_data $method $dupstr]}]
  98. error_check_good db_put $ret 0
  99. puts "tTest028.f: Retrieve the item"
  100. set ret [eval {$db get} $txn $gflags {$key}]
  101. error_check_good db_get $ret 
  102.     [list [list $key [pad_data $method $dupstr]]]
  103. # Delete the key to set up for next test
  104. set ret [eval {$db del} $txn {$key}]
  105. error_check_good db_del $ret 0
  106. # Now repeat the above set of tests with
  107. # duplicates (if not RECNO).
  108. if { [is_record_based $method] == 1 } {
  109. continue;
  110. }
  111. puts "tTest028.g: Insert key with duplicates"
  112. for { set count 0 } { $count < $ndups } { incr count } {
  113. set ret [eval {$db put} 
  114.     $txn {$key [chop_data $method $count$dupstr]}]
  115. error_check_good db_put $ret 0
  116. }
  117. puts "tTest028.h: Check dups"
  118. set dupnum 0
  119. dump_file $db $txn $t1 test028.check
  120. # Try no_overwrite
  121. puts "tTest028.i: No_overwrite test"
  122. set ret [eval {$db put} 
  123.     $txn {-nooverwrite $key $dupstr}]
  124. error_check_good 
  125.     db_put [is_substr $ret "DB_KEYEXIST"] 1
  126. # Now delete all the elements with a cursor
  127. puts "tTest028.j: Cursor Deletes"
  128. set count 0
  129. for { set ret [$dbc get -set $key] } {
  130.     [string length $ret] != 0 } {
  131.     set ret [$dbc get -next] } {
  132. set k [lindex [lindex $ret 0] 0]
  133. set d [lindex [lindex $ret 0] 1]
  134. error_check_good db_seq(key) $k $key
  135. error_check_good db_seq(data) $d $count$dupstr
  136. set ret [$dbc del]
  137. error_check_good dbc_del $ret 0
  138. incr count
  139. if { $count == [expr $ndups - 1] } {
  140. puts "tTest028.k:
  141. Duplicate No_Overwrite test"
  142. set $errorInfo ""
  143. set ret [eval {$db put} $txn 
  144.     {-nooverwrite $key $dupstr}]
  145. error_check_good db_put [is_substr 
  146.     $ret "DB_KEYEXIST"] 1
  147. }
  148. }
  149. # Make sure all the items are gone
  150. puts "tTest028.l: Get after delete"
  151. set ret [$dbc get -set $key]
  152. error_check_good get_after_del [string length $ret] 0
  153. puts "tTest028.m: Reput the item"
  154. set ret [eval {$db put} 
  155.     $txn {-nooverwrite $key 0$dupstr}]
  156. error_check_good db_put $ret 0
  157. for { set count 1 } { $count < $ndups } { incr count } {
  158. set ret [eval {$db put} $txn {$key $count$dupstr}]
  159. error_check_good db_put $ret 0
  160. }
  161. puts "tTest028.n: Retrieve the item"
  162. set dupnum 0
  163. dump_file $db $txn $t1 test028.check
  164. # Clean out in prep for next test
  165. set ret [eval {$db del} $txn {$key}]
  166. error_check_good db_del $ret 0
  167. }
  168. }
  169. error_check_good dbc_close [$dbc close] 0
  170. error_check_good db_close [$db close] 0
  171. }
  172. # Check function for test028; keys and data are identical
  173. proc test028.check { key data } {
  174. global dupnum
  175. global dupstr
  176. error_check_good "Bad key" $key put_after_cursor_del
  177. error_check_good "data mismatch for $key" $data $dupnum$dupstr
  178. incr dupnum
  179. }