Annotation of embedaddon/sqlite3/test/wal_common.tcl, revision 1.1.1.1

1.1       misho       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: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>