test014.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: test014.tcl,v 11.19 2000/08/25 14:21:54 sue Exp $
  7. #
  8. # DB Test 14 {access method}
  9. #
  10. # Partial put test, small data, replacing with same size.  The data set
  11. # consists of the first nentries of the dictionary.  We will insert them
  12. # (and retrieve them) as we do in test 1 (equal key/data pairs).  Then
  13. # we'll try to perform partial puts of some characters at the beginning,
  14. # some at the end, and some at the middle.
  15. proc test014 { method {nentries 10000} args } {
  16. set fixed 0
  17. set args [convert_args $method $args]
  18. if { [is_fixed_length $method] == 1 } {
  19. set fixed 1
  20. }
  21. puts "Test014: $method ($args) $nentries equal key/data pairs, put test"
  22. # flagp indicates whether this is a postpend or a
  23. # normal partial put
  24. set flagp 0
  25. eval {test014_body $method $flagp 1 1 $nentries} $args
  26. eval {test014_body $method $flagp 1 4 $nentries} $args
  27. eval {test014_body $method $flagp 2 4 $nentries} $args
  28. eval {test014_body $method $flagp 1 128 $nentries} $args
  29. eval {test014_body $method $flagp 2 16 $nentries} $args
  30. if { $fixed == 0 } {
  31. eval {test014_body $method $flagp 0 1 $nentries} $args
  32. eval {test014_body $method $flagp 0 4 $nentries} $args
  33. eval {test014_body $method $flagp 0 128 $nentries} $args
  34. # POST-PENDS :
  35. # partial put data after the end of the existent record
  36. # chars: number of empty spaces that will be padded with null
  37. # increase: is the length of the str to be appended (after pad)
  38. #
  39. set flagp 1
  40. eval {test014_body $method $flagp 1 1 $nentries} $args
  41. eval {test014_body $method $flagp 4 1 $nentries} $args
  42. eval {test014_body $method $flagp 128 1 $nentries} $args
  43. eval {test014_body $method $flagp 1 4 $nentries} $args
  44. eval {test014_body $method $flagp 1 128 $nentries} $args
  45. }
  46. puts "Test014 complete."
  47. }
  48. proc test014_body { method flagp chars increase {nentries 10000} args } {
  49. source ./include.tcl
  50. set omethod [convert_method $method]
  51. if { [is_fixed_length $method] == 1 && $chars != $increase } {
  52. puts "Test014: $method: skipping replace
  53.     $chars chars with string $increase times larger."
  54. return
  55. }
  56. if { $flagp == 1} {
  57. puts "Test014: Postpending string of len $increase with 
  58.     gap $chars."
  59. } else {
  60. puts "Test014: Replace $chars chars with string 
  61.     $increase times larger"
  62. }
  63. # Create the database and open the dictionary
  64. set eindex [lsearch -exact $args "-env"]
  65. #
  66. # If we are using an env, then testfile should just be the db name.
  67. # Otherwise it is the test directory and the name.
  68. if { $eindex == -1 } {
  69. set testfile $testdir/test014.db
  70. set env NULL
  71. } else {
  72. set testfile test014.db
  73. incr eindex
  74. set env [lindex $args $eindex]
  75. }
  76. set t1 $testdir/t1
  77. set t2 $testdir/t2
  78. set t3 $testdir/t3
  79. cleanup $testdir $env
  80. set db [eval {berkdb_open 
  81.      -create -truncate -mode 0644} $args {$omethod $testfile}]
  82. error_check_good dbopen [is_valid_db $db] TRUE
  83. set gflags ""
  84. set pflags ""
  85. set txn ""
  86. set count 0
  87. if { [is_record_based $method] == 1 } {
  88. append gflags " -recno"
  89. }
  90. puts "tTest014.a: put/get loop"
  91. # Here is the loop where we put and get each key/data pair
  92. # We will do the initial put and then three Partial Puts
  93. # for the beginning, middle and end of the string.
  94. set did [open $dict]
  95. while { [gets $did str] != -1 && $count < $nentries } {
  96. if { [is_record_based $method] == 1 } {
  97. set key [expr $count + 1]
  98. } else {
  99. set key $str
  100. }
  101. if { $flagp == 1 } {
  102. # this is for postpend only
  103. global dvals
  104. # initial put
  105. set ret [$db put $key $str]
  106. error_check_good dbput $ret 0
  107. set offset [string length $str]
  108. # increase is the actual number of new bytes
  109. # to be postpended (besides the null padding)
  110. set data [repeat "P" $increase]
  111. # chars is the amount of padding in between
  112. # the old data and the new
  113. set len [expr $offset + $chars + $increase]
  114. set dvals($key) [binary format 
  115.     a[set offset]x[set chars]a[set increase] 
  116.     $str $data]
  117. set offset [expr $offset + $chars]
  118. set ret [$db put -partial [list $offset 0] $key $data]
  119. error_check_good dbput:post $ret 0
  120. } else {
  121. partial_put $method $db $txn 
  122.     $gflags $key $str $chars $increase
  123. }
  124. incr count
  125. }
  126. close $did
  127. # Now make sure that everything looks OK
  128. puts "tTest014.b: check entire file contents"
  129. dump_file $db $txn $t1 test014.check
  130. error_check_good db_close [$db close] 0
  131. # Now compare the keys to see if they match the dictionary (or ints)
  132. if { [is_record_based $method] == 1 } {
  133. set oid [open $t2 w]
  134. for {set i 1} {$i <= $nentries} {set i [incr i]} {
  135. puts $oid $i
  136. }
  137. close $oid
  138. file rename -force $t1 $t3
  139. } else {
  140. set q q
  141. filehead $nentries $dict $t3
  142. filesort $t3 $t2
  143. filesort $t1 $t3
  144. }
  145. error_check_good 
  146.     Test014:diff($t3,$t2) [filecmp $t3 $t2] 0
  147. puts "tTest014.c: close, open, and dump file"
  148. # Now, reopen the file and run the last test again.
  149. open_and_dump_file $testfile $env $txn 
  150.     $t1 test014.check dump_file_direction "-first" "-next"
  151. if { [string compare $omethod "-recno"] != 0 } {
  152. filesort $t2 $t3
  153. file rename -force $t3 $t2
  154. filesort $t1 $t3
  155. }
  156. error_check_good 
  157.     Test014:diff($t3,$t2) [filecmp $t3 $t2] 0
  158. # Now, reopen the file and run the last test again in the
  159. # reverse direction.
  160. puts "tTest014.d: close, open, and dump file in reverse direction"
  161. open_and_dump_file $testfile $env $txn $t1 
  162.     test014.check dump_file_direction "-last" "-prev"
  163. if { [string compare $omethod "-recno"] != 0 } {
  164. filesort $t2 $t3
  165. file rename -force $t3 $t2
  166. filesort $t1 $t3
  167. }
  168. error_check_good 
  169.     Test014:diff($t3,$t2) [filecmp $t3 $t2] 0
  170. }
  171. # Check function for test014; keys and data are identical
  172. proc test014.check { key data } {
  173. global dvals
  174. error_check_good key"$key"_exists [info exists dvals($key)] 1
  175. error_check_good "data mismatch for key $key" $data $dvals($key)
  176. }