/ Hex Artifact Content
Login

Artifact ad9d768f96ca6199ad3a8c9562d679680bd032dd01204ea3e5ea6fb931d81847:


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 64 65 66   <fcntl.h>..#def
00b0: 69 6e 65 20 49 53 44 49 47 49 54 28 58 29 20 20  ine ISDIGIT(X)  
00c0: 69 73 64 69 67 69 74 28 28 75 6e 73 69 67 6e 65  isdigit((unsigne
00d0: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
00e0: 69 6e 65 20 49 53 50 52 49 4e 54 28 58 29 20 20  ine ISPRINT(X)  
00f0: 69 73 70 72 69 6e 74 28 28 75 6e 73 69 67 6e 65  isprint((unsigne
0100: 64 20 63 68 61 72 29 28 58 29 29 0a 0a 23 69 66  d char)(X))..#if
0110: 20 21 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56   !defined(_MSC_V
0120: 45 52 29 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  ER).#include <un
0130: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0140: 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23   <sys/types.h>.#
0150: 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20 3c 69  else.#include <i
0160: 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  o.h>.#endif..#in
0170: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
0180: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0190: 67 2e 68 3e 0a 0a 0a 73 74 61 74 69 63 20 69 6e  g.h>...static in
01a0: 74 20 70 61 67 65 73 69 7a 65 20 3d 20 31 30 32  t pagesize = 102
01b0: 34 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  4;     /* Size o
01c0: 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
01d0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
01e0: 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
01f0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
0200: 63 72 69 70 74 6f 72 20 66 6f 72 20 72 65 61 64  criptor for read
0210: 69 6e 67 20 74 68 65 20 57 41 4c 20 66 69 6c 65  ing the WAL file
0220: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
0230: 78 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  xFrame = 0;     
0240: 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 61 6d      /* Last fram
0250: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
0260: 70 65 72 4c 69 6e 65 20 3d 20 31 36 3b 20 20 20  perLine = 16;   
0270: 20 20 20 20 20 2f 2a 20 48 45 58 20 65 6c 65 6d       /* HEX elem
0280: 65 6e 74 73 20 74 6f 20 70 72 69 6e 74 20 70 65  ents to print pe
0290: 72 20 6c 69 6e 65 20 2a 2f 0a 0a 74 79 70 65 64  r line */..typed
02a0: 65 66 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74  ef long long int
02b0: 20 69 36 34 3b 20 20 20 20 20 20 2f 2a 20 44 61   i64;      /* Da
02c0: 74 61 74 79 70 65 20 66 6f 72 20 36 34 2d 62 69  tatype for 64-bi
02d0: 74 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 0a 2f  t integers */../
02e0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  * Information fo
02f0: 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20  r computing the 
0300: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 74 79 70 65  checksum */.type
0310: 64 65 66 20 73 74 72 75 63 74 20 43 6b 73 75 6d  def struct Cksum
0320: 20 43 6b 73 75 6d 3b 0a 73 74 72 75 63 74 20 43   Cksum;.struct C
0330: 6b 73 75 6d 20 7b 0a 20 20 69 6e 74 20 62 53 77  ksum {.  int bSw
0340: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ap;           /*
0350: 20 54 72 75 65 20 74 6f 20 64 6f 20 62 79 74 65   True to do byte
0360: 20 73 77 61 70 70 69 6e 67 20 6f 6e 20 33 32 2d   swapping on 32-
0370: 62 69 74 20 77 6f 72 64 73 20 2a 2f 0a 20 20 75  bit words */.  u
0380: 6e 73 69 67 6e 65 64 20 73 30 2c 20 73 31 3b 20  nsigned s0, s1; 
0390: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 63      /* Current c
03a0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f  hecksum value */
03b0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 65 78 74 72 61  .};../*.** extra
03c0: 63 74 20 61 20 33 32 2d 62 69 74 20 62 69 67 2d  ct a 32-bit big-
03d0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 0a 2a  endian integer.*
03e0: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
03f0: 64 20 69 6e 74 20 67 65 74 49 6e 74 33 32 28 63  d int getInt32(c
0400: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
0410: 61 72 20 2a 61 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *a){.  unsign
0420: 65 64 20 69 6e 74 20 78 20 3d 20 28 61 5b 30 5d  ed int x = (a[0]
0430: 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31  <<24) + (a[1]<<1
0440: 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b  6) + (a[2]<<8) +
0450: 20 61 5b 33 5d 3b 0a 20 20 72 65 74 75 72 6e 20   a[3];.  return 
0460: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  x;.}../*.** Swap
0470: 20 62 79 74 65 73 20 6f 6e 20 61 20 33 32 2d 62   bytes on a 32-b
0480: 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
0490: 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ger.*/.static un
04a0: 73 69 67 6e 65 64 20 69 6e 74 20 73 77 61 62 33  signed int swab3
04b0: 32 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78  2(unsigned int x
04c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 28 78  ){.  return (((x
04d0: 29 26 30 78 30 30 30 30 30 30 46 46 29 3c 3c 32  )&0x000000FF)<<2
04e0: 34 29 20 2b 20 28 28 28 78 29 26 30 78 30 30 30  4) + (((x)&0x000
04f0: 30 46 46 30 30 29 3c 3c 38 29 0a 20 20 20 20 20  0FF00)<<8).     
0500: 20 20 20 20 2b 20 28 28 28 78 29 26 30 78 30 30      + (((x)&0x00
0510: 46 46 30 30 30 30 29 3e 3e 38 29 20 20 2b 20 28  FF0000)>>8)  + (
0520: 28 28 78 29 26 30 78 46 46 30 30 30 30 30 30 29  ((x)&0xFF000000)
0530: 3e 3e 32 34 29 3b 0a 7d 0a 0a 2f 2a 20 45 78 74  >>24);.}../* Ext
0540: 65 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  end the checksum
0550: 2e 20 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  .  Reinitialize 
0560: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 66 20  the checksum if 
0570: 62 49 6e 69 74 20 69 73 20 74 72 75 65 2e 0a 2a  bInit is true..*
0580: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
0590: 74 65 6e 64 43 6b 73 75 6d 28 0a 20 20 43 6b 73  tendCksum(.  Cks
05a0: 75 6d 20 2a 70 43 6b 73 75 6d 2c 0a 20 20 75 6e  um *pCksum,.  un
05b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
05c0: 74 61 2c 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  ta,.  unsigned i
05d0: 6e 74 20 6e 42 79 74 65 2c 0a 20 20 69 6e 74 20  nt nByte,.  int 
05e0: 62 49 6e 69 74 0a 29 7b 0a 20 20 75 6e 73 69 67  bInit.){.  unsig
05f0: 6e 65 64 20 69 6e 74 20 2a 61 33 32 3b 0a 20 20  ned int *a32;.  
0600: 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20  if( bInit ){.   
0610: 20 69 6e 74 20 61 20 3d 20 30 3b 0a 20 20 20 20   int a = 0;.    
0620: 2a 28 28 63 68 61 72 2a 29 26 61 29 20 3d 20 31  *((char*)&a) = 1
0630: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 31 20 29  ;.    if( a==1 )
0640: 7b 0a 20 20 20 20 20 20 2f 2a 20 48 6f 73 74 20  {.      /* Host 
0650: 69 73 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  is little-endian
0660: 20 2a 2f 0a 20 20 20 20 20 20 70 43 6b 73 75 6d   */.      pCksum
0670: 2d 3e 62 53 77 61 70 20 3d 20 67 65 74 49 6e 74  ->bSwap = getInt
0680: 33 32 28 61 44 61 74 61 29 21 3d 30 78 33 37 37  32(aData)!=0x377
0690: 66 30 36 38 32 3b 0a 20 20 20 20 7d 65 6c 73 65  f0682;.    }else
06a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 48 6f 73 74 20  {.      /* Host 
06b0: 69 73 20 62 69 67 2d 65 6e 64 69 61 6e 20 2a 2f  is big-endian */
06c0: 0a 20 20 20 20 20 20 70 43 6b 73 75 6d 2d 3e 62  .      pCksum->b
06d0: 53 77 61 70 20 3d 20 67 65 74 49 6e 74 33 32 28  Swap = getInt32(
06e0: 61 44 61 74 61 29 21 3d 30 78 33 37 37 66 30 36  aData)!=0x377f06
06f0: 38 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  83;.    }.    pC
0700: 6b 73 75 6d 2d 3e 73 30 20 3d 20 30 3b 0a 20 20  ksum->s0 = 0;.  
0710: 20 20 70 43 6b 73 75 6d 2d 3e 73 31 20 3d 20 30    pCksum->s1 = 0
0720: 3b 0a 20 20 7d 0a 20 20 61 33 32 20 3d 20 28 75  ;.  }.  a32 = (u
0730: 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29 61 44 61  nsigned int*)aDa
0740: 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 6e 42 79  ta;.  while( nBy
0750: 74 65 3e 30 20 29 7b 0a 20 20 20 20 75 6e 73 69  te>0 ){.    unsi
0760: 67 6e 65 64 20 69 6e 74 20 78 30 20 3d 20 61 33  gned int x0 = a3
0770: 32 5b 30 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e  2[0];.    unsign
0780: 65 64 20 69 6e 74 20 78 31 20 3d 20 61 33 32 5b  ed int x1 = a32[
0790: 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6b 73  1];.    if( pCks
07a0: 75 6d 2d 3e 62 53 77 61 70 20 29 7b 0a 20 20 20  um->bSwap ){.   
07b0: 20 20 20 78 30 20 3d 20 73 77 61 62 33 32 28 78     x0 = swab32(x
07c0: 30 29 3b 0a 20 20 20 20 20 20 78 31 20 3d 20 73  0);.      x1 = s
07d0: 77 61 62 33 32 28 78 31 29 3b 0a 20 20 20 20 7d  wab32(x1);.    }
07e0: 0a 20 20 20 20 70 43 6b 73 75 6d 2d 3e 73 30 20  .    pCksum->s0 
07f0: 2b 3d 20 78 30 20 2b 20 70 43 6b 73 75 6d 2d 3e  += x0 + pCksum->
0800: 73 31 3b 0a 20 20 20 20 70 43 6b 73 75 6d 2d 3e  s1;.    pCksum->
0810: 73 31 20 2b 3d 20 78 31 20 2b 20 70 43 6b 73 75  s1 += x1 + pCksu
0820: 6d 2d 3e 73 30 3b 0a 20 20 20 20 6e 42 79 74 65  m->s0;.    nByte
0830: 20 2d 3d 20 38 3b 0a 20 20 20 20 61 33 32 20 2b   -= 8;.    a32 +
0840: 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
0850: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 76 61  * Convert the va
0860: 72 2d 69 6e 74 20 66 6f 72 6d 61 74 20 69 6e 74  r-int format int
0870: 6f 20 69 36 34 2e 20 20 52 65 74 75 72 6e 20 74  o i64.  Return t
0880: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
0890: 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 76 61 72  es.** in the var
08a0: 2d 69 6e 74 2e 20 20 57 72 69 74 65 20 74 68 65  -int.  Write the
08b0: 20 76 61 72 2d 69 6e 74 20 76 61 6c 75 65 20 69   var-int value i
08c0: 6e 74 6f 20 2a 70 56 61 6c 2e 0a 2a 2f 0a 73 74  nto *pVal..*/.st
08d0: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 56  atic int decodeV
08e0: 61 72 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69  arint(const unsi
08f0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 36  gned char *z, i6
0900: 34 20 2a 70 56 61 6c 29 7b 0a 20 20 69 36 34 20  4 *pVal){.  i64 
0910: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  v = 0;.  int i;.
0920: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 38 3b 20    for(i=0; i<8; 
0930: 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 28 76  i++){.    v = (v
0940: 3c 3c 37 29 20 2b 20 28 7a 5b 69 5d 26 30 78 37  <<7) + (z[i]&0x7
0950: 66 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69  f);.    if( (z[i
0960: 5d 26 30 78 38 30 29 3d 3d 30 20 29 7b 20 2a 70  ]&0x80)==0 ){ *p
0970: 56 61 6c 20 3d 20 76 3b 20 72 65 74 75 72 6e 20  Val = v; return 
0980: 69 2b 31 3b 20 7d 0a 20 20 7d 0a 20 20 76 20 3d  i+1; }.  }.  v =
0990: 20 28 76 3c 3c 38 29 20 2b 20 28 7a 5b 69 5d 26   (v<<8) + (z[i]&
09a0: 30 78 66 66 29 3b 0a 20 20 2a 70 56 61 6c 20 3d  0xff);.  *pVal =
09b0: 20 76 3b 0a 20 20 72 65 74 75 72 6e 20 39 3b 0a   v;.  return 9;.
09c0: 7d 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  }../* Report an 
09d0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09e0: 72 6f 72 20 61 6e 64 20 64 69 65 2e 0a 2a 2f 0a  ror and die..*/.
09f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 5f  static void out_
0a00: 6f 66 5f 6d 65 6d 6f 72 79 28 76 6f 69 64 29 7b  of_memory(void){
0a10: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
0a20: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
0a30: 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28  ...\n");.  exit(
0a40: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  1);.}../*.** Rea
0a50: 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
0a60: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  he file..**.** S
0a70: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
0a80: 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 62 74 61   content is obta
0a90: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
0aa0: 28 29 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  () and needs to 
0ab0: 62 65 0a 2a 2a 20 66 72 65 65 64 20 62 79 20 74  be.** freed by t
0ac0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
0ad0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
0ae0: 61 72 20 2a 67 65 74 43 6f 6e 74 65 6e 74 28 69  ar *getContent(i
0af0: 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 42 79  nt ofst, int nBy
0b00: 74 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  te){.  unsigned 
0b10: 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 61  char *aData;.  a
0b20: 44 61 74 61 20 3d 20 6d 61 6c 6c 6f 63 28 6e 42  Data = malloc(nB
0b30: 79 74 65 29 3b 0a 20 20 69 66 28 20 61 44 61 74  yte);.  if( aDat
0b40: 61 3d 3d 30 20 29 20 6f 75 74 5f 6f 66 5f 6d 65  a==0 ) out_of_me
0b50: 6d 6f 72 79 28 29 3b 0a 20 20 6c 73 65 65 6b 28  mory();.  lseek(
0b60: 66 64 2c 20 6f 66 73 74 2c 20 53 45 45 4b 5f 53  fd, ofst, SEEK_S
0b70: 45 54 29 3b 0a 20 20 72 65 61 64 28 66 64 2c 20  ET);.  read(fd, 
0b80: 61 44 61 74 61 2c 20 6e 42 79 74 65 29 3b 0a 20  aData, nByte);. 
0b90: 20 72 65 74 75 72 6e 20 61 44 61 74 61 3b 0a 7d   return aData;.}
0ba0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ../*.** Print a 
0bb0: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 61  range of bytes a
0bc0: 73 20 68 65 78 20 61 6e 64 20 61 73 20 61 73 63  s hex and as asc
0bd0: 69 69 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ii..*/.static vo
0be0: 69 64 20 70 72 69 6e 74 5f 62 79 74 65 5f 72 61  id print_byte_ra
0bf0: 6e 67 65 28 0a 20 20 69 6e 74 20 6f 66 73 74 2c  nge(.  int ofst,
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c10: 20 46 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   First byte in t
0c20: 68 65 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65  he range of byte
0c30: 73 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20  s to print */.  
0c40: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
0c50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0c60: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 70 72 69   of bytes to pri
0c70: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
0c80: 20 63 68 61 72 20 2a 61 44 61 74 61 2c 20 20 2f   char *aData,  /
0c90: 2a 20 43 6f 6e 74 65 6e 74 20 74 6f 20 70 72 69  * Content to pri
0ca0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 72 69 6e  nt */.  int prin
0cb0: 74 4f 66 73 74 20 20 20 20 20 20 20 20 20 20 2f  tOfst          /
0cc0: 2a 20 41 64 64 20 74 68 69 73 20 61 6d 6f 75 6e  * Add this amoun
0cd0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
0ce0: 6e 20 74 68 65 20 6c 65 66 74 20 63 6f 6c 75 6d  n the left colum
0cf0: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  n */.){.  int i,
0d00: 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
0d10: 20 2a 7a 4f 66 73 74 46 6d 74 3b 0a 0a 20 20 69   *zOfstFmt;..  i
0d20: 66 28 20 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e  f( ((printOfst+n
0d30: 42 79 74 65 29 26 7e 30 78 66 66 66 29 3d 3d 30  Byte)&~0xfff)==0
0d40: 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74   ){.    zOfstFmt
0d50: 20 3d 20 22 20 25 30 33 78 3a 20 22 3b 0a 20 20   = " %03x: ";.  
0d60: 7d 65 6c 73 65 20 69 66 28 20 28 28 70 72 69 6e  }else if( ((prin
0d70: 74 4f 66 73 74 2b 6e 42 79 74 65 29 26 7e 30 78  tOfst+nByte)&~0x
0d80: 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ffff)==0 ){.    
0d90: 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 34  zOfstFmt = " %04
0da0: 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  x: ";.  }else if
0db0: 28 20 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42  ( ((printOfst+nB
0dc0: 79 74 65 29 26 7e 30 78 66 66 66 66 66 29 3d 3d  yte)&~0xfffff)==
0dd0: 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d  0 ){.    zOfstFm
0de0: 74 20 3d 20 22 20 25 30 35 78 3a 20 22 3b 0a 20  t = " %05x: ";. 
0df0: 20 7d 65 6c 73 65 20 69 66 28 20 28 28 70 72 69   }else if( ((pri
0e00: 6e 74 4f 66 73 74 2b 6e 42 79 74 65 29 26 7e 30  ntOfst+nByte)&~0
0e10: 78 66 66 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20  xffffff)==0 ){. 
0e20: 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20     zOfstFmt = " 
0e30: 25 30 36 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65  %06x: ";.  }else
0e40: 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d  {.    zOfstFmt =
0e50: 20 22 20 25 30 38 78 3a 20 22 3b 0a 20 20 7d 0a   " %08x: ";.  }.
0e60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
0e70: 79 74 65 3b 20 69 20 2b 3d 20 70 65 72 4c 69 6e  yte; i += perLin
0e80: 65 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e){.    fprintf(
0e90: 73 74 64 6f 75 74 2c 20 7a 4f 66 73 74 46 6d 74  stdout, zOfstFmt
0ea0: 2c 20 69 2b 70 72 69 6e 74 4f 66 73 74 29 3b 0a  , i+printOfst);.
0eb0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
0ec0: 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20  erLine; j++){.  
0ed0: 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74      if( i+j>nByt
0ee0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
0ef0: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 20 20  intf(stdout, "  
0f00: 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   ");.      }else
0f10: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
0f20: 66 28 73 74 64 6f 75 74 2c 22 25 30 32 78 20 22  f(stdout,"%02x "
0f30: 2c 20 61 44 61 74 61 5b 69 2b 6a 5d 29 3b 0a 20  , aData[i+j]);. 
0f40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
0f50: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 65 72 4c   for(j=0; j<perL
0f60: 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ine; j++){.     
0f70: 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74 65 20 29   if( i+j>nByte )
0f80: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
0f90: 66 28 73 74 64 6f 75 74 2c 20 22 20 22 29 3b 0a  f(stdout, " ");.
0fa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
0fb0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
0fc0: 6f 75 74 2c 22 25 63 22 2c 20 49 53 50 52 49 4e  out,"%c", ISPRIN
0fd0: 54 28 61 44 61 74 61 5b 69 2b 6a 5d 29 20 3f 20  T(aData[i+j]) ? 
0fe0: 61 44 61 74 61 5b 69 2b 6a 5d 20 3a 20 27 2e 27  aData[i+j] : '.'
0ff0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1000: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1010: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  out,"\n");.  }.}
1020: 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 6c 69 6e  ../* Print a lin
1030: 65 20 6f 66 20 64 65 63 6f 64 65 20 6f 75 74 70  e of decode outp
1040: 75 74 20 73 68 6f 77 69 6e 67 20 61 20 34 2d 62  ut showing a 4-b
1050: 79 74 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  yte integer..*/.
1060: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
1070: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 0a 20  t_decode_line(. 
1080: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1090: 61 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 43  aData,      /* C
10a0: 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 64 65 63  ontent being dec
10b0: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  oded */.  int of
10c0: 73 74 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  st, int nByte,  
10d0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 61 6e       /* Start an
10e0: 64 20 73 69 7a 65 20 6f 66 20 64 65 63 6f 64 65  d size of decode
10f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 73 48 65 78 2c   */.  int asHex,
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6f 75 74   /* If true, out
1120: 70 75 74 20 76 61 6c 75 65 20 61 73 20 68 65 78  put value as hex
1130: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1140: 20 2a 7a 4d 73 67 20 20 20 20 20 20 20 20 20 20   *zMsg          
1150: 20 2f 2a 20 4d 65 73 73 61 67 65 20 74 6f 20 61   /* Message to a
1160: 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ppend */.){.  in
1170: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 76 61  t i, j;.  int va
1180: 6c 20 3d 20 61 44 61 74 61 5b 6f 66 73 74 5d 3b  l = aData[ofst];
1190: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
11a0: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
11b0: 66 2c 20 22 20 25 30 33 78 3a 20 25 30 32 78 22  f, " %03x: %02x"
11c0: 2c 20 6f 66 73 74 2c 20 61 44 61 74 61 5b 6f 66  , ofst, aData[of
11d0: 73 74 5d 29 3b 0a 20 20 69 20 3d 20 28 69 6e 74  st]);.  i = (int
11e0: 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20  )strlen(zBuf);. 
11f0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 3b 20 6a   for(j=1; j<4; j
1200: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  ++){.    if( j>=
1210: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 73  nByte ){.      s
1220: 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d 2c  printf(&zBuf[i],
1230: 20 22 20 20 20 22 29 3b 0a 20 20 20 20 7d 65 6c   "   ");.    }el
1240: 73 65 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  se{.      sprint
1250: 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 25 30  f(&zBuf[i], " %0
1260: 32 78 22 2c 20 61 44 61 74 61 5b 6f 66 73 74 2b  2x", aData[ofst+
1270: 6a 5d 29 3b 0a 20 20 20 20 20 20 76 61 6c 20 3d  j]);.      val =
1280: 20 76 61 6c 2a 32 35 36 20 2b 20 61 44 61 74 61   val*256 + aData
1290: 5b 6f 66 73 74 2b 6a 5d 3b 0a 20 20 20 20 7d 0a  [ofst+j];.    }.
12a0: 20 20 20 20 69 20 2b 3d 20 28 69 6e 74 29 73 74      i += (int)st
12b0: 72 6c 65 6e 28 26 7a 42 75 66 5b 69 5d 29 3b 0a  rlen(&zBuf[i]);.
12c0: 20 20 7d 0a 20 20 69 66 28 20 61 73 48 65 78 20    }.  if( asHex 
12d0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ){.    sprintf(&
12e0: 7a 42 75 66 5b 69 5d 2c 20 22 20 20 30 78 25 30  zBuf[i], "  0x%0
12f0: 38 78 22 2c 20 76 61 6c 29 3b 0a 20 20 7d 65 6c  8x", val);.  }el
1300: 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  se{.    sprintf(
1310: 26 7a 42 75 66 5b 69 5d 2c 20 22 20 20 20 25 39  &zBuf[i], "   %9
1320: 64 22 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20  d", val);.  }.  
1330: 70 72 69 6e 74 66 28 22 25 73 20 20 25 73 5c 6e  printf("%s  %s\n
1340: 22 2c 20 7a 42 75 66 2c 20 7a 4d 73 67 29 3b 0a  ", zBuf, zMsg);.
1350: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
1360: 6e 20 65 6e 74 69 72 65 20 70 61 67 65 20 6f 66  n entire page of
1370: 20 63 6f 6e 74 65 6e 74 20 61 73 20 68 65 78 0a   content as hex.
1380: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1390: 72 69 6e 74 5f 66 72 61 6d 65 28 69 6e 74 20 69  rint_frame(int i
13a0: 46 72 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 53  Frame){.  int iS
13b0: 74 61 72 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  tart;.  unsigned
13c0: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20   char *aData;.  
13d0: 69 53 74 61 72 74 20 3d 20 33 32 20 2b 20 28 69  iStart = 32 + (i
13e0: 46 72 61 6d 65 2d 31 29 2a 28 70 61 67 65 73 69  Frame-1)*(pagesi
13f0: 7a 65 2b 32 34 29 3b 0a 20 20 66 70 72 69 6e 74  ze+24);.  fprint
1400: 66 28 73 74 64 6f 75 74 2c 20 22 46 72 61 6d 65  f(stdout, "Frame
1410: 20 25 64 3a 20 20 20 28 6f 66 66 73 65 74 73 20   %d:   (offsets 
1420: 30 78 25 78 2e 2e 30 78 25 78 29 5c 6e 22 2c 0a  0x%x..0x%x)\n",.
1430: 20 20 20 20 20 20 20 20 20 20 69 46 72 61 6d 65            iFrame
1440: 2c 20 69 53 74 61 72 74 2c 20 69 53 74 61 72 74  , iStart, iStart
1450: 2b 70 61 67 65 73 69 7a 65 2b 32 34 29 3b 0a 20  +pagesize+24);. 
1460: 20 61 44 61 74 61 20 3d 20 67 65 74 43 6f 6e 74   aData = getCont
1470: 65 6e 74 28 69 53 74 61 72 74 2c 20 70 61 67 65  ent(iStart, page
1480: 73 69 7a 65 2b 32 34 29 3b 0a 20 20 70 72 69 6e  size+24);.  prin
1490: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
14a0: 61 74 61 2c 20 30 2c 20 34 2c 20 30 2c 20 22 50  ata, 0, 4, 0, "P
14b0: 61 67 65 20 6e 75 6d 62 65 72 22 29 3b 0a 20 20  age number");.  
14c0: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
14d0: 65 28 61 44 61 74 61 2c 20 34 2c 20 34 2c 20 30  e(aData, 4, 4, 0
14e0: 2c 20 22 44 42 20 73 69 7a 65 2c 20 6f 72 20 30  , "DB size, or 0
14f0: 20 66 6f 72 20 6e 6f 6e 2d 63 6f 6d 6d 69 74 22   for non-commit"
1500: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1510: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 38 2c  e_line(aData, 8,
1520: 20 34 2c 20 31 2c 20 22 53 61 6c 74 2d 31 22 29   4, 1, "Salt-1")
1530: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1540: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 31 32 2c 20  _line(aData,12, 
1550: 34 2c 20 31 2c 20 22 53 61 6c 74 2d 32 22 29 3b  4, 1, "Salt-2");
1560: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1570: 6c 69 6e 65 28 61 44 61 74 61 2c 31 36 2c 20 34  line(aData,16, 4
1580: 2c 20 31 2c 20 22 43 68 65 63 6b 73 75 6d 2d 31  , 1, "Checksum-1
1590: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
15a0: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 32 30  de_line(aData,20
15b0: 2c 20 34 2c 20 31 2c 20 22 43 68 65 63 6b 73 75  , 4, 1, "Checksu
15c0: 6d 2d 32 22 29 3b 0a 20 20 70 72 69 6e 74 5f 62  m-2");.  print_b
15d0: 79 74 65 5f 72 61 6e 67 65 28 69 53 74 61 72 74  yte_range(iStart
15e0: 2b 32 34 2c 20 70 61 67 65 73 69 7a 65 2c 20 61  +24, pagesize, a
15f0: 44 61 74 61 2b 32 34 2c 20 30 29 3b 0a 20 20 66  Data+24, 0);.  f
1600: 72 65 65 28 61 44 61 74 61 29 3b 0a 7d 0a 0a 2f  ree(aData);.}../
1610: 2a 0a 2a 2a 20 53 75 6d 6d 61 72 69 7a 65 20 61  *.** Summarize a
1620: 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f 6e   single frame on
1630: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 2e 0a   a single line..
1640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1650: 72 69 6e 74 5f 6f 6e 65 6c 69 6e 65 5f 66 72 61  rint_oneline_fra
1660: 6d 65 28 69 6e 74 20 69 46 72 61 6d 65 2c 20 43  me(int iFrame, C
1670: 6b 73 75 6d 20 2a 70 43 6b 73 75 6d 29 7b 0a 20  ksum *pCksum){. 
1680: 20 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 75   int iStart;.  u
1690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
16a0: 61 74 61 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ata;.  unsigned 
16b0: 69 6e 74 20 73 30 2c 20 73 31 3b 0a 20 20 69 53  int s0, s1;.  iS
16c0: 74 61 72 74 20 3d 20 33 32 20 2b 20 28 69 46 72  tart = 32 + (iFr
16d0: 61 6d 65 2d 31 29 2a 28 70 61 67 65 73 69 7a 65  ame-1)*(pagesize
16e0: 2b 32 34 29 3b 0a 20 20 61 44 61 74 61 20 3d 20  +24);.  aData = 
16f0: 67 65 74 43 6f 6e 74 65 6e 74 28 69 53 74 61 72  getContent(iStar
1700: 74 2c 20 32 34 29 3b 0a 20 20 65 78 74 65 6e 64  t, 24);.  extend
1710: 43 6b 73 75 6d 28 70 43 6b 73 75 6d 2c 20 61 44  Cksum(pCksum, aD
1720: 61 74 61 2c 20 38 2c 20 30 29 3b 0a 20 20 65 78  ata, 8, 0);.  ex
1730: 74 65 6e 64 43 6b 73 75 6d 28 70 43 6b 73 75 6d  tendCksum(pCksum
1740: 2c 20 67 65 74 43 6f 6e 74 65 6e 74 28 69 53 74  , getContent(iSt
1750: 61 72 74 2b 32 34 2c 20 70 61 67 65 73 69 7a 65  art+24, pagesize
1760: 29 2c 20 70 61 67 65 73 69 7a 65 2c 20 30 29 3b  ), pagesize, 0);
1770: 0a 20 20 73 30 20 3d 20 67 65 74 49 6e 74 33 32  .  s0 = getInt32
1780: 28 61 44 61 74 61 2b 31 36 29 3b 0a 20 20 73 31  (aData+16);.  s1
1790: 20 3d 20 67 65 74 49 6e 74 33 32 28 61 44 61 74   = getInt32(aDat
17a0: 61 2b 32 30 29 3b 0a 20 20 66 70 72 69 6e 74 66  a+20);.  fprintf
17b0: 28 73 74 64 6f 75 74 2c 20 22 46 72 61 6d 65 20  (stdout, "Frame 
17c0: 25 34 64 3a 20 25 36 64 20 25 36 64 20 30 78 25  %4d: %6d %6d 0x%
17d0: 30 38 78 2c 25 30 38 78 20 30 78 25 30 38 78 2c  08x,%08x 0x%08x,
17e0: 25 30 38 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20  %08x %s\n",.    
17f0: 20 20 20 20 20 20 69 46 72 61 6d 65 2c 20 0a 20        iFrame, . 
1800: 20 20 20 20 20 20 20 20 20 67 65 74 49 6e 74 33           getInt3
1810: 32 28 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  2(aData),.      
1820: 20 20 20 20 67 65 74 49 6e 74 33 32 28 61 44 61      getInt32(aDa
1830: 74 61 2b 34 29 2c 0a 20 20 20 20 20 20 20 20 20  ta+4),.         
1840: 20 67 65 74 49 6e 74 33 32 28 61 44 61 74 61 2b   getInt32(aData+
1850: 38 29 2c 0a 20 20 20 20 20 20 20 20 20 20 67 65  8),.          ge
1860: 74 49 6e 74 33 32 28 61 44 61 74 61 2b 31 32 29  tInt32(aData+12)
1870: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 30 2c 0a  ,.          s0,.
1880: 20 20 20 20 20 20 20 20 20 20 73 31 2c 0a 20 20            s1,.  
1890: 20 20 20 20 20 20 20 20 28 73 30 3d 3d 70 43 6b          (s0==pCk
18a0: 73 75 6d 2d 3e 73 30 20 26 26 20 73 31 3d 3d 70  sum->s0 && s1==p
18b0: 43 6b 73 75 6d 2d 3e 73 31 29 20 3f 20 22 22 20  Cksum->s1) ? "" 
18c0: 3a 20 22 63 6b 73 75 6d 2d 66 61 69 6c 22 0a 20  : "cksum-fail". 
18d0: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20   );..  /* Reset 
18e0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 73 6f 20  the checksum so 
18f0: 74 68 61 74 20 61 20 73 69 6e 67 6c 65 20 66 72  that a single fr
1900: 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 66 61 69  ame checksum fai
1910: 6c 75 72 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  lure will not.  
1920: 2a 2a 20 63 61 75 73 65 20 61 6c 6c 20 73 75 62  ** cause all sub
1930: 73 65 71 75 65 6e 74 20 66 72 61 6d 65 73 20 74  sequent frames t
1940: 6f 20 61 6c 73 6f 20 73 68 6f 77 20 61 20 66 61  o also show a fa
1950: 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 70 43 6b 73  ilure. */.  pCks
1960: 75 6d 2d 3e 73 30 20 3d 20 73 30 3b 0a 20 20 70  um->s0 = s0;.  p
1970: 43 6b 73 75 6d 2d 3e 73 31 20 3d 20 73 31 3b 0a  Cksum->s1 = s1;.
1980: 20 20 66 72 65 65 28 61 44 61 74 61 29 3b 0a 7d    free(aData);.}
1990: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
19a0: 68 65 20 57 41 4c 20 68 65 61 64 65 72 2e 0a 2a  he WAL header..*
19b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
19c0: 69 6e 74 5f 77 61 6c 5f 68 65 61 64 65 72 28 43  int_wal_header(C
19d0: 6b 73 75 6d 20 2a 70 43 6b 73 75 6d 29 7b 0a 20  ksum *pCksum){. 
19e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19f0: 61 44 61 74 61 3b 0a 20 20 61 44 61 74 61 20 3d  aData;.  aData =
1a00: 20 67 65 74 43 6f 6e 74 65 6e 74 28 30 2c 20 33   getContent(0, 3
1a10: 32 29 3b 0a 20 20 69 66 28 20 70 43 6b 73 75 6d  2);.  if( pCksum
1a20: 20 29 7b 0a 20 20 20 20 65 78 74 65 6e 64 43 6b   ){.    extendCk
1a30: 73 75 6d 28 70 43 6b 73 75 6d 2c 20 61 44 61 74  sum(pCksum, aDat
1a40: 61 2c 20 32 34 2c 20 31 29 3b 0a 20 20 20 20 70  a, 24, 1);.    p
1a50: 72 69 6e 74 66 28 22 43 68 65 63 6b 73 75 6d 20  rintf("Checksum 
1a60: 62 79 74 65 20 6f 72 64 65 72 3a 20 25 73 5c 6e  byte order: %s\n
1a70: 22 2c 20 70 43 6b 73 75 6d 2d 3e 62 53 77 61 70  ", pCksum->bSwap
1a80: 20 3f 20 22 73 77 61 70 70 65 64 22 20 3a 20 22   ? "swapped" : "
1a90: 6e 61 74 69 76 65 22 29 3b 0a 20 20 7d 0a 20 20  native");.  }.  
1aa0: 70 72 69 6e 74 66 28 22 57 41 4c 20 48 65 61 64  printf("WAL Head
1ab0: 65 72 3a 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74  er:\n");.  print
1ac0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1ad0: 74 61 2c 20 30 2c 20 34 2c 31 2c 22 4d 61 67 69  ta, 0, 4,1,"Magi
1ae0: 63 2e 20 20 30 78 33 37 37 66 30 36 38 32 20 28  c.  0x377f0682 (
1af0: 6c 65 29 20 6f 72 20 30 78 33 37 37 66 30 36 38  le) or 0x377f068
1b00: 33 20 28 62 65 29 22 29 3b 0a 20 20 70 72 69 6e  3 (be)");.  prin
1b10: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1b20: 61 74 61 2c 20 34 2c 20 34 2c 20 30 2c 20 22 46  ata, 4, 4, 0, "F
1b30: 69 6c 65 20 66 6f 72 6d 61 74 22 29 3b 0a 20 20  ile format");.  
1b40: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1b50: 65 28 61 44 61 74 61 2c 20 38 2c 20 34 2c 20 30  e(aData, 8, 4, 0
1b60: 2c 20 22 44 61 74 61 62 61 73 65 20 70 61 67 65  , "Database page
1b70: 20 73 69 7a 65 22 29 3b 0a 20 20 70 72 69 6e 74   size");.  print
1b80: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1b90: 74 61 2c 20 31 32 2c 34 2c 20 30 2c 20 22 43 68  ta, 12,4, 0, "Ch
1ba0: 65 63 6b 70 6f 69 6e 74 20 73 65 71 75 65 6e 63  eckpoint sequenc
1bb0: 65 20 6e 75 6d 62 65 72 22 29 3b 0a 20 20 70 72  e number");.  pr
1bc0: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1bd0: 61 44 61 74 61 2c 20 31 36 2c 34 2c 20 31 2c 20  aData, 16,4, 1, 
1be0: 22 53 61 6c 74 2d 31 22 29 3b 0a 20 20 70 72 69  "Salt-1");.  pri
1bf0: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
1c00: 44 61 74 61 2c 20 32 30 2c 34 2c 20 31 2c 20 22  Data, 20,4, 1, "
1c10: 53 61 6c 74 2d 32 22 29 3b 0a 20 20 70 72 69 6e  Salt-2");.  prin
1c20: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1c30: 61 74 61 2c 20 32 34 2c 34 2c 20 31 2c 20 22 43  ata, 24,4, 1, "C
1c40: 68 65 63 6b 73 75 6d 2d 31 22 29 3b 0a 20 20 70  hecksum-1");.  p
1c50: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1c60: 28 61 44 61 74 61 2c 20 32 38 2c 34 2c 20 31 2c  (aData, 28,4, 1,
1c70: 20 22 43 68 65 63 6b 73 75 6d 2d 32 22 29 3b 0a   "Checksum-2");.
1c80: 20 20 69 66 28 20 70 43 6b 73 75 6d 20 29 7b 0a    if( pCksum ){.
1c90: 20 20 20 20 69 66 28 20 70 43 6b 73 75 6d 2d 3e      if( pCksum->
1ca0: 73 30 21 3d 67 65 74 49 6e 74 33 32 28 61 44 61  s0!=getInt32(aDa
1cb0: 74 61 2b 32 34 29 20 29 7b 0a 20 20 20 20 20 20  ta+24) ){.      
1cc0: 70 72 69 6e 74 66 28 22 2a 2a 2a 2a 20 63 6b 73  printf("**** cks
1cd0: 75 6d 2d 31 20 6d 69 73 6d 61 74 63 68 3a 20 30  um-1 mismatch: 0
1ce0: 78 25 30 38 78 5c 6e 22 2c 20 70 43 6b 73 75 6d  x%08x\n", pCksum
1cf0: 2d 3e 73 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->s0);.    }.   
1d00: 20 69 66 28 20 70 43 6b 73 75 6d 2d 3e 73 31 21   if( pCksum->s1!
1d10: 3d 67 65 74 49 6e 74 33 32 28 61 44 61 74 61 2b  =getInt32(aData+
1d20: 32 38 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69  28) ){.      pri
1d30: 6e 74 66 28 22 2a 2a 2a 2a 20 63 6b 73 75 6d 2d  ntf("**** cksum-
1d40: 32 20 6d 69 73 6d 61 74 63 68 3a 20 30 78 25 30  2 mismatch: 0x%0
1d50: 38 78 5c 6e 22 2c 20 70 43 6b 73 75 6d 2d 3e 73  8x\n", pCksum->s
1d60: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
1d70: 66 72 65 65 28 61 44 61 74 61 29 3b 0a 7d 0a 2f  free(aData);.}./
1d80: 2a 0a 2a 2a 20 44 65 73 63 72 69 62 65 20 63 65  *.** Describe ce
1d90: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73  ll content..*/.s
1da0: 74 61 74 69 63 20 69 36 34 20 64 65 73 63 72 69  tatic i64 descri
1db0: 62 65 43 6f 6e 74 65 6e 74 28 0a 20 20 75 6e 73  beContent(.  uns
1dc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 20  igned char *a,  
1dd0: 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e       /* Cell con
1de0: 74 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4c  tent */.  i64 nL
1df0: 6f 63 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ocal,           
1e00: 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 61 5b    /* Bytes in a[
1e10: 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  ] */.  char *zDe
1e20: 73 63 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  sc             /
1e30: 2a 20 57 72 69 74 65 20 64 65 73 63 72 69 70 74  * Write descript
1e40: 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ion here */.){. 
1e50: 20 69 6e 74 20 6e 44 65 73 63 20 3d 20 30 3b 0a   int nDesc = 0;.
1e60: 20 20 69 6e 74 20 6e 2c 20 6a 3b 0a 20 20 69 36    int n, j;.  i6
1e70: 34 20 69 2c 20 78 2c 20 76 3b 0a 20 20 63 6f 6e  4 i, x, v;.  con
1e80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1e90: 20 2a 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74   *pData;.  const
1ea0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1eb0: 70 4c 69 6d 69 74 3b 0a 20 20 63 68 61 72 20 73  pLimit;.  char s
1ec0: 65 70 20 3d 20 27 20 27 3b 0a 0a 20 20 70 4c 69  ep = ' ';..  pLi
1ed0: 6d 69 74 20 3d 20 26 61 5b 6e 4c 6f 63 61 6c 5d  mit = &a[nLocal]
1ee0: 3b 0a 20 20 6e 20 3d 20 64 65 63 6f 64 65 56 61  ;.  n = decodeVa
1ef0: 72 69 6e 74 28 61 2c 20 26 78 29 3b 0a 20 20 70  rint(a, &x);.  p
1f00: 44 61 74 61 20 3d 20 26 61 5b 78 5d 3b 0a 20 20  Data = &a[x];.  
1f10: 61 20 2b 3d 20 6e 3b 0a 20 20 69 20 3d 20 78 20  a += n;.  i = x 
1f20: 2d 20 6e 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  - n;.  while( i>
1f30: 30 20 26 26 20 70 44 61 74 61 3c 3d 70 4c 69 6d  0 && pData<=pLim
1f40: 69 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 64 65  it ){.    n = de
1f50: 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 78  codeVarint(a, &x
1f60: 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20  );.    a += n;. 
1f70: 20 20 20 69 20 2d 3d 20 6e 3b 0a 20 20 20 20 6e     i -= n;.    n
1f80: 4c 6f 63 61 6c 20 2d 3d 20 6e 3b 0a 20 20 20 20  Local -= n;.    
1f90: 7a 44 65 73 63 5b 30 5d 20 3d 20 73 65 70 3b 0a  zDesc[0] = sep;.
1fa0: 20 20 20 20 73 65 70 20 3d 20 27 2c 27 3b 0a 20      sep = ',';. 
1fb0: 20 20 20 6e 44 65 73 63 2b 2b 3b 0a 20 20 20 20     nDesc++;.    
1fc0: 7a 44 65 73 63 2b 2b 3b 0a 20 20 20 20 69 66 28  zDesc++;.    if(
1fd0: 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   x==0 ){.      s
1fe0: 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 2a  printf(zDesc, "*
1ff0: 22 29 3b 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 20  ");     /* NULL 
2000: 69 73 20 61 20 22 2a 22 20 2a 2f 0a 20 20 20 20  is a "*" */.    
2010: 7d 65 6c 73 65 20 69 66 28 20 78 3e 3d 31 20 26  }else if( x>=1 &
2020: 26 20 78 3c 3d 36 20 29 7b 0a 20 20 20 20 20 20  & x<=6 ){.      
2030: 76 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  v = (signed char
2040: 29 70 44 61 74 61 5b 30 5d 3b 0a 20 20 20 20 20  )pData[0];.     
2050: 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20   pData++;.      
2060: 73 77 69 74 63 68 28 20 78 20 29 7b 0a 20 20 20  switch( x ){.   
2070: 20 20 20 20 20 63 61 73 65 20 36 3a 20 20 76 20       case 6:  v 
2080: 3d 20 28 76 3c 3c 31 36 29 20 2b 20 28 70 44 61  = (v<<16) + (pDa
2090: 74 61 5b 30 5d 3c 3c 38 29 20 2b 20 70 44 61 74  ta[0]<<8) + pDat
20a0: 61 5b 31 5d 3b 20 20 70 44 61 74 61 20 2b 3d 20  a[1];  pData += 
20b0: 32 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  2;.        case 
20c0: 35 3a 20 20 76 20 3d 20 28 76 3c 3c 31 36 29 20  5:  v = (v<<16) 
20d0: 2b 20 28 70 44 61 74 61 5b 30 5d 3c 3c 38 29 20  + (pData[0]<<8) 
20e0: 2b 20 70 44 61 74 61 5b 31 5d 3b 20 20 70 44 61  + pData[1];  pDa
20f0: 74 61 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ta += 2;.       
2100: 20 63 61 73 65 20 34 3a 20 20 76 20 3d 20 28 76   case 4:  v = (v
2110: 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b  <<8) + pData[0];
2120: 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20    pData++;.     
2130: 20 20 20 63 61 73 65 20 33 3a 20 20 76 20 3d 20     case 3:  v = 
2140: 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30  (v<<8) + pData[0
2150: 5d 3b 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20  ];  pData++;.   
2160: 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 76 20       case 2:  v 
2170: 3d 20 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61  = (v<<8) + pData
2180: 5b 30 5d 3b 20 20 70 44 61 74 61 2b 2b 3b 0a 20  [0];  pData++;. 
2190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 70 72       }.      spr
21a0: 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 25 6c 6c  intf(zDesc, "%ll
21b0: 64 22 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  d", v);.    }els
21c0: 65 20 69 66 28 20 78 3d 3d 37 20 29 7b 0a 20 20  e if( x==7 ){.  
21d0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73      sprintf(zDes
21e0: 63 2c 20 22 72 65 61 6c 22 29 3b 0a 20 20 20 20  c, "real");.    
21f0: 20 20 70 44 61 74 61 20 2b 3d 20 38 3b 0a 20 20    pData += 8;.  
2200: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d 38    }else if( x==8
2210: 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   ){.      sprint
2220: 66 28 7a 44 65 73 63 2c 20 22 30 22 29 3b 0a 20  f(zDesc, "0");. 
2230: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d     }else if( x==
2240: 39 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  9 ){.      sprin
2250: 74 66 28 7a 44 65 73 63 2c 20 22 31 22 29 3b 0a  tf(zDesc, "1");.
2260: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3e      }else if( x>
2270: 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 69 36 34  =12 ){.      i64
2280: 20 73 69 7a 65 20 3d 20 28 78 2d 31 32 29 2f 32   size = (x-12)/2
2290: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 78 26 31  ;.      if( (x&1
22a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22b0: 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22  sprintf(zDesc, "
22c0: 62 6c 6f 62 28 25 6c 6c 64 29 22 2c 20 73 69 7a  blob(%lld)", siz
22d0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
22e0: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
22f0: 28 7a 44 65 73 63 2c 20 22 74 78 74 28 25 6c 6c  (zDesc, "txt(%ll
2300: 64 29 22 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  d)", size);.    
2310: 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20    }.      pData 
2320: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  += size;.    }. 
2330: 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
2340: 65 6e 28 7a 44 65 73 63 29 3b 0a 20 20 20 20 7a  en(zDesc);.    z
2350: 44 65 73 63 20 2b 3d 20 6a 3b 0a 20 20 20 20 6e  Desc += j;.    n
2360: 44 65 73 63 20 2b 3d 20 6a 3b 0a 20 20 7d 0a 20  Desc += j;.  }. 
2370: 20 72 65 74 75 72 6e 20 6e 44 65 73 63 3b 0a 7d   return nDesc;.}
2380: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
2390: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
23a0: 64 20 73 69 7a 65 20 67 69 76 65 6e 20 74 68 65  d size given the
23b0: 20 74 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   total payload s
23c0: 69 7a 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70  ize and.** the p
23d0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  age size..*/.sta
23e0: 74 69 63 20 69 36 34 20 6c 6f 63 61 6c 50 61 79  tic i64 localPay
23f0: 6c 6f 61 64 28 69 36 34 20 6e 50 61 79 6c 6f 61  load(i64 nPayloa
2400: 64 2c 20 63 68 61 72 20 63 54 79 70 65 29 7b 0a  d, char cType){.
2410: 20 20 69 36 34 20 6d 61 78 4c 6f 63 61 6c 3b 0a    i64 maxLocal;.
2420: 20 20 69 36 34 20 6d 69 6e 4c 6f 63 61 6c 3b 0a    i64 minLocal;.
2430: 20 20 69 36 34 20 73 75 72 70 6c 75 73 3b 0a 20    i64 surplus;. 
2440: 20 69 36 34 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69   i64 nLocal;.  i
2450: 66 28 20 63 54 79 70 65 3d 3d 31 33 20 29 7b 0a  f( cType==13 ){.
2460: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 65 61      /* Table lea
2470: 66 20 2a 2f 0a 20 20 20 20 6d 61 78 4c 6f 63 61  f */.    maxLoca
2480: 6c 20 3d 20 70 61 67 65 73 69 7a 65 2d 33 35 3b  l = pagesize-35;
2490: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
24a0: 28 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 33 32  (pagesize-12)*32
24b0: 2f 32 35 35 2d 32 33 3b 0a 20 20 7d 65 6c 73 65  /255-23;.  }else
24c0: 7b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  {.    maxLocal =
24d0: 20 28 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 36   (pagesize-12)*6
24e0: 34 2f 32 35 35 2d 32 33 3b 0a 20 20 20 20 6d 69  4/255-23;.    mi
24f0: 6e 4c 6f 63 61 6c 20 3d 20 28 70 61 67 65 73 69  nLocal = (pagesi
2500: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 2d 32 33  ze-12)*32/255-23
2510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79  ;.  }.  if( nPay
2520: 6c 6f 61 64 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  load>maxLocal ){
2530: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
2540: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
2550: 6f 61 64 2d 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  oad-minLocal)%(p
2560: 61 67 65 73 69 7a 65 2d 34 29 3b 0a 20 20 20 20  agesize-4);.    
2570: 69 66 28 20 73 75 72 70 6c 75 73 3c 3d 6d 61 78  if( surplus<=max
2580: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
2590: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
25a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25b0: 20 20 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f    nLocal = minLo
25c0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  cal;.    }.  }el
25d0: 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
25e0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
25f0: 20 72 65 74 75 72 6e 20 6e 4c 6f 63 61 6c 3b 0a   return nLocal;.
2600: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2610: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 66 6f  a description fo
2620: 72 20 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c 2e  r a single cell.
2630: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2640: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c  n value is the l
2650: 6f 63 61 6c 20 63 65 6c 6c 20 73 69 7a 65 2e 0a  ocal cell size..
2660: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 64 65  */.static i64 de
2670: 73 63 72 69 62 65 43 65 6c 6c 28 0a 20 20 75 6e  scribeCell(.  un
2680: 73 69 67 6e 65 64 20 63 68 61 72 20 63 54 79 70  signed char cTyp
2690: 65 2c 20 20 20 20 2f 2a 20 50 61 67 65 20 74 79  e,    /* Page ty
26a0: 70 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  pe */.  unsigned
26b0: 20 63 68 61 72 20 2a 61 2c 20 20 20 20 20 20 20   char *a,       
26c0: 2f 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  /* Cell content 
26d0: 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 43 65 6c  */.  int showCel
26e0: 6c 43 6f 6e 74 65 6e 74 2c 20 20 20 20 2f 2a 20  lContent,    /* 
26f0: 53 68 6f 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  Show cell conten
2700: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 63  t if true */.  c
2710: 68 61 72 20 2a 2a 70 7a 44 65 73 63 20 20 20 20  har **pzDesc    
2720: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
2730: 64 65 73 63 72 69 70 74 69 6f 6e 20 68 65 72 65  description here
2740: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
2750: 20 20 69 36 34 20 6e 44 65 73 63 20 3d 20 30 3b    i64 nDesc = 0;
2760: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
2770: 69 6e 74 20 6c 65 66 74 43 68 69 6c 64 3b 0a 20  int leftChild;. 
2780: 20 69 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   i64 nPayload;. 
2790: 20 69 36 34 20 72 6f 77 69 64 3b 0a 20 20 69 36   i64 rowid;.  i6
27a0: 34 20 6e 4c 6f 63 61 6c 3b 0a 20 20 73 74 61 74  4 nLocal;.  stat
27b0: 69 63 20 63 68 61 72 20 7a 44 65 73 63 5b 31 30  ic char zDesc[10
27c0: 30 30 5d 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  00];.  i = 0;.  
27d0: 69 66 28 20 63 54 79 70 65 3c 3d 35 20 29 7b 0a  if( cType<=5 ){.
27e0: 20 20 20 20 6c 65 66 74 43 68 69 6c 64 20 3d 20      leftChild = 
27f0: 28 28 61 5b 30 5d 2a 32 35 36 20 2b 20 61 5b 31  ((a[0]*256 + a[1
2800: 5d 29 2a 32 35 36 20 2b 20 61 5b 32 5d 29 2a 32  ])*256 + a[2])*2
2810: 35 36 20 2b 20 61 5b 33 5d 3b 0a 20 20 20 20 61  56 + a[3];.    a
2820: 20 2b 3d 20 34 3b 0a 20 20 20 20 6e 20 2b 3d 20   += 4;.    n += 
2830: 34 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  4;.    sprintf(z
2840: 44 65 73 63 2c 20 22 6c 78 3a 20 25 64 20 22 2c  Desc, "lx: %d ",
2850: 20 6c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 20   leftChild);.   
2860: 20 6e 44 65 73 63 20 3d 20 73 74 72 6c 65 6e 28   nDesc = strlen(
2870: 7a 44 65 73 63 29 3b 0a 20 20 7d 0a 20 20 69 66  zDesc);.  }.  if
2880: 28 20 63 54 79 70 65 21 3d 35 20 29 7b 0a 20 20  ( cType!=5 ){.  
2890: 20 20 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69    i = decodeVari
28a0: 6e 74 28 61 2c 20 26 6e 50 61 79 6c 6f 61 64 29  nt(a, &nPayload)
28b0: 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b 0a 20 20  ;.    a += i;.  
28c0: 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20 20 73 70    n += i;.    sp
28d0: 72 69 6e 74 66 28 26 7a 44 65 73 63 5b 6e 44 65  rintf(&zDesc[nDe
28e0: 73 63 5d 2c 20 22 6e 3a 20 25 6c 6c 64 20 22 2c  sc], "n: %lld ",
28f0: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
2900: 6e 44 65 73 63 20 2b 3d 20 73 74 72 6c 65 6e 28  nDesc += strlen(
2910: 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 29 3b 0a  &zDesc[nDesc]);.
2920: 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6c 6f 63      nLocal = loc
2930: 61 6c 50 61 79 6c 6f 61 64 28 6e 50 61 79 6c 6f  alPayload(nPaylo
2940: 61 64 2c 20 63 54 79 70 65 29 3b 0a 20 20 7d 65  ad, cType);.  }e
2950: 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
2960: 64 20 3d 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a  d = nLocal = 0;.
2970: 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65 3d    }.  if( cType=
2980: 3d 35 20 7c 7c 20 63 54 79 70 65 3d 3d 31 33 20  =5 || cType==13 
2990: 29 7b 0a 20 20 20 20 69 20 3d 20 64 65 63 6f 64  ){.    i = decod
29a0: 65 56 61 72 69 6e 74 28 61 2c 20 26 72 6f 77 69  eVarint(a, &rowi
29b0: 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b 0a  d);.    a += i;.
29c0: 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20 20      n += i;.    
29d0: 73 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b 6e  sprintf(&zDesc[n
29e0: 44 65 73 63 5d 2c 20 22 72 3a 20 25 6c 6c 64 20  Desc], "r: %lld 
29f0: 22 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 6e  ", rowid);.    n
2a00: 44 65 73 63 20 2b 3d 20 73 74 72 6c 65 6e 28 26  Desc += strlen(&
2a10: 7a 44 65 73 63 5b 6e 44 65 73 63 5d 29 3b 0a 20  zDesc[nDesc]);. 
2a20: 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3c   }.  if( nLocal<
2a30: 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
2a40: 69 6e 74 20 6f 76 66 6c 3b 0a 20 20 20 20 75 6e  int ovfl;.    un
2a50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 20 3d  signed char *b =
2a60: 20 26 61 5b 6e 4c 6f 63 61 6c 5d 3b 0a 20 20 20   &a[nLocal];.   
2a70: 20 6f 76 66 6c 20 3d 20 28 28 62 5b 30 5d 2a 32   ovfl = ((b[0]*2
2a80: 35 36 20 2b 20 62 5b 31 5d 29 2a 32 35 36 20 2b  56 + b[1])*256 +
2a90: 20 62 5b 32 5d 29 2a 32 35 36 20 2b 20 62 5b 33   b[2])*256 + b[3
2aa0: 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ];.    sprintf(&
2ab0: 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20 22 6f  zDesc[nDesc], "o
2ac0: 76 3a 20 25 64 20 22 2c 20 6f 76 66 6c 29 3b 0a  v: %d ", ovfl);.
2ad0: 20 20 20 20 6e 44 65 73 63 20 2b 3d 20 73 74 72      nDesc += str
2ae0: 6c 65 6e 28 26 7a 44 65 73 63 5b 6e 44 65 73 63  len(&zDesc[nDesc
2af0: 5d 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 34 3b 0a  ]);.    n += 4;.
2b00: 20 20 7d 0a 20 20 69 66 28 20 73 68 6f 77 43 65    }.  if( showCe
2b10: 6c 6c 43 6f 6e 74 65 6e 74 20 26 26 20 63 54 79  llContent && cTy
2b20: 70 65 21 3d 35 20 29 7b 0a 20 20 20 20 6e 44 65  pe!=5 ){.    nDe
2b30: 73 63 20 2b 3d 20 64 65 73 63 72 69 62 65 43 6f  sc += describeCo
2b40: 6e 74 65 6e 74 28 61 2c 20 6e 4c 6f 63 61 6c 2c  ntent(a, nLocal,
2b50: 20 26 7a 44 65 73 63 5b 6e 44 65 73 63 2d 31 5d   &zDesc[nDesc-1]
2b60: 29 3b 0a 20 20 7d 0a 20 20 2a 70 7a 44 65 73 63  );.  }.  *pzDesc
2b70: 20 3d 20 7a 44 65 73 63 3b 0a 20 20 72 65 74 75   = zDesc;.  retu
2b80: 72 6e 20 6e 4c 6f 63 61 6c 2b 6e 3b 0a 7d 0a 0a  rn nLocal+n;.}..
2b90: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 62  /*.** Decode a b
2ba0: 74 72 65 65 20 70 61 67 65 0a 2a 2f 0a 73 74 61  tree page.*/.sta
2bb0: 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 5f  tic void decode_
2bc0: 62 74 72 65 65 5f 70 61 67 65 28 0a 20 20 75 6e  btree_page(.  un
2bd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20  signed char *a, 
2be0: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2bf0: 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 74  the btree page t
2c00: 6f 20 62 65 20 64 65 63 6f 64 65 64 20 2a 2f 0a  o be decoded */.
2c10: 20 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20    int pgno,     
2c20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2c30: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 64  mber */.  int hd
2c40: 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 2f 2a  rSize,        /*
2c50: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
2c60: 65 31 2d 68 65 61 64 65 72 20 69 6e 20 62 79 74  e1-header in byt
2c70: 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
2c80: 61 72 20 2a 7a 41 72 67 73 20 20 20 2f 2a 20 46  ar *zArgs   /* F
2c90: 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
2ca0: 66 6f 72 6d 61 74 74 69 6e 67 20 2a 2f 0a 29 7b  formatting */.){
2cb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cc0: 54 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  Type = "unknown"
2cd0: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
2ce0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
2cf0: 20 69 43 65 6c 6c 50 74 72 3b 0a 20 20 69 6e 74   iCellPtr;.  int
2d00: 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74   showCellContent
2d10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 68 6f 77   = 0;.  int show
2d20: 4d 61 70 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Map = 0;.  char 
2d30: 2a 7a 4d 61 70 20 3d 20 30 3b 0a 20 20 73 77 69  *zMap = 0;.  swi
2d40: 74 63 68 28 20 61 5b 30 5d 20 29 7b 0a 20 20 20  tch( a[0] ){.   
2d50: 20 63 61 73 65 20 32 3a 20 20 7a 54 79 70 65 20   case 2:  zType 
2d60: 3d 20 22 69 6e 64 65 78 20 69 6e 74 65 72 69 6f  = "index interio
2d70: 72 20 6e 6f 64 65 22 3b 20 20 62 72 65 61 6b 3b  r node";  break;
2d80: 0a 20 20 20 20 63 61 73 65 20 35 3a 20 20 7a 54  .    case 5:  zT
2d90: 79 70 65 20 3d 20 22 74 61 62 6c 65 20 69 6e 74  ype = "table int
2da0: 65 72 69 6f 72 20 6e 6f 64 65 22 3b 20 20 62 72  erior node";  br
2db0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 30  eak;.    case 10
2dc0: 3a 20 7a 54 79 70 65 20 3d 20 22 69 6e 64 65 78  : zType = "index
2dd0: 20 6c 65 61 66 22 3b 20 20 20 20 20 20 20 20 20   leaf";         
2de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
2df0: 65 20 31 33 3a 20 7a 54 79 70 65 20 3d 20 22 74  e 13: zType = "t
2e00: 61 62 6c 65 20 6c 65 61 66 22 3b 20 20 20 20 20  able leaf";     
2e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
2e20: 0a 20 20 77 68 69 6c 65 28 20 7a 41 72 67 73 5b  .  while( zArgs[
2e30: 30 5d 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  0] ){.    switch
2e40: 28 20 7a 41 72 67 73 5b 30 5d 20 29 7b 0a 20 20  ( zArgs[0] ){.  
2e50: 20 20 20 20 63 61 73 65 20 27 63 27 3a 20 73 68      case 'c': sh
2e60: 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 20 3d 20  owCellContent = 
2e70: 31 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  1;  break;.     
2e80: 20 63 61 73 65 20 27 6d 27 3a 20 73 68 6f 77 4d   case 'm': showM
2e90: 61 70 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ap = 1;         
2ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2eb0: 20 20 7a 41 72 67 73 2b 2b 3b 0a 20 20 7d 0a 20    zArgs++;.  }. 
2ec0: 20 70 72 69 6e 74 66 28 22 44 65 63 6f 64 65 20   printf("Decode 
2ed0: 6f 66 20 62 74 72 65 65 20 70 61 67 65 20 25 64  of btree page %d
2ee0: 3a 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  :\n", pgno);.  p
2ef0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
2f00: 28 61 2c 20 30 2c 20 31 2c 20 30 2c 20 7a 54 79  (a, 0, 1, 0, zTy
2f10: 70 65 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  pe);.  print_dec
2f20: 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 31 2c 20 32  ode_line(a, 1, 2
2f30: 2c 20 30 2c 20 22 4f 66 66 73 65 74 20 74 6f 20  , 0, "Offset to 
2f40: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 22  first freeblock"
2f50: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
2f60: 65 5f 6c 69 6e 65 28 61 2c 20 33 2c 20 32 2c 20  e_line(a, 3, 2, 
2f70: 30 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 63 65  0, "Number of ce
2f80: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  lls on this page
2f90: 22 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 61 5b  ");.  nCell = a[
2fa0: 33 5d 2a 32 35 36 20 2b 20 61 5b 34 5d 3b 0a 20  3]*256 + a[4];. 
2fb0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
2fc0: 6e 65 28 61 2c 20 35 2c 20 32 2c 20 30 2c 20 22  ne(a, 5, 2, 0, "
2fd0: 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
2fe0: 6f 6e 74 65 6e 74 20 61 72 65 61 22 29 3b 0a 20  ontent area");. 
2ff0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
3000: 6e 65 28 61 2c 20 37 2c 20 31 2c 20 30 2c 20 22  ne(a, 7, 1, 0, "
3010: 46 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 20  Fragmented byte 
3020: 63 6f 75 6e 74 22 29 3b 0a 20 20 69 66 28 20 61  count");.  if( a
3030: 5b 30 5d 3d 3d 32 20 7c 7c 20 61 5b 30 5d 3d 3d  [0]==2 || a[0]==
3040: 35 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 5f 64  5 ){.    print_d
3050: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 38 2c  ecode_line(a, 8,
3060: 20 34 2c 20 30 2c 20 22 52 69 67 68 74 20 63 68   4, 0, "Right ch
3070: 69 6c 64 22 29 3b 0a 20 20 20 20 69 43 65 6c 6c  ild");.    iCell
3080: 50 74 72 20 3d 20 31 32 3b 0a 20 20 7d 65 6c 73  Ptr = 12;.  }els
3090: 65 7b 0a 20 20 20 20 69 43 65 6c 6c 50 74 72 20  e{.    iCellPtr 
30a0: 3d 20 38 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 8;.  }.  if( n
30b0: 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 72  Cell>0 ){.    pr
30c0: 69 6e 74 66 28 22 20 6b 65 79 3a 20 6c 78 3d 6c  intf(" key: lx=l
30d0: 65 66 74 2d 63 68 69 6c 64 20 6e 3d 70 61 79 6c  eft-child n=payl
30e0: 6f 61 64 2d 73 69 7a 65 20 72 3d 72 6f 77 69 64  oad-size r=rowid
30f0: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
3100: 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20 7a  showMap ){.    z
3110: 4d 61 70 20 3d 20 6d 61 6c 6c 6f 63 28 70 61 67  Map = malloc(pag
3120: 65 73 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73  esize);.    mems
3130: 65 74 28 7a 4d 61 70 2c 20 27 2e 27 2c 20 70 61  et(zMap, '.', pa
3140: 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d  gesize);.    mem
3150: 73 65 74 28 7a 4d 61 70 2c 20 27 31 27 2c 20 68  set(zMap, '1', h
3160: 64 72 53 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d  drSize);.    mem
3170: 73 65 74 28 26 7a 4d 61 70 5b 68 64 72 53 69 7a  set(&zMap[hdrSiz
3180: 65 5d 2c 20 27 48 27 2c 20 69 43 65 6c 6c 50 74  e], 'H', iCellPt
3190: 72 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  r);.    memset(&
31a0: 7a 4d 61 70 5b 68 64 72 53 69 7a 65 2b 69 43 65  zMap[hdrSize+iCe
31b0: 6c 6c 50 74 72 5d 2c 20 27 50 27 2c 20 32 2a 6e  llPtr], 'P', 2*n
31c0: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Cell);.  }.  for
31d0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
31e0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 6f 66  ++){.    int cof
31f0: 73 74 20 3d 20 69 43 65 6c 6c 50 74 72 20 2b 20  st = iCellPtr + 
3200: 69 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  i*2;.    char *z
3210: 44 65 73 63 3b 0a 20 20 20 20 69 36 34 20 6e 3b  Desc;.    i64 n;
3220: 0a 0a 20 20 20 20 63 6f 66 73 74 20 3d 20 61 5b  ..    cofst = a[
3230: 63 6f 66 73 74 5d 2a 32 35 36 20 2b 20 61 5b 63  cofst]*256 + a[c
3240: 6f 66 73 74 2b 31 5d 3b 0a 20 20 20 20 6e 20 3d  ofst+1];.    n =
3250: 20 64 65 73 63 72 69 62 65 43 65 6c 6c 28 61 5b   describeCell(a[
3260: 30 5d 2c 20 26 61 5b 63 6f 66 73 74 2d 68 64 72  0], &a[cofst-hdr
3270: 53 69 7a 65 5d 2c 20 73 68 6f 77 43 65 6c 6c 43  Size], showCellC
3280: 6f 6e 74 65 6e 74 2c 20 26 7a 44 65 73 63 29 3b  ontent, &zDesc);
3290: 0a 20 20 20 20 69 66 28 20 73 68 6f 77 4d 61 70  .    if( showMap
32a0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
32b0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 6d  Buf[30];.      m
32c0: 65 6d 73 65 74 28 26 7a 4d 61 70 5b 63 6f 66 73  emset(&zMap[cofs
32d0: 74 5d 2c 20 27 2a 27 2c 20 28 73 69 7a 65 5f 74  t], '*', (size_t
32e0: 29 6e 29 3b 0a 20 20 20 20 20 20 7a 4d 61 70 5b  )n);.      zMap[
32f0: 63 6f 66 73 74 5d 20 3d 20 27 5b 27 3b 0a 20 20  cofst] = '[';.  
3300: 20 20 20 20 7a 4d 61 70 5b 63 6f 66 73 74 2b 6e      zMap[cofst+n
3310: 2d 31 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20  -1] = ']';.     
3320: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
3330: 25 64 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 6a  %d", i);.      j
3340: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
3350: 42 75 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Buf);.      if( 
3360: 6a 3c 3d 6e 2d 32 20 29 20 6d 65 6d 63 70 79 28  j<=n-2 ) memcpy(
3370: 26 7a 4d 61 70 5b 63 6f 66 73 74 2b 31 5d 2c 20  &zMap[cofst+1], 
3380: 7a 42 75 66 2c 20 6a 29 3b 0a 20 20 20 20 7d 0a  zBuf, j);.    }.
3390: 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 30 33      printf(" %03
33a0: 78 3a 20 63 65 6c 6c 5b 25 64 5d 20 25 73 5c 6e  x: cell[%d] %s\n
33b0: 22 2c 20 63 6f 66 73 74 2c 20 69 2c 20 7a 44 65  ", cofst, i, zDe
33c0: 73 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  sc);.  }.  if( s
33d0: 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20 66 6f  howMap ){.    fo
33e0: 72 28 69 3d 30 3b 20 69 3c 70 61 67 65 73 69 7a  r(i=0; i<pagesiz
33f0: 65 3b 20 69 2b 3d 36 34 29 7b 0a 20 20 20 20 20  e; i+=64){.     
3400: 20 70 72 69 6e 74 66 28 22 20 25 30 33 78 3a 20   printf(" %03x: 
3410: 25 2e 36 34 73 5c 6e 22 2c 20 69 2c 20 26 7a 4d  %.64s\n", i, &zM
3420: 61 70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ap[i]);.    }.  
3430: 20 20 66 72 65 65 28 7a 4d 61 70 29 3b 0a 20 20    free(zMap);.  
3440: 7d 20 20 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28  }  .}..int main(
3450: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
3460: 2a 61 72 67 76 29 7b 0a 20 20 73 74 72 75 63 74  *argv){.  struct
3470: 20 73 74 61 74 20 73 62 75 66 3b 0a 20 20 75 6e   stat sbuf;.  un
3480: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 50 67 53  signed char zPgS
3490: 7a 5b 34 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  z[4];.  if( argc
34a0: 3c 32 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  <2 ){.    fprint
34b0: 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65 3a  f(stderr,"Usage:
34c0: 20 25 73 20 46 49 4c 45 4e 41 4d 45 20 3f 50 41   %s FILENAME ?PA
34d0: 47 45 3f 20 2e 2e 2e 5c 6e 22 2c 20 61 72 67 76  GE? ...\n", argv
34e0: 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  [0]);.    exit(1
34f0: 29 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 6f 70  );.  }.  fd = op
3500: 65 6e 28 61 72 67 76 5b 31 5d 2c 20 4f 5f 52 44  en(argv[1], O_RD
3510: 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 66 64 3c  ONLY);.  if( fd<
3520: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
3530: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e  (stderr,"%s: can
3540: 27 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61  't open %s\n", a
3550: 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 29  rgv[0], argv[1])
3560: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
3570: 20 7d 0a 20 20 7a 50 67 53 7a 5b 30 5d 20 3d 20   }.  zPgSz[0] = 
3580: 30 3b 0a 20 20 7a 50 67 53 7a 5b 31 5d 20 3d 20  0;.  zPgSz[1] = 
3590: 30 3b 0a 20 20 6c 73 65 65 6b 28 66 64 2c 20 38  0;.  lseek(fd, 8
35a0: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72  , SEEK_SET);.  r
35b0: 65 61 64 28 66 64 2c 20 7a 50 67 53 7a 2c 20 34  ead(fd, zPgSz, 4
35c0: 29 3b 0a 20 20 70 61 67 65 73 69 7a 65 20 3d 20  );.  pagesize = 
35d0: 7a 50 67 53 7a 5b 31 5d 2a 36 35 35 33 36 20 2b  zPgSz[1]*65536 +
35e0: 20 7a 50 67 53 7a 5b 32 5d 2a 32 35 36 20 2b 20   zPgSz[2]*256 + 
35f0: 7a 50 67 53 7a 5b 33 5d 3b 0a 20 20 69 66 28 20  zPgSz[3];.  if( 
3600: 70 61 67 65 73 69 7a 65 3d 3d 30 20 29 20 70 61  pagesize==0 ) pa
3610: 67 65 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  gesize = 1024;. 
3620: 20 70 72 69 6e 74 66 28 22 50 61 67 65 73 69 7a   printf("Pagesiz
3630: 65 3a 20 25 64 5c 6e 22 2c 20 70 61 67 65 73 69  e: %d\n", pagesi
3640: 7a 65 29 3b 0a 20 20 66 73 74 61 74 28 66 64 2c  ze);.  fstat(fd,
3650: 20 26 73 62 75 66 29 3b 0a 20 20 69 66 28 20 73   &sbuf);.  if( s
3660: 62 75 66 2e 73 74 5f 73 69 7a 65 3c 33 32 20 29  buf.st_size<32 )
3670: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 66 69  {.    printf("fi
3680: 6c 65 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20  le too small to 
3690: 62 65 20 61 20 57 41 4c 5c 6e 22 29 3b 0a 20 20  be a WAL\n");.  
36a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
36b0: 20 20 6d 78 46 72 61 6d 65 20 3d 20 28 73 62 75    mxFrame = (sbu
36c0: 66 2e 73 74 5f 73 69 7a 65 20 2d 20 33 32 29 2f  f.st_size - 32)/
36d0: 28 70 61 67 65 73 69 7a 65 20 2b 20 32 34 29 3b  (pagesize + 24);
36e0: 0a 20 20 70 72 69 6e 74 66 28 22 41 76 61 69 6c  .  printf("Avail
36f0: 61 62 6c 65 20 70 61 67 65 73 3a 20 31 2e 2e 25  able pages: 1..%
3700: 64 5c 6e 22 2c 20 6d 78 46 72 61 6d 65 29 3b 0a  d\n", mxFrame);.
3710: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
3720: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3730: 43 6b 73 75 6d 20 78 3b 0a 20 20 20 20 70 72 69  Cksum x;.    pri
3740: 6e 74 5f 77 61 6c 5f 68 65 61 64 65 72 28 26 78  nt_wal_header(&x
3750: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
3760: 69 3c 3d 6d 78 46 72 61 6d 65 3b 20 69 2b 2b 29  i<=mxFrame; i++)
3770: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 5f 6f 6e  {.      print_on
3780: 65 6c 69 6e 65 5f 66 72 61 6d 65 28 69 2c 20 26  eline_frame(i, &
3790: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  x);.    }.  }els
37a0: 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
37b0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67    for(i=2; i<arg
37c0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
37d0: 6e 74 20 69 53 74 61 72 74 2c 20 69 45 6e 64 3b  nt iStart, iEnd;
37e0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 65  .      char *zLe
37f0: 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ft;.      if( st
3800: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22 68  rcmp(argv[i], "h
3810: 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  eader")==0 ){.  
3820: 20 20 20 20 20 20 70 72 69 6e 74 5f 77 61 6c 5f        print_wal_
3830: 68 65 61 64 65 72 28 30 29 3b 0a 20 20 20 20 20  header(0);.     
3840: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3850: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
3860: 49 53 44 49 47 49 54 28 61 72 67 76 5b 69 5d 5b  ISDIGIT(argv[i][
3870: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  0]) ){.        f
3880: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
3890: 25 73 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  %s: unknown opti
38a0: 6f 6e 3a 20 5b 25 73 5d 5c 6e 22 2c 20 61 72 67  on: [%s]\n", arg
38b0: 76 5b 30 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  v[0], argv[i]);.
38c0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
38d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38e0: 69 53 74 61 72 74 20 3d 20 73 74 72 74 6f 6c 28  iStart = strtol(
38f0: 61 72 67 76 5b 69 5d 2c 20 26 7a 4c 65 66 74 2c  argv[i], &zLeft,
3900: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   0);.      if( z
3910: 4c 65 66 74 20 26 26 20 73 74 72 63 6d 70 28 7a  Left && strcmp(z
3920: 4c 65 66 74 2c 22 2e 2e 65 6e 64 22 29 3d 3d 30  Left,"..end")==0
3930: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64   ){.        iEnd
3940: 20 3d 20 6d 78 46 72 61 6d 65 3b 0a 20 20 20 20   = mxFrame;.    
3950: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 65 66    }else if( zLef
3960: 74 20 26 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27  t && zLeft[0]=='
3970: 2e 27 20 26 26 20 7a 4c 65 66 74 5b 31 5d 3d 3d  .' && zLeft[1]==
3980: 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '.' ){.        i
3990: 45 6e 64 20 3d 20 73 74 72 74 6f 6c 28 26 7a 4c  End = strtol(&zL
39a0: 65 66 74 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20  eft[2], 0, 0);. 
39b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
39c0: 4c 65 66 74 20 26 26 20 7a 4c 65 66 74 5b 30 5d  Left && zLeft[0]
39d0: 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20  =='b' ){.       
39e0: 20 69 6e 74 20 6f 66 73 74 2c 20 6e 42 79 74 65   int ofst, nByte
39f0: 2c 20 68 64 72 53 69 7a 65 3b 0a 20 20 20 20 20  , hdrSize;.     
3a00: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
3a10: 20 2a 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28   *a;.        if(
3a20: 20 69 53 74 61 72 74 3d 3d 31 20 29 7b 0a 20 20   iStart==1 ){.  
3a30: 20 20 20 20 20 20 20 20 68 64 72 53 69 7a 65 20          hdrSize 
3a40: 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20 20  = 100;.         
3a50: 20 6f 66 73 74 20 3d 20 68 64 72 53 69 7a 65 20   ofst = hdrSize 
3a60: 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20 20  = 100;.         
3a70: 20 6e 42 79 74 65 20 3d 20 70 61 67 65 73 69 7a   nByte = pagesiz
3a80: 65 2d 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d  e-100;.        }
3a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3aa0: 68 64 72 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  hdrSize = 0;.   
3ab0: 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 28 69         ofst = (i
3ac0: 53 74 61 72 74 2d 31 29 2a 70 61 67 65 73 69 7a  Start-1)*pagesiz
3ad0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79  e;.          nBy
3ae0: 74 65 20 3d 20 70 61 67 65 73 69 7a 65 3b 0a 20  te = pagesize;. 
3af0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3b00: 20 6f 66 73 74 20 3d 20 33 32 20 2b 20 68 64 72   ofst = 32 + hdr
3b10: 53 69 7a 65 20 2b 20 28 69 53 74 61 72 74 2d 31  Size + (iStart-1
3b20: 29 2a 28 70 61 67 65 73 69 7a 65 2b 32 34 29 20  )*(pagesize+24) 
3b30: 2b 20 32 34 3b 0a 20 20 20 20 20 20 20 20 61 20  + 24;.        a 
3b40: 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28 6f 66 73  = getContent(ofs
3b50: 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  t, nByte);.     
3b60: 20 20 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f     decode_btree_
3b70: 70 61 67 65 28 61 2c 20 69 53 74 61 72 74 2c 20  page(a, iStart, 
3b80: 68 64 72 53 69 7a 65 2c 20 7a 4c 65 66 74 2b 31  hdrSize, zLeft+1
3b90: 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  );.        free(
3ba0: 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  a);.        cont
3bb0: 69 6e 75 65 3b 0a 23 69 66 20 21 64 65 66 69 6e  inue;.#if !defin
3bc0: 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20 20  ed(_MSC_VER).   
3bd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 65     }else if( zLe
3be0: 66 74 20 26 26 20 73 74 72 63 6d 70 28 7a 4c 65  ft && strcmp(zLe
3bf0: 66 74 2c 22 74 72 75 6e 63 61 74 65 22 29 3d 3d  ft,"truncate")==
3c00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
3c10: 46 72 61 6d 65 20 6e 75 6d 62 65 72 20 66 6f 6c  Frame number fol
3c20: 6c 6f 77 65 64 20 62 79 20 22 74 72 75 6e 63 61  lowed by "trunca
3c30: 74 65 22 20 74 72 75 6e 63 61 74 65 73 20 74 68  te" truncates th
3c40: 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20  e WAL file.     
3c50: 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68 61 74     ** after that
3c60: 20 66 72 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20   frame */.      
3c70: 20 20 6f 66 66 5f 74 20 6e 65 77 53 69 7a 65 20    off_t newSize 
3c80: 3d 20 33 32 20 2b 20 69 53 74 61 72 74 2a 28 70  = 32 + iStart*(p
3c90: 61 67 65 73 69 7a 65 2b 32 34 29 3b 0a 20 20 20  agesize+24);.   
3ca0: 20 20 20 20 20 74 72 75 6e 63 61 74 65 28 61 72       truncate(ar
3cb0: 67 76 5b 31 5d 2c 20 6e 65 77 53 69 7a 65 29 3b  gv[1], newSize);
3cc0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
3cd0: 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e;.#endif.      
3ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
3cf0: 45 6e 64 20 3d 20 69 53 74 61 72 74 3b 0a 20 20  End = iStart;.  
3d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3d10: 69 53 74 61 72 74 3c 31 20 7c 7c 20 69 45 6e 64  iStart<1 || iEnd
3d20: 3c 69 53 74 61 72 74 20 7c 7c 20 69 45 6e 64 3e  <iStart || iEnd>
3d30: 6d 78 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20  mxFrame ){.     
3d40: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
3d50: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 50 61  r,.          "Pa
3d60: 67 65 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  ge argument shou
3d70: 6c 64 20 62 65 20 4c 4f 57 45 52 3f 2e 2e 55 50  ld be LOWER?..UP
3d80: 50 45 52 3f 2e 20 20 52 61 6e 67 65 20 31 20 74  PER?.  Range 1 t
3d90: 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %d\n",.       
3da0: 20 20 20 6d 78 46 72 61 6d 65 29 3b 0a 20 20 20     mxFrame);.   
3db0: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
3dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
3dd0: 65 28 20 69 53 74 61 72 74 3c 3d 69 45 6e 64 20  e( iStart<=iEnd 
3de0: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
3df0: 5f 66 72 61 6d 65 28 69 53 74 61 72 74 29 3b 0a  _frame(iStart);.
3e00: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 2b 2b          iStart++
3e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3e20: 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b    }.  close(fd);
3e30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a     .  return 0;.}.