test053.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: test053.tcl,v 11.12 2000/12/11 17:24:55 sue Exp $
  7. #
  8. # Test53: test of the DB_REVSPLITOFF flag in the btree and
  9. # Btree-w-recnum methods
  10. proc test053 { method args } {
  11. global alphabet
  12. global errorCode
  13. source ./include.tcl
  14. set args [convert_args $method $args]
  15. set omethod [convert_method $method]
  16. puts "tTest053: Test of cursor stability across btree splits."
  17. if { [is_btree $method] != 1 && [is_rbtree $method] != 1 } {
  18. puts "Test053: skipping for method $method."
  19. return
  20. }
  21. set pgindex [lsearch -exact $args "-pagesize"]
  22. if { $pgindex != -1 } {
  23. puts "Test053: skipping for specific pagesizes"
  24. return
  25. }
  26. set txn ""
  27. set flags ""
  28. puts "tTest053.a: Create $omethod $args database."
  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/test053.db
  35. set env NULL
  36. } else {
  37. set testfile test053.db
  38. incr eindex
  39. set env [lindex $args $eindex]
  40. }
  41. set t1 $testdir/t1
  42. cleanup $testdir $env
  43. set oflags 
  44.     "-create -truncate -revsplitoff -pagesize 1024 $args $omethod"
  45. set db [eval {berkdb_open} $oflags $testfile]
  46. error_check_good dbopen [is_valid_db $db] TRUE
  47. set nkeys 8
  48. set npages 15
  49. # We want to create a db with npages leaf pages, and have each page
  50. # be near full with keys that we can predict. We set pagesize above
  51. # to 1024 bytes, it should breakdown as follows (per page):
  52. #
  53. # ~20 bytes overhead
  54. # key: ~4 bytes overhead, XXX0N where X is a letter, N is 0-9
  55. # data: ~4 bytes overhead, + 100 bytes
  56. #
  57. # then, with 8 keys/page we should be just under 1024 bytes
  58. puts "tTest053.b: Create $npages pages with $nkeys pairs on each."
  59. set keystring [string range $alphabet 0 [expr $npages -1]]
  60. set data [repeat DATA 22]
  61. for { set i 0 } { $i < $npages } {incr i } {
  62. set key ""
  63. set keyroot 
  64.     [repeat [string toupper [string range $keystring $i $i]] 3]
  65. set key_set($i) $keyroot
  66. for {set j 0} { $j < $nkeys} {incr j} {
  67. if { $j < 10 } {
  68. set key [set keyroot]0$j
  69. } else {
  70. set key $keyroot$j
  71. }
  72. set ret [$db put $key $data]
  73. error_check_good dbput $ret 0
  74. }
  75. }
  76. puts "tTest053.c: Check page count."
  77. error_check_good page_count:check 
  78.     [is_substr [$db stat] "{Leaf pages} $npages"] 1
  79. puts "tTest053.d: Delete all but one key per page."
  80. for {set i 0} { $i < $npages } {incr i } {
  81. for {set j 1} { $j < $nkeys } {incr j } {
  82. set ret [$db del $key_set($i)0$j]
  83. error_check_good dbdel $ret 0
  84. }
  85. }
  86. puts "tTest053.e: Check to make sure all pages are still there."
  87. error_check_good page_count:check 
  88.     [is_substr [$db stat] "{Leaf pages} $npages"] 1
  89. set dbc [$db cursor]
  90. error_check_good db:cursor [is_substr $dbc $db] 1
  91. # walk cursor through tree forward, backward.
  92. # delete one key, repeat
  93. for {set i 0} { $i < $npages} {incr i} {
  94. puts -nonewline 
  95.     "tTest053.f.$i: Walk curs through tree: forward..."
  96. for { set j $i; set curr [$dbc get -first]} { $j < $npages} { 
  97.     incr j; set curr [$dbc get -next]} {
  98. error_check_bad dbc:get:next [llength $curr] 0
  99. error_check_good dbc:get:keys 
  100.     [lindex [lindex $curr 0] 0] $key_set($j)00
  101. }
  102. puts -nonewline "backward..."
  103. for { set j [expr $npages - 1]; set curr [$dbc get -last]} { 
  104.     $j >= $i } { 
  105.     set j [incr j -1]; set curr [$dbc get -prev]} {
  106. error_check_bad dbc:get:prev [llength $curr] 0
  107. error_check_good dbc:get:keys 
  108.     [lindex [lindex $curr 0] 0] $key_set($j)00
  109. }
  110. puts "complete."
  111. if { [is_rbtree $method] == 1} {
  112. puts "ttTest053.f.$i:
  113.     Walk through tree with record numbers."
  114. for {set j 1} {$j <= [expr $npages - $i]} {incr j} {
  115. set curr [$db get -recno $j]
  116. error_check_bad 
  117.     db_get:recno:$j [llength $curr] 0
  118. error_check_good db_get:recno:keys:$j 
  119.     [lindex [lindex $curr 0] 0] 
  120.     $key_set([expr $j + $i - 1])00
  121. }
  122. }
  123. puts "tTest053.g.$i:
  124.     Delete single key ([expr $npages - $i] keys left)."
  125. set ret [$db del $key_set($i)00]
  126. error_check_good dbdel $ret 0
  127. error_check_good del:check 
  128.     [llength [$db get $key_set($i)00]] 0
  129. }
  130. # end for loop, verify db_notfound
  131. set ret [$dbc get -first]
  132. error_check_good dbc:get:verify [llength $ret] 0
  133. # loop: until single key restored on each page
  134. for {set i 0} { $i < $npages} {incr i} {
  135. puts "tTest053.i.$i:
  136.     Restore single key ([expr $i + 1] keys in tree)."
  137. set ret [$db put $key_set($i)00 $data]
  138. error_check_good dbput $ret 0
  139. puts -nonewline 
  140.     "tTest053.j: Walk cursor through tree: forward..."
  141. for { set j 0; set curr [$dbc get -first]} { $j <= $i} {
  142.   incr j; set curr [$dbc get -next]} {
  143. error_check_bad dbc:get:next [llength $curr] 0
  144. error_check_good dbc:get:keys 
  145.     [lindex [lindex $curr 0] 0] $key_set($j)00
  146. }
  147. error_check_good dbc:get:next [llength $curr] 0
  148. puts -nonewline "backward..."
  149. for { set j $i; set curr [$dbc get -last]} { 
  150.     $j >= 0 } { 
  151.     set j [incr j -1]; set curr [$dbc get -prev]} {
  152. error_check_bad dbc:get:prev [llength $curr] 0
  153. error_check_good dbc:get:keys 
  154.     [lindex [lindex $curr 0] 0] $key_set($j)00
  155. }
  156. puts "complete."
  157. error_check_good dbc:get:prev [llength $curr] 0
  158. if { [is_rbtree $method] == 1} {
  159. puts "ttTest053.k.$i:
  160.     Walk through tree with record numbers."
  161. for {set j 1} {$j <= [expr $i + 1]} {incr j} {
  162. set curr [$db get -recno $j]
  163. error_check_bad 
  164.     db_get:recno:$j [llength $curr] 0
  165. error_check_good db_get:recno:keys:$j 
  166.     [lindex [lindex $curr 0] 0] 
  167.     $key_set([expr $j - 1])00
  168. }
  169. }
  170. }
  171. error_check_good dbc_close [$dbc close] 0
  172. error_check_good db_close [$db close] 0
  173. puts "Test053 complete."
  174. }