test051.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: test051.tcl,v 11.14 2000/08/25 14:21:57 sue Exp $
  7. #
  8. # Test51:
  9. # Test of the fixed recno method.
  10. # 0. Test various flags (legal and illegal) to open
  11. # 1. Test partial puts where dlen != size (should fail)
  12. # 2. Partial puts for existent record -- replaces at beg, mid, and
  13. # end of record, as well as full replace
  14. #
  15. proc test051 { method { args "" } } {
  16. global fixed_len
  17. global errorInfo
  18. global errorCode
  19. source ./include.tcl
  20. set args [convert_args $method $args]
  21. set omethod [convert_method $method]
  22. puts "Test051: Test of the fixed length records."
  23. if { [is_fixed_length $method] != 1 } {
  24. puts "Test051: skipping for method $method"
  25. return
  26. }
  27. # Create the database and open the dictionary
  28. set eindex [lsearch -exact $args "-env"]
  29. #
  30. # If we are using an env, then testfile should just be the db name.
  31. # Otherwise it is the test directory and the name.
  32. if { $eindex == -1 } {
  33. set testfile $testdir/test051.db
  34. set testfile1 $testdir/test051a.db
  35. set env NULL
  36. } else {
  37. set testfile test051.db
  38. set testfile1 test051a.db
  39. incr eindex
  40. set env [lindex $args $eindex]
  41. }
  42. cleanup $testdir $env
  43. set oflags "-create -truncate -mode 0644 $args"
  44. # Test various flags (legal and illegal) to open
  45. puts "tTest051.a: Test correct flag behavior on open."
  46. set errorCode NONE
  47. foreach f { "-dup" "-dup -dupsort" "-recnum" } {
  48. puts "ttTest051.a: Test flag $f"
  49. error_check_good dbopen:flagtest:catch 
  50.     [catch {set db 
  51.     [eval {berkdb_open_noerr} $oflags $f $omethod 
  52.     $testfile]} ret] 1
  53. error_check_good 
  54.     dbopen:flagtest:$f [is_substr $errorCode EINVAL] 1
  55. set errorCode NONE
  56. }
  57. set f "-renumber"
  58. puts "ttTest051.a: Test $f"
  59. if { [is_frecno $method] == 1 } {
  60. set db [eval {berkdb_open} $oflags $f $omethod $testfile]
  61. error_check_good dbopen:flagtest:$f [is_valid_db $db] TRUE
  62. $db close
  63. } else {
  64. error_check_good 
  65.     dbopen:flagtest:catch [catch {set db [eval 
  66. {berkdb_open_noerr} $oflags $f 
  67. $omethod $testfile]} ret] 1
  68. error_check_good 
  69.     dbopen:flagtest:$f [is_substr $errorCode EINVAL] 1
  70. }
  71. # Test partial puts where dlen != size (should fail)
  72. # it is an error to specify a partial put w/ different
  73. # dlen and size in fixed length recno/queue
  74. set key 1
  75. set data ""
  76. set test_char "a"
  77. set db [eval {berkdb_open_noerr} $oflags $omethod $testfile1]
  78. error_check_good dbopen [is_valid_db $db] TRUE
  79. puts "tTest051.b: Partial puts with dlen != size."
  80. foreach dlen { 1 16 20 32 } {
  81. foreach doff { 0 10 20 32 } {
  82. # dlen < size
  83. puts "ttTest051.e: dlen: $dlen, doff: $doff, 
  84.     size: [expr $dlen+1]"
  85. set data [repeat $test_char [expr $dlen + 1]]
  86. error_check_good catch:put 1 [catch {$db 
  87.     put -partial [list $doff $dlen] $key $data} ret]
  88. #
  89. # We don't get back the server error string just
  90. # the result.
  91. #
  92. if { $eindex == -1 } {
  93. error_check_good "dbput:partial: dlen < size" 
  94.     [is_substr $errorInfo "Length improper"] 1
  95. } else {
  96. error_check_good "dbput:partial: dlen < size" 
  97.     [is_substr $errorCode "EINVAL"] 1
  98. }
  99. # dlen > size
  100. puts "ttTest051.e: dlen: $dlen, doff: $doff, 
  101.     size: [expr $dlen-1]"
  102. set data [repeat $test_char [expr $dlen - 1]]
  103. error_check_good catch:put 1 [catch {$db 
  104.     put -partial [list $doff $dlen] $key $data} ret]
  105. if { $eindex == -1 } {
  106. error_check_good "dbput:partial: dlen > size" 
  107.     [is_substr $errorInfo "Length improper"] 1
  108. } else {
  109. error_check_good "dbput:partial: dlen < size" 
  110.     [is_substr $errorCode "EINVAL"] 1
  111. }
  112. }
  113. }
  114. $db close
  115. # Partial puts for existent record -- replaces at beg, mid, and
  116. # end of record, as well as full replace
  117. puts "tTest051.f: Partial puts within existent record."
  118. set db [eval {berkdb_open} $oflags $omethod $testfile]
  119. error_check_good dbopen [is_valid_db $db] TRUE
  120. puts "ttTest051.f: First try a put and then a full replace."
  121. set data [repeat "a" $fixed_len]
  122. set ret [$db put 1 $data]
  123. error_check_good dbput $ret 0
  124. error_check_good dbget $data [lindex [lindex [$db get -recno 1] 0] 1]
  125. set data [repeat "b" $fixed_len]
  126. set ret [$db put -partial [list 0 $fixed_len] 1 $data]
  127. error_check_good dbput $ret 0
  128. error_check_good dbget $data [lindex [lindex [$db get -recno 1] 0] 1]
  129. set data "InitialData"
  130. set pdata "PUT"
  131. set dlen [string length $pdata]
  132. set ilen [string length $data]
  133. set mid [expr $ilen/2]
  134. # put initial data
  135. set key 0
  136. set offlist [list 0 $mid [expr $ilen -1] [expr $fixed_len - $dlen]]
  137. puts "ttTest051.g: Now replace at different offsets ($offlist)."
  138. foreach doff $offlist {
  139. incr key
  140. set ret [$db put $key $data]
  141. error_check_good dbput:init $ret 0
  142. puts "tt  Test051.g: Replace at offset $doff."
  143. set ret [$db put -partial [list $doff $dlen] $key $pdata]
  144. error_check_good dbput:partial $ret 0
  145. if { $doff == 0} {
  146. set beg ""
  147. set end [string range $data $dlen $ilen]
  148. } else {
  149. set beg [string range $data 0 [expr $doff - 1]]
  150. set end [string range $data [expr $doff + $dlen] $ilen]
  151. }
  152. if { $doff > $ilen } {
  153. # have to put padding between record and inserted
  154. # string
  155. set newdata [format %s%s $beg $end]
  156. set diff [expr $doff - $ilen]
  157. set nlen [string length $newdata]
  158. set newdata [binary 
  159.     format a[set nlen]x[set diff]a$dlen $newdata $pdata]
  160. } else {
  161. set newdata [make_fixed_length 
  162.     frecno [format %s%s%s $beg $pdata $end]]
  163. }
  164. set ret [$db get -recno $key]
  165. error_check_good compare($newdata,$ret) 
  166.     [binary_compare [lindex [lindex $ret 0] 1] $newdata] 0
  167. }
  168. $db close
  169. puts "tTest051 complete."
  170. }