diff options
Diffstat (limited to 'chromium/third_party/sqlite/sqlite-src-3240000/tool/restore_jrnl.tcl')
-rw-r--r-- | chromium/third_party/sqlite/sqlite-src-3240000/tool/restore_jrnl.tcl | 233 |
1 files changed, 0 insertions, 233 deletions
diff --git a/chromium/third_party/sqlite/sqlite-src-3240000/tool/restore_jrnl.tcl b/chromium/third_party/sqlite/sqlite-src-3240000/tool/restore_jrnl.tcl deleted file mode 100644 index 65dee80ca27..00000000000 --- a/chromium/third_party/sqlite/sqlite-src-3240000/tool/restore_jrnl.tcl +++ /dev/null @@ -1,233 +0,0 @@ -# 2010 January 7 -# -# The author disclaims copyright to this source code. In place of -# a legal notice, here is a blessing: -# -# May you do good and not evil. -# May you find forgiveness for yourself and forgive others. -# May you share freely, never taking more than you give. -# -#*********************************************************************** -# This file implements utility functions for SQLite library. -# -# This file attempts to restore the header of a journal. -# This may be useful for rolling-back the last committed -# transaction from a recovered journal. -# - -package require sqlite3 - -set parm_error 0 -set fix_chksums 0 -set dump_pages 0 -set db_name "" - -for {set i 0} {$i<$argc} {incr i} { - if {[lindex $argv $i] == "-fix_chksums"} { - set fix_chksums -1 - } elseif {[lindex $argv $i] == "-dump_pages"} { - set dump_pages -1 - } elseif {$db_name == ""} { - set db_name [lindex $argv $i] - set jrnl_name $db_name-journal - } else { - set parm_error -1 - } -} -if {$parm_error || $db_name == ""} { - puts "USAGE: restore_jrnl.tcl \[-fix_chksums\] \[-dump_pages\] db_name" - puts "Example: restore_jrnl.tcl foo.sqlite" - return -} - -# is there a way to determine this? -set sectsz 512 - -# Copy file $from into $to -# -proc copy_file {from to} { - file copy -force $from $to -} - -# Execute some SQL -# -proc catchsql {sql} { - set rc [catch {uplevel [list db eval $sql]} msg] - list $rc $msg -} - -# Perform a test -# -proc do_test {name cmd expected} { - puts -nonewline "$name ..." - set res [uplevel $cmd] - if {$res eq $expected} { - puts Ok - } else { - puts Error - puts " Got: $res" - puts " Expected: $expected" - } -} - -# Calc checksum nonce from journal page data. -# -proc calc_nonce {jrnl_pgno} { - global sectsz - global db_pgsz - global jrnl_name - set jrnl_pg_offset [expr $sectsz+((4+$db_pgsz+4)*$jrnl_pgno)] - set nonce [hexio_get_int [hexio_read $jrnl_name [expr $jrnl_pg_offset+4+$db_pgsz] 4]] - for {set i [expr $db_pgsz-200]} {$i>0} {set i [expr $i-200]} { - set byte [hexio_get_int [hexio_read $jrnl_name [expr $jrnl_pg_offset+4+$i] 1]] - set nonce [expr $nonce-$byte] - } - return $nonce -} - -# Calc checksum from journal page data. -# -proc calc_chksum {jrnl_pgno} { - global sectsz - global db_pgsz - global jrnl_name - global nonce - set jrnl_pg_offset [expr $sectsz+((4+$db_pgsz+4)*$jrnl_pgno)] - set chksum $nonce - for {set i [expr $db_pgsz-200]} {$i>0} {set i [expr $i-200]} { - set byte [hexio_get_int [hexio_read $jrnl_name [expr $jrnl_pg_offset+4+$i] 1]] - set chksum [expr $chksum+$byte] - } - return $chksum -} - -# Print journal page data in hex dump form -# -proc dump_jrnl_page {jrnl_pgno} { - global sectsz - global db_pgsz - global jrnl_name - - # print a header block for the page - puts [string repeat "-" 79] - set jrnl_pg_offset [expr $sectsz+((4+$db_pgsz+4)*$jrnl_pgno)] - set db_pgno [hexio_get_int [hexio_read $jrnl_name [expr $jrnl_pg_offset] 4]] - set chksum [hexio_get_int [hexio_read $jrnl_name [expr $jrnl_pg_offset+4+$db_pgsz] 4]] - set nonce [calc_nonce $jrnl_pgno] - puts [ format {jrnl_pg_offset: %08x (%d) jrnl_pgno: %d db_pgno: %d} \ - $jrnl_pg_offset $jrnl_pg_offset \ - $jrnl_pgno $db_pgno] - puts [ format {nonce: %08x chksum: %08x} \ - $nonce $chksum] - - # now hex dump the data - # This is derived from the Tcler's WIKI - set fid [open $jrnl_name r] - fconfigure $fid -translation binary -encoding binary - seek $fid [expr $jrnl_pg_offset+4] - set data [read $fid $db_pgsz] - close $fid - for {set addr 0} {$addr<$db_pgsz} {set addr [expr $addr+16]} { - # get 16 bytes of data - set s [string range $data $addr [expr $addr+16]] - - # Convert the data to hex and to characters. - binary scan $s H*@0a* hex ascii - - # Replace non-printing characters in the data. - regsub -all -- {[^[:graph:] ]} $ascii {.} ascii - - # Split the 16 bytes into two 8-byte chunks - regexp -- {(.{16})(.{0,16})} $hex -> hex1 hex2 - - # Convert the hex to pairs of hex digits - regsub -all -- {..} $hex1 {& } hex1 - regsub -all -- {..} $hex2 {& } hex2 - - # Print the hex and ascii data - puts [ format {%08x %-24s %-24s %-16s} \ - $addr $hex1 $hex2 $ascii ] - } -} - -# Setup for the tests. Make a backup copy of the files. -# -if [file exist $db_name.org] { - puts "ERROR: during back-up: $db_name.org exists already." - return; -} -if [file exist $jrnl_name.org] { - puts "ERROR: during back-up: $jrnl_name.org exists already." - return -} -copy_file $db_name $db_name.org -copy_file $jrnl_name $jrnl_name.org - -set db_fsize [file size $db_name] -set db_pgsz [hexio_get_int [hexio_read $db_name 16 2]] -set db_npage [expr {$db_fsize / $db_pgsz}] - -set jrnl_fsize [file size $jrnl_name] -set jrnl_npage [expr {($jrnl_fsize - $sectsz) / (4 + $db_pgsz + 4)}] - -# calculate checksum nonce for first page -set nonce [calc_nonce 0] - -# verify all the pages in the journal use the same nonce -for {set i 1} {$i<$jrnl_npage} {incr i} { - set tnonce [calc_nonce $i] - if {$tnonce != $nonce} { - puts "WARNING: different nonces: 0=$nonce $i=$tnonce" - if {$fix_chksums } { - set jrnl_pg_offset [expr $sectsz+((4+$db_pgsz+4)*$i)] - set tchksum [calc_chksum $i] - hexio_write $jrnl_name [expr $jrnl_pg_offset+4+$db_pgsz] [format %08x $tchksum] - puts "INFO: fixing chksum: $i=$tchksum" - } - } -} - -# verify all the page numbers in the journal -for {set i 0} {$i<$jrnl_npage} {incr i} { - set jrnl_pg_offset [expr $sectsz+((4+$db_pgsz+4)*$i)] - set db_pgno [hexio_get_int [hexio_read $jrnl_name $jrnl_pg_offset 4]] - if {$db_pgno < 1} { - puts "WARNING: page number < 1: $i=$db_pgno" - } - if {$db_pgno >= $db_npage} { - puts "WARNING: page number >= $db_npage: $i=$db_pgno" - } -} - -# dump page data -if {$dump_pages} { - for {set i 0} {$i<$jrnl_npage} {incr i} { - dump_jrnl_page $i - } -} - -# write the 8 byte magic string -hexio_write $jrnl_name 0 d9d505f920a163d7 - -# write -1 for number of records -hexio_write $jrnl_name 8 ffffffff - -# write 00 for checksum nonce -hexio_write $jrnl_name 12 [format %08x $nonce] - -# write page count -hexio_write $jrnl_name 16 [format %08x $db_npage] - -# write sector size -hexio_write $jrnl_name 20 [format %08x $sectsz] - -# write page size -hexio_write $jrnl_name 24 [format %08x $db_pgsz] - -# check the integrity of the database with the patched journal -sqlite3 db $db_name -do_test restore_jrnl-1.0 { - catchsql {PRAGMA integrity_check} -} {0 ok} -db close - |