/ Hex Artifact Content
Login

Artifact 85cb36d4fe3e93e2fbd63e786e0d1ce42d0c4fad:


0000: 2f 2a 0a 2a 2a 20 41 20 75 74 69 6c 69 74 79 20  /*.** A utility 
0010: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 63 6f 6e  for printing con
0020: 74 65 6e 74 20 66 72 6f 6d 20 61 20 77 72 69 74  tent from a writ
0030: 65 2d 61 68 65 61 64 20 6c 6f 67 20 66 69 6c 65  e-ahead log file
0040: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73  ..*/.#include <s
0050: 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  tdio.h>.#include
0060: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c   <ctype.h>.#incl
0070: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68  ude <sys/types.h
0080: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0090: 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  stat.h>.#include
00a0: 20 3c 66 63 6e 74 6c 2e 68 3e 0a 0a 23 69 66 20   <fcntl.h>..#if 
00b0: 21 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45  !defined(_MSC_VE
00c0: 52 29 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  R).#include <uni
00d0: 73 74 64 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 6e  std.h>.#else.#in
00e0: 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 65 6e  clude <io.h>.#en
00f0: 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73  dif..#include <s
0100: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0110: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 0a 73  e <string.h>...s
0120: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 73 69  tatic int pagesi
0130: 7a 65 20 3d 20 31 30 32 34 3b 20 20 20 20 20 2f  ze = 1024;     /
0140: 2a 20 53 69 7a 65 20 6f 66 20 61 20 64 61 74 61  * Size of a data
0150: 62 61 73 65 20 70 61 67 65 20 2a 2f 0a 73 74 61  base page */.sta
0160: 74 69 63 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  tic int fd = -1;
0170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0180: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
0190: 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  for reading the 
01a0: 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 73 74 61 74  WAL file */.stat
01b0: 69 63 20 69 6e 74 20 6d 78 46 72 61 6d 65 20 3d  ic int mxFrame =
01c0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c   0;         /* L
01d0: 61 73 74 20 66 72 61 6d 65 20 2a 2f 0a 73 74 61  ast frame */.sta
01e0: 74 69 63 20 69 6e 74 20 70 65 72 4c 69 6e 65 20  tic int perLine 
01f0: 3d 20 31 36 3b 20 20 20 20 20 20 20 20 2f 2a 20  = 16;        /* 
0200: 48 45 58 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  HEX elements to 
0210: 70 72 69 6e 74 20 70 65 72 20 6c 69 6e 65 20 2a  print per line *
0220: 2f 0a 0a 74 79 70 65 64 65 66 20 6c 6f 6e 67 20  /..typedef long 
0230: 6c 6f 6e 67 20 69 6e 74 20 69 36 34 3b 20 20 20  long int i64;   
0240: 20 20 20 2f 2a 20 44 61 74 61 74 79 70 65 20 66     /* Datatype f
0250: 6f 72 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  or 64-bit intege
0260: 72 73 20 2a 2f 0a 0a 2f 2a 20 49 6e 66 6f 72 6d  rs */../* Inform
0270: 61 74 69 6f 6e 20 66 6f 72 20 63 6f 6d 70 75 74  ation for comput
0280: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
0290: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
02a0: 63 74 20 43 6b 73 75 6d 20 43 6b 73 75 6d 3b 0a  ct Cksum Cksum;.
02b0: 73 74 72 75 63 74 20 43 6b 73 75 6d 20 7b 0a 20  struct Cksum {. 
02c0: 20 69 6e 74 20 62 53 77 61 70 3b 20 20 20 20 20   int bSwap;     
02d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
02e0: 20 64 6f 20 62 79 74 65 20 73 77 61 70 70 69 6e   do byte swappin
02f0: 67 20 6f 6e 20 33 32 2d 62 69 74 20 77 6f 72 64  g on 32-bit word
0300: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
0310: 73 30 2c 20 73 31 3b 20 20 20 20 20 2f 2a 20 43  s0, s1;     /* C
0320: 75 72 72 65 6e 74 20 63 68 65 63 6b 73 75 6d 20  urrent checksum 
0330: 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  value */.};../*.
0340: 2a 2a 20 65 78 74 72 61 63 74 20 61 20 33 32 2d  ** extract a 32-
0350: 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  bit big-endian i
0360: 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63  nteger.*/.static
0370: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
0380: 74 49 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73  tInt32(const uns
0390: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
03a0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
03b0: 20 3d 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20   = (a[0]<<24) + 
03c0: 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b  (a[1]<<16) + (a[
03d0: 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 20  2]<<8) + a[3];. 
03e0: 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a   return x;.}../*
03f0: 0a 2a 2a 20 53 77 61 70 20 62 79 74 65 73 20 6f  .** Swap bytes o
0400: 6e 20 61 20 33 32 2d 62 69 74 20 75 6e 73 69 67  n a 32-bit unsig
0410: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73  ned integer.*/.s
0420: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
0430: 6e 74 20 73 77 61 62 33 32 28 75 6e 73 69 67 6e  nt swab32(unsign
0440: 65 64 20 69 6e 74 20 78 29 7b 0a 20 20 72 65 74  ed int x){.  ret
0450: 75 72 6e 20 28 28 28 78 29 26 30 78 30 30 30 30  urn (((x)&0x0000
0460: 30 30 46 46 29 3c 3c 32 34 29 20 2b 20 28 28 28  00FF)<<24) + (((
0470: 78 29 26 30 78 30 30 30 30 46 46 30 30 29 3c 3c  x)&0x0000FF00)<<
0480: 38 29 0a 20 20 20 20 20 20 20 20 20 2b 20 28 28  8).         + ((
0490: 28 78 29 26 30 78 30 30 46 46 30 30 30 30 29 3e  (x)&0x00FF0000)>
04a0: 3e 38 29 20 20 2b 20 28 28 28 78 29 26 30 78 46  >8)  + (((x)&0xF
04b0: 46 30 30 30 30 30 30 29 3e 3e 32 34 29 3b 0a 7d  F000000)>>24);.}
04c0: 0a 0a 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20  ../* Extend the 
04d0: 63 68 65 63 6b 73 75 6d 2e 20 20 52 65 69 6e 69  checksum.  Reini
04e0: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68 65 63  tialize the chec
04f0: 6b 73 75 6d 20 69 66 20 62 49 6e 69 74 20 69 73  ksum if bInit is
0500: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
0510: 20 76 6f 69 64 20 65 78 74 65 6e 64 43 6b 73 75   void extendCksu
0520: 6d 28 0a 20 20 43 6b 73 75 6d 20 2a 70 43 6b 73  m(.  Cksum *pCks
0530: 75 6d 2c 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  um,.  unsigned c
0540: 68 61 72 20 2a 61 44 61 74 61 2c 0a 20 20 75 6e  har *aData,.  un
0550: 73 69 67 6e 65 64 20 69 6e 74 20 6e 42 79 74 65  signed int nByte
0560: 2c 0a 20 20 69 6e 74 20 62 49 6e 69 74 0a 29 7b  ,.  int bInit.){
0570: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
0580: 2a 61 33 32 3b 0a 20 20 69 66 28 20 62 49 6e 69  *a32;.  if( bIni
0590: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  t ){.    int a =
05a0: 20 30 3b 0a 20 20 20 20 2a 28 28 63 68 61 72 2a   0;.    *((char*
05b0: 29 26 61 29 20 3d 20 31 3b 0a 20 20 20 20 69 66  )&a) = 1;.    if
05c0: 28 20 61 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( a==1 ){.      
05d0: 2f 2a 20 48 6f 73 74 20 69 73 20 6c 69 74 74 6c  /* Host is littl
05e0: 65 2d 65 6e 64 69 61 6e 20 2a 2f 0a 20 20 20 20  e-endian */.    
05f0: 20 20 70 43 6b 73 75 6d 2d 3e 62 53 77 61 70 20    pCksum->bSwap 
0600: 3d 20 67 65 74 49 6e 74 33 32 28 61 44 61 74 61  = getInt32(aData
0610: 29 21 3d 30 78 33 37 37 66 30 36 38 32 3b 0a 20  )!=0x377f0682;. 
0620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0630: 2f 2a 20 48 6f 73 74 20 69 73 20 62 69 67 2d 65  /* Host is big-e
0640: 6e 64 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70  ndian */.      p
0650: 43 6b 73 75 6d 2d 3e 62 53 77 61 70 20 3d 20 67  Cksum->bSwap = g
0660: 65 74 49 6e 74 33 32 28 61 44 61 74 61 29 21 3d  etInt32(aData)!=
0670: 30 78 33 37 37 66 30 36 38 33 3b 0a 20 20 20 20  0x377f0683;.    
0680: 7d 0a 20 20 20 20 70 43 6b 73 75 6d 2d 3e 73 30  }.    pCksum->s0
0690: 20 3d 20 30 3b 0a 20 20 20 20 70 43 6b 73 75 6d   = 0;.    pCksum
06a0: 2d 3e 73 31 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ->s1 = 0;.  }.  
06b0: 61 33 32 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  a32 = (unsigned 
06c0: 69 6e 74 2a 29 61 44 61 74 61 3b 0a 20 20 77 68  int*)aData;.  wh
06d0: 69 6c 65 28 20 6e 42 79 74 65 3e 30 20 29 7b 0a  ile( nByte>0 ){.
06e0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
06f0: 20 78 30 20 3d 20 61 33 32 5b 30 5d 3b 0a 20 20   x0 = a32[0];.  
0700: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
0710: 31 20 3d 20 61 33 32 5b 31 5d 3b 0a 20 20 20 20  1 = a32[1];.    
0720: 69 66 28 20 70 43 6b 73 75 6d 2d 3e 62 53 77 61  if( pCksum->bSwa
0730: 70 20 29 7b 0a 20 20 20 20 20 20 78 30 20 3d 20  p ){.      x0 = 
0740: 73 77 61 62 33 32 28 78 30 29 3b 0a 20 20 20 20  swab32(x0);.    
0750: 20 20 78 31 20 3d 20 73 77 61 62 33 32 28 78 31    x1 = swab32(x1
0760: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6b  );.    }.    pCk
0770: 73 75 6d 2d 3e 73 30 20 2b 3d 20 78 30 20 2b 20  sum->s0 += x0 + 
0780: 70 43 6b 73 75 6d 2d 3e 73 31 3b 0a 20 20 20 20  pCksum->s1;.    
0790: 70 43 6b 73 75 6d 2d 3e 73 31 20 2b 3d 20 78 31  pCksum->s1 += x1
07a0: 20 2b 20 70 43 6b 73 75 6d 2d 3e 73 30 3b 0a 20   + pCksum->s0;. 
07b0: 20 20 20 6e 42 79 74 65 20 2d 3d 20 38 3b 0a 20     nByte -= 8;. 
07c0: 20 20 20 61 33 32 20 2b 3d 20 32 3b 0a 20 20 7d     a32 += 2;.  }
07d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
07e0: 74 20 74 68 65 20 76 61 72 2d 69 6e 74 20 66 6f  t the var-int fo
07f0: 72 6d 61 74 20 69 6e 74 6f 20 69 36 34 2e 20 20  rmat into i64.  
0800: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
0810: 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 69 6e  r of bytes.** in
0820: 20 74 68 65 20 76 61 72 2d 69 6e 74 2e 20 20 57   the var-int.  W
0830: 72 69 74 65 20 74 68 65 20 76 61 72 2d 69 6e 74  rite the var-int
0840: 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 70 56 61   value into *pVa
0850: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
0860: 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28 63 6f   decodeVarint(co
0870: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
0880: 72 20 2a 7a 2c 20 69 36 34 20 2a 70 56 61 6c 29  r *z, i64 *pVal)
0890: 7b 0a 20 20 69 36 34 20 76 20 3d 20 30 3b 0a 20  {.  i64 v = 0;. 
08a0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
08b0: 30 3b 20 69 3c 38 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<8; i++){.  
08c0: 20 20 76 20 3d 20 28 76 3c 3c 37 29 20 2b 20 28    v = (v<<7) + (
08d0: 7a 5b 69 5d 26 30 78 37 66 29 3b 0a 20 20 20 20  z[i]&0x7f);.    
08e0: 69 66 28 20 28 7a 5b 69 5d 26 30 78 38 30 29 3d  if( (z[i]&0x80)=
08f0: 3d 30 20 29 7b 20 2a 70 56 61 6c 20 3d 20 76 3b  =0 ){ *pVal = v;
0900: 20 72 65 74 75 72 6e 20 69 2b 31 3b 20 7d 0a 20   return i+1; }. 
0910: 20 7d 0a 20 20 76 20 3d 20 28 76 3c 3c 38 29 20   }.  v = (v<<8) 
0920: 2b 20 28 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  + (z[i]&0xff);. 
0930: 20 2a 70 56 61 6c 20 3d 20 76 3b 0a 20 20 72 65   *pVal = v;.  re
0940: 74 75 72 6e 20 39 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 9;.}../* Re
0950: 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  port an out-of-m
0960: 65 6d 6f 72 79 20 65 72 72 6f 72 20 61 6e 64 20  emory error and 
0970: 64 69 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  die..*/.static v
0980: 6f 69 64 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  oid out_of_memor
0990: 79 28 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e  y(void){.  fprin
09a0: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
09b0: 66 20 6d 65 6d 6f 72 79 2e 2e 2e 5c 6e 22 29 3b  f memory...\n");
09c0: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f  .  exit(1);.}../
09d0: 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e  *.** Read conten
09e0: 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2e  t from the file.
09f0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
0a00: 68 6f 6c 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  hold the content
0a10: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
0a20: 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6e  m malloc() and n
0a30: 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 66 72  eeds to be.** fr
0a40: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
0a50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  r..*/.static uns
0a60: 69 67 6e 65 64 20 63 68 61 72 20 2a 67 65 74 43  igned char *getC
0a70: 6f 6e 74 65 6e 74 28 69 6e 74 20 6f 66 73 74 2c  ontent(int ofst,
0a80: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 75   int nByte){.  u
0a90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
0aa0: 61 74 61 3b 0a 20 20 61 44 61 74 61 20 3d 20 6d  ata;.  aData = m
0ab0: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
0ac0: 69 66 28 20 61 44 61 74 61 3d 3d 30 20 29 20 6f  if( aData==0 ) o
0ad0: 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
0ae0: 20 20 6c 73 65 65 6b 28 66 64 2c 20 6f 66 73 74    lseek(fd, ofst
0af0: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72  , SEEK_SET);.  r
0b00: 65 61 64 28 66 64 2c 20 61 44 61 74 61 2c 20 6e  ead(fd, aData, n
0b10: 42 79 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Byte);.  return 
0b20: 61 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  aData;.}../*.** 
0b30: 50 72 69 6e 74 20 61 20 72 61 6e 67 65 20 6f 66  Print a range of
0b40: 20 62 79 74 65 73 20 61 73 20 68 65 78 20 61 6e   bytes as hex an
0b50: 64 20 61 73 20 61 73 63 69 69 2e 0a 2a 2f 0a 73  d as ascii..*/.s
0b60: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
0b70: 5f 62 79 74 65 5f 72 61 6e 67 65 28 0a 20 20 69  _byte_range(.  i
0b80: 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
0b90: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
0ba0: 79 74 65 20 69 6e 20 74 68 65 20 72 61 6e 67 65  yte in the range
0bb0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 70 72 69   of bytes to pri
0bc0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  nt */.  int nByt
0bd0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
0be0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
0bf0: 73 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20  s to print */.  
0c00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
0c10: 44 61 74 61 2c 20 20 2f 2a 20 43 6f 6e 74 65 6e  Data,  /* Conten
0c20: 74 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20  t to print */.  
0c30: 69 6e 74 20 70 72 69 6e 74 4f 66 73 74 20 20 20  int printOfst   
0c40: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
0c50: 69 73 20 61 6d 6f 75 6e 74 20 74 6f 20 74 68 65  is amount to the
0c60: 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 6c 65   index on the le
0c70: 66 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ft column */.){.
0c80: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f    int i, j;.  co
0c90: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 66 73 74 46  nst char *zOfstF
0ca0: 6d 74 3b 0a 0a 20 20 69 66 28 20 28 28 70 72 69  mt;..  if( ((pri
0cb0: 6e 74 4f 66 73 74 2b 6e 42 79 74 65 29 26 7e 30  ntOfst+nByte)&~0
0cc0: 78 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  xfff)==0 ){.    
0cd0: 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 33  zOfstFmt = " %03
0ce0: 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  x: ";.  }else if
0cf0: 28 20 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42  ( ((printOfst+nB
0d00: 79 74 65 29 26 7e 30 78 66 66 66 66 29 3d 3d 30  yte)&~0xffff)==0
0d10: 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74   ){.    zOfstFmt
0d20: 20 3d 20 22 20 25 30 34 78 3a 20 22 3b 0a 20 20   = " %04x: ";.  
0d30: 7d 65 6c 73 65 20 69 66 28 20 28 28 70 72 69 6e  }else if( ((prin
0d40: 74 4f 66 73 74 2b 6e 42 79 74 65 29 26 7e 30 78  tOfst+nByte)&~0x
0d50: 66 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20  fffff)==0 ){.   
0d60: 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30   zOfstFmt = " %0
0d70: 35 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69  5x: ";.  }else i
0d80: 66 28 20 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e  f( ((printOfst+n
0d90: 42 79 74 65 29 26 7e 30 78 66 66 66 66 66 66 29  Byte)&~0xffffff)
0da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74  ==0 ){.    zOfst
0db0: 46 6d 74 20 3d 20 22 20 25 30 36 78 3a 20 22 3b  Fmt = " %06x: ";
0dc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f  .  }else{.    zO
0dd0: 66 73 74 46 6d 74 20 3d 20 22 20 25 30 38 78 3a  fstFmt = " %08x:
0de0: 20 22 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69   ";.  }..  for(i
0df0: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 20 2b  =0; i<nByte; i +
0e00: 3d 20 70 65 72 4c 69 6e 65 29 7b 0a 20 20 20 20  = perLine){.    
0e10: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
0e20: 7a 4f 66 73 74 46 6d 74 2c 20 69 2b 70 72 69 6e  zOfstFmt, i+prin
0e30: 74 4f 66 73 74 29 3b 0a 20 20 20 20 66 6f 72 28  tOfst);.    for(
0e40: 6a 3d 30 3b 20 6a 3c 70 65 72 4c 69 6e 65 3b 20  j=0; j<perLine; 
0e50: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0e60: 69 2b 6a 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20  i+j>nByte ){.   
0e70: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
0e80: 6f 75 74 2c 20 22 20 20 20 22 29 3b 0a 20 20 20  out, "   ");.   
0e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0ea0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
0eb0: 2c 22 25 30 32 78 20 22 2c 20 61 44 61 74 61 5b  ,"%02x ", aData[
0ec0: 69 2b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i+j]);.      }. 
0ed0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
0ee0: 3b 20 6a 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b  ; j<perLine; j++
0ef0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 2b 6a  ){.      if( i+j
0f00: 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  >nByte ){.      
0f10: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
0f20: 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 7d 65  , " ");.      }e
0f30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
0f40: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 63 22  intf(stdout,"%c"
0f50: 2c 20 69 73 70 72 69 6e 74 28 61 44 61 74 61 5b  , isprint(aData[
0f60: 69 2b 6a 5d 29 20 3f 20 61 44 61 74 61 5b 69 2b  i+j]) ? aData[i+
0f70: 6a 5d 20 3a 20 27 2e 27 29 3b 0a 20 20 20 20 20  j] : '.');.     
0f80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72   }.    }.    fpr
0f90: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 5c 6e 22  intf(stdout,"\n"
0fa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69  );.  }.}../* Pri
0fb0: 6e 74 20 61 20 6c 69 6e 65 20 6f 66 20 64 65 63  nt a line of dec
0fc0: 6f 64 65 20 6f 75 74 70 75 74 20 73 68 6f 77 69  ode output showi
0fd0: 6e 67 20 61 20 34 2d 62 79 74 65 20 69 6e 74 65  ng a 4-byte inte
0fe0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ger..*/.static v
0ff0: 6f 69 64 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  oid print_decode
1000: 5f 6c 69 6e 65 28 0a 20 20 75 6e 73 69 67 6e 65  _line(.  unsigne
1010: 64 20 63 68 61 72 20 2a 61 44 61 74 61 2c 20 20  d char *aData,  
1020: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 62      /* Content b
1030: 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
1040: 20 20 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20    int ofst, int 
1050: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  nByte,       /* 
1060: 53 74 61 72 74 20 61 6e 64 20 73 69 7a 65 20 6f  Start and size o
1070: 66 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  f decode */.  in
1080: 74 20 61 73 48 65 78 2c 20 20 20 20 20 20 20 20  t asHex,        
1090: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
10a0: 72 75 65 2c 20 6f 75 74 70 75 74 20 76 61 6c 75  rue, output valu
10b0: 65 20 61 73 20 68 65 78 20 2a 2f 0a 20 20 63 6f  e as hex */.  co
10c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 20  nst char *zMsg  
10d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
10e0: 61 67 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  age to append */
10f0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
1100: 20 20 69 6e 74 20 76 61 6c 20 3d 20 61 44 61 74    int val = aDat
1110: 61 5b 6f 66 73 74 5d 3b 0a 20 20 63 68 61 72 20  a[ofst];.  char 
1120: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 73 70 72  zBuf[100];.  spr
1130: 69 6e 74 66 28 7a 42 75 66 2c 20 22 20 25 30 33  intf(zBuf, " %03
1140: 78 3a 20 25 30 32 78 22 2c 20 6f 66 73 74 2c 20  x: %02x", ofst, 
1150: 61 44 61 74 61 5b 6f 66 73 74 5d 29 3b 0a 20 20  aData[ofst]);.  
1160: 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  i = (int)strlen(
1170: 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 6a 3d 31  zBuf);.  for(j=1
1180: 3b 20 6a 3c 34 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<4; j++){.   
1190: 20 69 66 28 20 6a 3e 3d 6e 42 79 74 65 20 29 7b   if( j>=nByte ){
11a0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 26  .      sprintf(&
11b0: 7a 42 75 66 5b 69 5d 2c 20 22 20 20 20 22 29 3b  zBuf[i], "   ");
11c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11d0: 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b    sprintf(&zBuf[
11e0: 69 5d 2c 20 22 20 25 30 32 78 22 2c 20 61 44 61  i], " %02x", aDa
11f0: 74 61 5b 6f 66 73 74 2b 6a 5d 29 3b 0a 20 20 20  ta[ofst+j]);.   
1200: 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a 32 35 36     val = val*256
1210: 20 2b 20 61 44 61 74 61 5b 6f 66 73 74 2b 6a 5d   + aData[ofst+j]
1220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 2b 3d  ;.    }.    i +=
1230: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 26 7a 42   (int)strlen(&zB
1240: 75 66 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  uf[i]);.  }.  if
1250: 28 20 61 73 48 65 78 20 29 7b 0a 20 20 20 20 73  ( asHex ){.    s
1260: 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d 2c  printf(&zBuf[i],
1270: 20 22 20 20 30 78 25 30 38 78 22 2c 20 76 61 6c   "  0x%08x", val
1280: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1290: 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d  sprintf(&zBuf[i]
12a0: 2c 20 22 20 20 20 25 39 64 22 2c 20 76 61 6c 29  , "   %9d", val)
12b0: 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22  ;.  }.  printf("
12c0: 25 73 20 20 25 73 5c 6e 22 2c 20 7a 42 75 66 2c  %s  %s\n", zBuf,
12d0: 20 7a 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zMsg);.}../*.**
12e0: 20 50 72 69 6e 74 20 61 6e 20 65 6e 74 69 72 65   Print an entire
12f0: 20 70 61 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74   page of content
1300: 20 61 73 20 68 65 78 0a 2a 2f 0a 73 74 61 74 69   as hex.*/.stati
1310: 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 66 72 61  c void print_fra
1320: 6d 65 28 69 6e 74 20 69 46 72 61 6d 65 29 7b 0a  me(int iFrame){.
1330: 20 20 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20    int iStart;.  
1340: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1350: 44 61 74 61 3b 0a 20 20 69 53 74 61 72 74 20 3d  Data;.  iStart =
1360: 20 33 32 20 2b 20 28 69 46 72 61 6d 65 2d 31 29   32 + (iFrame-1)
1370: 2a 28 70 61 67 65 73 69 7a 65 2b 32 34 29 3b 0a  *(pagesize+24);.
1380: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
1390: 2c 20 22 46 72 61 6d 65 20 25 64 3a 20 20 20 28  , "Frame %d:   (
13a0: 6f 66 66 73 65 74 73 20 30 78 25 78 2e 2e 30 78  offsets 0x%x..0x
13b0: 25 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %x)\n",.        
13c0: 20 20 69 46 72 61 6d 65 2c 20 69 53 74 61 72 74    iFrame, iStart
13d0: 2c 20 69 53 74 61 72 74 2b 70 61 67 65 73 69 7a  , iStart+pagesiz
13e0: 65 2b 32 34 29 3b 0a 20 20 61 44 61 74 61 20 3d  e+24);.  aData =
13f0: 20 67 65 74 43 6f 6e 74 65 6e 74 28 69 53 74 61   getContent(iSta
1400: 72 74 2c 20 70 61 67 65 73 69 7a 65 2b 32 34 29  rt, pagesize+24)
1410: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1420: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 30 2c 20  _line(aData, 0, 
1430: 34 2c 20 30 2c 20 22 50 61 67 65 20 6e 75 6d 62  4, 0, "Page numb
1440: 65 72 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  er");.  print_de
1450: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1460: 20 34 2c 20 34 2c 20 30 2c 20 22 44 42 20 73 69   4, 4, 0, "DB si
1470: 7a 65 2c 20 6f 72 20 30 20 66 6f 72 20 6e 6f 6e  ze, or 0 for non
1480: 2d 63 6f 6d 6d 69 74 22 29 3b 0a 20 20 70 72 69  -commit");.  pri
1490: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
14a0: 44 61 74 61 2c 20 38 2c 20 34 2c 20 31 2c 20 22  Data, 8, 4, 1, "
14b0: 53 61 6c 74 2d 31 22 29 3b 0a 20 20 70 72 69 6e  Salt-1");.  prin
14c0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
14d0: 61 74 61 2c 31 32 2c 20 34 2c 20 31 2c 20 22 53  ata,12, 4, 1, "S
14e0: 61 6c 74 2d 32 22 29 3b 0a 20 20 70 72 69 6e 74  alt-2");.  print
14f0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1500: 74 61 2c 31 36 2c 20 34 2c 20 31 2c 20 22 43 68  ta,16, 4, 1, "Ch
1510: 65 63 6b 73 75 6d 2d 31 22 29 3b 0a 20 20 70 72  ecksum-1");.  pr
1520: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1530: 61 44 61 74 61 2c 32 30 2c 20 34 2c 20 31 2c 20  aData,20, 4, 1, 
1540: 22 43 68 65 63 6b 73 75 6d 2d 32 22 29 3b 0a 20  "Checksum-2");. 
1550: 20 70 72 69 6e 74 5f 62 79 74 65 5f 72 61 6e 67   print_byte_rang
1560: 65 28 69 53 74 61 72 74 2b 32 34 2c 20 70 61 67  e(iStart+24, pag
1570: 65 73 69 7a 65 2c 20 61 44 61 74 61 2b 32 34 2c  esize, aData+24,
1580: 20 30 29 3b 0a 20 20 66 72 65 65 28 61 44 61 74   0);.  free(aDat
1590: 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 6d  a);.}../*.** Sum
15a0: 6d 61 72 69 7a 65 20 61 20 73 69 6e 67 6c 65 20  marize a single 
15b0: 66 72 61 6d 65 20 6f 6e 20 61 20 73 69 6e 67 6c  frame on a singl
15c0: 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  e line..*/.stati
15d0: 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 6f 6e 65  c void print_one
15e0: 6c 69 6e 65 5f 66 72 61 6d 65 28 69 6e 74 20 69  line_frame(int i
15f0: 46 72 61 6d 65 2c 20 43 6b 73 75 6d 20 2a 70 43  Frame, Cksum *pC
1600: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 69 53 74  ksum){.  int iSt
1610: 61 72 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  art;.  unsigned 
1620: 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 75  char *aData;.  u
1630: 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 30 2c 20  nsigned int s0, 
1640: 73 31 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 33  s1;.  iStart = 3
1650: 32 20 2b 20 28 69 46 72 61 6d 65 2d 31 29 2a 28  2 + (iFrame-1)*(
1660: 70 61 67 65 73 69 7a 65 2b 32 34 29 3b 0a 20 20  pagesize+24);.  
1670: 61 44 61 74 61 20 3d 20 67 65 74 43 6f 6e 74 65  aData = getConte
1680: 6e 74 28 69 53 74 61 72 74 2c 20 32 34 29 3b 0a  nt(iStart, 24);.
1690: 20 20 65 78 74 65 6e 64 43 6b 73 75 6d 28 70 43    extendCksum(pC
16a0: 6b 73 75 6d 2c 20 61 44 61 74 61 2c 20 38 2c 20  ksum, aData, 8, 
16b0: 30 29 3b 0a 20 20 65 78 74 65 6e 64 43 6b 73 75  0);.  extendCksu
16c0: 6d 28 70 43 6b 73 75 6d 2c 20 67 65 74 43 6f 6e  m(pCksum, getCon
16d0: 74 65 6e 74 28 69 53 74 61 72 74 2b 32 34 2c 20  tent(iStart+24, 
16e0: 70 61 67 65 73 69 7a 65 29 2c 20 70 61 67 65 73  pagesize), pages
16f0: 69 7a 65 2c 20 30 29 3b 0a 20 20 73 30 20 3d 20  ize, 0);.  s0 = 
1700: 67 65 74 49 6e 74 33 32 28 61 44 61 74 61 2b 31  getInt32(aData+1
1710: 36 29 3b 0a 20 20 73 31 20 3d 20 67 65 74 49 6e  6);.  s1 = getIn
1720: 74 33 32 28 61 44 61 74 61 2b 32 30 29 3b 0a 20  t32(aData+20);. 
1730: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
1740: 20 22 46 72 61 6d 65 20 25 34 64 3a 20 25 36 64   "Frame %4d: %6d
1750: 20 25 36 64 20 30 78 25 30 38 78 2c 25 30 38 78   %6d 0x%08x,%08x
1760: 20 30 78 25 30 38 78 2c 25 30 38 78 20 25 73 5c   0x%08x,%08x %s\
1770: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 46  n",.          iF
1780: 72 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  rame, .         
1790: 20 67 65 74 49 6e 74 33 32 28 61 44 61 74 61 29   getInt32(aData)
17a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 49  ,.          getI
17b0: 6e 74 33 32 28 61 44 61 74 61 2b 34 29 2c 0a 20  nt32(aData+4),. 
17c0: 20 20 20 20 20 20 20 20 20 67 65 74 49 6e 74 33           getInt3
17d0: 32 28 61 44 61 74 61 2b 38 29 2c 0a 20 20 20 20  2(aData+8),.    
17e0: 20 20 20 20 20 20 67 65 74 49 6e 74 33 32 28 61        getInt32(a
17f0: 44 61 74 61 2b 31 32 29 2c 0a 20 20 20 20 20 20  Data+12),.      
1800: 20 20 20 20 73 30 2c 0a 20 20 20 20 20 20 20 20      s0,.        
1810: 20 20 73 31 2c 0a 20 20 20 20 20 20 20 20 20 20    s1,.          
1820: 28 73 30 3d 3d 70 43 6b 73 75 6d 2d 3e 73 30 20  (s0==pCksum->s0 
1830: 26 26 20 73 31 3d 3d 70 43 6b 73 75 6d 2d 3e 73  && s1==pCksum->s
1840: 31 29 20 3f 20 22 22 20 3a 20 22 63 6b 73 75 6d  1) ? "" : "cksum
1850: 2d 66 61 69 6c 22 0a 20 20 29 3b 0a 0a 20 20 2f  -fail".  );..  /
1860: 2a 20 52 65 73 65 74 20 74 68 65 20 63 68 65 63  * Reset the chec
1870: 6b 73 75 6d 20 73 6f 20 74 68 61 74 20 61 20 73  ksum so that a s
1880: 69 6e 67 6c 65 20 66 72 61 6d 65 20 63 68 65 63  ingle frame chec
1890: 6b 73 75 6d 20 66 61 69 6c 75 72 65 20 77 69 6c  ksum failure wil
18a0: 6c 20 6e 6f 74 0a 20 20 2a 2a 20 63 61 75 73 65  l not.  ** cause
18b0: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
18c0: 66 72 61 6d 65 73 20 74 6f 20 61 6c 73 6f 20 73  frames to also s
18d0: 68 6f 77 20 61 20 66 61 69 6c 75 72 65 2e 20 2a  how a failure. *
18e0: 2f 0a 20 20 70 43 6b 73 75 6d 2d 3e 73 30 20 3d  /.  pCksum->s0 =
18f0: 20 73 30 3b 0a 20 20 70 43 6b 73 75 6d 2d 3e 73   s0;.  pCksum->s
1900: 31 20 3d 20 73 31 3b 0a 20 20 66 72 65 65 28 61  1 = s1;.  free(a
1910: 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
1920: 44 65 63 6f 64 65 20 74 68 65 20 57 41 4c 20 68  Decode the WAL h
1930: 65 61 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  eader..*/.static
1940: 20 76 6f 69 64 20 70 72 69 6e 74 5f 77 61 6c 5f   void print_wal_
1950: 68 65 61 64 65 72 28 43 6b 73 75 6d 20 2a 70 43  header(Cksum *pC
1960: 6b 73 75 6d 29 7b 0a 20 20 75 6e 73 69 67 6e 65  ksum){.  unsigne
1970: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20  d char *aData;. 
1980: 20 61 44 61 74 61 20 3d 20 67 65 74 43 6f 6e 74   aData = getCont
1990: 65 6e 74 28 30 2c 20 33 32 29 3b 0a 20 20 69 66  ent(0, 32);.  if
19a0: 28 20 70 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20  ( pCksum ){.    
19b0: 65 78 74 65 6e 64 43 6b 73 75 6d 28 70 43 6b 73  extendCksum(pCks
19c0: 75 6d 2c 20 61 44 61 74 61 2c 20 32 34 2c 20 31  um, aData, 24, 1
19d0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  );.    printf("C
19e0: 68 65 63 6b 73 75 6d 20 62 79 74 65 20 6f 72 64  hecksum byte ord
19f0: 65 72 3a 20 25 73 5c 6e 22 2c 20 70 43 6b 73 75  er: %s\n", pCksu
1a00: 6d 2d 3e 62 53 77 61 70 20 3f 20 22 73 77 61 70  m->bSwap ? "swap
1a10: 70 65 64 22 20 3a 20 22 6e 61 74 69 76 65 22 29  ped" : "native")
1a20: 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22  ;.  }.  printf("
1a30: 57 41 4c 20 48 65 61 64 65 72 3a 5c 6e 22 29 3b  WAL Header:\n");
1a40: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1a50: 6c 69 6e 65 28 61 44 61 74 61 2c 20 30 2c 20 34  line(aData, 0, 4
1a60: 2c 31 2c 22 4d 61 67 69 63 2e 20 20 30 78 33 37  ,1,"Magic.  0x37
1a70: 37 66 30 36 38 32 20 28 6c 65 29 20 6f 72 20 30  7f0682 (le) or 0
1a80: 78 33 37 37 66 30 36 38 33 20 28 62 65 29 22 29  x377f0683 (be)")
1a90: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1aa0: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 34 2c 20  _line(aData, 4, 
1ab0: 34 2c 20 30 2c 20 22 46 69 6c 65 20 66 6f 72 6d  4, 0, "File form
1ac0: 61 74 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  at");.  print_de
1ad0: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1ae0: 20 38 2c 20 34 2c 20 30 2c 20 22 44 61 74 61 62   8, 4, 0, "Datab
1af0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 22 29 3b  ase page size");
1b00: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1b10: 6c 69 6e 65 28 61 44 61 74 61 2c 20 31 32 2c 34  line(aData, 12,4
1b20: 2c 20 30 2c 20 22 43 68 65 63 6b 70 6f 69 6e 74  , 0, "Checkpoint
1b30: 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
1b40: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1b50: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 31  de_line(aData, 1
1b60: 36 2c 34 2c 20 31 2c 20 22 53 61 6c 74 2d 31 22  6,4, 1, "Salt-1"
1b70: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1b80: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 32 30  e_line(aData, 20
1b90: 2c 34 2c 20 31 2c 20 22 53 61 6c 74 2d 32 22 29  ,4, 1, "Salt-2")
1ba0: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1bb0: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 32 34 2c  _line(aData, 24,
1bc0: 34 2c 20 31 2c 20 22 43 68 65 63 6b 73 75 6d 2d  4, 1, "Checksum-
1bd0: 31 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  1");.  print_dec
1be0: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
1bf0: 32 38 2c 34 2c 20 31 2c 20 22 43 68 65 63 6b 73  28,4, 1, "Checks
1c00: 75 6d 2d 32 22 29 3b 0a 20 20 69 66 28 20 70 43  um-2");.  if( pC
1c10: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  ksum ){.    if( 
1c20: 70 43 6b 73 75 6d 2d 3e 73 30 21 3d 67 65 74 49  pCksum->s0!=getI
1c30: 6e 74 33 32 28 61 44 61 74 61 2b 32 34 29 20 29  nt32(aData+24) )
1c40: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
1c50: 2a 2a 2a 2a 20 63 6b 73 75 6d 2d 31 20 6d 69 73  **** cksum-1 mis
1c60: 6d 61 74 63 68 3a 20 30 78 25 30 38 78 5c 6e 22  match: 0x%08x\n"
1c70: 2c 20 70 43 6b 73 75 6d 2d 3e 73 30 29 3b 0a 20  , pCksum->s0);. 
1c80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6b     }.    if( pCk
1c90: 73 75 6d 2d 3e 73 31 21 3d 67 65 74 49 6e 74 33  sum->s1!=getInt3
1ca0: 32 28 61 44 61 74 61 2b 32 38 29 20 29 7b 0a 20  2(aData+28) ){. 
1cb0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 2a 2a 2a       printf("***
1cc0: 2a 20 63 6b 73 75 6d 2d 32 20 6d 69 73 6d 61 74  * cksum-2 mismat
1cd0: 63 68 3a 20 30 78 25 30 38 78 5c 6e 22 2c 20 70  ch: 0x%08x\n", p
1ce0: 43 6b 73 75 6d 2d 3e 73 31 29 3b 0a 20 20 20 20  Cksum->s1);.    
1cf0: 7d 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 44 61  }.  }.  free(aDa
1d00: 74 61 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 73  ta);.}./*.** Des
1d10: 63 72 69 62 65 20 63 65 6c 6c 20 63 6f 6e 74 65  cribe cell conte
1d20: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  nt..*/.static i6
1d30: 34 20 64 65 73 63 72 69 62 65 43 6f 6e 74 65 6e  4 describeConten
1d40: 74 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t(.  unsigned ch
1d50: 61 72 20 2a 61 2c 20 20 20 20 20 20 20 2f 2a 20  ar *a,       /* 
1d60: 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Cell content */.
1d70: 20 20 69 36 34 20 6e 4c 6f 63 61 6c 2c 20 20 20    i64 nLocal,   
1d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1d90: 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 63  es in a[] */.  c
1da0: 68 61 72 20 2a 7a 44 65 73 63 20 20 20 20 20 20  har *zDesc      
1db0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1dc0: 64 65 73 63 72 69 70 74 69 6f 6e 20 68 65 72 65  description here
1dd0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 44 65   */.){.  int nDe
1de0: 73 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c  sc = 0;.  int n,
1df0: 20 6a 3b 0a 20 20 69 36 34 20 69 2c 20 78 2c 20   j;.  i64 i, x, 
1e00: 76 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  v;.  const unsig
1e10: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 3b  ned char *pData;
1e20: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1e30: 64 20 63 68 61 72 20 2a 70 4c 69 6d 69 74 3b 0a  d char *pLimit;.
1e40: 20 20 63 68 61 72 20 73 65 70 20 3d 20 27 20 27    char sep = ' '
1e50: 3b 0a 0a 20 20 70 4c 69 6d 69 74 20 3d 20 26 61  ;..  pLimit = &a
1e60: 5b 6e 4c 6f 63 61 6c 5d 3b 0a 20 20 6e 20 3d 20  [nLocal];.  n = 
1e70: 64 65 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20  decodeVarint(a, 
1e80: 26 78 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 26  &x);.  pData = &
1e90: 61 5b 78 5d 3b 0a 20 20 61 20 2b 3d 20 6e 3b 0a  a[x];.  a += n;.
1ea0: 20 20 69 20 3d 20 78 20 2d 20 6e 3b 0a 20 20 77    i = x - n;.  w
1eb0: 68 69 6c 65 28 20 69 3e 30 20 26 26 20 70 44 61  hile( i>0 && pDa
1ec0: 74 61 3c 3d 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ta<=pLimit ){.  
1ed0: 20 20 6e 20 3d 20 64 65 63 6f 64 65 56 61 72 69    n = decodeVari
1ee0: 6e 74 28 61 2c 20 26 78 29 3b 0a 20 20 20 20 61  nt(a, &x);.    a
1ef0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 69 20 2d 3d 20   += n;.    i -= 
1f00: 6e 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 2d 3d  n;.    nLocal -=
1f10: 20 6e 3b 0a 20 20 20 20 7a 44 65 73 63 5b 30 5d   n;.    zDesc[0]
1f20: 20 3d 20 73 65 70 3b 0a 20 20 20 20 73 65 70 20   = sep;.    sep 
1f30: 3d 20 27 2c 27 3b 0a 20 20 20 20 6e 44 65 73 63  = ',';.    nDesc
1f40: 2b 2b 3b 0a 20 20 20 20 7a 44 65 73 63 2b 2b 3b  ++;.    zDesc++;
1f50: 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b  .    if( x==0 ){
1f60: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
1f70: 44 65 73 63 2c 20 22 2a 22 29 3b 20 20 20 20 20  Desc, "*");     
1f80: 2f 2a 20 4e 55 4c 4c 20 69 73 20 61 20 22 2a 22  /* NULL is a "*"
1f90: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
1fa0: 28 20 78 3e 3d 31 20 26 26 20 78 3c 3d 36 20 29  ( x>=1 && x<=6 )
1fb0: 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 73 69 67  {.      v = (sig
1fc0: 6e 65 64 20 63 68 61 72 29 70 44 61 74 61 5b 30  ned char)pData[0
1fd0: 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2b 2b  ];.      pData++
1fe0: 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
1ff0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  x ){.        cas
2000: 65 20 36 3a 20 20 76 20 3d 20 28 76 3c 3c 31 36  e 6:  v = (v<<16
2010: 29 20 2b 20 28 70 44 61 74 61 5b 30 5d 3c 3c 38  ) + (pData[0]<<8
2020: 29 20 2b 20 70 44 61 74 61 5b 31 5d 3b 20 20 70  ) + pData[1];  p
2030: 44 61 74 61 20 2b 3d 20 32 3b 0a 20 20 20 20 20  Data += 2;.     
2040: 20 20 20 63 61 73 65 20 35 3a 20 20 76 20 3d 20     case 5:  v = 
2050: 28 76 3c 3c 31 36 29 20 2b 20 28 70 44 61 74 61  (v<<16) + (pData
2060: 5b 30 5d 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b  [0]<<8) + pData[
2070: 31 5d 3b 20 20 70 44 61 74 61 20 2b 3d 20 32 3b  1];  pData += 2;
2080: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 34 3a  .        case 4:
2090: 20 20 76 20 3d 20 28 76 3c 3c 38 29 20 2b 20 70    v = (v<<8) + p
20a0: 44 61 74 61 5b 30 5d 3b 20 20 70 44 61 74 61 2b  Data[0];  pData+
20b0: 2b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  +;.        case 
20c0: 33 3a 20 20 76 20 3d 20 28 76 3c 3c 38 29 20 2b  3:  v = (v<<8) +
20d0: 20 70 44 61 74 61 5b 30 5d 3b 20 20 70 44 61 74   pData[0];  pDat
20e0: 61 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  a++;.        cas
20f0: 65 20 32 3a 20 20 76 20 3d 20 28 76 3c 3c 38 29  e 2:  v = (v<<8)
2100: 20 2b 20 70 44 61 74 61 5b 30 5d 3b 20 20 70 44   + pData[0];  pD
2110: 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ata++;.      }. 
2120: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65       sprintf(zDe
2130: 73 63 2c 20 22 25 6c 6c 64 22 2c 20 76 29 3b 0a  sc, "%lld", v);.
2140: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d      }else if( x=
2150: 3d 37 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69  =7 ){.      spri
2160: 6e 74 66 28 7a 44 65 73 63 2c 20 22 72 65 61 6c  ntf(zDesc, "real
2170: 22 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  ");.      pData 
2180: 2b 3d 20 38 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 8;.    }else 
2190: 69 66 28 20 78 3d 3d 38 20 29 7b 0a 20 20 20 20  if( x==8 ){.    
21a0: 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c    sprintf(zDesc,
21b0: 20 22 30 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65   "0");.    }else
21c0: 20 69 66 28 20 78 3d 3d 39 20 29 7b 0a 20 20 20   if( x==9 ){.   
21d0: 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73 63     sprintf(zDesc
21e0: 2c 20 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73  , "1");.    }els
21f0: 65 20 69 66 28 20 78 3e 3d 31 32 20 29 7b 0a 20  e if( x>=12 ){. 
2200: 20 20 20 20 20 69 36 34 20 73 69 7a 65 20 3d 20       i64 size = 
2210: 28 78 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  (x-12)/2;.      
2220: 69 66 28 20 28 78 26 31 29 3d 3d 30 20 29 7b 0a  if( (x&1)==0 ){.
2230: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
2240: 7a 44 65 73 63 2c 20 22 62 6c 6f 62 28 25 6c 6c  zDesc, "blob(%ll
2250: 64 29 22 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  d)", size);.    
2260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2270: 20 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20   sprintf(zDesc, 
2280: 22 74 78 74 28 25 6c 6c 64 29 22 2c 20 73 69 7a  "txt(%lld)", siz
2290: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22a0: 20 20 70 44 61 74 61 20 2b 3d 20 73 69 7a 65 3b    pData += size;
22b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 28  .    }.    j = (
22c0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 65 73 63  int)strlen(zDesc
22d0: 29 3b 0a 20 20 20 20 7a 44 65 73 63 20 2b 3d 20  );.    zDesc += 
22e0: 6a 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20  j;.    nDesc += 
22f0: 6a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  j;.  }.  return 
2300: 6e 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nDesc;.}../*.** 
2310: 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 6f 63 61  Compute the loca
2320: 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 67  l payload size g
2330: 69 76 65 6e 20 74 68 65 20 74 6f 74 61 6c 20 70  iven the total p
2340: 61 79 6c 6f 61 64 20 73 69 7a 65 20 61 6e 64 0a  ayload size and.
2350: 2a 2a 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ** the page size
2360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
2370: 6c 6f 63 61 6c 50 61 79 6c 6f 61 64 28 69 36 34  localPayload(i64
2380: 20 6e 50 61 79 6c 6f 61 64 2c 20 63 68 61 72 20   nPayload, char 
2390: 63 54 79 70 65 29 7b 0a 20 20 69 36 34 20 6d 61  cType){.  i64 ma
23a0: 78 4c 6f 63 61 6c 3b 0a 20 20 69 36 34 20 6d 69  xLocal;.  i64 mi
23b0: 6e 4c 6f 63 61 6c 3b 0a 20 20 69 36 34 20 73 75  nLocal;.  i64 su
23c0: 72 70 6c 75 73 3b 0a 20 20 69 36 34 20 6e 4c 6f  rplus;.  i64 nLo
23d0: 63 61 6c 3b 0a 20 20 69 66 28 20 63 54 79 70 65  cal;.  if( cType
23e0: 3d 3d 31 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ==13 ){.    /* T
23f0: 61 62 6c 65 20 6c 65 61 66 20 2a 2f 0a 20 20 20  able leaf */.   
2400: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 61 67 65   maxLocal = page
2410: 73 69 7a 65 2d 33 35 3b 0a 20 20 20 20 6d 69 6e  size-35;.    min
2420: 4c 6f 63 61 6c 20 3d 20 28 70 61 67 65 73 69 7a  Local = (pagesiz
2430: 65 2d 31 32 29 2a 33 32 2f 32 35 35 2d 32 33 3b  e-12)*32/255-23;
2440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61  .  }else{.    ma
2450: 78 4c 6f 63 61 6c 20 3d 20 28 70 61 67 65 73 69  xLocal = (pagesi
2460: 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 2d 32 33  ze-12)*64/255-23
2470: 3b 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  ;.    minLocal =
2480: 20 28 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 33   (pagesize-12)*3
2490: 32 2f 32 35 35 2d 32 33 3b 0a 20 20 7d 0a 20 20  2/255-23;.  }.  
24a0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 6d 61 78  if( nPayload>max
24b0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 73 75 72  Local ){.    sur
24c0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
24d0: 2b 20 28 6e 50 61 79 6c 6f 61 64 2d 6d 69 6e 4c  + (nPayload-minL
24e0: 6f 63 61 6c 29 25 28 70 61 67 65 73 69 7a 65 2d  ocal)%(pagesize-
24f0: 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70  4);.    if( surp
2500: 6c 75 73 3c 3d 6d 61 78 4c 6f 63 61 6c 20 29 7b  lus<=maxLocal ){
2510: 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
2520: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
2530: 73 65 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c  se{.      nLocal
2540: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
2550: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2560: 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61  nLocal = nPayloa
2570: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
2580: 6e 4c 6f 63 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nLocal;.}../*.**
2590: 20 43 72 65 61 74 65 20 61 20 64 65 73 63 72 69   Create a descri
25a0: 70 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ption for a sing
25b0: 6c 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  le cell..**.** T
25c0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
25d0: 69 73 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  is the local cel
25e0: 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  l size..*/.stati
25f0: 63 20 69 36 34 20 64 65 73 63 72 69 62 65 43 65  c i64 describeCe
2600: 6c 6c 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll(.  unsigned c
2610: 68 61 72 20 63 54 79 70 65 2c 20 20 20 20 2f 2a  har cType,    /*
2620: 20 50 61 67 65 20 74 79 70 65 20 2a 2f 0a 20 20   Page type */.  
2630: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2640: 2c 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20  ,       /* Cell 
2650: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
2660: 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74   showCellContent
2670: 2c 20 20 20 20 2f 2a 20 53 68 6f 77 20 63 65 6c  ,    /* Show cel
2680: 6c 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  l content if tru
2690: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
26a0: 44 65 73 63 20 20 20 20 20 20 20 20 20 20 20 2f  Desc           /
26b0: 2a 20 53 74 6f 72 65 20 64 65 73 63 72 69 70 74  * Store descript
26c0: 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ion here */.){. 
26d0: 20 69 6e 74 20 69 3b 0a 20 20 69 36 34 20 6e 44   int i;.  i64 nD
26e0: 65 73 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  esc = 0;.  int n
26f0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 65 66 74   = 0;.  int left
2700: 43 68 69 6c 64 3b 0a 20 20 69 36 34 20 6e 50 61  Child;.  i64 nPa
2710: 79 6c 6f 61 64 3b 0a 20 20 69 36 34 20 72 6f 77  yload;.  i64 row
2720: 69 64 3b 0a 20 20 69 36 34 20 6e 4c 6f 63 61 6c  id;.  i64 nLocal
2730: 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
2740: 7a 44 65 73 63 5b 31 30 30 30 5d 3b 0a 20 20 69  zDesc[1000];.  i
2750: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 54 79 70   = 0;.  if( cTyp
2760: 65 3c 3d 35 20 29 7b 0a 20 20 20 20 6c 65 66 74  e<=5 ){.    left
2770: 43 68 69 6c 64 20 3d 20 28 28 61 5b 30 5d 2a 32  Child = ((a[0]*2
2780: 35 36 20 2b 20 61 5b 31 5d 29 2a 32 35 36 20 2b  56 + a[1])*256 +
2790: 20 61 5b 32 5d 29 2a 32 35 36 20 2b 20 61 5b 33   a[2])*256 + a[3
27a0: 5d 3b 0a 20 20 20 20 61 20 2b 3d 20 34 3b 0a 20  ];.    a += 4;. 
27b0: 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20 20 20 73     n += 4;.    s
27c0: 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 6c  printf(zDesc, "l
27d0: 78 3a 20 25 64 20 22 2c 20 6c 65 66 74 43 68 69  x: %d ", leftChi
27e0: 6c 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 3d  ld);.    nDesc =
27f0: 20 73 74 72 6c 65 6e 28 7a 44 65 73 63 29 3b 0a   strlen(zDesc);.
2800: 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65 21    }.  if( cType!
2810: 3d 35 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65  =5 ){.    i = de
2820: 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 6e  codeVarint(a, &n
2830: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 61 20  Payload);.    a 
2840: 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20 69  += i;.    n += i
2850: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  ;.    sprintf(&z
2860: 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20 22 6e 3a  Desc[nDesc], "n:
2870: 20 25 6c 6c 64 20 22 2c 20 6e 50 61 79 6c 6f 61   %lld ", nPayloa
2880: 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d  d);.    nDesc +=
2890: 20 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b 6e   strlen(&zDesc[n
28a0: 44 65 73 63 5d 29 3b 0a 20 20 20 20 6e 4c 6f 63  Desc]);.    nLoc
28b0: 61 6c 20 3d 20 6c 6f 63 61 6c 50 61 79 6c 6f 61  al = localPayloa
28c0: 64 28 6e 50 61 79 6c 6f 61 64 2c 20 63 54 79 70  d(nPayload, cTyp
28d0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
28e0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 4c 6f 63   nPayload = nLoc
28f0: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
2900: 28 20 63 54 79 70 65 3d 3d 35 20 7c 7c 20 63 54  ( cType==5 || cT
2910: 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20 20 20 69  ype==13 ){.    i
2920: 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28   = decodeVarint(
2930: 61 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20 20  a, &rowid);.    
2940: 61 20 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d  a += i;.    n +=
2950: 20 69 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   i;.    sprintf(
2960: 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20 22  &zDesc[nDesc], "
2970: 72 3a 20 25 6c 6c 64 20 22 2c 20 72 6f 77 69 64  r: %lld ", rowid
2980: 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20  );.    nDesc += 
2990: 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b 6e 44  strlen(&zDesc[nD
29a0: 65 73 63 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  esc]);.  }.  if(
29b0: 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79 6c 6f 61 64   nLocal<nPayload
29c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 76 66 6c   ){.    int ovfl
29d0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
29e0: 68 61 72 20 2a 62 20 3d 20 26 61 5b 6e 4c 6f 63  har *b = &a[nLoc
29f0: 61 6c 5d 3b 0a 20 20 20 20 6f 76 66 6c 20 3d 20  al];.    ovfl = 
2a00: 28 28 62 5b 30 5d 2a 32 35 36 20 2b 20 62 5b 31  ((b[0]*256 + b[1
2a10: 5d 29 2a 32 35 36 20 2b 20 62 5b 32 5d 29 2a 32  ])*256 + b[2])*2
2a20: 35 36 20 2b 20 62 5b 33 5d 3b 0a 20 20 20 20 73  56 + b[3];.    s
2a30: 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b 6e 44  printf(&zDesc[nD
2a40: 65 73 63 5d 2c 20 22 6f 76 3a 20 25 64 20 22 2c  esc], "ov: %d ",
2a50: 20 6f 76 66 6c 29 3b 0a 20 20 20 20 6e 44 65 73   ovfl);.    nDes
2a60: 63 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 44 65  c += strlen(&zDe
2a70: 73 63 5b 6e 44 65 73 63 5d 29 3b 0a 20 20 20 20  sc[nDesc]);.    
2a80: 6e 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  n += 4;.  }.  if
2a90: 28 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e  ( showCellConten
2aa0: 74 20 26 26 20 63 54 79 70 65 21 3d 35 20 29 7b  t && cType!=5 ){
2ab0: 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20 64 65  .    nDesc += de
2ac0: 73 63 72 69 62 65 43 6f 6e 74 65 6e 74 28 61 2c  scribeContent(a,
2ad0: 20 6e 4c 6f 63 61 6c 2c 20 26 7a 44 65 73 63 5b   nLocal, &zDesc[
2ae0: 6e 44 65 73 63 2d 31 5d 29 3b 0a 20 20 7d 0a 20  nDesc-1]);.  }. 
2af0: 20 2a 70 7a 44 65 73 63 20 3d 20 7a 44 65 73 63   *pzDesc = zDesc
2b00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 4c 6f 63 61  ;.  return nLoca
2b10: 6c 2b 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  l+n;.}../*.** De
2b20: 63 6f 64 65 20 61 20 62 74 72 65 65 20 70 61 67  code a btree pag
2b30: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
2b40: 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f 70 61   decode_btree_pa
2b50: 67 65 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ge(.  unsigned c
2b60: 68 61 72 20 2a 61 2c 20 20 20 2f 2a 20 43 6f 6e  har *a,   /* Con
2b70: 74 65 6e 74 20 6f 66 20 74 68 65 20 62 74 72 65  tent of the btre
2b80: 65 20 70 61 67 65 20 74 6f 20 62 65 20 64 65 63  e page to be dec
2b90: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 70 67  oded */.  int pg
2ba0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
2bb0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
2bc0: 20 20 69 6e 74 20 68 64 72 53 69 7a 65 2c 20 20    int hdrSize,  
2bd0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2be0: 20 74 68 65 20 70 61 67 65 31 2d 68 65 61 64 65   the page1-heade
2bf0: 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
2c00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2c10: 73 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20  s   /* Flags to 
2c20: 63 6f 6e 74 72 6f 6c 20 66 6f 72 6d 61 74 74 69  control formatti
2c30: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ng */.){.  const
2c40: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22   char *zType = "
2c50: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 69 6e 74 20  unknown";.  int 
2c60: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 2c 20  nCell;.  int i, 
2c70: 6a 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 50 74  j;.  int iCellPt
2c80: 72 3b 0a 20 20 69 6e 74 20 73 68 6f 77 43 65 6c  r;.  int showCel
2c90: 6c 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 20 20  lContent = 0;.  
2ca0: 69 6e 74 20 73 68 6f 77 4d 61 70 20 3d 20 30 3b  int showMap = 0;
2cb0: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 70 20 3d 20  .  char *zMap = 
2cc0: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 61 5b 30  0;.  switch( a[0
2cd0: 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20 32 3a  ] ){.    case 2:
2ce0: 20 20 7a 54 79 70 65 20 3d 20 22 69 6e 64 65 78    zType = "index
2cf0: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 22 3b   interior node";
2d00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2d10: 65 20 35 3a 20 20 7a 54 79 70 65 20 3d 20 22 74  e 5:  zType = "t
2d20: 61 62 6c 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f  able interior no
2d30: 64 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  de";  break;.   
2d40: 20 63 61 73 65 20 31 30 3a 20 7a 54 79 70 65 20   case 10: zType 
2d50: 3d 20 22 69 6e 64 65 78 20 6c 65 61 66 22 3b 20  = "index leaf"; 
2d60: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2d70: 0a 20 20 20 20 63 61 73 65 20 31 33 3a 20 7a 54  .    case 13: zT
2d80: 79 70 65 20 3d 20 22 74 61 62 6c 65 20 6c 65 61  ype = "table lea
2d90: 66 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  f";           br
2da0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  eak;.  }.  while
2db0: 28 20 7a 41 72 67 73 5b 30 5d 20 29 7b 0a 20 20  ( zArgs[0] ){.  
2dc0: 20 20 73 77 69 74 63 68 28 20 7a 41 72 67 73 5b    switch( zArgs[
2dd0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  0] ){.      case
2de0: 20 27 63 27 3a 20 73 68 6f 77 43 65 6c 6c 43 6f   'c': showCellCo
2df0: 6e 74 65 6e 74 20 3d 20 31 3b 20 20 62 72 65 61  ntent = 1;  brea
2e00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 6d  k;.      case 'm
2e10: 27 3a 20 73 68 6f 77 4d 61 70 20 3d 20 31 3b 20  ': showMap = 1; 
2e20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2e30: 20 20 20 20 7d 0a 20 20 20 20 7a 41 72 67 73 2b      }.    zArgs+
2e40: 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28  +;.  }.  printf(
2e50: 22 44 65 63 6f 64 65 20 6f 66 20 62 74 72 65 65  "Decode of btree
2e60: 20 70 61 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67   page %d:\n", pg
2e70: 6e 6f 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  no);.  print_dec
2e80: 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 31  ode_line(a, 0, 1
2e90: 2c 20 30 2c 20 7a 54 79 70 65 29 3b 0a 20 20 70  , 0, zType);.  p
2ea0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
2eb0: 28 61 2c 20 31 2c 20 32 2c 20 30 2c 20 22 4f 66  (a, 1, 2, 0, "Of
2ec0: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 66 72  fset to first fr
2ed0: 65 65 62 6c 6f 63 6b 22 29 3b 0a 20 20 70 72 69  eeblock");.  pri
2ee0: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
2ef0: 2c 20 33 2c 20 32 2c 20 30 2c 20 22 4e 75 6d 62  , 3, 2, 0, "Numb
2f00: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
2f10: 68 69 73 20 70 61 67 65 22 29 3b 0a 20 20 6e 43  his page");.  nC
2f20: 65 6c 6c 20 3d 20 61 5b 33 5d 2a 32 35 36 20 2b  ell = a[3]*256 +
2f30: 20 61 5b 34 5d 3b 0a 20 20 70 72 69 6e 74 5f 64   a[4];.  print_d
2f40: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 35 2c  ecode_line(a, 5,
2f50: 20 32 2c 20 30 2c 20 22 4f 66 66 73 65 74 20 74   2, 0, "Offset t
2f60: 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  o cell content a
2f70: 72 65 61 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  rea");.  print_d
2f80: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 37 2c  ecode_line(a, 7,
2f90: 20 31 2c 20 30 2c 20 22 46 72 61 67 6d 65 6e 74   1, 0, "Fragment
2fa0: 65 64 20 62 79 74 65 20 63 6f 75 6e 74 22 29 3b  ed byte count");
2fb0: 0a 20 20 69 66 28 20 61 5b 30 5d 3d 3d 32 20 7c  .  if( a[0]==2 |
2fc0: 7c 20 61 5b 30 5d 3d 3d 35 20 29 7b 0a 20 20 20  | a[0]==5 ){.   
2fd0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
2fe0: 6e 65 28 61 2c 20 38 2c 20 34 2c 20 30 2c 20 22  ne(a, 8, 4, 0, "
2ff0: 52 69 67 68 74 20 63 68 69 6c 64 22 29 3b 0a 20  Right child");. 
3000: 20 20 20 69 43 65 6c 6c 50 74 72 20 3d 20 31 32     iCellPtr = 12
3010: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3020: 43 65 6c 6c 50 74 72 20 3d 20 38 3b 0a 20 20 7d  CellPtr = 8;.  }
3030: 0a 20 20 69 66 28 20 6e 43 65 6c 6c 3e 30 20 29  .  if( nCell>0 )
3040: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 6b  {.    printf(" k
3050: 65 79 3a 20 6c 78 3d 6c 65 66 74 2d 63 68 69 6c  ey: lx=left-chil
3060: 64 20 6e 3d 70 61 79 6c 6f 61 64 2d 73 69 7a 65  d n=payload-size
3070: 20 72 3d 72 6f 77 69 64 5c 6e 22 29 3b 0a 20 20   r=rowid\n");.  
3080: 7d 0a 20 20 69 66 28 20 73 68 6f 77 4d 61 70 20  }.  if( showMap 
3090: 29 7b 0a 20 20 20 20 7a 4d 61 70 20 3d 20 6d 61  ){.    zMap = ma
30a0: 6c 6c 6f 63 28 70 61 67 65 73 69 7a 65 29 3b 0a  lloc(pagesize);.
30b0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 4d 61 70 2c      memset(zMap,
30c0: 20 27 2e 27 2c 20 70 61 67 65 73 69 7a 65 29 3b   '.', pagesize);
30d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 4d 61 70  .    memset(zMap
30e0: 2c 20 27 31 27 2c 20 68 64 72 53 69 7a 65 29 3b  , '1', hdrSize);
30f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4d 61  .    memset(&zMa
3100: 70 5b 68 64 72 53 69 7a 65 5d 2c 20 27 48 27 2c  p[hdrSize], 'H',
3110: 20 69 43 65 6c 6c 50 74 72 29 3b 0a 20 20 20 20   iCellPtr);.    
3120: 6d 65 6d 73 65 74 28 26 7a 4d 61 70 5b 68 64 72  memset(&zMap[hdr
3130: 53 69 7a 65 2b 69 43 65 6c 6c 50 74 72 5d 2c 20  Size+iCellPtr], 
3140: 27 50 27 2c 20 32 2a 6e 43 65 6c 6c 29 3b 0a 20  'P', 2*nCell);. 
3150: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
3160: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
3170: 20 69 6e 74 20 63 6f 66 73 74 20 3d 20 69 43 65   int cofst = iCe
3180: 6c 6c 50 74 72 20 2b 20 69 2a 32 3b 0a 20 20 20  llPtr + i*2;.   
3190: 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20   char *zDesc;.  
31a0: 20 20 69 36 34 20 6e 3b 0a 0a 20 20 20 20 63 6f    i64 n;..    co
31b0: 66 73 74 20 3d 20 61 5b 63 6f 66 73 74 5d 2a 32  fst = a[cofst]*2
31c0: 35 36 20 2b 20 61 5b 63 6f 66 73 74 2b 31 5d 3b  56 + a[cofst+1];
31d0: 0a 20 20 20 20 6e 20 3d 20 64 65 73 63 72 69 62  .    n = describ
31e0: 65 43 65 6c 6c 28 61 5b 30 5d 2c 20 26 61 5b 63  eCell(a[0], &a[c
31f0: 6f 66 73 74 2d 68 64 72 53 69 7a 65 5d 2c 20 73  ofst-hdrSize], s
3200: 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 2c 20  howCellContent, 
3210: 26 7a 44 65 73 63 29 3b 0a 20 20 20 20 69 66 28  &zDesc);.    if(
3220: 20 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20   showMap ){.    
3230: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
3240: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a  .      memset(&z
3250: 4d 61 70 5b 63 6f 66 73 74 5d 2c 20 27 2a 27 2c  Map[cofst], '*',
3260: 20 28 73 69 7a 65 5f 74 29 6e 29 3b 0a 20 20 20   (size_t)n);.   
3270: 20 20 20 7a 4d 61 70 5b 63 6f 66 73 74 5d 20 3d     zMap[cofst] =
3280: 20 27 5b 27 3b 0a 20 20 20 20 20 20 7a 4d 61 70   '[';.      zMap
3290: 5b 63 6f 66 73 74 2b 6e 2d 31 5d 20 3d 20 27 5d  [cofst+n-1] = ']
32a0: 27 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ';.      sprintf
32b0: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 29 3b  (zBuf, "%d", i);
32c0: 0a 20 20 20 20 20 20 6a 20 3d 20 28 69 6e 74 29  .      j = (int)
32d0: 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20  strlen(zBuf);.  
32e0: 20 20 20 20 69 66 28 20 6a 3c 3d 6e 2d 32 20 29      if( j<=n-2 )
32f0: 20 6d 65 6d 63 70 79 28 26 7a 4d 61 70 5b 63 6f   memcpy(&zMap[co
3300: 66 73 74 2b 31 5d 2c 20 7a 42 75 66 2c 20 6a 29  fst+1], zBuf, j)
3310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  ;.    }.    prin
3320: 74 66 28 22 20 25 30 33 78 3a 20 63 65 6c 6c 5b  tf(" %03x: cell[
3330: 25 64 5d 20 25 73 5c 6e 22 2c 20 63 6f 66 73 74  %d] %s\n", cofst
3340: 2c 20 69 2c 20 7a 44 65 73 63 29 3b 0a 20 20 7d  , i, zDesc);.  }
3350: 0a 20 20 69 66 28 20 73 68 6f 77 4d 61 70 20 29  .  if( showMap )
3360: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
3370: 3c 70 61 67 65 73 69 7a 65 3b 20 69 2b 3d 36 34  <pagesize; i+=64
3380: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
3390: 22 20 25 30 33 78 3a 20 25 2e 36 34 73 5c 6e 22  " %03x: %.64s\n"
33a0: 2c 20 69 2c 20 26 7a 4d 61 70 5b 69 5d 29 3b 0a  , i, &zMap[i]);.
33b0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 7a      }.    free(z
33c0: 4d 61 70 29 3b 0a 20 20 7d 20 20 0a 7d 0a 0a 69  Map);.  }  .}..i
33d0: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
33e0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
33f0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 62    struct stat sb
3400: 75 66 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  uf;.  unsigned c
3410: 68 61 72 20 7a 50 67 53 7a 5b 34 5d 3b 0a 20 20  har zPgSz[4];.  
3420: 69 66 28 20 61 72 67 63 3c 32 20 29 7b 0a 20 20  if( argc<2 ){.  
3430: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
3440: 2c 22 55 73 61 67 65 3a 20 25 73 20 46 49 4c 45  ,"Usage: %s FILE
3450: 4e 41 4d 45 20 3f 50 41 47 45 3f 20 2e 2e 2e 5c  NAME ?PAGE? ...\
3460: 6e 22 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  n", argv[0]);.  
3470: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
3480: 20 66 64 20 3d 20 6f 70 65 6e 28 61 72 67 76 5b   fd = open(argv[
3490: 31 5d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  1], O_RDONLY);. 
34a0: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
34b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
34c0: 22 25 73 3a 20 63 61 6e 27 74 20 6f 70 65 6e 20  "%s: can't open 
34d0: 25 73 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 2c 20  %s\n", argv[0], 
34e0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 78  argv[1]);.    ex
34f0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 7a 50 67  it(1);.  }.  zPg
3500: 53 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 7a 50 67  Sz[0] = 0;.  zPg
3510: 53 7a 5b 31 5d 20 3d 20 30 3b 0a 20 20 6c 73 65  Sz[1] = 0;.  lse
3520: 65 6b 28 66 64 2c 20 38 2c 20 53 45 45 4b 5f 53  ek(fd, 8, SEEK_S
3530: 45 54 29 3b 0a 20 20 72 65 61 64 28 66 64 2c 20  ET);.  read(fd, 
3540: 7a 50 67 53 7a 2c 20 34 29 3b 0a 20 20 70 61 67  zPgSz, 4);.  pag
3550: 65 73 69 7a 65 20 3d 20 7a 50 67 53 7a 5b 31 5d  esize = zPgSz[1]
3560: 2a 36 35 35 33 36 20 2b 20 7a 50 67 53 7a 5b 32  *65536 + zPgSz[2
3570: 5d 2a 32 35 36 20 2b 20 7a 50 67 53 7a 5b 33 5d  ]*256 + zPgSz[3]
3580: 3b 0a 20 20 69 66 28 20 70 61 67 65 73 69 7a 65  ;.  if( pagesize
3590: 3d 3d 30 20 29 20 70 61 67 65 73 69 7a 65 20 3d  ==0 ) pagesize =
35a0: 20 31 30 32 34 3b 0a 20 20 70 72 69 6e 74 66 28   1024;.  printf(
35b0: 22 50 61 67 65 73 69 7a 65 3a 20 25 64 5c 6e 22  "Pagesize: %d\n"
35c0: 2c 20 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 66  , pagesize);.  f
35d0: 73 74 61 74 28 66 64 2c 20 26 73 62 75 66 29 3b  stat(fd, &sbuf);
35e0: 0a 20 20 69 66 28 20 73 62 75 66 2e 73 74 5f 73  .  if( sbuf.st_s
35f0: 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 72  ize<32 ){.    pr
3600: 69 6e 74 66 28 22 66 69 6c 65 20 74 6f 6f 20 73  intf("file too s
3610: 6d 61 6c 6c 20 74 6f 20 62 65 20 61 20 57 41 4c  mall to be a WAL
3620: 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
3630: 20 30 3b 0a 20 20 7d 0a 20 20 6d 78 46 72 61 6d   0;.  }.  mxFram
3640: 65 20 3d 20 28 73 62 75 66 2e 73 74 5f 73 69 7a  e = (sbuf.st_siz
3650: 65 20 2d 20 33 32 29 2f 28 70 61 67 65 73 69 7a  e - 32)/(pagesiz
3660: 65 20 2b 20 32 34 29 3b 0a 20 20 70 72 69 6e 74  e + 24);.  print
3670: 66 28 22 41 76 61 69 6c 61 62 6c 65 20 70 61 67  f("Available pag
3680: 65 73 3a 20 31 2e 2e 25 64 5c 6e 22 2c 20 6d 78  es: 1..%d\n", mx
3690: 46 72 61 6d 65 29 3b 0a 20 20 69 66 28 20 61 72  Frame);.  if( ar
36a0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  gc==2 ){.    int
36b0: 20 69 3b 0a 20 20 20 20 43 6b 73 75 6d 20 78 3b   i;.    Cksum x;
36c0: 0a 20 20 20 20 70 72 69 6e 74 5f 77 61 6c 5f 68  .    print_wal_h
36d0: 65 61 64 65 72 28 26 78 29 3b 0a 20 20 20 20 66  eader(&x);.    f
36e0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6d 78 46 72 61  or(i=1; i<=mxFra
36f0: 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  me; i++){.      
3700: 70 72 69 6e 74 5f 6f 6e 65 6c 69 6e 65 5f 66 72  print_oneline_fr
3710: 61 6d 65 28 69 2c 20 26 78 29 3b 0a 20 20 20 20  ame(i, &x);.    
3720: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
3730: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
3740: 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  2; i<argc; i++){
3750: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 74 61 72  .      int iStar
3760: 74 2c 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 63  t, iEnd;.      c
3770: 68 61 72 20 2a 7a 4c 65 66 74 3b 0a 20 20 20 20  har *zLeft;.    
3780: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
3790: 76 5b 69 5d 2c 20 22 68 65 61 64 65 72 22 29 3d  v[i], "header")=
37a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
37b0: 69 6e 74 5f 77 61 6c 5f 68 65 61 64 65 72 28 30  int_wal_header(0
37c0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
37d0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
37e0: 20 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28     if( !isdigit(
37f0: 61 72 67 76 5b 69 5d 5b 30 5d 29 20 29 7b 0a 20  argv[i][0]) ){. 
3800: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
3810: 74 64 65 72 72 2c 20 22 25 73 3a 20 75 6e 6b 6e  tderr, "%s: unkn
3820: 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5b 25 73 5d  own option: [%s]
3830: 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72  \n", argv[0], ar
3840: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[i]);.        
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3860: 7d 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  }.      iStart =
3870: 20 73 74 72 74 6f 6c 28 61 72 67 76 5b 69 5d 2c   strtol(argv[i],
3880: 20 26 7a 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20   &zLeft, 0);.   
3890: 20 20 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20     if( zLeft && 
38a0: 73 74 72 63 6d 70 28 7a 4c 65 66 74 2c 22 2e 2e  strcmp(zLeft,"..
38b0: 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  end")==0 ){.    
38c0: 20 20 20 20 69 45 6e 64 20 3d 20 6d 78 46 72 61      iEnd = mxFra
38d0: 6d 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  me;.      }else 
38e0: 69 66 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c 65  if( zLeft && zLe
38f0: 66 74 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 7a 4c  ft[0]=='.' && zL
3900: 65 66 74 5b 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20  eft[1]=='.' ){. 
3910: 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 74         iEnd = st
3920: 72 74 6f 6c 28 26 7a 4c 65 66 74 5b 32 5d 2c 20  rtol(&zLeft[2], 
3930: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  0, 0);.      }el
3940: 73 65 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20  se if( zLeft && 
3950: 7a 4c 65 66 74 5b 30 5d 3d 3d 27 62 27 20 29 7b  zLeft[0]=='b' ){
3960: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 66 73  .        int ofs
3970: 74 2c 20 6e 42 79 74 65 2c 20 68 64 72 53 69 7a  t, nByte, hdrSiz
3980: 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
3990: 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 20  ned char *a;.   
39a0: 20 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3d       if( iStart=
39b0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
39c0: 68 64 72 53 69 7a 65 20 3d 20 31 30 30 3b 0a 20  hdrSize = 100;. 
39d0: 20 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20           ofst = 
39e0: 68 64 72 53 69 7a 65 20 3d 20 31 30 30 3b 0a 20  hdrSize = 100;. 
39f0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d           nByte =
3a00: 20 70 61 67 65 73 69 7a 65 2d 31 30 30 3b 0a 20   pagesize-100;. 
3a10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3a20: 20 20 20 20 20 20 20 20 68 64 72 53 69 7a 65 20          hdrSize 
3a30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  = 0;.          o
3a40: 66 73 74 20 3d 20 28 69 53 74 61 72 74 2d 31 29  fst = (iStart-1)
3a50: 2a 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20  *pagesize;.     
3a60: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 70 61 67       nByte = pag
3a70: 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  esize;.        }
3a80: 0a 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20  .        ofst = 
3a90: 33 32 20 2b 20 68 64 72 53 69 7a 65 20 2b 20 28  32 + hdrSize + (
3aa0: 69 53 74 61 72 74 2d 31 29 2a 28 70 61 67 65 73  iStart-1)*(pages
3ab0: 69 7a 65 2b 32 34 29 20 2b 20 32 34 3b 0a 20 20  ize+24) + 24;.  
3ac0: 20 20 20 20 20 20 61 20 3d 20 67 65 74 43 6f 6e        a = getCon
3ad0: 74 65 6e 74 28 6f 66 73 74 2c 20 6e 42 79 74 65  tent(ofst, nByte
3ae0: 29 3b 0a 20 20 20 20 20 20 20 20 64 65 63 6f 64  );.        decod
3af0: 65 5f 62 74 72 65 65 5f 70 61 67 65 28 61 2c 20  e_btree_page(a, 
3b00: 69 53 74 61 72 74 2c 20 68 64 72 53 69 7a 65 2c  iStart, hdrSize,
3b10: 20 7a 4c 65 66 74 2b 31 29 3b 0a 20 20 20 20 20   zLeft+1);.     
3b20: 20 20 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20     free(a);.    
3b30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b50: 20 20 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74     iEnd = iStart
3b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3b70: 69 66 28 20 69 53 74 61 72 74 3c 31 20 7c 7c 20  if( iStart<1 || 
3b80: 69 45 6e 64 3c 69 53 74 61 72 74 20 7c 7c 20 69  iEnd<iStart || i
3b90: 45 6e 64 3e 6d 78 46 72 61 6d 65 20 29 7b 0a 20  End>mxFrame ){. 
3ba0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
3bb0: 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
3bc0: 20 22 50 61 67 65 20 61 72 67 75 6d 65 6e 74 20   "Page argument 
3bd0: 73 68 6f 75 6c 64 20 62 65 20 4c 4f 57 45 52 3f  should be LOWER?
3be0: 2e 2e 55 50 50 45 52 3f 2e 20 20 52 61 6e 67 65  ..UPPER?.  Range
3bf0: 20 31 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20   1 to %d\n",.   
3c00: 20 20 20 20 20 20 20 6d 78 46 72 61 6d 65 29 3b         mxFrame);
3c10: 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
3c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3c30: 77 68 69 6c 65 28 20 69 53 74 61 72 74 3c 3d 69  while( iStart<=i
3c40: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70  End ){.        p
3c50: 72 69 6e 74 5f 66 72 61 6d 65 28 69 53 74 61 72  rint_frame(iStar
3c60: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  t);.        iSta
3c70: 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rt++;.      }.  
3c80: 20 20 7d 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28    }.  }.  close(
3c90: 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  fd);.  return 0;
3ca0: 0a 7d 0a                                         .}.