test017.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: test017.tcl,v 11.13 2000/12/11 17:42:18 sue Exp $
  7. #
  8. # DB Test 17 {access method}
  9. # Run duplicates with small page size so that we test off page duplicates.
  10. # Then after we have an off-page database, test with overflow pages too.
  11. #
  12. proc test017 { method {contents 0} {ndups 19} {tnum 17} args } {
  13. source ./include.tcl
  14. set args [convert_args $method $args]
  15. set omethod [convert_method $method]
  16. if { [is_record_based $method] == 1 || 
  17.     [is_rbtree $method] == 1 } {
  18. puts "Test0$tnum skipping for method $method"
  19. return
  20. }
  21. set pgindex [lsearch -exact $args "-pagesize"]
  22. if { $pgindex != -1 } {
  23. incr pgindex
  24. if { [lindex $args $pgindex] > 8192 } {
  25. puts "Test0$tnum: Skipping for large pagesizes"
  26. return
  27. }
  28. }
  29. puts "Test0$tnum: $method ($args) Off page duplicate tests with $ndups duplicates"
  30. # Create the database and open the dictionary
  31. set eindex [lsearch -exact $args "-env"]
  32. #
  33. # If we are using an env, then testfile should just be the db name.
  34. # Otherwise it is the test directory and the name.
  35. if { $eindex == -1 } {
  36. set testfile $testdir/test0$tnum.db
  37. set env NULL
  38. } else {
  39. set testfile test0$tnum.db
  40. incr eindex
  41. set env [lindex $args $eindex]
  42. }
  43. set t1 $testdir/t1
  44. set t2 $testdir/t2
  45. set t3 $testdir/t3
  46. set t4 $testdir/t4
  47. cleanup $testdir $env
  48. set db [eval {berkdb_open 
  49.      -create -truncate -mode 0644 -dup} $args {$omethod $testfile}]
  50. error_check_good dbopen [is_valid_db $db] TRUE
  51. set pflags ""
  52. set gflags ""
  53. set txn ""
  54. set count 0
  55. set ovfl ""
  56. # Here is the loop where we put and get each key/data pair
  57. set dbc [eval {$db cursor} $txn]
  58. puts -nonewline 
  59.     "tTest0$tnum.a: Creating duplicates with "
  60. if { $contents != 0 } {
  61. puts "file contents as key/data"
  62. } else {
  63. puts "file name as key/data"
  64. }
  65. set file_list [glob ../*/*.c ./*.lo]
  66. foreach f $file_list {
  67. if { $contents != 0 } {
  68. set fid [open $f r]
  69. fconfigure $fid -translation binary
  70. #
  71. # Prepend file name to guarantee uniqueness
  72. set filecont [read $fid]
  73. set str $f:$filecont
  74. close $fid
  75. } else {
  76. set str $f
  77. }
  78. for { set i 1 } { $i <= $ndups } { incr i } {
  79. set datastr $i:$str
  80. set ret [eval {$db put} 
  81.     $txn $pflags {$str [chop_data $method $datastr]}]
  82. error_check_good put $ret 0
  83. }
  84. #
  85. # Save 10% files for overflow test
  86. #
  87. if { $contents == 0 && [expr $count % 10] == 0 } {
  88. lappend ovfl $f
  89. }
  90. # Now retrieve all the keys matching this key
  91. set ret [$db get $str]
  92. error_check_bad $f:dbget_dups [llength $ret] 0
  93. error_check_good $f:dbget_dups1 [llength $ret] $ndups
  94. set x 1
  95. for {set ret [$dbc get "-set" $str]} 
  96.     {[llength $ret] != 0} 
  97.     {set ret [$dbc get "-next"] } {
  98. set k [lindex [lindex $ret 0] 0]
  99. if { [string compare $k $str] != 0 } {
  100. break
  101. }
  102. set datastr [lindex [lindex $ret 0] 1]
  103. set d [data_of $datastr]
  104. if {[string length $d] == 0} {
  105. break
  106. }
  107. error_check_good "Test0$tnum:get" $d $str
  108. set id [ id_of $datastr ]
  109. error_check_good "Test0$tnum:$f:dup#" $id $x
  110. incr x
  111. }
  112. error_check_good "Test0$tnum:ndups:$str" [expr $x - 1] $ndups
  113. incr count
  114. }
  115. error_check_good cursor_close [$dbc close] 0
  116. # Now we will get each key from the DB and compare the results
  117. # to the original.
  118. puts "tTest0$tnum.b: Checking file for correct duplicates"
  119. set dlist ""
  120. for { set i 1 } { $i <= $ndups } {incr i} {
  121. lappend dlist $i
  122. }
  123. set oid [open $t2.tmp w]
  124. set o1id [open $t4.tmp w]
  125. foreach f $file_list {
  126. for {set i 1} {$i <= $ndups} {incr i} {
  127. puts $o1id $f
  128. }
  129. puts $oid $f
  130. }
  131. close $oid
  132. close $o1id
  133. filesort $t2.tmp $t2
  134. filesort $t4.tmp $t4
  135. fileremove $t2.tmp
  136. fileremove $t4.tmp
  137. dup_check $db $txn $t1 $dlist
  138. if {$contents == 0} {
  139. filesort $t1 $t3
  140. error_check_good Test0$tnum:diff($t3,$t2) 
  141.     [filecmp $t3 $t2] 0
  142. # Now compare the keys to see if they match the file names
  143. dump_file $db $txn $t1 test017.check
  144. filesort $t1 $t3
  145. error_check_good Test0$tnum:diff($t3,$t4) 
  146.     [filecmp $t3 $t4] 0
  147. }
  148. error_check_good db_close [$db close] 0
  149. set db [eval {berkdb_open} $args $testfile]
  150. error_check_good dbopen [is_valid_db $db] TRUE
  151. puts "tTest0$tnum.c: Checking file for correct duplicates after close"
  152. dup_check $db $txn $t1 $dlist
  153. if {$contents == 0} {
  154. # Now compare the keys to see if they match the filenames
  155. filesort $t1 $t3
  156. error_check_good Test0$tnum:diff($t3,$t2) 
  157.     [filecmp $t3 $t2] 0
  158. }
  159. error_check_good db_close [$db close] 0
  160. puts "tTest0$tnum.d: Verify off page duplicates and overflow status"
  161. set db [eval {berkdb_open} $args $testfile]
  162. error_check_good dbopen [is_valid_db $db] TRUE
  163. set stat [$db stat]
  164. if { [is_btree $method] } {
  165. error_check_bad stat:offpage 
  166.     [is_substr $stat "{{Internal pages} 0}"] 1
  167. }
  168. if {$contents == 0} {
  169. # This check doesn't work in hash, since overflow
  170. # pages count extra pages in buckets as well as true
  171. # P_OVERFLOW pages.
  172. if { [is_hash $method] == 0 } {
  173. error_check_good overflow 
  174.     [is_substr $stat "{{Overflow pages} 0}"] 1
  175. }
  176. } else {
  177. error_check_bad overflow 
  178.     [is_substr $stat "{{Overflow pages} 0}"] 1
  179. }
  180. #
  181. # If doing overflow test, do that now.  Else we are done.
  182. # Add overflow pages by adding a large entry to a duplicate.
  183. #
  184. if { [llength $ovfl] == 0} {
  185. error_check_good db_close [$db close] 0
  186. return
  187. }
  188. puts "tTest0$tnum.e: Add overflow duplicate entries"
  189. set ovfldup [expr $ndups + 1]
  190. foreach f $ovfl {
  191. #
  192. # This is just like put_file, but prepends the dup number
  193. #
  194. set fid [open $f r]
  195. fconfigure $fid -translation binary
  196. set fdata [read $fid]
  197. close $fid
  198. set data $ovfldup:$fdata
  199. set ret [eval {$db put} $txn $pflags {$f $data}]
  200. error_check_good ovfl_put $ret 0
  201. }
  202. puts "tTest0$tnum.f: Verify overflow duplicate entries"
  203. dup_check $db $txn $t1 $dlist $ovfldup
  204. filesort $t1 $t3
  205. error_check_good Test0$tnum:diff($t3,$t2) 
  206.     [filecmp $t3 $t2] 0
  207. set stat [$db stat]
  208. error_check_bad overflow1 
  209.     [is_substr $stat "{{Overflow pages} 0}"] 1
  210. error_check_good db_close [$db close] 0
  211. }
  212. # Check function; verify data contains key
  213. proc test017.check { key data } {
  214. error_check_good "data mismatch for key $key" $key [data_of $data]
  215. }