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

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: sdb004.tcl,v 11.14 2000/08/25 14:21:53 sue Exp $
  7. #
  8. # SubDB Test 4 {access method}
  9. # Create 1 db with many large subdbs.  Use the contents as subdb names.
  10. # Take the source files and dbtest executable and enter their names as the
  11. # key with their contents as data.  After all are entered, retrieve all;
  12. # compare output to original. Close file, reopen, do retrieve and re-verify.
  13. proc subdb004 { method args} {
  14. global names
  15. source ./include.tcl
  16. set args [convert_args $method $args]
  17. set omethod [convert_method $method]
  18. if { [is_queue $method] == 1 || [is_fixed_length $method] == 1 } {
  19. puts "Subdb004: skipping for method $method"
  20. return
  21. }
  22. puts "Subdb004: $method ($args) 
  23.     filecontents=subdbname filename=key filecontents=data pairs"
  24. # Create the database and open the dictionary
  25. set testfile $testdir/subdb004.db
  26. set t1 $testdir/t1
  27. set t2 $testdir/t2
  28. set t3 $testdir/t3
  29. set t4 $testdir/t4
  30. cleanup $testdir NULL
  31. set pflags ""
  32. set gflags ""
  33. set txn ""
  34. if { [is_record_based $method] == 1 } {
  35. set checkfunc subdb004_recno.check
  36. append gflags "-recno"
  37. } else {
  38. set checkfunc subdb004.check
  39. }
  40. # Here is the loop where we put and get each key/data pair
  41. set file_list [glob ../*/*.c ./libdb.so.3.0 ./libtool ./libtool.exe]
  42. set fcount [llength $file_list]
  43. set count 0
  44. if { [is_record_based $method] == 1 } {
  45. set oid [open $t2 w]
  46. for {set i 1} {$i <= $fcount} {set i [incr i]} {
  47. puts $oid $i
  48. }
  49. close $oid
  50. } else {
  51. set oid [open $t2.tmp w]
  52. foreach f $file_list {
  53. puts $oid $f
  54. }
  55. close $oid
  56. filesort $t2.tmp $t2
  57. }
  58. puts "tSubdb004.a: Set/Check each subdb"
  59. foreach f $file_list {
  60. if { [is_record_based $method] == 1 } {
  61. set key [expr $count + 1]
  62. set names([expr $count + 1]) $f
  63. } else {
  64. set key $f
  65. }
  66. # Should really catch errors
  67. set fid [open $f r]
  68. fconfigure $fid -translation binary
  69. set data [read $fid]
  70. set subdb $data
  71. close $fid
  72. set db [eval {berkdb_open -create -mode 0644} 
  73.     $args {$omethod $testfile $subdb}]
  74. error_check_good dbopen [is_valid_db $db] TRUE
  75. set ret [eval 
  76.     {$db put} $txn $pflags {$key [chop_data $method $data]}]
  77. error_check_good put $ret 0
  78. # Should really catch errors
  79. set fid [open $t4 w]
  80. fconfigure $fid -translation binary
  81. if [catch {eval {$db get} $gflags {$key}} data] {
  82. puts -nonewline $fid $data
  83. } else {
  84. # Data looks like {{key data}}
  85. set key [lindex [lindex $data 0] 0]
  86. set data [lindex [lindex $data 0] 1]
  87. puts -nonewline $fid $data
  88. }
  89. close $fid
  90. error_check_good Subdb004:diff($f,$t4) 
  91.     [filecmp $f $t4] 0
  92. incr count
  93. # Now we will get each key from the DB and compare the results
  94. # to the original.
  95. # puts "tSubdb004.b: dump file"
  96. dump_bin_file $db $txn $t1 $checkfunc
  97. error_check_good db_close [$db close] 0
  98. }
  99. #
  100. # Now for each file, check that the subdb name is the same
  101. # as the data in that subdb and that the filename is the key.
  102. #
  103. puts "tSubdb004.b: Compare subdb names with key/data"
  104. set db [berkdb_open -rdonly $testfile]
  105. error_check_good dbopen [is_valid_db $db] TRUE
  106. set c [eval {$db cursor} $txn]
  107. error_check_good db_cursor [is_valid_cursor $c $db] TRUE
  108. for {set d [$c get -first] } { [llength $d] != 0 } 
  109.     {set d [$c get -next] } {
  110. set subdbname [lindex [lindex $d 0] 0]
  111. set subdb [berkdb_open $testfile $subdbname]
  112. error_check_good dbopen [is_valid_db $db] TRUE
  113. # Output the subdb name
  114. set ofid [open $t3 w]
  115. fconfigure $ofid -translation binary
  116. set subdbname [string trimright $subdbname ]
  117. puts -nonewline $ofid $subdbname
  118. close $ofid
  119. # Output the data
  120. set subc [eval {$subdb cursor} $txn]
  121. error_check_good db_cursor [is_valid_cursor $subc $subdb] TRUE
  122. set d [$subc get -first]
  123. error_check_good dbc_get [expr [llength $d] != 0] 1
  124. set key [lindex [lindex $d 0] 0]
  125. set data [lindex [lindex $d 0] 1]
  126. set ofid [open $t1 w]
  127. fconfigure $ofid -translation binary
  128. puts -nonewline $ofid $data
  129. close $ofid
  130. $checkfunc $key $t1
  131. $checkfunc $key $t3
  132. error_check_good Subdb004:diff($t3,$t1) 
  133.     [filecmp $t3 $t1] 0
  134. error_check_good curs_close [$subc close] 0
  135. error_check_good db_close [$subdb close] 0
  136. }
  137. error_check_good curs_close [$c close] 0
  138. error_check_good db_close [$db close] 0
  139. if { [is_record_based $method] != 1 } {
  140. fileremove $t2.tmp
  141. }
  142. }
  143. # Check function for subdb004; key should be file name; data should be contents
  144. proc subdb004.check { binfile tmpfile } {
  145. source ./include.tcl
  146. error_check_good Subdb004:datamismatch($binfile,$tmpfile) 
  147.     [filecmp $binfile $tmpfile] 0
  148. }
  149. proc subdb004_recno.check { binfile tmpfile } {
  150. global names
  151. source ./include.tcl
  152. set fname $names($binfile)
  153. error_check_good key"$binfile"_exists [info exists names($binfile)] 1
  154. error_check_good Subdb004:datamismatch($fname,$tmpfile) 
  155.     [filecmp $fname $tmpfile] 0
  156. }