/ Hex Artifact Content
Login

Artifact f09e5a80a293919290ec85a6a37c85a5ddcf37d9:


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 23 69 6e 63 6c   <fcntl.h>.#incl
00b0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
00c0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
00d0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
00e0: 69 6e 67 2e 68 3e 0a 0a 0a 73 74 61 74 69 63 20  ing.h>...static 
00f0: 69 6e 74 20 70 61 67 65 73 69 7a 65 20 3d 20 31  int pagesize = 1
0100: 30 32 34 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  024;     /* Size
0110: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
0120: 61 67 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  age */.static in
0130: 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
0140: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
0150: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 72 65  escriptor for re
0160: 61 64 69 6e 67 20 74 68 65 20 57 41 4c 20 66 69  ading the WAL fi
0170: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
0180: 20 6d 78 46 72 61 6d 65 20 3d 20 30 3b 20 20 20   mxFrame = 0;   
0190: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72        /* Last fr
01a0: 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ame */.static in
01b0: 74 20 70 65 72 4c 69 6e 65 20 3d 20 31 36 3b 20  t perLine = 16; 
01c0: 20 20 20 20 20 20 20 2f 2a 20 48 45 58 20 65 6c         /* HEX el
01d0: 65 6d 65 6e 74 73 20 74 6f 20 70 72 69 6e 74 20  ements to print 
01e0: 70 65 72 20 6c 69 6e 65 20 2a 2f 0a 0a 74 79 70  per line */..typ
01f0: 65 64 65 66 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69  edef long long i
0200: 6e 74 20 69 36 34 3b 20 20 20 20 20 20 2f 2a 20  nt i64;      /* 
0210: 44 61 74 61 74 79 70 65 20 66 6f 72 20 36 34 2d  Datatype for 64-
0220: 62 69 74 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  bit integers */.
0230: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
0240: 74 68 65 20 76 61 72 2d 69 6e 74 20 66 6f 72 6d  the var-int form
0250: 61 74 20 69 6e 74 6f 20 69 36 34 2e 20 20 52 65  at into i64.  Re
0260: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
0270: 6f 66 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  of bytes.** in t
0280: 68 65 20 76 61 72 2d 69 6e 74 2e 20 20 57 72 69  he var-int.  Wri
0290: 74 65 20 74 68 65 20 76 61 72 2d 69 6e 74 20 76  te the var-int v
02a0: 61 6c 75 65 20 69 6e 74 6f 20 2a 70 56 61 6c 2e  alue into *pVal.
02b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
02c0: 65 63 6f 64 65 56 61 72 69 6e 74 28 63 6f 6e 73  ecodeVarint(cons
02d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
02e0: 2a 7a 2c 20 69 36 34 20 2a 70 56 61 6c 29 7b 0a  *z, i64 *pVal){.
02f0: 20 20 69 36 34 20 76 20 3d 20 30 3b 0a 20 20 69    i64 v = 0;.  i
0300: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
0310: 20 69 3c 38 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<8; i++){.    
0320: 76 20 3d 20 28 76 3c 3c 37 29 20 2b 20 28 7a 5b  v = (v<<7) + (z[
0330: 69 5d 26 30 78 37 66 29 3b 0a 20 20 20 20 69 66  i]&0x7f);.    if
0340: 28 20 28 7a 5b 69 5d 26 30 78 38 30 29 3d 3d 30  ( (z[i]&0x80)==0
0350: 20 29 7b 20 2a 70 56 61 6c 20 3d 20 76 3b 20 72   ){ *pVal = v; r
0360: 65 74 75 72 6e 20 69 2b 31 3b 20 7d 0a 20 20 7d  eturn i+1; }.  }
0370: 0a 20 20 76 20 3d 20 28 76 3c 3c 38 29 20 2b 20  .  v = (v<<8) + 
0380: 28 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 2a  (z[i]&0xff);.  *
0390: 70 56 61 6c 20 3d 20 76 3b 0a 20 20 72 65 74 75  pVal = v;.  retu
03a0: 72 6e 20 39 3b 0a 7d 0a 0a 2f 2a 20 52 65 70 6f  rn 9;.}../* Repo
03b0: 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  rt an out-of-mem
03c0: 6f 72 79 20 65 72 72 6f 72 20 61 6e 64 20 64 69  ory error and di
03d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
03e0: 64 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  d out_of_memory(
03f0: 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66  void){.  fprintf
0400: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
0410: 6d 65 6d 6f 72 79 2e 2e 2e 5c 6e 22 29 3b 0a 20  memory...\n");. 
0420: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(1);.}../*.
0430: 2a 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20  ** Read content 
0440: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2e 0a 2a  from the file..*
0450: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
0460: 6c 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  ld the content i
0470: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
0480: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6e 65 65  malloc() and nee
0490: 64 73 20 74 6f 20 62 65 0a 2a 2a 20 66 72 65 65  ds to be.** free
04a0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
04b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
04c0: 6e 65 64 20 63 68 61 72 20 2a 67 65 74 43 6f 6e  ned char *getCon
04d0: 74 65 6e 74 28 69 6e 74 20 6f 66 73 74 2c 20 69  tent(int ofst, i
04e0: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 73  nt nByte){.  uns
04f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
0500: 61 3b 0a 20 20 61 44 61 74 61 20 3d 20 6d 61 6c  a;.  aData = mal
0510: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  loc(nByte);.  if
0520: 28 20 61 44 61 74 61 3d 3d 30 20 29 20 6f 75 74  ( aData==0 ) out
0530: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
0540: 6c 73 65 65 6b 28 66 64 2c 20 6f 66 73 74 2c 20  lseek(fd, ofst, 
0550: 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72 65 61  SEEK_SET);.  rea
0560: 64 28 66 64 2c 20 61 44 61 74 61 2c 20 6e 42 79  d(fd, aData, nBy
0570: 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 44  te);.  return aD
0580: 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ata;.}../*.** Pr
0590: 69 6e 74 20 61 20 72 61 6e 67 65 20 6f 66 20 62  int a range of b
05a0: 79 74 65 73 20 61 73 20 68 65 78 20 61 6e 64 20  ytes as hex and 
05b0: 61 73 20 61 73 63 69 69 2e 0a 2a 2f 0a 73 74 61  as ascii..*/.sta
05c0: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 62  tic void print_b
05d0: 79 74 65 5f 72 61 6e 67 65 28 0a 20 20 69 6e 74  yte_range(.  int
05e0: 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
05f0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
0600: 65 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f  e in the range o
0610: 66 20 62 79 74 65 73 20 74 6f 20 70 72 69 6e 74  f bytes to print
0620: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0640: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
0650: 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 75 6e  to print */.  un
0660: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
0670: 74 61 2c 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20  ta,  /* Content 
0680: 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e  to print */.  in
0690: 74 20 70 72 69 6e 74 4f 66 73 74 20 20 20 20 20  t printOfst     
06a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
06b0: 20 61 6d 6f 75 6e 74 20 74 6f 20 74 68 65 20 69   amount to the i
06c0: 6e 64 65 78 20 6f 6e 20 74 68 65 20 6c 65 66 74  ndex on the left
06d0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20   column */.){.  
06e0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73  int i, j;.  cons
06f0: 74 20 63 68 61 72 20 2a 7a 4f 66 73 74 46 6d 74  t char *zOfstFmt
0700: 3b 0a 0a 20 20 69 66 28 20 28 28 70 72 69 6e 74  ;..  if( ((print
0710: 4f 66 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66  Ofst+nByte)&~0xf
0720: 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f  ff)==0 ){.    zO
0730: 66 73 74 46 6d 74 20 3d 20 22 20 25 30 33 78 3a  fstFmt = " %03x:
0740: 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   ";.  }else if( 
0750: 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74  ((printOfst+nByt
0760: 65 29 26 7e 30 78 66 66 66 66 29 3d 3d 30 20 29  e)&~0xffff)==0 )
0770: 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d  {.    zOfstFmt =
0780: 20 22 20 25 30 34 78 3a 20 22 3b 0a 20 20 7d 65   " %04x: ";.  }e
0790: 6c 73 65 20 69 66 28 20 28 28 70 72 69 6e 74 4f  lse if( ((printO
07a0: 66 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66  fst+nByte)&~0xff
07b0: 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  fff)==0 ){.    z
07c0: 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 35 78  OfstFmt = " %05x
07d0: 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  : ";.  }else if(
07e0: 20 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79   ((printOfst+nBy
07f0: 74 65 29 26 7e 30 78 66 66 66 66 66 66 29 3d 3d  te)&~0xffffff)==
0800: 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d  0 ){.    zOfstFm
0810: 74 20 3d 20 22 20 25 30 36 78 3a 20 22 3b 0a 20  t = " %06x: ";. 
0820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 66 73   }else{.    zOfs
0830: 74 46 6d 74 20 3d 20 22 20 25 30 38 78 3a 20 22  tFmt = " %08x: "
0840: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
0850: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 20 2b 3d 20  ; i<nByte; i += 
0860: 70 65 72 4c 69 6e 65 29 7b 0a 20 20 20 20 66 70  perLine){.    fp
0870: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 7a 4f  rintf(stdout, zO
0880: 66 73 74 46 6d 74 2c 20 69 2b 70 72 69 6e 74 4f  fstFmt, i+printO
0890: 66 73 74 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  fst);.    for(j=
08a0: 30 3b 20 6a 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b  0; j<perLine; j+
08b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 2b  +){.      if( i+
08c0: 6a 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  j>nByte ){.     
08d0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75     fprintf(stdou
08e0: 74 2c 20 22 20 20 20 22 29 3b 0a 20 20 20 20 20  t, "   ");.     
08f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0900: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 22  fprintf(stdout,"
0910: 25 30 32 78 20 22 2c 20 61 44 61 74 61 5b 69 2b  %02x ", aData[i+
0920: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
0930: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
0940: 6a 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b  j<perLine; j++){
0950: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e  .      if( i+j>n
0960: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
0970: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
0980: 22 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  " ");.      }els
0990: 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
09a0: 74 66 28 73 74 64 6f 75 74 2c 22 25 63 22 2c 20  tf(stdout,"%c", 
09b0: 69 73 70 72 69 6e 74 28 61 44 61 74 61 5b 69 2b  isprint(aData[i+
09c0: 6a 5d 29 20 3f 20 61 44 61 74 61 5b 69 2b 6a 5d  j]) ? aData[i+j]
09d0: 20 3a 20 27 2e 27 29 3b 0a 20 20 20 20 20 20 7d   : '.');.      }
09e0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
09f0: 74 66 28 73 74 64 6f 75 74 2c 22 5c 6e 22 29 3b  tf(stdout,"\n");
0a00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  .  }.}../* Print
0a10: 20 61 20 6c 69 6e 65 20 6f 66 20 64 65 63 6f 64   a line of decod
0a20: 65 20 6f 75 74 70 75 74 20 73 68 6f 77 69 6e 67  e output showing
0a30: 20 61 20 34 2d 62 79 74 65 20 69 6e 74 65 67 65   a 4-byte intege
0a40: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
0a50: 64 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c  d print_decode_l
0a60: 69 6e 65 28 0a 20 20 75 6e 73 69 67 6e 65 64 20  ine(.  unsigned 
0a70: 63 68 61 72 20 2a 61 44 61 74 61 2c 20 20 20 20  char *aData,    
0a80: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 62 65 69    /* Content bei
0a90: 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
0aa0: 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 42  int ofst, int nB
0ab0: 79 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 53 74  yte,       /* St
0ac0: 61 72 74 20 61 6e 64 20 73 69 7a 65 20 6f 66 20  art and size of 
0ad0: 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  decode */.  int 
0ae0: 61 73 48 65 78 2c 20 20 20 20 20 20 20 20 20 20  asHex,          
0af0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
0b00: 65 2c 20 6f 75 74 70 75 74 20 76 61 6c 75 65 20  e, output value 
0b10: 61 73 20 68 65 78 20 2a 2f 0a 20 20 63 6f 6e 73  as hex */.  cons
0b20: 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 20 20 20  t char *zMsg    
0b30: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
0b40: 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29  e to append */.)
0b50: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
0b60: 69 6e 74 20 76 61 6c 20 3d 20 61 44 61 74 61 5b  int val = aData[
0b70: 6f 66 73 74 5d 3b 0a 20 20 63 68 61 72 20 7a 42  ofst];.  char zB
0b80: 75 66 5b 31 30 30 5d 3b 0a 20 20 73 70 72 69 6e  uf[100];.  sprin
0b90: 74 66 28 7a 42 75 66 2c 20 22 20 25 30 33 78 3a  tf(zBuf, " %03x:
0ba0: 20 25 30 32 78 22 2c 20 6f 66 73 74 2c 20 61 44   %02x", ofst, aD
0bb0: 61 74 61 5b 6f 66 73 74 5d 29 3b 0a 20 20 69 20  ata[ofst]);.  i 
0bc0: 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
0bd0: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 3b 20    for(j=1; j<4; 
0be0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6a 3e  j++){.    if( j>
0bf0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
0c00: 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d  sprintf(&zBuf[i]
0c10: 2c 20 22 20 20 20 22 29 3b 0a 20 20 20 20 7d 65  , "   ");.    }e
0c20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  lse{.      sprin
0c30: 74 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 25  tf(&zBuf[i], " %
0c40: 30 32 78 22 2c 20 61 44 61 74 61 5b 6f 66 73 74  02x", aData[ofst
0c50: 2b 6a 5d 29 3b 0a 20 20 20 20 20 20 76 61 6c 20  +j]);.      val 
0c60: 3d 20 76 61 6c 2a 32 35 36 20 2b 20 61 44 61 74  = val*256 + aDat
0c70: 61 5b 6f 66 73 74 2b 6a 5d 3b 0a 20 20 20 20 7d  a[ofst+j];.    }
0c80: 0a 20 20 20 20 69 20 2b 3d 20 73 74 72 6c 65 6e  .    i += strlen
0c90: 28 26 7a 42 75 66 5b 69 5d 29 3b 0a 20 20 7d 0a  (&zBuf[i]);.  }.
0ca0: 20 20 69 66 28 20 61 73 48 65 78 20 29 7b 0a 20    if( asHex ){. 
0cb0: 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66     sprintf(&zBuf
0cc0: 5b 69 5d 2c 20 22 20 20 30 78 25 30 38 78 22 2c  [i], "  0x%08x",
0cd0: 20 76 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   val);.  }else{.
0ce0: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
0cf0: 66 5b 69 5d 2c 20 22 20 20 20 25 39 64 22 2c 20  f[i], "   %9d", 
0d00: 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  val);.  }.  prin
0d10: 74 66 28 22 25 73 20 20 25 73 5c 6e 22 2c 20 7a  tf("%s  %s\n", z
0d20: 42 75 66 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 0a 2f  Buf, zMsg);.}../
0d30: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 6e  *.** Print an en
0d40: 74 69 72 65 20 70 61 67 65 20 6f 66 20 63 6f 6e  tire page of con
0d50: 74 65 6e 74 20 61 73 20 68 65 78 0a 2a 2f 0a 73  tent as hex.*/.s
0d60: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
0d70: 5f 66 72 61 6d 65 28 69 6e 74 20 69 46 72 61 6d  _frame(int iFram
0d80: 65 29 7b 0a 20 20 69 6e 74 20 69 53 74 61 72 74  e){.  int iStart
0d90: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
0da0: 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 53 74 61  r *aData;.  iSta
0db0: 72 74 20 3d 20 33 32 20 2b 20 28 69 46 72 61 6d  rt = 32 + (iFram
0dc0: 65 2d 31 29 2a 28 70 61 67 65 73 69 7a 65 2b 32  e-1)*(pagesize+2
0dd0: 34 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  4);.  fprintf(st
0de0: 64 6f 75 74 2c 20 22 46 72 61 6d 65 20 25 64 3a  dout, "Frame %d:
0df0: 20 20 20 28 6f 66 66 73 65 74 73 20 30 78 25 78     (offsets 0x%x
0e00: 2e 2e 30 78 25 78 29 5c 6e 22 2c 0a 20 20 20 20  ..0x%x)\n",.    
0e10: 20 20 20 20 20 20 69 46 72 61 6d 65 2c 20 69 53        iFrame, iS
0e20: 74 61 72 74 2c 20 69 53 74 61 72 74 2b 70 61 67  tart, iStart+pag
0e30: 65 73 69 7a 65 2b 32 34 29 3b 0a 20 20 61 44 61  esize+24);.  aDa
0e40: 74 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28  ta = getContent(
0e50: 69 53 74 61 72 74 2c 20 70 61 67 65 73 69 7a 65  iStart, pagesize
0e60: 2b 32 34 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  +24);.  print_de
0e70: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
0e80: 20 30 2c 20 34 2c 20 30 2c 20 22 50 61 67 65 20   0, 4, 0, "Page 
0e90: 6e 75 6d 62 65 72 22 29 3b 0a 20 20 70 72 69 6e  number");.  prin
0ea0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
0eb0: 61 74 61 2c 20 34 2c 20 34 2c 20 30 2c 20 22 44  ata, 4, 4, 0, "D
0ec0: 42 20 73 69 7a 65 2c 20 6f 72 20 30 20 66 6f 72  B size, or 0 for
0ed0: 20 6e 6f 6e 2d 63 6f 6d 6d 69 74 22 29 3b 0a 20   non-commit");. 
0ee0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
0ef0: 6e 65 28 61 44 61 74 61 2c 20 38 2c 20 34 2c 20  ne(aData, 8, 4, 
0f00: 31 2c 20 22 53 61 6c 74 2d 31 22 29 3b 0a 20 20  1, "Salt-1");.  
0f10: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
0f20: 65 28 61 44 61 74 61 2c 31 32 2c 20 34 2c 20 31  e(aData,12, 4, 1
0f30: 2c 20 22 53 61 6c 74 2d 32 22 29 3b 0a 20 20 70  , "Salt-2");.  p
0f40: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
0f50: 28 61 44 61 74 61 2c 31 36 2c 20 34 2c 20 31 2c  (aData,16, 4, 1,
0f60: 20 22 43 68 65 63 6b 73 75 6d 2d 31 22 29 3b 0a   "Checksum-1");.
0f70: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
0f80: 69 6e 65 28 61 44 61 74 61 2c 32 30 2c 20 34 2c  ine(aData,20, 4,
0f90: 20 31 2c 20 22 43 68 65 63 6b 73 75 6d 2d 32 22   1, "Checksum-2"
0fa0: 29 3b 0a 20 20 70 72 69 6e 74 5f 62 79 74 65 5f  );.  print_byte_
0fb0: 72 61 6e 67 65 28 69 53 74 61 72 74 2b 32 34 2c  range(iStart+24,
0fc0: 20 70 61 67 65 73 69 7a 65 2c 20 61 44 61 74 61   pagesize, aData
0fd0: 2b 32 34 2c 20 30 29 3b 0a 20 20 66 72 65 65 28  +24, 0);.  free(
0fe0: 61 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aData);.}../*.**
0ff0: 20 65 78 74 72 61 63 74 20 61 20 33 32 2d 62 69   extract a 32-bi
1000: 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  t big-endian int
1010: 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75  eger.*/.static u
1020: 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 49  nsigned int getI
1030: 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 67  nt32(const unsig
1040: 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20  ned char *a){.  
1050: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 20 3d  unsigned int x =
1060: 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61   (a[0]<<24) + (a
1070: 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d  [1]<<16) + (a[2]
1080: 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 20 20 72  <<8) + a[3];.  r
1090: 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn x;.}../*.*
10a0: 2a 20 50 72 69 6e 74 20 61 6e 20 65 6e 74 69 72  * Print an entir
10b0: 65 20 70 61 67 65 20 6f 66 20 63 6f 6e 74 65 6e  e page of conten
10c0: 74 20 61 73 20 68 65 78 0a 2a 2f 0a 73 74 61 74  t as hex.*/.stat
10d0: 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 6f 6e  ic void print_on
10e0: 65 6c 69 6e 65 5f 66 72 61 6d 65 28 69 6e 74 20  eline_frame(int 
10f0: 69 46 72 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  iFrame){.  int i
1100: 53 74 61 72 74 3b 0a 20 20 75 6e 73 69 67 6e 65  Start;.  unsigne
1110: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20  d char *aData;. 
1120: 20 69 53 74 61 72 74 20 3d 20 33 32 20 2b 20 28   iStart = 32 + (
1130: 69 46 72 61 6d 65 2d 31 29 2a 28 70 61 67 65 73  iFrame-1)*(pages
1140: 69 7a 65 2b 32 34 29 3b 0a 20 20 61 44 61 74 61  ize+24);.  aData
1150: 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28 69 53   = getContent(iS
1160: 74 61 72 74 2c 20 32 34 29 3b 0a 20 20 66 70 72  tart, 24);.  fpr
1170: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 46 72  intf(stdout, "Fr
1180: 61 6d 65 20 25 34 64 3a 20 25 36 64 20 25 36 64  ame %4d: %6d %6d
1190: 20 30 78 25 30 38 78 20 30 78 25 30 38 78 20 30   0x%08x 0x%08x 0
11a0: 78 25 30 38 78 20 30 78 25 30 38 78 5c 6e 22 2c  x%08x 0x%08x\n",
11b0: 0a 20 20 20 20 20 20 20 20 20 20 69 46 72 61 6d  .          iFram
11c0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  e, .          ge
11d0: 74 49 6e 74 33 32 28 61 44 61 74 61 29 2c 0a 20  tInt32(aData),. 
11e0: 20 20 20 20 20 20 20 20 20 67 65 74 49 6e 74 33           getInt3
11f0: 32 28 61 44 61 74 61 2b 34 29 2c 0a 20 20 20 20  2(aData+4),.    
1200: 20 20 20 20 20 20 67 65 74 49 6e 74 33 32 28 61        getInt32(a
1210: 44 61 74 61 2b 38 29 2c 0a 20 20 20 20 20 20 20  Data+8),.       
1220: 20 20 20 67 65 74 49 6e 74 33 32 28 61 44 61 74     getInt32(aDat
1230: 61 2b 31 32 29 2c 0a 20 20 20 20 20 20 20 20 20  a+12),.         
1240: 20 67 65 74 49 6e 74 33 32 28 61 44 61 74 61 2b   getInt32(aData+
1250: 31 36 29 2c 0a 20 20 20 20 20 20 20 20 20 20 67  16),.          g
1260: 65 74 49 6e 74 33 32 28 61 44 61 74 61 2b 32 30  etInt32(aData+20
1270: 29 0a 20 20 29 3b 0a 20 20 66 72 65 65 28 61 44  ).  );.  free(aD
1280: 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ata);.}../*.** D
1290: 65 63 6f 64 65 20 74 68 65 20 57 41 4c 20 68 65  ecode the WAL he
12a0: 61 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ader..*/.static 
12b0: 76 6f 69 64 20 70 72 69 6e 74 5f 77 61 6c 5f 68  void print_wal_h
12c0: 65 61 64 65 72 28 76 6f 69 64 29 7b 0a 20 20 75  eader(void){.  u
12d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
12e0: 61 74 61 3b 0a 20 20 61 44 61 74 61 20 3d 20 67  ata;.  aData = g
12f0: 65 74 43 6f 6e 74 65 6e 74 28 30 2c 20 33 32 29  etContent(0, 32)
1300: 3b 0a 20 20 70 72 69 6e 74 66 28 22 57 41 4c 20  ;.  printf("WAL 
1310: 48 65 61 64 65 72 3a 5c 6e 22 29 3b 0a 20 20 70  Header:\n");.  p
1320: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1330: 28 61 44 61 74 61 2c 20 30 2c 20 34 2c 31 2c 22  (aData, 0, 4,1,"
1340: 4d 61 67 69 63 2e 20 20 30 78 33 37 37 66 30 36  Magic.  0x377f06
1350: 38 32 20 28 6c 65 29 20 6f 72 20 30 78 33 37 37  82 (le) or 0x377
1360: 66 30 36 38 33 20 28 62 65 29 22 29 3b 0a 20 20  f0683 (be)");.  
1370: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1380: 65 28 61 44 61 74 61 2c 20 34 2c 20 34 2c 20 30  e(aData, 4, 4, 0
1390: 2c 20 22 46 69 6c 65 20 66 6f 72 6d 61 74 22 29  , "File format")
13a0: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
13b0: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 38 2c 20  _line(aData, 8, 
13c0: 34 2c 20 30 2c 20 22 44 61 74 61 62 61 73 65 20  4, 0, "Database 
13d0: 70 61 67 65 20 73 69 7a 65 22 29 3b 0a 20 20 70  page size");.  p
13e0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
13f0: 28 61 44 61 74 61 2c 20 31 32 2c 34 2c 20 30 2c  (aData, 12,4, 0,
1400: 20 22 43 68 65 63 6b 70 6f 69 6e 74 20 73 65 71   "Checkpoint seq
1410: 75 65 6e 63 65 20 6e 75 6d 62 65 72 22 29 3b 0a  uence number");.
1420: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
1430: 69 6e 65 28 61 44 61 74 61 2c 20 31 36 2c 34 2c  ine(aData, 16,4,
1440: 20 31 2c 20 22 53 61 6c 74 2d 31 22 29 3b 0a 20   1, "Salt-1");. 
1450: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1460: 6e 65 28 61 44 61 74 61 2c 20 32 30 2c 34 2c 20  ne(aData, 20,4, 
1470: 31 2c 20 22 53 61 6c 74 2d 32 22 29 3b 0a 20 20  1, "Salt-2");.  
1480: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1490: 65 28 61 44 61 74 61 2c 20 32 34 2c 34 2c 20 31  e(aData, 24,4, 1
14a0: 2c 20 22 43 68 65 63 6b 73 75 6d 2d 31 22 29 3b  , "Checksum-1");
14b0: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
14c0: 6c 69 6e 65 28 61 44 61 74 61 2c 20 32 38 2c 34  line(aData, 28,4
14d0: 2c 20 31 2c 20 22 43 68 65 63 6b 73 75 6d 2d 32  , 1, "Checksum-2
14e0: 22 29 3b 0a 20 20 66 72 65 65 28 61 44 61 74 61  ");.  free(aData
14f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
1500: 74 65 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  te a description
1510: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 65   for a single ce
1520: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1530: 74 20 64 65 73 63 72 69 62 65 43 65 6c 6c 28 75  t describeCell(u
1540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 54 79  nsigned char cTy
1550: 70 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  pe, unsigned cha
1560: 72 20 2a 61 2c 20 63 68 61 72 20 2a 2a 70 7a 44  r *a, char **pzD
1570: 65 73 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  esc){.  int i;. 
1580: 20 69 6e 74 20 6e 44 65 73 63 20 3d 20 30 3b 0a   int nDesc = 0;.
1590: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69    int n = 0;.  i
15a0: 6e 74 20 6c 65 66 74 43 68 69 6c 64 3b 0a 20 20  nt leftChild;.  
15b0: 69 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  i64 nPayload;.  
15c0: 69 36 34 20 72 6f 77 69 64 3b 0a 20 20 73 74 61  i64 rowid;.  sta
15d0: 74 69 63 20 63 68 61 72 20 7a 44 65 73 63 5b 31  tic char zDesc[1
15e0: 30 30 5d 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  00];.  i = 0;.  
15f0: 69 66 28 20 63 54 79 70 65 3c 3d 35 20 29 7b 0a  if( cType<=5 ){.
1600: 20 20 20 20 6c 65 66 74 43 68 69 6c 64 20 3d 20      leftChild = 
1610: 28 28 61 5b 30 5d 2a 32 35 36 20 2b 20 61 5b 31  ((a[0]*256 + a[1
1620: 5d 29 2a 32 35 36 20 2b 20 61 5b 32 5d 29 2a 32  ])*256 + a[2])*2
1630: 35 36 20 2b 20 61 5b 33 5d 3b 0a 20 20 20 20 61  56 + a[3];.    a
1640: 20 2b 3d 20 34 3b 0a 20 20 20 20 6e 20 2b 3d 20   += 4;.    n += 
1650: 34 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  4;.    sprintf(z
1660: 44 65 73 63 2c 20 22 6c 65 66 74 2d 63 68 69 6c  Desc, "left-chil
1670: 64 3a 20 25 64 20 22 2c 20 6c 65 66 74 43 68 69  d: %d ", leftChi
1680: 6c 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 3d  ld);.    nDesc =
1690: 20 73 74 72 6c 65 6e 28 7a 44 65 73 63 29 3b 0a   strlen(zDesc);.
16a0: 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65 21    }.  if( cType!
16b0: 3d 35 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65  =5 ){.    i = de
16c0: 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 6e  codeVarint(a, &n
16d0: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 61 20  Payload);.    a 
16e0: 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20 69  += i;.    n += i
16f0: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  ;.    sprintf(&z
1700: 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20 22 73 7a  Desc[nDesc], "sz
1710: 3a 20 25 6c 6c 64 20 22 2c 20 6e 50 61 79 6c 6f  : %lld ", nPaylo
1720: 61 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b  ad);.    nDesc +
1730: 3d 20 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b  = strlen(&zDesc[
1740: 6e 44 65 73 63 5d 29 3b 0a 20 20 7d 0a 20 20 69  nDesc]);.  }.  i
1750: 66 28 20 63 54 79 70 65 3d 3d 35 20 7c 7c 20 63  f( cType==5 || c
1760: 54 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20 20 20  Type==13 ){.    
1770: 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  i = decodeVarint
1780: 28 61 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  (a, &rowid);.   
1790: 20 61 20 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b   a += i;.    n +
17a0: 3d 20 69 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  = i;.    sprintf
17b0: 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20  (&zDesc[nDesc], 
17c0: 22 72 6f 77 69 64 3a 20 25 6c 6c 64 20 22 2c 20  "rowid: %lld ", 
17d0: 72 6f 77 69 64 29 3b 0a 20 20 20 20 6e 44 65 73  rowid);.    nDes
17e0: 63 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 44 65  c += strlen(&zDe
17f0: 73 63 5b 6e 44 65 73 63 5d 29 3b 0a 20 20 7d 0a  sc[nDesc]);.  }.
1800: 20 20 2a 70 7a 44 65 73 63 20 3d 20 7a 44 65 73    *pzDesc = zDes
1810: 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  c;.  return n;.}
1820: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
1830: 20 62 74 72 65 65 20 70 61 67 65 0a 2a 2f 0a 73   btree page.*/.s
1840: 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64  tatic void decod
1850: 65 5f 62 74 72 65 65 5f 70 61 67 65 28 75 6e 73  e_btree_page(uns
1860: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 69  igned char *a, i
1870: 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20 68 64 72  nt pgno, int hdr
1880: 53 69 7a 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Size){.  const c
1890: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e  har *zType = "un
18a0: 6b 6e 6f 77 6e 22 3b 0a 20 20 69 6e 74 20 6e 43  known";.  int nC
18b0: 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ell;.  int i;.  
18c0: 69 6e 74 20 69 43 65 6c 6c 50 74 72 3b 0a 20 20  int iCellPtr;.  
18d0: 73 77 69 74 63 68 28 20 61 5b 30 5d 20 29 7b 0a  switch( a[0] ){.
18e0: 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a 54 79      case 2:  zTy
18f0: 70 65 20 3d 20 22 69 6e 64 65 78 20 69 6e 74 65  pe = "index inte
1900: 72 69 6f 72 20 6e 6f 64 65 22 3b 20 20 62 72 65  rior node";  bre
1910: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 35 3a 20  ak;.    case 5: 
1920: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 20   zType = "table 
1930: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 22 3b 20  interior node"; 
1940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1950: 20 31 30 3a 20 7a 54 79 70 65 20 3d 20 22 69 6e   10: zType = "in
1960: 64 65 78 20 6c 65 61 66 22 3b 20 20 20 20 20 20  dex leaf";      
1970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1980: 63 61 73 65 20 31 33 3a 20 7a 54 79 70 65 20 3d  case 13: zType =
1990: 20 22 74 61 62 6c 65 20 6c 65 61 66 22 3b 20 20   "table leaf";  
19a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19b0: 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 44 65    }.  printf("De
19c0: 63 6f 64 65 20 6f 66 20 62 74 72 65 65 20 70 61  code of btree pa
19d0: 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67 6e 6f 29  ge %d:\n", pgno)
19e0: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
19f0: 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 31 2c 20 30  _line(a, 0, 1, 0
1a00: 2c 20 7a 54 79 70 65 29 3b 0a 20 20 70 72 69 6e  , zType);.  prin
1a10: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c  t_decode_line(a,
1a20: 20 31 2c 20 32 2c 20 30 2c 20 22 4f 66 66 73 65   1, 2, 0, "Offse
1a30: 74 20 74 6f 20 66 69 72 73 74 20 66 72 65 65 62  t to first freeb
1a40: 6c 6f 63 6b 22 29 3b 0a 20 20 70 72 69 6e 74 5f  lock");.  print_
1a50: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 33  decode_line(a, 3
1a60: 2c 20 32 2c 20 30 2c 20 22 4e 75 6d 62 65 72 20  , 2, 0, "Number 
1a70: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73  of cells on this
1a80: 20 70 61 67 65 22 29 3b 0a 20 20 6e 43 65 6c 6c   page");.  nCell
1a90: 20 3d 20 61 5b 33 5d 2a 32 35 36 20 2b 20 61 5b   = a[3]*256 + a[
1aa0: 34 5d 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  4];.  print_deco
1ab0: 64 65 5f 6c 69 6e 65 28 61 2c 20 35 2c 20 32 2c  de_line(a, 5, 2,
1ac0: 20 30 2c 20 22 4f 66 66 73 65 74 20 74 6f 20 63   0, "Offset to c
1ad0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
1ae0: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1af0: 64 65 5f 6c 69 6e 65 28 61 2c 20 37 2c 20 31 2c  de_line(a, 7, 1,
1b00: 20 30 2c 20 22 46 72 61 67 6d 65 6e 74 65 64 20   0, "Fragmented 
1b10: 62 79 74 65 20 63 6f 75 6e 74 22 29 3b 0a 20 20  byte count");.  
1b20: 69 66 28 20 61 5b 30 5d 3d 3d 32 20 7c 7c 20 61  if( a[0]==2 || a
1b30: 5b 30 5d 3d 3d 35 20 29 7b 0a 20 20 20 20 70 72  [0]==5 ){.    pr
1b40: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1b50: 61 2c 20 38 2c 20 34 2c 20 30 2c 20 22 52 69 67  a, 8, 4, 0, "Rig
1b60: 68 74 20 63 68 69 6c 64 22 29 3b 0a 20 20 20 20  ht child");.    
1b70: 69 43 65 6c 6c 50 74 72 20 3d 20 31 32 3b 0a 20  iCellPtr = 12;. 
1b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43 65 6c   }else{.    iCel
1b90: 6c 50 74 72 20 3d 20 38 3b 0a 20 20 7d 0a 20 20  lPtr = 8;.  }.  
1ba0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1bb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1bc0: 63 6f 66 73 74 20 3d 20 69 43 65 6c 6c 50 74 72  cofst = iCellPtr
1bd0: 20 2b 20 69 2a 32 3b 0a 20 20 20 20 63 68 61 72   + i*2;.    char
1be0: 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 63 6f 66   *zDesc;.    cof
1bf0: 73 74 20 3d 20 61 5b 63 6f 66 73 74 5d 2a 32 35  st = a[cofst]*25
1c00: 36 20 2b 20 61 5b 63 6f 66 73 74 2b 31 5d 3b 0a  6 + a[cofst+1];.
1c10: 20 20 20 20 64 65 73 63 72 69 62 65 43 65 6c 6c      describeCell
1c20: 28 61 5b 30 5d 2c 20 26 61 5b 63 6f 66 73 74 2d  (a[0], &a[cofst-
1c30: 68 64 72 53 69 7a 65 5d 2c 20 26 7a 44 65 73 63  hdrSize], &zDesc
1c40: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  );.    printf(" 
1c50: 25 30 33 78 3a 20 63 65 6c 6c 5b 25 64 5d 20 25  %03x: cell[%d] %
1c60: 73 5c 6e 22 2c 20 63 6f 66 73 74 2c 20 69 2c 20  s\n", cofst, i, 
1c70: 7a 44 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 69  zDesc);.  }.}..i
1c80: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
1c90: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
1ca0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 62    struct stat sb
1cb0: 75 66 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  uf;.  unsigned c
1cc0: 68 61 72 20 7a 50 67 53 7a 5b 32 5d 3b 0a 20 20  har zPgSz[2];.  
1cd0: 69 66 28 20 61 72 67 63 3c 32 20 29 7b 0a 20 20  if( argc<2 ){.  
1ce0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1cf0: 2c 22 55 73 61 67 65 3a 20 25 73 20 46 49 4c 45  ,"Usage: %s FILE
1d00: 4e 41 4d 45 20 3f 50 41 47 45 3f 20 2e 2e 2e 5c  NAME ?PAGE? ...\
1d10: 6e 22 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  n", argv[0]);.  
1d20: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1d30: 20 66 64 20 3d 20 6f 70 65 6e 28 61 72 67 76 5b   fd = open(argv[
1d40: 31 5d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  1], O_RDONLY);. 
1d50: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
1d60: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1d70: 22 25 73 3a 20 63 61 6e 27 74 20 6f 70 65 6e 20  "%s: can't open 
1d80: 25 73 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 2c 20  %s\n", argv[0], 
1d90: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 78  argv[1]);.    ex
1da0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 7a 50 67  it(1);.  }.  zPg
1db0: 53 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 7a 50 67  Sz[0] = 0;.  zPg
1dc0: 53 7a 5b 31 5d 20 3d 20 30 3b 0a 20 20 6c 73 65  Sz[1] = 0;.  lse
1dd0: 65 6b 28 66 64 2c 20 31 30 2c 20 53 45 45 4b 5f  ek(fd, 10, SEEK_
1de0: 53 45 54 29 3b 0a 20 20 72 65 61 64 28 66 64 2c  SET);.  read(fd,
1df0: 20 7a 50 67 53 7a 2c 20 32 29 3b 0a 20 20 70 61   zPgSz, 2);.  pa
1e00: 67 65 73 69 7a 65 20 3d 20 7a 50 67 53 7a 5b 30  gesize = zPgSz[0
1e10: 5d 2a 32 35 36 20 2b 20 7a 50 67 53 7a 5b 31 5d  ]*256 + zPgSz[1]
1e20: 3b 0a 20 20 69 66 28 20 70 61 67 65 73 69 7a 65  ;.  if( pagesize
1e30: 3d 3d 30 20 29 20 70 61 67 65 73 69 7a 65 20 3d  ==0 ) pagesize =
1e40: 20 31 30 32 34 3b 0a 20 20 70 72 69 6e 74 66 28   1024;.  printf(
1e50: 22 50 61 67 65 73 69 7a 65 3a 20 25 64 5c 6e 22  "Pagesize: %d\n"
1e60: 2c 20 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 66  , pagesize);.  f
1e70: 73 74 61 74 28 66 64 2c 20 26 73 62 75 66 29 3b  stat(fd, &sbuf);
1e80: 0a 20 20 69 66 28 20 73 62 75 66 2e 73 74 5f 73  .  if( sbuf.st_s
1e90: 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 72  ize<32 ){.    pr
1ea0: 69 6e 74 66 28 22 66 69 6c 65 20 74 6f 6f 20 73  intf("file too s
1eb0: 6d 61 6c 6c 20 74 6f 20 62 65 20 61 20 57 41 4c  mall to be a WAL
1ec0: 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
1ed0: 20 30 3b 0a 20 20 7d 0a 20 20 6d 78 46 72 61 6d   0;.  }.  mxFram
1ee0: 65 20 3d 20 28 73 62 75 66 2e 73 74 5f 73 69 7a  e = (sbuf.st_siz
1ef0: 65 20 2d 20 33 32 29 2f 28 70 61 67 65 73 69 7a  e - 32)/(pagesiz
1f00: 65 20 2b 20 32 34 29 3b 0a 20 20 70 72 69 6e 74  e + 24);.  print
1f10: 66 28 22 41 76 61 69 6c 61 62 6c 65 20 70 61 67  f("Available pag
1f20: 65 73 3a 20 31 2e 2e 25 64 5c 6e 22 2c 20 6d 78  es: 1..%d\n", mx
1f30: 46 72 61 6d 65 29 3b 0a 20 20 69 66 28 20 61 72  Frame);.  if( ar
1f40: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  gc==2 ){.    int
1f50: 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 5f 77 61   i;.    print_wa
1f60: 6c 5f 68 65 61 64 65 72 28 29 3b 0a 20 20 20 20  l_header();.    
1f70: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6d 78 46 72  for(i=1; i<=mxFr
1f80: 61 6d 65 3b 20 69 2b 2b 29 20 70 72 69 6e 74 5f  ame; i++) print_
1f90: 6f 6e 65 6c 69 6e 65 5f 66 72 61 6d 65 28 69 29  oneline_frame(i)
1fa0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1fb0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1fc0: 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  2; i<argc; i++){
1fd0: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 74 61 72  .      int iStar
1fe0: 74 2c 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 63  t, iEnd;.      c
1ff0: 68 61 72 20 2a 7a 4c 65 66 74 3b 0a 20 20 20 20  har *zLeft;.    
2000: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
2010: 76 5b 69 5d 2c 20 22 68 65 61 64 65 72 22 29 3d  v[i], "header")=
2020: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
2030: 69 6e 74 5f 77 61 6c 5f 68 65 61 64 65 72 28 29  int_wal_header()
2040: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
2050: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2060: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 61    if( !isdigit(a
2070: 72 67 76 5b 69 5d 5b 30 5d 29 20 29 7b 0a 20 20  rgv[i][0]) ){.  
2080: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
2090: 64 65 72 72 2c 20 22 25 73 3a 20 75 6e 6b 6e 6f  derr, "%s: unkno
20a0: 77 6e 20 6f 70 74 69 6f 6e 3a 20 5b 25 73 5d 5c  wn option: [%s]\
20b0: 6e 22 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67  n", argv[0], arg
20c0: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 63  v[i]);.        c
20d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
20e0: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
20f0: 73 74 72 74 6f 6c 28 61 72 67 76 5b 69 5d 2c 20  strtol(argv[i], 
2100: 26 7a 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  &zLeft, 0);.    
2110: 20 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20 73    if( zLeft && s
2120: 74 72 63 6d 70 28 7a 4c 65 66 74 2c 22 2e 2e 65  trcmp(zLeft,"..e
2130: 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nd")==0 ){.     
2140: 20 20 20 69 45 6e 64 20 3d 20 6d 78 46 72 61 6d     iEnd = mxFram
2150: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
2160: 66 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66  f( zLeft && zLef
2170: 74 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 7a 4c 65  t[0]=='.' && zLe
2180: 66 74 5b 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20  ft[1]=='.' ){.  
2190: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 74 72        iEnd = str
21a0: 74 6f 6c 28 26 7a 4c 65 66 74 5b 32 5d 2c 20 30  tol(&zLeft[2], 0
21b0: 2c 20 30 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  , 0);.#if 0.    
21c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 65 66    }else if( zLef
21d0: 74 20 26 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27  t && zLeft[0]=='
21e0: 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  b' ){.        in
21f0: 74 20 6f 66 73 74 2c 20 6e 42 79 74 65 2c 20 68  t ofst, nByte, h
2200: 64 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  drSize;.        
2210: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
2220: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53  ;.        if( iS
2230: 74 61 72 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  tart==1 ){.     
2240: 20 20 20 20 20 6f 66 73 74 20 3d 20 68 64 72 53       ofst = hdrS
2250: 69 7a 65 20 3d 20 31 30 30 3b 0a 20 20 20 20 20  ize = 100;.     
2260: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 70 61 67       nByte = pag
2270: 65 73 69 7a 65 2d 31 30 30 3b 0a 20 20 20 20 20  esize-100;.     
2280: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2290: 20 20 20 20 68 64 72 53 69 7a 65 20 3d 20 30 3b      hdrSize = 0;
22a0: 0a 20 20 20 20 20 20 20 20 20 20 6f 66 73 74 20  .          ofst 
22b0: 3d 20 28 69 53 74 61 72 74 2d 31 29 2a 70 61 67  = (iStart-1)*pag
22c0: 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  esize;.         
22d0: 20 6e 42 79 74 65 20 3d 20 70 61 67 65 73 69 7a   nByte = pagesiz
22e0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
22f0: 20 20 20 20 20 61 20 3d 20 67 65 74 43 6f 6e 74       a = getCont
2300: 65 6e 74 28 6f 66 73 74 2c 20 6e 42 79 74 65 29  ent(ofst, nByte)
2310: 3b 0a 20 20 20 20 20 20 20 20 64 65 63 6f 64 65  ;.        decode
2320: 5f 62 74 72 65 65 5f 70 61 67 65 28 61 2c 20 69  _btree_page(a, i
2330: 53 74 61 72 74 2c 20 68 64 72 53 69 7a 65 29 3b  Start, hdrSize);
2340: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 61 29  .        free(a)
2350: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
2360: 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ue;.#endif.     
2370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2380: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 3b 0a 20  iEnd = iStart;. 
2390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23a0: 20 69 53 74 61 72 74 3c 31 20 7c 7c 20 69 45 6e   iStart<1 || iEn
23b0: 64 3c 69 53 74 61 72 74 20 7c 7c 20 69 45 6e 64  d<iStart || iEnd
23c0: 3e 6d 78 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  >mxFrame ){.    
23d0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
23e0: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 50  rr,.          "P
23f0: 61 67 65 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  age argument sho
2400: 75 6c 64 20 62 65 20 4c 4f 57 45 52 3f 2e 2e 55  uld be LOWER?..U
2410: 50 50 45 52 3f 2e 20 20 52 61 6e 67 65 20 31 20  PPER?.  Range 1 
2420: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
2430: 20 20 20 20 6d 78 46 72 61 6d 65 29 3b 0a 20 20      mxFrame);.  
2440: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
2450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
2460: 6c 65 28 20 69 53 74 61 72 74 3c 3d 69 45 6e 64  le( iStart<=iEnd
2470: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
2480: 74 5f 66 72 61 6d 65 28 69 53 74 61 72 74 29 3b  t_frame(iStart);
2490: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 2b  .        iStart+
24a0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
24b0: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29  .  }.  close(fd)
24c0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.