/ Hex Artifact Content
Login

Artifact 6957a34f8f1f0f8285e07536225ec3b292a9024a:


0000: 23 20 32 30 31 30 20 4a 61 6e 75 61 72 79 20 37  # 2010 January 7
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 75 74  le implements ut
0180: 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 73 20  ility functions 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 0a 23 0a 23 20 54 68 69 73 20 66 69 6c  ry..#.# This fil
01b0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
01c0: 73 74 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  store the header
01d0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 2e 0a 23   of a journal..#
01e0: 20 54 68 69 73 20 6d 61 79 20 62 65 20 75 73 65   This may be use
01f0: 66 75 6c 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 2d  ful for rolling-
0200: 62 61 63 6b 20 74 68 65 20 6c 61 73 74 20 63 6f  back the last co
0210: 6d 6d 69 74 74 65 64 20 0a 23 20 74 72 61 6e 73  mmitted .# trans
0220: 61 63 74 69 6f 6e 20 66 72 6f 6d 20 61 20 72 65  action from a re
0230: 63 6f 76 65 72 65 64 20 6a 6f 75 72 6e 61 6c 2e  covered journal.
0240: 0a 23 0a 0a 70 61 63 6b 61 67 65 20 72 65 71 75  .#..package requ
0250: 69 72 65 20 73 71 6c 69 74 65 33 0a 0a 73 65 74  ire sqlite3..set
0260: 20 70 61 72 6d 5f 65 72 72 6f 72 20 30 0a 73 65   parm_error 0.se
0270: 74 20 66 69 78 5f 63 68 6b 73 75 6d 73 20 30 0a  t fix_chksums 0.
0280: 73 65 74 20 64 75 6d 70 5f 70 61 67 65 73 20 30  set dump_pages 0
0290: 0a 73 65 74 20 64 62 5f 6e 61 6d 65 20 22 22 0a  .set db_name "".
02a0: 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b  .for {set i 0} {
02b0: 24 69 3c 24 61 72 67 63 7d 20 7b 69 6e 63 72 20  $i<$argc} {incr 
02c0: 69 7d 20 7b 0a 20 20 69 66 20 7b 5b 6c 69 6e 64  i} {.  if {[lind
02d0: 65 78 20 24 61 72 67 76 20 24 69 5d 20 3d 3d 20  ex $argv $i] == 
02e0: 22 2d 66 69 78 5f 63 68 6b 73 75 6d 73 22 7d 20  "-fix_chksums"} 
02f0: 7b 0a 20 20 20 20 73 65 74 20 66 69 78 5f 63 68  {.    set fix_ch
0300: 6b 73 75 6d 73 20 2d 31 0a 20 20 7d 20 65 6c 73  ksums -1.  } els
0310: 65 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24 61 72  eif {[lindex $ar
0320: 67 76 20 24 69 5d 20 3d 3d 20 22 2d 64 75 6d 70  gv $i] == "-dump
0330: 5f 70 61 67 65 73 22 7d 20 7b 0a 20 20 20 20 73  _pages"} {.    s
0340: 65 74 20 64 75 6d 70 5f 70 61 67 65 73 20 2d 31  et dump_pages -1
0350: 0a 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 64 62  .  } elseif {$db
0360: 5f 6e 61 6d 65 20 3d 3d 20 22 22 7d 20 7b 0a 20  _name == ""} {. 
0370: 20 20 20 73 65 74 20 64 62 5f 6e 61 6d 65 20 5b     set db_name [
0380: 6c 69 6e 64 65 78 20 24 61 72 67 76 20 24 69 5d  lindex $argv $i]
0390: 0a 20 20 20 20 73 65 74 20 6a 72 6e 6c 5f 6e 61  .    set jrnl_na
03a0: 6d 65 20 24 64 62 5f 6e 61 6d 65 2d 6a 6f 75 72  me $db_name-jour
03b0: 6e 61 6c 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  nal.  } else {. 
03c0: 20 20 20 73 65 74 20 70 61 72 6d 5f 65 72 72 6f     set parm_erro
03d0: 72 20 2d 31 0a 20 20 7d 0a 7d 0a 69 66 20 7b 24  r -1.  }.}.if {$
03e0: 70 61 72 6d 5f 65 72 72 6f 72 20 7c 7c 20 24 64  parm_error || $d
03f0: 62 5f 6e 61 6d 65 20 3d 3d 20 22 22 7d 20 7b 0a  b_name == ""} {.
0400: 20 20 70 75 74 73 20 22 55 53 41 47 45 3a 20 72    puts "USAGE: r
0410: 65 73 74 6f 72 65 5f 6a 72 6e 6c 2e 74 63 6c 20  estore_jrnl.tcl 
0420: 5c 5b 2d 66 69 78 5f 63 68 6b 73 75 6d 73 5c 5d  \[-fix_chksums\]
0430: 20 5c 5b 2d 64 75 6d 70 5f 70 61 67 65 73 5c 5d   \[-dump_pages\]
0440: 20 64 62 5f 6e 61 6d 65 22 0a 20 20 70 75 74 73   db_name".  puts
0450: 20 22 45 78 61 6d 70 6c 65 3a 20 72 65 73 74 6f   "Example: resto
0460: 72 65 5f 6a 72 6e 6c 2e 74 63 6c 20 66 6f 6f 2e  re_jrnl.tcl foo.
0470: 73 71 6c 69 74 65 22 0a 20 20 72 65 74 75 72 6e  sqlite".  return
0480: 0a 7d 0a 0a 23 20 69 73 20 74 68 65 72 65 20 61  .}..# is there a
0490: 20 77 61 79 20 74 6f 20 64 65 74 65 72 6d 69 6e   way to determin
04a0: 65 20 74 68 69 73 3f 0a 73 65 74 20 73 65 63 74  e this?.set sect
04b0: 73 7a 20 35 31 32 0a 0a 23 20 43 6f 70 79 20 66  sz 512..# Copy f
04c0: 69 6c 65 20 24 66 72 6f 6d 20 69 6e 74 6f 20 24  ile $from into $
04d0: 74 6f 0a 23 0a 70 72 6f 63 20 63 6f 70 79 5f 66  to.#.proc copy_f
04e0: 69 6c 65 20 7b 66 72 6f 6d 20 74 6f 7d 20 7b 0a  ile {from to} {.
04f0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
0500: 63 65 20 24 66 72 6f 6d 20 24 74 6f 0a 7d 0a 0a  ce $from $to.}..
0510: 23 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20 53  # Execute some S
0520: 51 4c 0a 23 0a 70 72 6f 63 20 63 61 74 63 68 73  QL.#.proc catchs
0530: 71 6c 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74  ql {sql} {.  set
0540: 20 72 63 20 5b 63 61 74 63 68 20 7b 75 70 6c 65   rc [catch {uple
0550: 76 65 6c 20 5b 6c 69 73 74 20 64 62 20 65 76 61  vel [list db eva
0560: 6c 20 24 73 71 6c 5d 7d 20 6d 73 67 5d 0a 20 20  l $sql]} msg].  
0570: 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 0a  list $rc $msg.}.
0580: 0a 23 20 50 65 72 66 6f 72 6d 20 61 20 74 65 73  .# Perform a tes
0590: 74 0a 23 0a 70 72 6f 63 20 64 6f 5f 74 65 73 74  t.#.proc do_test
05a0: 20 7b 6e 61 6d 65 20 63 6d 64 20 65 78 70 65 63   {name cmd expec
05b0: 74 65 64 7d 20 7b 0a 20 20 70 75 74 73 20 2d 6e  ted} {.  puts -n
05c0: 6f 6e 65 77 6c 69 6e 65 20 22 24 6e 61 6d 65 20  onewline "$name 
05d0: 2e 2e 2e 22 0a 20 20 73 65 74 20 72 65 73 20 5b  ...".  set res [
05e0: 75 70 6c 65 76 65 6c 20 24 63 6d 64 5d 0a 20 20  uplevel $cmd].  
05f0: 69 66 20 7b 24 72 65 73 20 65 71 20 24 65 78 70  if {$res eq $exp
0600: 65 63 74 65 64 7d 20 7b 0a 20 20 20 20 70 75 74  ected} {.    put
0610: 73 20 4f 6b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  s Ok.  } else {.
0620: 20 20 20 20 70 75 74 73 20 45 72 72 6f 72 0a 20      puts Error. 
0630: 20 20 20 70 75 74 73 20 22 20 20 47 6f 74 3a 20     puts "  Got: 
0640: 24 72 65 73 22 0a 20 20 20 20 70 75 74 73 20 22  $res".    puts "
0650: 20 20 45 78 70 65 63 74 65 64 3a 20 24 65 78 70    Expected: $exp
0660: 65 63 74 65 64 22 0a 20 20 7d 0a 7d 0a 0a 23 20  ected".  }.}..# 
0670: 43 61 6c 63 20 63 68 65 63 6b 73 75 6d 20 6e 6f  Calc checksum no
0680: 6e 63 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  nce from journal
0690: 20 70 61 67 65 20 64 61 74 61 2e 0a 23 0a 70 72   page data..#.pr
06a0: 6f 63 20 63 61 6c 63 5f 6e 6f 6e 63 65 20 7b 6a  oc calc_nonce {j
06b0: 72 6e 6c 5f 70 67 6e 6f 7d 20 7b 0a 20 20 67 6c  rnl_pgno} {.  gl
06c0: 6f 62 61 6c 20 73 65 63 74 73 7a 0a 20 20 67 6c  obal sectsz.  gl
06d0: 6f 62 61 6c 20 64 62 5f 70 67 73 7a 0a 20 20 67  obal db_pgsz.  g
06e0: 6c 6f 62 61 6c 20 6a 72 6e 6c 5f 6e 61 6d 65 0a  lobal jrnl_name.
06f0: 20 20 73 65 74 20 6a 72 6e 6c 5f 70 67 5f 6f 66    set jrnl_pg_of
0700: 66 73 65 74 20 5b 65 78 70 72 20 24 73 65 63 74  fset [expr $sect
0710: 73 7a 2b 28 28 34 2b 24 64 62 5f 70 67 73 7a 2b  sz+((4+$db_pgsz+
0720: 34 29 2a 24 6a 72 6e 6c 5f 70 67 6e 6f 29 5d 0a  4)*$jrnl_pgno)].
0730: 20 20 73 65 74 20 6e 6f 6e 63 65 20 5b 68 65 78    set nonce [hex
0740: 69 6f 5f 67 65 74 5f 69 6e 74 20 5b 68 65 78 69  io_get_int [hexi
0750: 6f 5f 72 65 61 64 20 24 6a 72 6e 6c 5f 6e 61 6d  o_read $jrnl_nam
0760: 65 20 5b 65 78 70 72 20 24 6a 72 6e 6c 5f 70 67  e [expr $jrnl_pg
0770: 5f 6f 66 66 73 65 74 2b 34 2b 24 64 62 5f 70 67  _offset+4+$db_pg
0780: 73 7a 5d 20 34 5d 5d 0a 20 20 66 6f 72 20 7b 73  sz] 4]].  for {s
0790: 65 74 20 69 20 5b 65 78 70 72 20 24 64 62 5f 70  et i [expr $db_p
07a0: 67 73 7a 2d 32 30 30 5d 7d 20 7b 24 69 3e 30 7d  gsz-200]} {$i>0}
07b0: 20 7b 73 65 74 20 69 20 5b 65 78 70 72 20 24 69   {set i [expr $i
07c0: 2d 32 30 30 5d 7d 20 7b 0a 20 20 20 20 73 65 74  -200]} {.    set
07d0: 20 62 79 74 65 20 5b 68 65 78 69 6f 5f 67 65 74   byte [hexio_get
07e0: 5f 69 6e 74 20 5b 68 65 78 69 6f 5f 72 65 61 64  _int [hexio_read
07f0: 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20 5b 65 78 70   $jrnl_name [exp
0800: 72 20 24 6a 72 6e 6c 5f 70 67 5f 6f 66 66 73 65  r $jrnl_pg_offse
0810: 74 2b 34 2b 24 69 5d 20 31 5d 5d 0a 20 20 20 20  t+4+$i] 1]].    
0820: 73 65 74 20 6e 6f 6e 63 65 20 5b 65 78 70 72 20  set nonce [expr 
0830: 24 6e 6f 6e 63 65 2d 24 62 79 74 65 5d 0a 20 20  $nonce-$byte].  
0840: 7d 0a 20 20 72 65 74 75 72 6e 20 24 6e 6f 6e 63  }.  return $nonc
0850: 65 0a 7d 0a 0a 23 20 43 61 6c 63 20 63 68 65 63  e.}..# Calc chec
0860: 6b 73 75 6d 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ksum from journa
0870: 6c 20 70 61 67 65 20 64 61 74 61 2e 0a 23 0a 70  l page data..#.p
0880: 72 6f 63 20 63 61 6c 63 5f 63 68 6b 73 75 6d 20  roc calc_chksum 
0890: 7b 6a 72 6e 6c 5f 70 67 6e 6f 7d 20 7b 0a 20 20  {jrnl_pgno} {.  
08a0: 67 6c 6f 62 61 6c 20 73 65 63 74 73 7a 0a 20 20  global sectsz.  
08b0: 67 6c 6f 62 61 6c 20 64 62 5f 70 67 73 7a 0a 20  global db_pgsz. 
08c0: 20 67 6c 6f 62 61 6c 20 6a 72 6e 6c 5f 6e 61 6d   global jrnl_nam
08d0: 65 0a 20 20 67 6c 6f 62 61 6c 20 6e 6f 6e 63 65  e.  global nonce
08e0: 0a 20 20 73 65 74 20 6a 72 6e 6c 5f 70 67 5f 6f  .  set jrnl_pg_o
08f0: 66 66 73 65 74 20 5b 65 78 70 72 20 24 73 65 63  ffset [expr $sec
0900: 74 73 7a 2b 28 28 34 2b 24 64 62 5f 70 67 73 7a  tsz+((4+$db_pgsz
0910: 2b 34 29 2a 24 6a 72 6e 6c 5f 70 67 6e 6f 29 5d  +4)*$jrnl_pgno)]
0920: 0a 20 20 73 65 74 20 63 68 6b 73 75 6d 20 24 6e  .  set chksum $n
0930: 6f 6e 63 65 0a 20 20 66 6f 72 20 7b 73 65 74 20  once.  for {set 
0940: 69 20 5b 65 78 70 72 20 24 64 62 5f 70 67 73 7a  i [expr $db_pgsz
0950: 2d 32 30 30 5d 7d 20 7b 24 69 3e 30 7d 20 7b 73  -200]} {$i>0} {s
0960: 65 74 20 69 20 5b 65 78 70 72 20 24 69 2d 32 30  et i [expr $i-20
0970: 30 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 62 79  0]} {.    set by
0980: 74 65 20 5b 68 65 78 69 6f 5f 67 65 74 5f 69 6e  te [hexio_get_in
0990: 74 20 5b 68 65 78 69 6f 5f 72 65 61 64 20 24 6a  t [hexio_read $j
09a0: 72 6e 6c 5f 6e 61 6d 65 20 5b 65 78 70 72 20 24  rnl_name [expr $
09b0: 6a 72 6e 6c 5f 70 67 5f 6f 66 66 73 65 74 2b 34  jrnl_pg_offset+4
09c0: 2b 24 69 5d 20 31 5d 5d 0a 20 20 20 20 73 65 74  +$i] 1]].    set
09d0: 20 63 68 6b 73 75 6d 20 5b 65 78 70 72 20 24 63   chksum [expr $c
09e0: 68 6b 73 75 6d 2b 24 62 79 74 65 5d 0a 20 20 7d  hksum+$byte].  }
09f0: 0a 20 20 72 65 74 75 72 6e 20 24 63 68 6b 73 75  .  return $chksu
0a00: 6d 0a 7d 0a 0a 23 20 50 72 69 6e 74 20 6a 6f 75  m.}..# Print jou
0a10: 72 6e 61 6c 20 70 61 67 65 20 64 61 74 61 20 69  rnal page data i
0a20: 6e 20 68 65 78 20 64 75 6d 70 20 66 6f 72 6d 0a  n hex dump form.
0a30: 23 0a 70 72 6f 63 20 64 75 6d 70 5f 6a 72 6e 6c  #.proc dump_jrnl
0a40: 5f 70 61 67 65 20 7b 6a 72 6e 6c 5f 70 67 6e 6f  _page {jrnl_pgno
0a50: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 73 65 63  } {.  global sec
0a60: 74 73 7a 0a 20 20 67 6c 6f 62 61 6c 20 64 62 5f  tsz.  global db_
0a70: 70 67 73 7a 0a 20 20 67 6c 6f 62 61 6c 20 6a 72  pgsz.  global jr
0a80: 6e 6c 5f 6e 61 6d 65 0a 0a 20 20 23 20 70 72 69  nl_name..  # pri
0a90: 6e 74 20 61 20 68 65 61 64 65 72 20 62 6c 6f 63  nt a header bloc
0aa0: 6b 20 66 6f 72 20 74 68 65 20 70 61 67 65 0a 20  k for the page. 
0ab0: 20 70 75 74 73 20 5b 73 74 72 69 6e 67 20 72 65   puts [string re
0ac0: 70 65 61 74 20 22 2d 22 20 37 39 5d 0a 20 20 73  peat "-" 79].  s
0ad0: 65 74 20 6a 72 6e 6c 5f 70 67 5f 6f 66 66 73 65  et jrnl_pg_offse
0ae0: 74 20 5b 65 78 70 72 20 24 73 65 63 74 73 7a 2b  t [expr $sectsz+
0af0: 28 28 34 2b 24 64 62 5f 70 67 73 7a 2b 34 29 2a  ((4+$db_pgsz+4)*
0b00: 24 6a 72 6e 6c 5f 70 67 6e 6f 29 5d 0a 20 20 73  $jrnl_pgno)].  s
0b10: 65 74 20 64 62 5f 70 67 6e 6f 20 5b 68 65 78 69  et db_pgno [hexi
0b20: 6f 5f 67 65 74 5f 69 6e 74 20 5b 68 65 78 69 6f  o_get_int [hexio
0b30: 5f 72 65 61 64 20 24 6a 72 6e 6c 5f 6e 61 6d 65  _read $jrnl_name
0b40: 20 5b 65 78 70 72 20 24 6a 72 6e 6c 5f 70 67 5f   [expr $jrnl_pg_
0b50: 6f 66 66 73 65 74 5d 20 34 5d 5d 0a 20 20 73 65  offset] 4]].  se
0b60: 74 20 63 68 6b 73 75 6d 20 5b 68 65 78 69 6f 5f  t chksum [hexio_
0b70: 67 65 74 5f 69 6e 74 20 5b 68 65 78 69 6f 5f 72  get_int [hexio_r
0b80: 65 61 64 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20 5b  ead $jrnl_name [
0b90: 65 78 70 72 20 24 6a 72 6e 6c 5f 70 67 5f 6f 66  expr $jrnl_pg_of
0ba0: 66 73 65 74 2b 34 2b 24 64 62 5f 70 67 73 7a 5d  fset+4+$db_pgsz]
0bb0: 20 34 5d 5d 0a 20 20 73 65 74 20 6e 6f 6e 63 65   4]].  set nonce
0bc0: 20 5b 63 61 6c 63 5f 6e 6f 6e 63 65 20 24 6a 72   [calc_nonce $jr
0bd0: 6e 6c 5f 70 67 6e 6f 5d 0a 20 20 70 75 74 73 20  nl_pgno].  puts 
0be0: 5b 20 66 6f 72 6d 61 74 20 7b 6a 72 6e 6c 5f 70  [ format {jrnl_p
0bf0: 67 5f 6f 66 66 73 65 74 3a 20 25 30 38 78 20 28  g_offset: %08x (
0c00: 25 64 29 20 20 6a 72 6e 6c 5f 70 67 6e 6f 3a 20  %d)  jrnl_pgno: 
0c10: 25 64 20 20 64 62 5f 70 67 6e 6f 3a 20 25 64 7d  %d  db_pgno: %d}
0c20: 20 5c 0d 0a 20 20 20 20 20 20 24 6a 72 6e 6c 5f   \..      $jrnl_
0c30: 70 67 5f 6f 66 66 73 65 74 20 24 6a 72 6e 6c 5f  pg_offset $jrnl_
0c40: 70 67 5f 6f 66 66 73 65 74 20 5c 0d 0a 20 20 20  pg_offset \..   
0c50: 20 20 20 24 6a 72 6e 6c 5f 70 67 6e 6f 20 24 64     $jrnl_pgno $d
0c60: 62 5f 70 67 6e 6f 5d 0d 0a 20 20 70 75 74 73 20  b_pgno]..  puts 
0c70: 5b 20 66 6f 72 6d 61 74 20 7b 6e 6f 6e 63 65 3a  [ format {nonce:
0c80: 20 25 30 38 78 20 63 68 6b 73 75 6d 3a 20 25 30   %08x chksum: %0
0c90: 38 78 7d 20 5c 0d 0a 20 20 20 20 20 20 24 6e 6f  8x} \..      $no
0ca0: 6e 63 65 20 24 63 68 6b 73 75 6d 5d 0d 0a 0a 20  nce $chksum]... 
0cb0: 20 23 20 6e 6f 77 20 68 65 78 20 64 75 6d 70 20   # now hex dump 
0cc0: 74 68 65 20 64 61 74 61 0a 20 20 23 20 54 68 69  the data.  # Thi
0cd0: 73 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f  s is derived fro
0ce0: 6d 20 74 68 65 20 54 63 6c 65 72 27 73 20 57 49  m the Tcler's WI
0cf0: 4b 49 0d 0a 20 20 73 65 74 20 66 69 64 20 5b 6f  KI..  set fid [o
0d00: 70 65 6e 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20 72  pen $jrnl_name r
0d10: 5d 0d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20  ]..  fconfigure 
0d20: 24 66 69 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f  $fid -translatio
0d30: 6e 20 62 69 6e 61 72 79 20 2d 65 6e 63 6f 64 69  n binary -encodi
0d40: 6e 67 20 62 69 6e 61 72 79 0d 0a 20 20 73 65 65  ng binary..  see
0d50: 6b 20 24 66 69 64 20 5b 65 78 70 72 20 24 6a 72  k $fid [expr $jr
0d60: 6e 6c 5f 70 67 5f 6f 66 66 73 65 74 2b 34 5d 0d  nl_pg_offset+4].
0d70: 0a 20 20 73 65 74 20 64 61 74 61 20 5b 72 65 61  .  set data [rea
0d80: 64 20 24 66 69 64 20 24 64 62 5f 70 67 73 7a 5d  d $fid $db_pgsz]
0d90: 0d 0a 20 20 63 6c 6f 73 65 20 24 66 69 64 0d 0a  ..  close $fid..
0da0: 20 20 66 6f 72 20 7b 73 65 74 20 61 64 64 72 20    for {set addr 
0db0: 30 7d 20 7b 24 61 64 64 72 3c 24 64 62 5f 70 67  0} {$addr<$db_pg
0dc0: 73 7a 7d 20 7b 73 65 74 20 61 64 64 72 20 5b 65  sz} {set addr [e
0dd0: 78 70 72 20 24 61 64 64 72 2b 31 36 5d 7d 20 7b  xpr $addr+16]} {
0de0: 0a 20 20 20 20 23 20 67 65 74 20 31 36 20 62 79  .    # get 16 by
0df0: 74 65 73 20 6f 66 20 64 61 74 61 0d 0a 20 20 20  tes of data..   
0e00: 20 73 65 74 20 73 20 5b 73 74 72 69 6e 67 20 72   set s [string r
0e10: 61 6e 67 65 20 24 64 61 74 61 20 24 61 64 64 72  ange $data $addr
0e20: 20 5b 65 78 70 72 20 24 61 64 64 72 2b 31 36 5d   [expr $addr+16]
0e30: 5d 0d 0a 20 20 20 20 0d 0a 20 20 20 20 23 20 43  ]..    ..    # C
0e40: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
0e50: 74 6f 20 68 65 78 20 61 6e 64 20 74 6f 20 63 68  to hex and to ch
0e60: 61 72 61 63 74 65 72 73 2e 0d 0a 20 20 20 20 62  aracters...    b
0e70: 69 6e 61 72 79 20 73 63 61 6e 20 24 73 20 48 2a  inary scan $s H*
0e80: 40 30 61 2a 20 68 65 78 20 61 73 63 69 69 0d 0a  @0a* hex ascii..
0e90: 0d 0a 20 20 20 20 23 20 52 65 70 6c 61 63 65 20  ..    # Replace 
0ea0: 6e 6f 6e 2d 70 72 69 6e 74 69 6e 67 20 63 68 61  non-printing cha
0eb0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 64  racters in the d
0ec0: 61 74 61 2e 0d 0a 20 20 20 20 72 65 67 73 75 62  ata...    regsub
0ed0: 20 2d 61 6c 6c 20 2d 2d 20 7b 5b 5e 5b 3a 67 72   -all -- {[^[:gr
0ee0: 61 70 68 3a 5d 20 5d 7d 20 24 61 73 63 69 69 20  aph:] ]} $ascii 
0ef0: 7b 2e 7d 20 61 73 63 69 69 0d 0a 0d 0a 20 20 20  {.} ascii....   
0f00: 20 23 20 53 70 6c 69 74 20 74 68 65 20 31 36 20   # Split the 16 
0f10: 62 79 74 65 73 20 69 6e 74 6f 20 74 77 6f 20 38  bytes into two 8
0f20: 2d 62 79 74 65 20 63 68 75 6e 6b 73 0d 0a 20 20  -byte chunks..  
0f30: 20 20 72 65 67 65 78 70 20 2d 2d 20 7b 28 2e 7b    regexp -- {(.{
0f40: 31 36 7d 29 28 2e 7b 30 2c 31 36 7d 29 7d 20 24  16})(.{0,16})} $
0f50: 68 65 78 20 2d 3e 20 68 65 78 31 20 68 65 78 32  hex -> hex1 hex2
0f60: 0d 0a 0d 0a 20 20 20 20 23 20 43 6f 6e 76 65 72  ....    # Conver
0f70: 74 20 74 68 65 20 68 65 78 20 74 6f 20 70 61 69  t the hex to pai
0f80: 72 73 20 6f 66 20 68 65 78 20 64 69 67 69 74 73  rs of hex digits
0f90: 0d 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c  ..    regsub -al
0fa0: 6c 20 2d 2d 20 7b 2e 2e 7d 20 24 68 65 78 31 20  l -- {..} $hex1 
0fb0: 7b 26 20 7d 20 68 65 78 31 0d 0a 20 20 20 20 72  {& } hex1..    r
0fc0: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 2e  egsub -all -- {.
0fd0: 2e 7d 20 24 68 65 78 32 20 7b 26 20 7d 20 68 65  .} $hex2 {& } he
0fe0: 78 32 0d 0a 0d 0a 20 20 20 20 23 20 50 72 69 6e  x2....    # Prin
0ff0: 74 20 74 68 65 20 68 65 78 20 61 6e 64 20 61 73  t the hex and as
1000: 63 69 69 20 64 61 74 61 0d 0a 20 20 20 20 70 75  cii data..    pu
1010: 74 73 20 5b 20 66 6f 72 6d 61 74 20 7b 25 30 38  ts [ format {%08
1020: 78 20 25 2d 32 34 73 20 25 2d 32 34 73 20 25 2d  x %-24s %-24s %-
1030: 31 36 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  16s} \..        
1040: 24 61 64 64 72 20 24 68 65 78 31 20 24 68 65 78  $addr $hex1 $hex
1050: 32 20 24 61 73 63 69 69 20 5d 0d 0a 20 20 7d 0d  2 $ascii ]..  }.
1060: 0a 7d 0a 0a 23 20 53 65 74 75 70 20 66 6f 72 20  .}..# Setup for 
1070: 74 68 65 20 74 65 73 74 73 2e 20 20 4d 61 6b 65  the tests.  Make
1080: 20 61 20 62 61 63 6b 75 70 20 63 6f 70 79 20 6f   a backup copy o
1090: 66 20 74 68 65 20 66 69 6c 65 73 2e 0a 23 0a 69  f the files..#.i
10a0: 66 20 5b 66 69 6c 65 20 65 78 69 73 74 20 24 64  f [file exist $d
10b0: 62 5f 6e 61 6d 65 2e 6f 72 67 5d 20 7b 0a 20 20  b_name.org] {.  
10c0: 70 75 74 73 20 22 45 52 52 4f 52 3a 20 64 75 72  puts "ERROR: dur
10d0: 69 6e 67 20 62 61 63 6b 2d 75 70 3a 20 24 64 62  ing back-up: $db
10e0: 5f 6e 61 6d 65 2e 6f 72 67 20 65 78 69 73 74 73  _name.org exists
10f0: 20 61 6c 72 65 61 64 79 2e 22 0a 20 20 72 65 74   already.".  ret
1100: 75 72 6e 3b 0a 7d 0a 69 66 20 5b 66 69 6c 65 20  urn;.}.if [file 
1110: 65 78 69 73 74 20 24 6a 72 6e 6c 5f 6e 61 6d 65  exist $jrnl_name
1120: 2e 6f 72 67 5d 20 7b 0a 20 20 70 75 74 73 20 22  .org] {.  puts "
1130: 45 52 52 4f 52 3a 20 64 75 72 69 6e 67 20 62 61  ERROR: during ba
1140: 63 6b 2d 75 70 3a 20 24 6a 72 6e 6c 5f 6e 61 6d  ck-up: $jrnl_nam
1150: 65 2e 6f 72 67 20 65 78 69 73 74 73 20 61 6c 72  e.org exists alr
1160: 65 61 64 79 2e 22 0a 20 20 72 65 74 75 72 6e 0a  eady.".  return.
1170: 7d 0a 63 6f 70 79 5f 66 69 6c 65 20 24 64 62 5f  }.copy_file $db_
1180: 6e 61 6d 65 20 24 64 62 5f 6e 61 6d 65 2e 6f 72  name $db_name.or
1190: 67 0a 63 6f 70 79 5f 66 69 6c 65 20 24 6a 72 6e  g.copy_file $jrn
11a0: 6c 5f 6e 61 6d 65 20 24 6a 72 6e 6c 5f 6e 61 6d  l_name $jrnl_nam
11b0: 65 2e 6f 72 67 0a 0a 73 65 74 20 64 62 5f 66 73  e.org..set db_fs
11c0: 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 24  ize [file size $
11d0: 64 62 5f 6e 61 6d 65 5d 0a 73 65 74 20 64 62 5f  db_name].set db_
11e0: 70 67 73 7a 20 5b 68 65 78 69 6f 5f 67 65 74 5f  pgsz [hexio_get_
11f0: 69 6e 74 20 5b 68 65 78 69 6f 5f 72 65 61 64 20  int [hexio_read 
1200: 24 64 62 5f 6e 61 6d 65 20 31 36 20 32 5d 5d 0a  $db_name 16 2]].
1210: 73 65 74 20 64 62 5f 6e 70 61 67 65 20 5b 65 78  set db_npage [ex
1220: 70 72 20 7b 24 64 62 5f 66 73 69 7a 65 20 2f 20  pr {$db_fsize / 
1230: 24 64 62 5f 70 67 73 7a 7d 5d 0a 0a 73 65 74 20  $db_pgsz}]..set 
1240: 6a 72 6e 6c 5f 66 73 69 7a 65 20 5b 66 69 6c 65  jrnl_fsize [file
1250: 20 73 69 7a 65 20 24 6a 72 6e 6c 5f 6e 61 6d 65   size $jrnl_name
1260: 5d 0a 73 65 74 20 6a 72 6e 6c 5f 6e 70 61 67 65  ].set jrnl_npage
1270: 20 5b 65 78 70 72 20 7b 28 24 6a 72 6e 6c 5f 66   [expr {($jrnl_f
1280: 73 69 7a 65 20 2d 20 24 73 65 63 74 73 7a 29 20  size - $sectsz) 
1290: 2f 20 28 34 20 2b 20 24 64 62 5f 70 67 73 7a 20  / (4 + $db_pgsz 
12a0: 2b 20 34 29 7d 5d 0a 0a 23 20 63 61 6c 63 75 6c  + 4)}]..# calcul
12b0: 61 74 65 20 63 68 65 63 6b 73 75 6d 20 6e 6f 6e  ate checksum non
12c0: 63 65 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  ce for first pag
12d0: 65 0a 73 65 74 20 6e 6f 6e 63 65 20 5b 63 61 6c  e.set nonce [cal
12e0: 63 5f 6e 6f 6e 63 65 20 30 5d 0a 0a 23 20 76 65  c_nonce 0]..# ve
12f0: 72 69 66 79 20 61 6c 6c 20 74 68 65 20 70 61 67  rify all the pag
1300: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1310: 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6e  l use the same n
1320: 6f 6e 63 65 0a 66 6f 72 20 7b 73 65 74 20 69 20  once.for {set i 
1330: 31 7d 20 7b 24 69 3c 24 6a 72 6e 6c 5f 6e 70 61  1} {$i<$jrnl_npa
1340: 67 65 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  ge} {incr i} {. 
1350: 20 73 65 74 20 74 6e 6f 6e 63 65 20 5b 63 61 6c   set tnonce [cal
1360: 63 5f 6e 6f 6e 63 65 20 24 69 5d 0a 20 20 69 66  c_nonce $i].  if
1370: 20 7b 24 74 6e 6f 6e 63 65 20 21 3d 20 24 6e 6f   {$tnonce != $no
1380: 6e 63 65 7d 20 7b 0a 20 20 20 20 70 75 74 73 20  nce} {.    puts 
1390: 22 57 41 52 4e 49 4e 47 3a 20 64 69 66 66 65 72  "WARNING: differ
13a0: 65 6e 74 20 6e 6f 6e 63 65 73 3a 20 30 3d 24 6e  ent nonces: 0=$n
13b0: 6f 6e 63 65 20 24 69 3d 24 74 6e 6f 6e 63 65 22  once $i=$tnonce"
13c0: 0a 20 20 20 20 69 66 20 7b 24 66 69 78 5f 63 68  .    if {$fix_ch
13d0: 6b 73 75 6d 73 20 7d 20 7b 0a 20 20 20 20 20 20  ksums } {.      
13e0: 73 65 74 20 6a 72 6e 6c 5f 70 67 5f 6f 66 66 73  set jrnl_pg_offs
13f0: 65 74 20 5b 65 78 70 72 20 24 73 65 63 74 73 7a  et [expr $sectsz
1400: 2b 28 28 34 2b 24 64 62 5f 70 67 73 7a 2b 34 29  +((4+$db_pgsz+4)
1410: 2a 24 69 29 5d 0a 20 20 20 20 20 20 73 65 74 20  *$i)].      set 
1420: 74 63 68 6b 73 75 6d 20 5b 63 61 6c 63 5f 63 68  tchksum [calc_ch
1430: 6b 73 75 6d 20 24 69 5d 0a 20 20 20 20 20 20 68  ksum $i].      h
1440: 65 78 69 6f 5f 77 72 69 74 65 20 24 6a 72 6e 6c  exio_write $jrnl
1450: 5f 6e 61 6d 65 20 5b 65 78 70 72 20 24 6a 72 6e  _name [expr $jrn
1460: 6c 5f 70 67 5f 6f 66 66 73 65 74 2b 34 2b 24 64  l_pg_offset+4+$d
1470: 62 5f 70 67 73 7a 5d 20 5b 66 6f 72 6d 61 74 20  b_pgsz] [format 
1480: 25 30 38 78 20 24 74 63 68 6b 73 75 6d 5d 0a 20  %08x $tchksum]. 
1490: 20 20 20 20 20 70 75 74 73 20 22 49 4e 46 4f 3a       puts "INFO:
14a0: 20 66 69 78 69 6e 67 20 63 68 6b 73 75 6d 3a 20   fixing chksum: 
14b0: 24 69 3d 24 74 63 68 6b 73 75 6d 22 0a 20 20 20  $i=$tchksum".   
14c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 76 65 72 69   }.  }.}..# veri
14d0: 66 79 20 61 6c 6c 20 74 68 65 20 70 61 67 65 20  fy all the page 
14e0: 6e 75 6d 62 65 72 73 20 69 6e 20 74 68 65 20 6a  numbers in the j
14f0: 6f 75 72 6e 61 6c 0a 66 6f 72 20 7b 73 65 74 20  ournal.for {set 
1500: 69 20 30 7d 20 7b 24 69 3c 24 6a 72 6e 6c 5f 6e  i 0} {$i<$jrnl_n
1510: 70 61 67 65 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  page} {incr i} {
1520: 0a 20 20 73 65 74 20 6a 72 6e 6c 5f 70 67 5f 6f  .  set jrnl_pg_o
1530: 66 66 73 65 74 20 5b 65 78 70 72 20 24 73 65 63  ffset [expr $sec
1540: 74 73 7a 2b 28 28 34 2b 24 64 62 5f 70 67 73 7a  tsz+((4+$db_pgsz
1550: 2b 34 29 2a 24 69 29 5d 0a 20 20 73 65 74 20 64  +4)*$i)].  set d
1560: 62 5f 70 67 6e 6f 20 5b 68 65 78 69 6f 5f 67 65  b_pgno [hexio_ge
1570: 74 5f 69 6e 74 20 5b 68 65 78 69 6f 5f 72 65 61  t_int [hexio_rea
1580: 64 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20 24 6a 72  d $jrnl_name $jr
1590: 6e 6c 5f 70 67 5f 6f 66 66 73 65 74 20 34 5d 5d  nl_pg_offset 4]]
15a0: 0a 20 20 69 66 20 7b 24 64 62 5f 70 67 6e 6f 20  .  if {$db_pgno 
15b0: 3c 20 31 7d 20 7b 0a 20 20 20 20 70 75 74 73 20  < 1} {.    puts 
15c0: 22 57 41 52 4e 49 4e 47 3a 20 70 61 67 65 20 6e  "WARNING: page n
15d0: 75 6d 62 65 72 20 3c 20 31 3a 20 24 69 3d 24 64  umber < 1: $i=$d
15e0: 62 5f 70 67 6e 6f 22 0a 20 20 7d 0a 20 20 69 66  b_pgno".  }.  if
15f0: 20 7b 24 64 62 5f 70 67 6e 6f 20 3e 3d 20 24 64   {$db_pgno >= $d
1600: 62 5f 6e 70 61 67 65 7d 20 7b 0a 20 20 20 20 70  b_npage} {.    p
1610: 75 74 73 20 22 57 41 52 4e 49 4e 47 3a 20 70 61  uts "WARNING: pa
1620: 67 65 20 6e 75 6d 62 65 72 20 3e 3d 20 24 64 62  ge number >= $db
1630: 5f 6e 70 61 67 65 3a 20 24 69 3d 24 64 62 5f 70  _npage: $i=$db_p
1640: 67 6e 6f 22 0a 20 20 7d 0a 7d 0a 0a 23 20 64 75  gno".  }.}..# du
1650: 6d 70 20 70 61 67 65 20 64 61 74 61 0a 69 66 20  mp page data.if 
1660: 7b 24 64 75 6d 70 5f 70 61 67 65 73 7d 20 7b 0a  {$dump_pages} {.
1670: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
1680: 7b 24 69 3c 24 6a 72 6e 6c 5f 6e 70 61 67 65 7d  {$i<$jrnl_npage}
1690: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
16a0: 64 75 6d 70 5f 6a 72 6e 6c 5f 70 61 67 65 20 24  dump_jrnl_page $
16b0: 69 0a 20 20 7d 0a 7d 0a 0a 23 20 77 72 69 74 65  i.  }.}..# write
16c0: 20 74 68 65 20 38 20 62 79 74 65 20 6d 61 67 69   the 8 byte magi
16d0: 63 20 73 74 72 69 6e 67 0a 68 65 78 69 6f 5f 77  c string.hexio_w
16e0: 72 69 74 65 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20  rite $jrnl_name 
16f0: 30 20 64 39 64 35 30 35 66 39 32 30 61 31 36 33  0 d9d505f920a163
1700: 64 37 0a 0a 23 20 77 72 69 74 65 20 2d 31 20 66  d7..# write -1 f
1710: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  or number of rec
1720: 6f 72 64 73 0a 68 65 78 69 6f 5f 77 72 69 74 65  ords.hexio_write
1730: 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20 38 20 66 66   $jrnl_name 8 ff
1740: 66 66 66 66 66 66 0a 0a 23 20 77 72 69 74 65 20  ffffff..# write 
1750: 30 30 20 66 6f 72 20 63 68 65 63 6b 73 75 6d 20  00 for checksum 
1760: 6e 6f 6e 63 65 0a 68 65 78 69 6f 5f 77 72 69 74  nonce.hexio_writ
1770: 65 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20 31 32 20  e $jrnl_name 12 
1780: 5b 66 6f 72 6d 61 74 20 25 30 38 78 20 24 6e 6f  [format %08x $no
1790: 6e 63 65 5d 0a 0a 23 20 77 72 69 74 65 20 70 61  nce]..# write pa
17a0: 67 65 20 63 6f 75 6e 74 0a 68 65 78 69 6f 5f 77  ge count.hexio_w
17b0: 72 69 74 65 20 24 6a 72 6e 6c 5f 6e 61 6d 65 20  rite $jrnl_name 
17c0: 31 36 20 5b 66 6f 72 6d 61 74 20 25 30 38 78 20  16 [format %08x 
17d0: 24 64 62 5f 6e 70 61 67 65 5d 0a 0a 23 20 77 72  $db_npage]..# wr
17e0: 69 74 65 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ite sector size.
17f0: 68 65 78 69 6f 5f 77 72 69 74 65 20 24 6a 72 6e  hexio_write $jrn
1800: 6c 5f 6e 61 6d 65 20 32 30 20 5b 66 6f 72 6d 61  l_name 20 [forma
1810: 74 20 25 30 38 78 20 24 73 65 63 74 73 7a 5d 0a  t %08x $sectsz].
1820: 0a 23 20 77 72 69 74 65 20 70 61 67 65 20 73 69  .# write page si
1830: 7a 65 0a 68 65 78 69 6f 5f 77 72 69 74 65 20 24  ze.hexio_write $
1840: 6a 72 6e 6c 5f 6e 61 6d 65 20 32 34 20 5b 66 6f  jrnl_name 24 [fo
1850: 72 6d 61 74 20 25 30 38 78 20 24 64 62 5f 70 67  rmat %08x $db_pg
1860: 73 7a 5d 0a 0a 23 20 63 68 65 63 6b 20 74 68 65  sz]..# check the
1870: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
1880: 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  e database with 
1890: 74 68 65 20 70 61 74 63 68 65 64 20 6a 6f 75 72  the patched jour
18a0: 6e 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20 24  nal.sqlite3 db $
18b0: 64 62 5f 6e 61 6d 65 0a 64 6f 5f 74 65 73 74 20  db_name.do_test 
18c0: 72 65 73 74 6f 72 65 5f 6a 72 6e 6c 2d 31 2e 30  restore_jrnl-1.0
18d0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 50   {.  catchsql {P
18e0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
18f0: 63 68 65 63 6b 7d 0a 7d 20 7b 30 20 6f 6b 7d 0a  check}.} {0 ok}.
1900: 64 62 20 63 6c 6f 73 65 0a 0a                    db close..