Home | History | Annotate | Download | only in test
      1 # 2010 June 03
      2 #
      3 # The author disclaims copyright to this source code.  In place of
      4 # a legal notice, here is a blessing:
      5 #
      6 #    May you do good and not evil.
      7 #    May you find forgiveness for yourself and forgive others.
      8 #    May you share freely, never taking more than you give.
      9 #
     10 #***********************************************************************
     11 #
     12 # This file contains common code used by many different malloc tests
     13 # within the test suite.
     14 #
     15 
     16 proc wal_file_size {nFrame pgsz} {
     17   expr {32 + ($pgsz+24)*$nFrame}
     18 }
     19 
     20 proc wal_frame_count {zFile pgsz} {
     21   if {[file exists $zFile]==0} { return 0 }
     22   set f [file size $zFile]
     23   if {$f < 32} { return 0 }
     24   expr {($f - 32) / ($pgsz+24)}
     25 }
     26 
     27 proc wal_cksum_intlist {ckv1 ckv2 intlist} {
     28   upvar $ckv1 c1
     29   upvar $ckv2 c2
     30   foreach {v1 v2} $intlist {
     31     set c1 [expr {($c1 + $v1 + $c2)&0xFFFFFFFF}]
     32     set c2 [expr {($c2 + $v2 + $c1)&0xFFFFFFFF}]
     33   }
     34 }
     35 
     36 
     37 # This proc calculates checksums in the same way as those used by SQLite
     38 # in WAL files. If the $endian argument is "big", then checksums are
     39 # calculated by interpreting data as an array of big-endian integers. If
     40 # it is "little", data is interpreted as an array of little-endian integers.
     41 #
     42 proc wal_cksum {endian ckv1 ckv2 blob} {
     43   upvar $ckv1 c1
     44   upvar $ckv2 c2
     45 
     46   if {$endian!="big" && $endian!="little"} {
     47     return -error "Bad value \"$endian\" - must be \"big\" or \"little\""
     48   }
     49   set scanpattern I*
     50   if {$endian == "little"} { set scanpattern i* }
     51 
     52   binary scan $blob $scanpattern values
     53   wal_cksum_intlist c1 c2 $values
     54 }
     55 
     56 proc wal_set_walhdr {filename {intlist {}}} {
     57   if {[llength $intlist]==6} {
     58     set blob [binary format I6 $intlist]
     59     set endian little
     60     if {[lindex $intlist 0] & 0x00000001} { set endian big }
     61     set c1 0
     62     set c2 0
     63     wal_cksum $endian c1 c2 $blob
     64     append blob [binary format II $c1 $c2]
     65 
     66     set fd [open $filename r+]
     67     fconfigure $fd -translation binary
     68     fconfigure $fd -encoding binary
     69     seek $fd 0
     70     puts -nonewline $fd $blob
     71     close $fd
     72   }
     73 
     74   set fd [open $filename]
     75   fconfigure $fd -translation binary
     76   fconfigure $fd -encoding binary
     77   set blob [read $fd 24]
     78   close $fd
     79 
     80   binary scan $blob I6 ints
     81   set ints
     82 }
     83 
     84 proc wal_fix_walindex_cksum {hdrvar} {
     85   upvar $hdrvar hdr
     86   set c1 0
     87   set c2 0
     88   wal_cksum_intlist c1 c2 [lrange $hdr 0 9]
     89   lset hdr 10 $c1
     90   lset hdr 11 $c2
     91 }
     92 
     93 
     94