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

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: sdbutils.tcl,v 11.9 2000/05/22 12:51:38 bostic Exp $
  7. #
  8. proc build_all_subdb { dbname methods psize dups {nentries 100} {dbargs ""}} {
  9. set nsubdbs [llength $dups]
  10. set plen [llength $psize]
  11. set mlen [llength $methods]
  12. set savearg $dbargs
  13. for {set i 0} {$i < $nsubdbs} { incr i } {
  14. set m [lindex $methods [expr $i % $mlen]]
  15. set dbargs $savearg
  16. set p [lindex $psize [expr $i % $plen]]
  17. subdb_build $dbname $nentries [lindex $dups $i] 
  18.     $i $m $p sub$i.db $dbargs
  19. }
  20. }
  21. proc subdb_build { name nkeys ndups dup_interval method psize subdb dbargs} {
  22. source ./include.tcl
  23. set dbargs [convert_args $method $dbargs]
  24. set omethod [convert_method $method]
  25. puts "Method: $method"
  26. # Create the database and open the dictionary
  27. set oflags "-create -mode 0644 $omethod 
  28.     -pagesize $psize $dbargs $name $subdb"
  29. set db [eval {berkdb_open} $oflags]
  30. error_check_good dbopen [is_valid_db $db] TRUE
  31. set did [open $dict]
  32. set count 0
  33. if { $ndups >= 0 } {
  34. puts "tBuilding $method $name $subdb. 
  35. $nkeys keys with $ndups duplicates at interval of $dup_interval"
  36. }
  37. if { $ndups < 0 } {
  38. puts "tBuilding $method $name $subdb. 
  39.     $nkeys unique keys of pagesize $psize"
  40. #
  41. # If ndups is < 0, we want unique keys in each subdb,
  42. # so skip ahead in the dict by nkeys * iteration
  43. #
  44. for { set count 0 } 
  45.     { $count < [expr $nkeys * $dup_interval] } {
  46.     incr count} {
  47. set ret [gets $did str]
  48. if { $ret == -1 } {
  49. break
  50. }
  51. }
  52. }
  53. for { set count 0 } { [gets $did str] != -1 && $count < $nkeys } {
  54.     incr count} {
  55. for { set i 0 } { $i < $ndups } { incr i } {
  56. set data [format "%04d" [expr $i * $dup_interval]]
  57. set ret [$db put $str [chop_data $method $data]]
  58. error_check_good put $ret 0
  59. }
  60. if { $ndups == 0 } {
  61. set ret [$db put $str [chop_data $method NODUP]]
  62. error_check_good put $ret 0
  63. } elseif { $ndups < 0 } {
  64. if { [is_record_based $method] == 1 } {
  65. global kvals
  66. set num [expr $nkeys * $dup_interval]
  67. set num [expr $num + $count + 1]
  68. set ret [$db put $num [chop_data $method $str]]
  69. set kvals($num) [pad_data $method $str]
  70. error_check_good put $ret 0
  71. } else {
  72. set ret [$db put $str [chop_data $method $str]]
  73. error_check_good put $ret 0
  74. }
  75. }
  76. }
  77. close $did
  78. error_check_good close:$name [$db close] 0
  79. }
  80. proc do_join_subdb { db primary subdbs key } {
  81. source ./include.tcl
  82. puts "tJoining: $subdbs on $key"
  83. # Open all the databases
  84. set p [berkdb_open -unknown $db $primary]
  85. error_check_good "primary open" [is_valid_db $p] TRUE
  86. set dblist ""
  87. set curslist ""
  88. foreach i $subdbs {
  89. set jdb [berkdb_open -unknown $db sub$i.db]
  90. error_check_good "sub$i.db open" [is_valid_db $jdb] TRUE
  91. lappend jlist [list $jdb $key]
  92. lappend dblist $jdb
  93. }
  94. set join_res [eval {$p get_join} $jlist]
  95. set ndups [llength $join_res]
  96. # Calculate how many dups we expect.
  97. # We go through the list of indices.  If we find a 0, then we
  98. # expect 0 dups.  For everything else, we look at pairs of numbers,
  99. # if the are relatively prime, multiply them and figure out how
  100. # many times that goes into 50.  If they aren't relatively prime,
  101. # take the number of times the larger goes into 50.
  102. set expected 50
  103. set last 1
  104. foreach n $subdbs {
  105. if { $n == 0 } {
  106. set expected 0
  107. break
  108. }
  109. if { $last == $n } {
  110. continue
  111. }
  112. if { [expr $last % $n] == 0 || [expr $n % $last] == 0 } {
  113. if { $n > $last } {
  114. set last $n
  115. set expected [expr 50 / $last]
  116. }
  117. } else {
  118. set last [expr $n * $last / [gcd $n $last]]
  119. set expected [expr 50 / $last]
  120. }
  121. }
  122. error_check_good number_of_dups:$subdbs $ndups $expected
  123. #
  124. # If we get here, we have the number expected, now loop
  125. # through each and see if it is what we expected.
  126. #
  127. for { set i 0 } { $i < $ndups } { incr i } {
  128. set pair [lindex $join_res $i]
  129. set k [lindex $pair 0]
  130. foreach j $subdbs {
  131. error_check_bad valid_dup:$j:$subdbs $j 0
  132. set kval [string trimleft $k 0]
  133. if { [string length $kval] == 0 } {
  134. set kval 0
  135. }
  136. error_check_good 
  137.     valid_dup:$j:$subdbs [expr $kval % $j] 0
  138. }
  139. }
  140. error_check_good close_primary [$p close] 0
  141. foreach i $dblist {
  142. error_check_good close_index:$i [$i close] 0
  143. }
  144. }
  145. proc n_to_subname { n } {
  146. if { $n == 0 } {
  147. return null.db;
  148. } else {
  149. return sub$n.db;
  150. }
  151. }