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

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: rsrc003.tcl,v 11.1 2000/11/29 18:28:49 sue Exp $
  7. #
  8. # Recno backing file test.
  9. # Try different patterns of adding records and making sure that the
  10. # corresponding file matches
  11. proc rsrc003 { } {
  12. source ./include.tcl
  13. global fixed_len
  14. puts "Rsrc003: Basic recno backing file writeback tests fixed length"
  15. # We run this test essentially twice, once with a db file
  16. # and once without (an in-memory database).
  17. #
  18. # Then run with big fixed-length records
  19. set rec1 "This is record 1"
  20. set rec2 "This is record 2"
  21. set rec3 "This is record 3"
  22. set bigrec1 [replicate "This is record 1 " 512]
  23. set bigrec2 [replicate "This is record 2 " 512]
  24. set bigrec3 [replicate "This is record 3 " 512]
  25. set orig_fixed_len $fixed_len
  26. set rlist { 
  27. {{$rec1 $rec2 $rec3} "small records" }
  28. {{$bigrec1 $bigrec2 $bigrec3} "large records" }}
  29. foreach testfile { "$testdir/rsrc003.db" "" } {
  30. foreach rec $rlist {
  31. cleanup $testdir NULL
  32. set recs [lindex $rec 0]
  33. set msg [lindex $rec 1]
  34. # Create the starting files
  35. # Note that for the rest of the test, we are going
  36. # to append a LF when we 'put' via DB to maintain
  37. # file structure and allow us to use 'gets'.
  38. set oid1 [open $testdir/rsrc.txt w]
  39. set oid2 [open $testdir/check.txt w]
  40. foreach record $recs {
  41. set r [subst $record]
  42. set fixed_len [string length $r]
  43. puts $oid1 $r
  44. puts $oid2 $r
  45. }
  46. close $oid1
  47. close $oid2
  48. set reclen [expr $fixed_len + 1]
  49. if { $reclen > [string length $rec1] } {
  50. set repl 512
  51. } else {
  52. set repl 2
  53. }
  54. if { $testfile == "" } {
  55. puts 
  56. "Rsrc003: Testing with in-memory database with $msg."
  57. } else {
  58. puts 
  59. "Rsrc003: Testing with disk-backed database with $msg."
  60. }
  61. puts -nonewline 
  62.     "tRsrc003.a: Read file, rewrite last record;"
  63. puts " write it out and diff"
  64. set db [eval {berkdb_open -create -mode 0644 -recno 
  65.     -len $reclen -source $testdir/rsrc.txt} $testfile]
  66. error_check_good dbopen [is_valid_db $db] TRUE
  67. # Read the last record; replace it (don't change it).
  68. # Then close the file and diff the two files.
  69. set txn ""
  70. set dbc [eval {$db cursor} $txn]
  71. error_check_good db_cursor 
  72.     [is_valid_cursor $dbc $db] TRUE
  73. set rec [$dbc get -last]
  74. error_check_good get_last [llength [lindex $rec 0]] 2
  75. set key [lindex [lindex $rec 0] 0]
  76. set data [lindex [lindex $rec 0] 1]
  77. # Get the last record from the text file
  78. set oid [open $testdir/rsrc.txt]
  79. set laststr ""
  80. while { [gets $oid str] != -1 } {
  81. append str 12
  82. set laststr $str
  83. }
  84. close $oid
  85. set data [sanitize_record $data]
  86. error_check_good getlast $data $laststr
  87. set ret [eval {$db put} $txn {$key $data}]
  88. error_check_good replace_last $ret 0
  89. error_check_good curs_close [$dbc close] 0
  90. error_check_good db_sync [$db sync] 0
  91. error_check_good db_sync [$db sync] 0
  92. error_check_good 
  93.     diff1($testdir/rsrc.txt,$testdir/check.txt) 
  94.     [filecmp $testdir/rsrc.txt $testdir/check.txt] 0
  95. puts -nonewline "tRsrc003.b: "
  96. puts "Append some records in tree and verify in file."
  97. set oid [open $testdir/check.txt a]
  98. for {set i 1} {$i < 10} {incr i} {
  99. set rec [chop_data -frecno [replicate 
  100.     "This is New Record $i" $repl]]
  101. puts $oid $rec
  102. append rec 12
  103. incr key
  104. set ret [eval {$db put} $txn {-append $rec}]
  105. error_check_good put_append $ret $key
  106. }
  107. error_check_good db_sync [$db sync] 0
  108. error_check_good db_sync [$db sync] 0
  109. close $oid
  110. set ret [filecmp $testdir/rsrc.txt $testdir/check.txt]
  111. error_check_good 
  112.     diff2($testdir/{rsrc.txt,check.txt}) $ret 0
  113. puts "tRsrc003.c: Append by record number"
  114. set oid [open $testdir/check.txt a]
  115. for {set i 1} {$i < 10} {incr i} {
  116. set rec [chop_data -frecno [replicate 
  117.     "New Record (set 2) $i" $repl]]
  118. puts $oid $rec
  119. append rec 12
  120. incr key
  121. set ret [eval {$db put} $txn {$key $rec}]
  122. error_check_good put_byno $ret 0
  123. }
  124. error_check_good db_sync [$db sync] 0
  125. error_check_good db_sync [$db sync] 0
  126. close $oid
  127. set ret [filecmp $testdir/rsrc.txt $testdir/check.txt]
  128. error_check_good 
  129.     diff3($testdir/{rsrc.txt,check.txt}) $ret 0
  130. puts 
  131. "tRsrc003.d: Verify proper syncing of changes on close."
  132. error_check_good Rsrc003:db_close [$db close] 0
  133. set db [eval {berkdb_open -create -mode 0644 -recno 
  134.     -len $reclen -source $testdir/rsrc.txt} $testfile]
  135. set oid [open $testdir/check.txt a]
  136. for {set i 1} {$i < 10} {incr i} {
  137. set rec [chop_data -frecno [replicate 
  138.     "New Record (set 3) $i" $repl]]
  139. puts $oid $rec
  140. append rec 12
  141. set ret [eval {$db put} $txn {-append $rec}]
  142. # Don't bother checking return;
  143. # we don't know what
  144. # the key number is, and we'll pick up a failure
  145. # when we compare.
  146. }
  147. error_check_good Rsrc003:db_close [$db close] 0
  148. close $oid
  149. set ret [filecmp $testdir/rsrc.txt $testdir/check.txt]
  150. error_check_good 
  151.     diff5($testdir/{rsrc,check}.txt) $ret 0
  152. }
  153. }
  154. set fixed_len $orig_fixed_len
  155. return
  156. }