github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/wal_common.tcl (about)

     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