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

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: test074.tcl,v 11.10 2000/08/25 14:21:58 sue Exp $
  7. #
  8. # DB Test 74: Test of DB_NEXT_NODUP.
  9. proc test074 { method {dir -nextnodup} {pagesize 512} {nitems 100} {tnum 74} args } {
  10. source ./include.tcl
  11. global alphabet
  12. global rand_init
  13. set omethod [convert_method $method]
  14. set args [convert_args $method $args]
  15. berkdb srand $rand_init
  16. # Data prefix--big enough that we get a mix of on-page, off-page,
  17. # and multi-off-page dups with the default nitems
  18. if { [is_fixed_length $method] == 1 } {
  19. set globaldata "somedata"
  20. } else {
  21. set globaldata [repeat $alphabet 4]
  22. }
  23. puts "Test0$tnum $omethod ($args): Test of $dir"
  24. # First, test non-dup (and not-very-interesting) case with
  25. # all db types.
  26. puts "tTest0$tnum.a: No duplicates."
  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/test0$tnum-nodup.db
  33. set env NULL
  34. } else {
  35. set testfile test0$tnum-nodup.db
  36. incr eindex
  37. set env [lindex $args $eindex]
  38. }
  39. cleanup $testdir $env
  40. set db [eval {berkdb_open -create -truncate -mode 0644} $omethod
  41.     $args {$testfile}]
  42. error_check_good db_open [is_valid_db $db] TRUE
  43. # Insert nitems items.
  44. puts "ttTest0$tnum.a.1: Put loop."
  45. for {set i 1} {$i <= $nitems} {incr i} {
  46. #
  47. # If record based, set key to $i * 2 to leave
  48. # holes/unused entries for further testing.
  49. #
  50. if {[is_record_based $method] == 1} {
  51. set key [expr $i * 2]
  52. } else {
  53. set key "key$i"
  54. }
  55. set data "$globaldata$i"
  56. error_check_good put($i) [$db put $key
  57.     [chop_data $method $data]] 0
  58. }
  59. puts "ttTest0$tnum.a.2: Get($dir)"
  60. # foundarray($i) is set when key number i is found in the database
  61. set dbc [$db cursor]
  62. error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
  63. # Initialize foundarray($i) to zero for all $i
  64. for {set i 1} {$i < $nitems} {incr i} {
  65. set foundarray($i) 0
  66. }
  67. # Walk database using $dir and record each key gotten.
  68. for {set i 1} {$i <= $nitems} {incr i} {
  69. set dbt [$dbc get $dir]
  70. set key [lindex [lindex $dbt 0] 0]
  71. if {[is_record_based $method] == 1} {
  72. set num [expr $key / 2]
  73. set desired_key $key
  74. error_check_good $method:num $key [expr $num * 2]
  75. } else {
  76. set num [string range $key 3 end]
  77. set desired_key key$num
  78. }
  79. error_check_good dbt_correct($i) $dbt
  80.     [list [list $desired_key
  81.     [pad_data $method $globaldata$num]]]
  82. set foundarray($num) 1
  83. }
  84. puts "ttTest0$tnum.a.3: Final key."
  85. error_check_good last_db_get [$dbc get $dir] [list]
  86. puts "ttTest0$tnum.a.4: Verify loop."
  87. for { set i 1 } { $i <= $nitems } { incr i } {
  88. error_check_good found_key($i) $foundarray($i) 1
  89. }
  90. error_check_good dbc_close(nodup) [$dbc close] 0
  91. # If we are a method that doesn't allow dups, verify that
  92. # we get an empty list if we try to use DB_NEXT_DUP
  93. if { [is_record_based $method] == 1 || [is_rbtree $method] == 1 } {
  94. puts "ttTest0$tnum.a.5: Check DB_NEXT_DUP for $method."
  95. set dbc [$db cursor]
  96. error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
  97. set dbt [$dbc get $dir]
  98. error_check_good $method:nextdup [$dbc get -nextdup] [list]
  99. error_check_good dbc_close(nextdup) [$dbc close] 0
  100. }
  101. error_check_good db_close(nodup) [$db close] 0
  102. # Quit here if we're a method that won't allow dups.
  103. if { [is_record_based $method] == 1 || [is_rbtree $method] == 1 } {
  104. puts "tTest0$tnum: Skipping remainder for method $method."
  105. return
  106. }
  107. foreach opt { "-dup" "-dupsort" } {
  108. #
  109. # If we are using an env, then testfile should just be the
  110. # db name.  Otherwise it is the test directory and the name.
  111. if { $eindex == -1 } {
  112. set testfile $testdir/test0$tnum$opt.db
  113. } else {
  114. set testfile test0$tnum$opt.db
  115. }
  116. if { [string compare $opt "-dupsort"] == 0 } {
  117. set opt "-dup -dupsort"
  118. }
  119. puts "tTest0$tnum.b: Duplicates ($opt)."
  120. puts "ttTest0$tnum.b.1 ($opt): Put loop."
  121. set db [eval {berkdb_open -create -truncate -mode 0644}
  122.     $opt $omethod $args {$testfile}]
  123. error_check_good db_open [is_valid_db $db] TRUE
  124. # Insert nitems different keys such that key i has i dups.
  125. for {set i 1} {$i <= $nitems} {incr i} {
  126. set key key$i
  127. for {set j 1} {$j <= $i} {incr j} {
  128. if { $j < 10 } {
  129. set data "${globaldata}00$j"
  130. } elseif { $j < 100 } {
  131. set data "${globaldata}0$j"
  132. } else {
  133. set data "$globaldata$j"
  134. }
  135. error_check_good put($i,$j) 
  136.     [$db put $key $data] 0
  137. }
  138. }
  139. # Initialize foundarray($i) to 0 for all i.
  140. unset foundarray
  141. for { set i 1 } { $i <= $nitems } { incr i } {
  142. set foundarray($i) 0
  143. }
  144. # Get loop--after each get, move forward a random increment
  145. # within the duplicate set.
  146. puts "ttTest0$tnum.b.2 ($opt): Get loop."
  147. set one "001"
  148. set dbc [$db cursor]
  149. error_check_good dbc($opt) [is_valid_cursor $dbc $db] TRUE
  150. for { set i 1 } { $i <= $nitems } { incr i } {
  151. set dbt [$dbc get $dir]
  152. set key [lindex [lindex $dbt 0] 0]
  153. set num [string range $key 3 end]
  154. set desired_key key$num
  155. if { [string compare $dir "-prevnodup"] == 0 } {
  156. if { $num < 10 } {
  157. set one "00$num"
  158. } elseif { $num < 100 } {
  159. set one "0$num"
  160. } else {
  161. set one $num
  162. }
  163. }
  164. error_check_good dbt_correct($i) $dbt
  165. [list [list $desired_key
  166.     "$globaldata$one"]]
  167. set foundarray($num) 1
  168. # Go forward by some number w/i dup set.
  169. set inc [berkdb random_int 0 [expr $num - 1]]
  170. for { set j 0 } { $j < $inc } { incr j } {
  171. eval {$dbc get -nextdup}
  172. }
  173. }
  174. puts "ttTest0$tnum.b.3 ($opt): Final key."
  175. error_check_good last_db_get($opt) [$dbc get $dir] [list]
  176. # Verify
  177. puts "ttTest0$tnum.b.4 ($opt): Verify loop."
  178. for { set i 1 } { $i <= $nitems } { incr i } {
  179. error_check_good found_key($i) $foundarray($i) 1
  180. }
  181. error_check_good dbc_close [$dbc close] 0
  182. error_check_good db_close [$db close] 0
  183. }
  184. }