/ Hex Artifact Content
Login

Artifact c7a978cf525ef0f8bc2fd29cd52108dd1dfa605a:


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 61 6c 6c  for printing all
0020: 20 6f 72 20 70 61 72 74 20 6f 66 20 61 6e 20 53   or part of an S
0030: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66  QLite database f
0040: 69 6c 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ile..*/.#include
0050: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0060: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0070: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
0080: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  s.h>.#include <s
0090: 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c  ys/stat.h>.#incl
00a0: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69  ude <fcntl.h>.#i
00b0: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
00c0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
00d0: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
00e0: 73 74 72 69 6e 67 2e 68 3e 0a 0a 0a 73 74 61 74  string.h>...stat
00f0: 69 63 20 69 6e 74 20 70 61 67 65 73 69 7a 65 20  ic int pagesize 
0100: 3d 20 31 30 32 34 3b 20 20 20 20 20 2f 2a 20 53  = 1024;     /* S
0110: 69 7a 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ize of a databas
0120: 65 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69 63  e page */.static
0130: 20 69 6e 74 20 64 62 20 3d 20 2d 31 3b 20 20 20   int db = -1;   
0140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0150: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0160: 20 72 65 61 64 69 6e 67 20 74 68 65 20 44 42 20   reading the DB 
0170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 78  */.static int mx
0180: 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
0190: 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
01a0: 6e 75 6d 62 65 72 20 2a 2f 0a 73 74 61 74 69 63  number */.static
01b0: 20 69 6e 74 20 70 65 72 4c 69 6e 65 20 3d 20 31   int perLine = 1
01c0: 36 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 45 58  6;        /* HEX
01d0: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 70 72 69   elements to pri
01e0: 6e 74 20 70 65 72 20 6c 69 6e 65 20 2a 2f 0a 0a  nt per line */..
01f0: 74 79 70 65 64 65 66 20 6c 6f 6e 67 20 6c 6f 6e  typedef long lon
0200: 67 20 69 6e 74 20 69 36 34 3b 20 20 20 20 20 20  g int i64;      
0210: 2f 2a 20 44 61 74 61 74 79 70 65 20 66 6f 72 20  /* Datatype for 
0220: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20  64-bit integers 
0230: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  */.../*.** Conve
0240: 72 74 20 74 68 65 20 76 61 72 2d 69 6e 74 20 66  rt the var-int f
0250: 6f 72 6d 61 74 20 69 6e 74 6f 20 69 36 34 2e 20  ormat into i64. 
0260: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
0270: 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 69  er of bytes.** i
0280: 6e 20 74 68 65 20 76 61 72 2d 69 6e 74 2e 20 20  n the var-int.  
0290: 57 72 69 74 65 20 74 68 65 20 76 61 72 2d 69 6e  Write the var-in
02a0: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 70 56  t value into *pV
02b0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
02c0: 74 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28 63  t decodeVarint(c
02d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
02e0: 61 72 20 2a 7a 2c 20 69 36 34 20 2a 70 56 61 6c  ar *z, i64 *pVal
02f0: 29 7b 0a 20 20 69 36 34 20 76 20 3d 20 30 3b 0a  ){.  i64 v = 0;.
0300: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
0310: 3d 30 3b 20 69 3c 38 3b 20 69 2b 2b 29 7b 0a 20  =0; i<8; i++){. 
0320: 20 20 20 76 20 3d 20 28 76 3c 3c 37 29 20 2b 20     v = (v<<7) + 
0330: 28 7a 5b 69 5d 26 30 78 37 66 29 3b 0a 20 20 20  (z[i]&0x7f);.   
0340: 20 69 66 28 20 28 7a 5b 69 5d 26 30 78 38 30 29   if( (z[i]&0x80)
0350: 3d 3d 30 20 29 7b 20 2a 70 56 61 6c 20 3d 20 76  ==0 ){ *pVal = v
0360: 3b 20 72 65 74 75 72 6e 20 69 2b 31 3b 20 7d 0a  ; return i+1; }.
0370: 20 20 7d 0a 20 20 76 20 3d 20 28 76 3c 3c 38 29    }.  v = (v<<8)
0380: 20 2b 20 28 7a 5b 69 5d 26 30 78 66 66 29 3b 0a   + (z[i]&0xff);.
0390: 20 20 2a 70 56 61 6c 20 3d 20 76 3b 0a 20 20 72    *pVal = v;.  r
03a0: 65 74 75 72 6e 20 39 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 9;.}../*.*
03b0: 2a 20 45 78 74 72 61 63 74 20 61 20 62 69 67 2d  * Extract a big-
03c0: 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69 6e  endian 32-bit in
03d0: 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  teger.*/.static 
03e0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 64 65 63  unsigned int dec
03f0: 6f 64 65 49 6e 74 33 32 28 63 6f 6e 73 74 20 75  odeInt32(const u
0400: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29  nsigned char *z)
0410: 7b 0a 20 20 72 65 74 75 72 6e 20 28 7a 5b 30 5d  {.  return (z[0]
0420: 3c 3c 32 34 29 20 2b 20 28 7a 5b 31 5d 3c 3c 31  <<24) + (z[1]<<1
0430: 36 29 20 2b 20 28 7a 5b 32 5d 3c 3c 38 29 20 2b  6) + (z[2]<<8) +
0440: 20 7a 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 20 52 65 70   z[3];.}../* Rep
0450: 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  ort an out-of-me
0460: 6d 6f 72 79 20 65 72 72 6f 72 20 61 6e 64 20 64  mory error and d
0470: 69 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ie..*/.static vo
0480: 69 64 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  id out_of_memory
0490: 28 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74  (void){.  fprint
04a0: 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
04b0: 20 6d 65 6d 6f 72 79 2e 2e 2e 5c 6e 22 29 3b 0a   memory...\n");.
04c0: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a    exit(1);.}../*
04d0: 0a 2a 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74  .** Read content
04e0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 2e 0a   from the file..
04f0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
0500: 6f 6c 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  old the content 
0510: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
0520: 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6e 65   malloc() and ne
0530: 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 66 72 65  eds to be.** fre
0540: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
0550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  ..*/.static unsi
0560: 67 6e 65 64 20 63 68 61 72 20 2a 67 65 74 43 6f  gned char *getCo
0570: 6e 74 65 6e 74 28 69 6e 74 20 6f 66 73 74 2c 20  ntent(int ofst, 
0580: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  int nByte){.  un
0590: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
05a0: 74 61 3b 0a 20 20 61 44 61 74 61 20 3d 20 6d 61  ta;.  aData = ma
05b0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69  lloc(nByte);.  i
05c0: 66 28 20 61 44 61 74 61 3d 3d 30 20 29 20 6f 75  f( aData==0 ) ou
05d0: 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
05e0: 20 6c 73 65 65 6b 28 64 62 2c 20 6f 66 73 74 2c   lseek(db, ofst,
05f0: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72 65   SEEK_SET);.  re
0600: 61 64 28 64 62 2c 20 61 44 61 74 61 2c 20 6e 42  ad(db, aData, nB
0610: 79 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  yte);.  return a
0620: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  Data;.}../*.** P
0630: 72 69 6e 74 20 61 20 72 61 6e 67 65 20 6f 66 20  rint a range of 
0640: 62 79 74 65 73 20 61 73 20 68 65 78 20 61 6e 64  bytes as hex and
0650: 20 61 73 20 61 73 63 69 69 2e 0a 2a 2f 0a 73 74   as ascii..*/.st
0660: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
0670: 61 72 20 2a 70 72 69 6e 74 5f 62 79 74 65 5f 72  ar *print_byte_r
0680: 61 6e 67 65 28 0a 20 20 69 6e 74 20 6f 66 73 74  ange(.  int ofst
0690: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
06a0: 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
06b0: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 74  range of bytes t
06c0: 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  o print */.  int
06d0: 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
06e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
06f0: 65 73 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20  es to print */. 
0700: 20 69 6e 74 20 70 72 69 6e 74 4f 66 73 74 20 20   int printOfst  
0710: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
0720: 61 6d 6f 75 6e 74 20 74 6f 20 74 68 65 20 69 6e  amount to the in
0730: 64 65 78 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  dex on the left 
0740: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 75  column */.){.  u
0750: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
0760: 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ata;.  int i, j;
0770: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0780: 4f 66 73 74 46 6d 74 3b 0a 0a 20 20 69 66 28 20  OfstFmt;..  if( 
0790: 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74  ((printOfst+nByt
07a0: 65 29 26 7e 30 78 66 66 66 29 3d 3d 30 20 29 7b  e)&~0xfff)==0 ){
07b0: 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20  .    zOfstFmt = 
07c0: 22 20 25 30 33 78 3a 20 22 3b 0a 20 20 7d 65 6c  " %03x: ";.  }el
07d0: 73 65 20 69 66 28 20 28 28 70 72 69 6e 74 4f 66  se if( ((printOf
07e0: 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66 66  st+nByte)&~0xfff
07f0: 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66  f)==0 ){.    zOf
0800: 73 74 46 6d 74 20 3d 20 22 20 25 30 34 78 3a 20  stFmt = " %04x: 
0810: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  ";.  }else if( (
0820: 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74 65  (printOfst+nByte
0830: 29 26 7e 30 78 66 66 66 66 66 29 3d 3d 30 20 29  )&~0xfffff)==0 )
0840: 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d  {.    zOfstFmt =
0850: 20 22 20 25 30 35 78 3a 20 22 3b 0a 20 20 7d 65   " %05x: ";.  }e
0860: 6c 73 65 20 69 66 28 20 28 28 70 72 69 6e 74 4f  lse if( ((printO
0870: 66 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66  fst+nByte)&~0xff
0880: 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ffff)==0 ){.    
0890: 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 36  zOfstFmt = " %06
08a0: 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  x: ";.  }else{. 
08b0: 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20     zOfstFmt = " 
08c0: 25 30 38 78 3a 20 22 3b 0a 20 20 7d 0a 0a 20 20  %08x: ";.  }..  
08d0: 61 44 61 74 61 20 3d 20 67 65 74 43 6f 6e 74 65  aData = getConte
08e0: 6e 74 28 6f 66 73 74 2c 20 6e 42 79 74 65 29 3b  nt(ofst, nByte);
08f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
0900: 79 74 65 3b 20 69 20 2b 3d 20 70 65 72 4c 69 6e  yte; i += perLin
0910: 65 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e){.    fprintf(
0920: 73 74 64 6f 75 74 2c 20 7a 4f 66 73 74 46 6d 74  stdout, zOfstFmt
0930: 2c 20 69 2b 70 72 69 6e 74 4f 66 73 74 29 3b 0a  , i+printOfst);.
0940: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
0950: 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20  erLine; j++){.  
0960: 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74      if( i+j>nByt
0970: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
0980: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 20 20  intf(stdout, "  
0990: 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   ");.      }else
09a0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
09b0: 66 28 73 74 64 6f 75 74 2c 22 25 30 32 78 20 22  f(stdout,"%02x "
09c0: 2c 20 61 44 61 74 61 5b 69 2b 6a 5d 29 3b 0a 20  , aData[i+j]);. 
09d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
09e0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 65 72 4c   for(j=0; j<perL
09f0: 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ine; j++){.     
0a00: 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74 65 20 29   if( i+j>nByte )
0a10: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
0a20: 66 28 73 74 64 6f 75 74 2c 20 22 20 22 29 3b 0a  f(stdout, " ");.
0a30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
0a40: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
0a50: 6f 75 74 2c 22 25 63 22 2c 20 69 73 70 72 69 6e  out,"%c", isprin
0a60: 74 28 61 44 61 74 61 5b 69 2b 6a 5d 29 20 3f 20  t(aData[i+j]) ? 
0a70: 61 44 61 74 61 5b 69 2b 6a 5d 20 3a 20 27 2e 27  aData[i+j] : '.'
0a80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
0a90: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
0aa0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  out,"\n");.  }. 
0ab0: 20 72 65 74 75 72 6e 20 61 44 61 74 61 3b 0a 7d   return aData;.}
0ac0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  ../*.** Print an
0ad0: 20 65 6e 74 69 72 65 20 70 61 67 65 20 6f 66 20   entire page of 
0ae0: 63 6f 6e 74 65 6e 74 20 61 73 20 68 65 78 0a 2a  content as hex.*
0af0: 2f 0a 73 74 61 74 69 63 20 70 72 69 6e 74 5f 70  /.static print_p
0b00: 61 67 65 28 69 6e 74 20 69 50 67 29 7b 0a 20 20  age(int iPg){.  
0b10: 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 75 6e  int iStart;.  un
0b20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
0b30: 74 61 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 28  ta;.  iStart = (
0b40: 69 50 67 2d 31 29 2a 70 61 67 65 73 69 7a 65 3b  iPg-1)*pagesize;
0b50: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75  .  fprintf(stdou
0b60: 74 2c 20 22 50 61 67 65 20 25 64 3a 20 20 20 28  t, "Page %d:   (
0b70: 6f 66 66 73 65 74 73 20 30 78 25 78 2e 2e 30 78  offsets 0x%x..0x
0b80: 25 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %x)\n",.        
0b90: 20 20 69 50 67 2c 20 69 53 74 61 72 74 2c 20 69    iPg, iStart, i
0ba0: 53 74 61 72 74 2b 70 61 67 65 73 69 7a 65 2d 31  Start+pagesize-1
0bb0: 29 3b 0a 20 20 61 44 61 74 61 20 3d 20 70 72 69  );.  aData = pri
0bc0: 6e 74 5f 62 79 74 65 5f 72 61 6e 67 65 28 69 53  nt_byte_range(iS
0bd0: 74 61 72 74 2c 20 70 61 67 65 73 69 7a 65 2c 20  tart, pagesize, 
0be0: 30 29 3b 0a 20 20 66 72 65 65 28 61 44 61 74 61  0);.  free(aData
0bf0: 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  );.}../* Print a
0c00: 20 6c 69 6e 65 20 6f 66 20 64 65 63 6f 64 65 20   line of decode 
0c10: 6f 75 74 70 75 74 20 73 68 6f 77 69 6e 67 20 61  output showing a
0c20: 20 34 2d 62 79 74 65 20 69 6e 74 65 67 65 72 2e   4-byte integer.
0c30: 0a 2a 2f 0a 73 74 61 74 69 63 20 70 72 69 6e 74  .*/.static print
0c40: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 0a 20 20  _decode_line(.  
0c50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
0c60: 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 43 6f  Data,      /* Co
0c70: 6e 74 65 6e 74 20 62 65 69 6e 67 20 64 65 63 6f  ntent being deco
0c80: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ded */.  int ofs
0c90: 74 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  t, int nByte,   
0ca0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 61 6e 64      /* Start and
0cb0: 20 73 69 7a 65 20 6f 66 20 64 65 63 6f 64 65 20   size of decode 
0cc0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0cd0: 2a 7a 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  *zMsg           
0ce0: 2f 2a 20 4d 65 73 73 61 67 65 20 74 6f 20 61 70  /* Message to ap
0cf0: 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
0d00: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 76 61 6c   i, j;.  int val
0d10: 20 3d 20 61 44 61 74 61 5b 6f 66 73 74 5d 3b 0a   = aData[ofst];.
0d20: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
0d30: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
0d40: 2c 20 22 20 25 30 33 78 3a 20 25 30 32 78 22 2c  , " %03x: %02x",
0d50: 20 6f 66 73 74 2c 20 61 44 61 74 61 5b 6f 66 73   ofst, aData[ofs
0d60: 74 5d 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65  t]);.  i = strle
0d70: 6e 28 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 6a  n(zBuf);.  for(j
0d80: 3d 31 3b 20 6a 3c 34 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<4; j++){. 
0d90: 20 20 20 69 66 28 20 6a 3e 3d 6e 42 79 74 65 20     if( j>=nByte 
0da0: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
0db0: 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 20 20 22  (&zBuf[i], "   "
0dc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
0dd0: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
0de0: 66 5b 69 5d 2c 20 22 20 25 30 32 78 22 2c 20 61  f[i], " %02x", a
0df0: 44 61 74 61 5b 6f 66 73 74 2b 6a 5d 29 3b 0a 20  Data[ofst+j]);. 
0e00: 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a 32       val = val*2
0e10: 35 36 20 2b 20 61 44 61 74 61 5b 6f 66 73 74 2b  56 + aData[ofst+
0e20: 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  j];.    }.    i 
0e30: 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 42 75 66 5b  += strlen(&zBuf[
0e40: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 70 72 69 6e  i]);.  }.  sprin
0e50: 74 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 20  tf(&zBuf[i], "  
0e60: 20 25 39 64 22 2c 20 76 61 6c 29 3b 0a 20 20 70   %9d", val);.  p
0e70: 72 69 6e 74 66 28 22 25 73 20 20 25 73 5c 6e 22  rintf("%s  %s\n"
0e80: 2c 20 7a 42 75 66 2c 20 7a 4d 73 67 29 3b 0a 7d  , zBuf, zMsg);.}
0e90: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
0ea0: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
0eb0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
0ec0: 69 64 20 70 72 69 6e 74 5f 64 62 5f 68 65 61 64  id print_db_head
0ed0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69  er(void){.  unsi
0ee0: 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
0ef0: 3b 0a 20 20 61 44 61 74 61 20 3d 20 70 72 69 6e  ;.  aData = prin
0f00: 74 5f 62 79 74 65 5f 72 61 6e 67 65 28 30 2c 20  t_byte_range(0, 
0f10: 31 30 30 2c 20 30 29 3b 0a 20 20 70 72 69 6e 74  100, 0);.  print
0f20: 66 28 22 44 65 63 6f 64 65 64 3a 5c 6e 22 29 3b  f("Decoded:\n");
0f30: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
0f40: 6c 69 6e 65 28 61 44 61 74 61 2c 20 31 36 2c 20  line(aData, 16, 
0f50: 32 2c 20 22 44 61 74 61 62 61 73 65 20 70 61 67  2, "Database pag
0f60: 65 20 73 69 7a 65 22 29 3b 0a 20 20 70 72 69 6e  e size");.  prin
0f70: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
0f80: 61 74 61 2c 20 31 38 2c 20 31 2c 20 22 46 69 6c  ata, 18, 1, "Fil
0f90: 65 20 66 6f 72 6d 61 74 20 77 72 69 74 65 20 76  e format write v
0fa0: 65 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72 69 6e  ersion");.  prin
0fb0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
0fc0: 61 74 61 2c 20 31 39 2c 20 31 2c 20 22 46 69 6c  ata, 19, 1, "Fil
0fd0: 65 20 66 6f 72 6d 61 74 20 72 65 61 64 20 76 65  e format read ve
0fe0: 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72 69 6e 74  rsion");.  print
0ff0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1000: 74 61 2c 20 32 30 2c 20 31 2c 20 22 52 65 73 65  ta, 20, 1, "Rese
1010: 72 76 65 64 20 73 70 61 63 65 20 61 74 20 65 6e  rved space at en
1020: 64 20 6f 66 20 70 61 67 65 22 29 3b 0a 20 20 70  d of page");.  p
1030: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1040: 28 61 44 61 74 61 2c 20 32 34 2c 20 34 2c 20 22  (aData, 24, 4, "
1050: 46 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  File change coun
1060: 74 65 72 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  ter");.  print_d
1070: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
1080: 2c 20 32 38 2c 20 34 2c 20 22 53 69 7a 65 20 6f  , 28, 4, "Size o
1090: 66 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  f database in pa
10a0: 67 65 73 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  ges");.  print_d
10b0: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
10c0: 2c 20 33 32 2c 20 34 2c 20 22 50 61 67 65 20 6e  , 32, 4, "Page n
10d0: 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 66  umber of first f
10e0: 72 65 65 6c 69 73 74 20 70 61 67 65 22 29 3b 0a  reelist page");.
10f0: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
1100: 69 6e 65 28 61 44 61 74 61 2c 20 33 36 2c 20 34  ine(aData, 36, 4
1110: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 66 72 65  , "Number of fre
1120: 65 6c 69 73 74 20 70 61 67 65 73 22 29 3b 0a 20  elist pages");. 
1130: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1140: 6e 65 28 61 44 61 74 61 2c 20 34 30 2c 20 34 2c  ne(aData, 40, 4,
1150: 20 22 53 63 68 65 6d 61 20 63 6f 6f 6b 69 65 22   "Schema cookie"
1160: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1170: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 34 34  e_line(aData, 44
1180: 2c 20 34 2c 20 22 53 63 68 65 6d 61 20 66 6f 72  , 4, "Schema for
1190: 6d 61 74 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20  mat version");. 
11a0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
11b0: 6e 65 28 61 44 61 74 61 2c 20 34 38 2c 20 34 2c  ne(aData, 48, 4,
11c0: 20 22 44 65 66 61 75 6c 74 20 70 61 67 65 20 63   "Default page c
11d0: 61 63 68 65 20 73 69 7a 65 22 29 3b 0a 20 20 70  ache size");.  p
11e0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
11f0: 28 61 44 61 74 61 2c 20 35 32 2c 20 34 2c 20 22  (aData, 52, 4, "
1200: 4c 61 72 67 65 73 74 20 61 75 74 6f 2d 76 61 63  Largest auto-vac
1210: 20 72 6f 6f 74 20 70 61 67 65 22 29 3b 0a 20 20   root page");.  
1220: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1230: 65 28 61 44 61 74 61 2c 20 35 36 2c 20 34 2c 20  e(aData, 56, 4, 
1240: 22 54 65 78 74 20 65 6e 63 6f 64 69 6e 67 22 29  "Text encoding")
1250: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1260: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 36 30 2c  _line(aData, 60,
1270: 20 34 2c 20 22 55 73 65 72 20 76 65 72 73 69 6f   4, "User versio
1280: 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  n");.  print_dec
1290: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
12a0: 36 34 2c 20 34 2c 20 22 49 6e 63 72 65 6d 65 6e  64, 4, "Incremen
12b0: 74 61 6c 2d 76 61 63 75 75 6d 20 6d 6f 64 65 22  tal-vacuum mode"
12c0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
12d0: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 36 38  e_line(aData, 68
12e0: 2c 20 34 2c 20 22 6d 65 74 61 5b 37 5d 22 29 3b  , 4, "meta[7]");
12f0: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1300: 6c 69 6e 65 28 61 44 61 74 61 2c 20 37 32 2c 20  line(aData, 72, 
1310: 34 2c 20 22 6d 65 74 61 5b 38 5d 22 29 3b 0a 20  4, "meta[8]");. 
1320: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1330: 6e 65 28 61 44 61 74 61 2c 20 37 36 2c 20 34 2c  ne(aData, 76, 4,
1340: 20 22 6d 65 74 61 5b 39 5d 22 29 3b 0a 20 20 70   "meta[9]");.  p
1350: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1360: 28 61 44 61 74 61 2c 20 38 30 2c 20 34 2c 20 22  (aData, 80, 4, "
1370: 6d 65 74 61 5b 31 30 5d 22 29 3b 0a 20 20 70 72  meta[10]");.  pr
1380: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1390: 61 44 61 74 61 2c 20 38 34 2c 20 34 2c 20 22 6d  aData, 84, 4, "m
13a0: 65 74 61 5b 31 31 5d 22 29 3b 0a 20 20 70 72 69  eta[11]");.  pri
13b0: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
13c0: 44 61 74 61 2c 20 38 38 2c 20 34 2c 20 22 6d 65  Data, 88, 4, "me
13d0: 74 61 5b 31 32 5d 22 29 3b 0a 20 20 70 72 69 6e  ta[12]");.  prin
13e0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
13f0: 61 74 61 2c 20 39 32 2c 20 34 2c 20 22 43 68 61  ata, 92, 4, "Cha
1400: 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1410: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 22 29  version number")
1420: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1430: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 39 36 2c  _line(aData, 96,
1440: 20 34 2c 20 22 53 51 4c 69 74 65 20 76 65 72 73   4, "SQLite vers
1450: 69 6f 6e 20 6e 75 6d 62 65 72 22 29 3b 0a 7d 0a  ion number");.}.
1460: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1470: 64 65 73 63 72 69 70 74 69 6f 6e 20 66 6f 72 20  description for 
1480: 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c 2e 0a 2a  a single cell..*
1490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 73  /.static int des
14a0: 63 72 69 62 65 43 65 6c 6c 28 75 6e 73 69 67 6e  cribeCell(unsign
14b0: 65 64 20 63 68 61 72 20 63 54 79 70 65 2c 20 75  ed char cType, u
14c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c  nsigned char *a,
14d0: 20 63 68 61 72 20 2a 2a 70 7a 44 65 73 63 29 7b   char **pzDesc){
14e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
14f0: 6e 44 65 73 63 20 3d 20 30 3b 0a 20 20 69 6e 74  nDesc = 0;.  int
1500: 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 65   n = 0;.  int le
1510: 66 74 43 68 69 6c 64 3b 0a 20 20 69 36 34 20 6e  ftChild;.  i64 n
1520: 50 61 79 6c 6f 61 64 3b 0a 20 20 69 36 34 20 72  Payload;.  i64 r
1530: 6f 77 69 64 3b 0a 20 20 73 74 61 74 69 63 20 63  owid;.  static c
1540: 68 61 72 20 7a 44 65 73 63 5b 31 30 30 5d 3b 0a  har zDesc[100];.
1550: 20 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 63    i = 0;.  if( c
1560: 54 79 70 65 3c 3d 35 20 29 7b 0a 20 20 20 20 6c  Type<=5 ){.    l
1570: 65 66 74 43 68 69 6c 64 20 3d 20 28 28 61 5b 30  eftChild = ((a[0
1580: 5d 2a 32 35 36 20 2b 20 61 5b 31 5d 29 2a 32 35  ]*256 + a[1])*25
1590: 36 20 2b 20 61 5b 32 5d 29 2a 32 35 36 20 2b 20  6 + a[2])*256 + 
15a0: 61 5b 33 5d 3b 0a 20 20 20 20 61 20 2b 3d 20 34  a[3];.    a += 4
15b0: 3b 0a 20 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20  ;.    n += 4;.  
15c0: 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c    sprintf(zDesc,
15d0: 20 22 6c 65 66 74 2d 63 68 69 6c 64 3a 20 25 64   "left-child: %d
15e0: 20 22 2c 20 6c 65 66 74 43 68 69 6c 64 29 3b 0a   ", leftChild);.
15f0: 20 20 20 20 6e 44 65 73 63 20 3d 20 73 74 72 6c      nDesc = strl
1600: 65 6e 28 7a 44 65 73 63 29 3b 0a 20 20 7d 0a 20  en(zDesc);.  }. 
1610: 20 69 66 28 20 63 54 79 70 65 21 3d 35 20 29 7b   if( cType!=5 ){
1620: 0a 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56  .    i = decodeV
1630: 61 72 69 6e 74 28 61 2c 20 26 6e 50 61 79 6c 6f  arint(a, &nPaylo
1640: 61 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b  ad);.    a += i;
1650: 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20  .    n += i;.   
1660: 20 73 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b   sprintf(&zDesc[
1670: 6e 44 65 73 63 5d 2c 20 22 73 7a 3a 20 25 6c 6c  nDesc], "sz: %ll
1680: 64 20 22 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  d ", nPayload);.
1690: 20 20 20 20 6e 44 65 73 63 20 2b 3d 20 73 74 72      nDesc += str
16a0: 6c 65 6e 28 26 7a 44 65 73 63 5b 6e 44 65 73 63  len(&zDesc[nDesc
16b0: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 54  ]);.  }.  if( cT
16c0: 79 70 65 3d 3d 35 20 7c 7c 20 63 54 79 70 65 3d  ype==5 || cType=
16d0: 3d 31 33 20 29 7b 0a 20 20 20 20 69 20 3d 20 64  =13 ){.    i = d
16e0: 65 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26  ecodeVarint(a, &
16f0: 72 6f 77 69 64 29 3b 0a 20 20 20 20 61 20 2b 3d  rowid);.    a +=
1700: 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a   i;.    n += i;.
1710: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44 65      sprintf(&zDe
1720: 73 63 5b 6e 44 65 73 63 5d 2c 20 22 72 6f 77 69  sc[nDesc], "rowi
1730: 64 3a 20 25 6c 6c 64 20 22 2c 20 72 6f 77 69 64  d: %lld ", rowid
1740: 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20  );.    nDesc += 
1750: 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b 6e 44  strlen(&zDesc[nD
1760: 65 73 63 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 7a  esc]);.  }.  *pz
1770: 44 65 73 63 20 3d 20 7a 44 65 73 63 3b 0a 20 20  Desc = zDesc;.  
1780: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
1790: 2a 2a 20 44 65 63 6f 64 65 20 61 20 62 74 72 65  ** Decode a btre
17a0: 65 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  e page.*/.static
17b0: 20 76 6f 69 64 20 64 65 63 6f 64 65 5f 62 74 72   void decode_btr
17c0: 65 65 5f 70 61 67 65 28 75 6e 73 69 67 6e 65 64  ee_page(unsigned
17d0: 20 63 68 61 72 20 2a 61 2c 20 69 6e 74 20 70 67   char *a, int pg
17e0: 6e 6f 2c 20 69 6e 74 20 68 64 72 53 69 7a 65 29  no, int hdrSize)
17f0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1800: 7a 54 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  zType = "unknown
1810: 22 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  ";.  int nCell;.
1820: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
1830: 43 65 6c 6c 50 74 72 3b 0a 20 20 73 77 69 74 63  CellPtr;.  switc
1840: 68 28 20 61 5b 30 5d 20 29 7b 0a 20 20 20 20 63  h( a[0] ){.    c
1850: 61 73 65 20 32 3a 20 20 7a 54 79 70 65 20 3d 20  ase 2:  zType = 
1860: 22 69 6e 64 65 78 20 69 6e 74 65 72 69 6f 72 20  "index interior 
1870: 6e 6f 64 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20  node";  break;. 
1880: 20 20 20 63 61 73 65 20 35 3a 20 20 7a 54 79 70     case 5:  zTyp
1890: 65 20 3d 20 22 74 61 62 6c 65 20 69 6e 74 65 72  e = "table inter
18a0: 69 6f 72 20 6e 6f 64 65 22 3b 20 20 62 72 65 61  ior node";  brea
18b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  k;.    case 10: 
18c0: 7a 54 79 70 65 20 3d 20 22 69 6e 64 65 78 20 6c  zType = "index l
18d0: 65 61 66 22 3b 20 20 20 20 20 20 20 20 20 20 20  eaf";           
18e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18f0: 31 33 3a 20 7a 54 79 70 65 20 3d 20 22 74 61 62  13: zType = "tab
1900: 6c 65 20 6c 65 61 66 22 3b 20 20 20 20 20 20 20  le leaf";       
1910: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
1920: 20 70 72 69 6e 74 66 28 22 44 65 63 6f 64 65 20   printf("Decode 
1930: 6f 66 20 62 74 72 65 65 20 70 61 67 65 20 25 64  of btree page %d
1940: 3a 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  :\n", pgno);.  p
1950: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1960: 28 61 2c 20 30 2c 20 31 2c 20 7a 54 79 70 65 29  (a, 0, 1, zType)
1970: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1980: 5f 6c 69 6e 65 28 61 2c 20 31 2c 20 32 2c 20 22  _line(a, 1, 2, "
1990: 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  Offset to first 
19a0: 66 72 65 65 62 6c 6f 63 6b 22 29 3b 0a 20 20 70  freeblock");.  p
19b0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
19c0: 28 61 2c 20 33 2c 20 32 2c 20 22 4e 75 6d 62 65  (a, 3, 2, "Numbe
19d0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
19e0: 69 73 20 70 61 67 65 22 29 3b 0a 20 20 6e 43 65  is page");.  nCe
19f0: 6c 6c 20 3d 20 61 5b 33 5d 2a 32 35 36 20 2b 20  ll = a[3]*256 + 
1a00: 61 5b 34 5d 3b 0a 20 20 70 72 69 6e 74 5f 64 65  a[4];.  print_de
1a10: 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 35 2c 20  code_line(a, 5, 
1a20: 32 2c 20 22 4f 66 66 73 65 74 20 74 6f 20 63 65  2, "Offset to ce
1a30: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
1a40: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1a50: 65 5f 6c 69 6e 65 28 61 2c 20 37 2c 20 31 2c 20  e_line(a, 7, 1, 
1a60: 22 46 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65  "Fragmented byte
1a70: 20 63 6f 75 6e 74 22 29 3b 0a 20 20 69 66 28 20   count");.  if( 
1a80: 61 5b 30 5d 3d 3d 32 20 7c 7c 20 61 5b 30 5d 3d  a[0]==2 || a[0]=
1a90: 3d 35 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 5f  =5 ){.    print_
1aa0: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 38  decode_line(a, 8
1ab0: 2c 20 34 2c 20 22 52 69 67 68 74 20 63 68 69 6c  , 4, "Right chil
1ac0: 64 22 29 3b 0a 20 20 20 20 69 43 65 6c 6c 50 74  d");.    iCellPt
1ad0: 72 20 3d 20 31 32 3b 0a 20 20 7d 65 6c 73 65 7b  r = 12;.  }else{
1ae0: 0a 20 20 20 20 69 43 65 6c 6c 50 74 72 20 3d 20  .    iCellPtr = 
1af0: 38 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  8;.  }.  for(i=0
1b00: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1b10: 0a 20 20 20 20 69 6e 74 20 63 6f 66 73 74 20 3d  .    int cofst =
1b20: 20 69 43 65 6c 6c 50 74 72 20 2b 20 69 2a 32 3b   iCellPtr + i*2;
1b30: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 65 73 63  .    char *zDesc
1b40: 3b 0a 20 20 20 20 63 6f 66 73 74 20 3d 20 61 5b  ;.    cofst = a[
1b50: 63 6f 66 73 74 5d 2a 32 35 36 20 2b 20 61 5b 63  cofst]*256 + a[c
1b60: 6f 66 73 74 2b 31 5d 3b 0a 20 20 20 20 64 65 73  ofst+1];.    des
1b70: 63 72 69 62 65 43 65 6c 6c 28 61 5b 30 5d 2c 20  cribeCell(a[0], 
1b80: 26 61 5b 63 6f 66 73 74 2d 68 64 72 53 69 7a 65  &a[cofst-hdrSize
1b90: 5d 2c 20 26 7a 44 65 73 63 29 3b 0a 20 20 20 20  ], &zDesc);.    
1ba0: 70 72 69 6e 74 66 28 22 20 25 30 33 78 3a 20 63  printf(" %03x: c
1bb0: 65 6c 6c 5b 25 64 5d 20 25 73 5c 6e 22 2c 20 63  ell[%d] %s\n", c
1bc0: 6f 66 73 74 2c 20 69 2c 20 7a 44 65 73 63 29 3b  ofst, i, zDesc);
1bd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1be0: 63 6f 64 65 20 61 20 66 72 65 65 6c 69 73 74 20  code a freelist 
1bf0: 74 72 75 6e 6b 20 70 61 67 65 2e 0a 2a 2f 0a 73  trunk page..*/.s
1c00: 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64  tatic void decod
1c10: 65 5f 74 72 75 6e 6b 5f 70 61 67 65 28 0a 20 20  e_trunk_page(.  
1c20: 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  int pgno,       
1c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1c40: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1c50: 74 20 70 61 67 65 73 69 7a 65 2c 20 20 20 20 20  t pagesize,     
1c60: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1c70: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ach page */.  in
1c80: 74 20 64 65 74 61 69 6c 2c 20 20 20 20 20 20 20  t detail,       
1c90: 20 20 20 20 2f 2a 20 53 68 6f 77 20 6c 65 61 66      /* Show leaf
1ca0: 20 70 61 67 65 73 20 69 66 20 74 72 75 65 20 2a   pages if true *
1cb0: 2f 0a 20 20 69 6e 74 20 72 65 63 75 72 73 69 76  /.  int recursiv
1cc0: 65 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c  e         /* Fol
1cd0: 6c 6f 77 20 74 68 65 20 74 72 75 6e 6b 20 63 68  low the trunk ch
1ce0: 61 6e 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  ange if true */.
1cf0: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20 6b  ){.  int n, i, k
1d00: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1d10: 72 20 2a 61 3b 0a 20 20 77 68 69 6c 65 28 20 70  r *a;.  while( p
1d20: 67 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 61 20 3d  gno>0 ){.    a =
1d30: 20 67 65 74 43 6f 6e 74 65 6e 74 28 28 70 67 6e   getContent((pgn
1d40: 6f 2d 31 29 2a 70 61 67 65 73 69 7a 65 2c 20 70  o-1)*pagesize, p
1d50: 61 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 70 72  agesize);.    pr
1d60: 69 6e 74 66 28 22 44 65 63 6f 64 65 20 6f 66 20  intf("Decode of 
1d70: 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
1d80: 61 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67 6e 6f  age %d:\n", pgno
1d90: 29 3b 0a 20 20 20 20 70 72 69 6e 74 5f 64 65 63  );.    print_dec
1da0: 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 34  ode_line(a, 0, 4
1db0: 2c 20 22 4e 65 78 74 20 66 72 65 65 6c 69 73 74  , "Next freelist
1dc0: 20 74 72 75 6e 6b 20 70 61 67 65 22 29 3b 0a 20   trunk page");. 
1dd0: 20 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f     print_decode_
1de0: 6c 69 6e 65 28 61 2c 20 34 2c 20 34 2c 20 22 4e  line(a, 4, 4, "N
1df0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1e00: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 22 29 3b   on this page");
1e10: 0a 20 20 20 20 69 66 28 20 64 65 74 61 69 6c 20  .    if( detail 
1e20: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e  ){.      n = (in
1e30: 74 29 64 65 63 6f 64 65 49 6e 74 33 32 28 26 61  t)decodeInt32(&a
1e40: 5b 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  [4]);.      for(
1e50: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1e60: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1e70: 20 69 6e 74 20 78 20 3d 20 64 65 63 6f 64 65 49   int x = decodeI
1e80: 6e 74 33 32 28 26 61 5b 38 2b 34 2a 69 5d 29 3b  nt32(&a[8+4*i]);
1e90: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 49  .        char zI
1ea0: 64 78 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20  dx[10];.        
1eb0: 73 70 72 69 6e 74 66 28 7a 49 64 78 2c 20 22 5b  sprintf(zIdx, "[
1ec0: 25 64 5d 22 2c 20 69 29 3b 0a 20 20 20 20 20 20  %d]", i);.      
1ed0: 20 20 70 72 69 6e 74 66 28 22 20 20 25 35 73 20    printf("  %5s 
1ee0: 25 37 75 22 2c 20 7a 49 64 78 2c 20 78 29 3b 0a  %7u", zIdx, x);.
1ef0: 20 20 20 20 20 20 20 20 69 66 28 20 69 25 35 3d          if( i%5=
1f00: 3d 34 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  =4 ) printf("\n"
1f10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f20: 20 69 66 28 20 69 25 35 21 3d 30 20 29 20 70 72   if( i%5!=0 ) pr
1f30: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
1f40: 7d 0a 20 20 20 20 69 66 28 20 21 72 65 63 75 72  }.    if( !recur
1f50: 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 70 67  sive ){.      pg
1f60: 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  no = 0;.    }els
1f70: 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  e{.      pgno = 
1f80: 28 69 6e 74 29 64 65 63 6f 64 65 49 6e 74 33 32  (int)decodeInt32
1f90: 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  (&a[0]);.    }. 
1fa0: 20 20 20 66 72 65 65 28 61 29 3b 0a 20 20 7d 0a     free(a);.  }.
1fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
1fc0: 20 75 73 61 67 65 20 63 6f 6d 6d 65 6e 74 0a 2a   usage comment.*
1fd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  /.static void us
1fe0: 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  age(const char *
1ff0: 61 72 67 76 30 29 7b 0a 20 20 66 70 72 69 6e 74  argv0){.  fprint
2000: 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2010: 20 25 73 20 46 49 4c 45 4e 41 4d 45 20 3f 61 72   %s FILENAME ?ar
2020: 67 73 2e 2e 2e 3f 5c 6e 5c 6e 22 2c 20 61 72 67  gs...?\n\n", arg
2030: 76 30 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  v0);.  fprintf(s
2040: 74 64 65 72 72 2c 0a 20 20 20 20 22 61 72 67 73  tderr,.    "args
2050: 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 64 62  :\n".    "    db
2060: 68 65 61 64 65 72 20 20 20 20 20 20 20 20 53 68  header        Sh
2070: 6f 77 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ow database head
2080: 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e  er\n".    "    N
2090: 4e 4e 2e 2e 4d 4d 4d 20 20 20 20 20 20 20 20 53  NN..MMM        S
20a0: 68 6f 77 20 68 65 78 20 6f 66 20 70 61 67 65 73  how hex of pages
20b0: 20 4e 4e 4e 20 74 68 72 6f 75 67 68 20 4d 4d 4d   NNN through MMM
20c0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e  \n".    "    NNN
20d0: 2e 2e 65 6e 64 20 20 20 20 20 20 20 20 53 68 6f  ..end        Sho
20e0: 77 20 68 65 78 20 6f 66 20 70 61 67 65 73 20 4e  w hex of pages N
20f0: 4e 4e 20 74 68 72 6f 75 67 68 20 65 6e 64 20 6f  NN through end o
2100: 66 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 22 20  f file\n".    " 
2110: 20 20 20 4e 4e 4e 62 20 20 20 20 20 20 20 20 20     NNNb         
2120: 20 20 20 44 65 63 6f 64 65 20 62 74 72 65 65 20     Decode btree 
2130: 70 61 67 65 20 4e 4e 4e 5c 6e 22 0a 20 20 20 20  page NNN\n".    
2140: 22 20 20 20 20 4e 4e 4e 74 20 20 20 20 20 20 20  "    NNNt       
2150: 20 20 20 20 20 44 65 63 6f 64 65 20 66 72 65 65       Decode free
2160: 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2170: 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  NNN\n".    "    
2180: 4e 4e 4e 74 64 20 20 20 20 20 20 20 20 20 20 20  NNNtd           
2190: 53 68 6f 77 20 6c 65 61 76 65 20 66 72 65 65 6c  Show leave freel
21a0: 69 73 74 20 70 61 67 65 73 20 6f 6e 20 74 68 65  ist pages on the
21b0: 20 64 65 63 6f 64 65 5c 6e 22 0a 20 20 20 20 22   decode\n".    "
21c0: 20 20 20 20 4e 4e 4e 74 72 20 20 20 20 20 20 20      NNNtr       
21d0: 20 20 20 20 52 65 63 75 72 69 73 76 65 6c 79 20      Recurisvely 
21e0: 64 65 63 6f 64 65 20 66 72 65 65 6c 69 73 74 20  decode freelist 
21f0: 73 74 61 72 74 69 6e 67 20 61 74 20 4e 4e 4e 5c  starting at NNN\
2200: 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6d  n".  );.}..int m
2210: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
2220: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 74  ar **argv){.  st
2230: 72 75 63 74 20 73 74 61 74 20 73 62 75 66 3b 0a  ruct stat sbuf;.
2240: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2250: 7a 50 67 53 7a 5b 32 5d 3b 0a 20 20 69 66 28 20  zPgSz[2];.  if( 
2260: 61 72 67 63 3c 32 20 29 7b 0a 20 20 20 20 75 73  argc<2 ){.    us
2270: 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  age(argv[0]);.  
2280: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
2290: 20 64 62 20 3d 20 6f 70 65 6e 28 61 72 67 76 5b   db = open(argv[
22a0: 31 5d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  1], O_RDONLY);. 
22b0: 20 69 66 28 20 64 62 3c 30 20 29 7b 0a 20 20 20   if( db<0 ){.   
22c0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
22d0: 22 25 73 3a 20 63 61 6e 27 74 20 6f 70 65 6e 20  "%s: can't open 
22e0: 25 73 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 2c 20  %s\n", argv[0], 
22f0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 78  argv[1]);.    ex
2300: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 7a 50 67  it(1);.  }.  zPg
2310: 53 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 7a 50 67  Sz[0] = 0;.  zPg
2320: 53 7a 5b 31 5d 20 3d 20 30 3b 0a 20 20 6c 73 65  Sz[1] = 0;.  lse
2330: 65 6b 28 64 62 2c 20 31 36 2c 20 53 45 45 4b 5f  ek(db, 16, SEEK_
2340: 53 45 54 29 3b 0a 20 20 72 65 61 64 28 64 62 2c  SET);.  read(db,
2350: 20 7a 50 67 53 7a 2c 20 32 29 3b 0a 20 20 70 61   zPgSz, 2);.  pa
2360: 67 65 73 69 7a 65 20 3d 20 7a 50 67 53 7a 5b 30  gesize = zPgSz[0
2370: 5d 2a 32 35 36 20 2b 20 7a 50 67 53 7a 5b 31 5d  ]*256 + zPgSz[1]
2380: 2a 36 35 35 33 36 3b 0a 20 20 69 66 28 20 70 61  *65536;.  if( pa
2390: 67 65 73 69 7a 65 3d 3d 30 20 29 20 70 61 67 65  gesize==0 ) page
23a0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 70  size = 1024;.  p
23b0: 72 69 6e 74 66 28 22 50 61 67 65 73 69 7a 65 3a  rintf("Pagesize:
23c0: 20 25 64 5c 6e 22 2c 20 70 61 67 65 73 69 7a 65   %d\n", pagesize
23d0: 29 3b 0a 20 20 66 73 74 61 74 28 64 62 2c 20 26  );.  fstat(db, &
23e0: 73 62 75 66 29 3b 0a 20 20 6d 78 50 61 67 65 20  sbuf);.  mxPage 
23f0: 3d 20 73 62 75 66 2e 73 74 5f 73 69 7a 65 2f 70  = sbuf.st_size/p
2400: 61 67 65 73 69 7a 65 3b 0a 20 20 70 72 69 6e 74  agesize;.  print
2410: 66 28 22 41 76 61 69 6c 61 62 6c 65 20 70 61 67  f("Available pag
2420: 65 73 3a 20 31 2e 2e 25 64 5c 6e 22 2c 20 6d 78  es: 1..%d\n", mx
2430: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 61 72 67  Page);.  if( arg
2440: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  c==2 ){.    int 
2450: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
2460: 69 3c 3d 6d 78 50 61 67 65 3b 20 69 2b 2b 29 20  i<=mxPage; i++) 
2470: 70 72 69 6e 74 5f 70 61 67 65 28 69 29 3b 0a 20  print_page(i);. 
2480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2490: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  i;.    for(i=2; 
24a0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
24b0: 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20      int iStart, 
24c0: 69 45 6e 64 3b 0a 20 20 20 20 20 20 63 68 61 72  iEnd;.      char
24d0: 20 2a 7a 4c 65 66 74 3b 0a 20 20 20 20 20 20 69   *zLeft;.      i
24e0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
24f0: 5d 2c 20 22 64 62 68 65 61 64 65 72 22 29 3d 3d  ], "dbheader")==
2500: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
2510: 6e 74 5f 64 62 5f 68 65 61 64 65 72 28 29 3b 0a  nt_db_header();.
2520: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2540: 69 66 28 20 21 69 73 64 69 67 69 74 28 61 72 67  if( !isdigit(arg
2550: 76 5b 69 5d 5b 30 5d 29 20 29 7b 0a 20 20 20 20  v[i][0]) ){.    
2560: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2570: 72 72 2c 20 22 25 73 3a 20 75 6e 6b 6e 6f 77 6e  rr, "%s: unknown
2580: 20 6f 70 74 69 6f 6e 3a 20 5b 25 73 5d 5c 6e 22   option: [%s]\n"
2590: 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b  , argv[0], argv[
25a0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  i]);.        con
25b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
25c0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 74       iStart = st
25d0: 72 74 6f 6c 28 61 72 67 76 5b 69 5d 2c 20 26 7a  rtol(argv[i], &z
25e0: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
25f0: 69 66 28 20 7a 4c 65 66 74 20 26 26 20 73 74 72  if( zLeft && str
2600: 63 6d 70 28 7a 4c 65 66 74 2c 22 2e 2e 65 6e 64  cmp(zLeft,"..end
2610: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
2620: 20 69 45 6e 64 20 3d 20 6d 78 50 61 67 65 3b 0a   iEnd = mxPage;.
2630: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2640: 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66 74 5b 30  zLeft && zLeft[0
2650: 5d 3d 3d 27 2e 27 20 26 26 20 7a 4c 65 66 74 5b  ]=='.' && zLeft[
2660: 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  1]=='.' ){.     
2670: 20 20 20 69 45 6e 64 20 3d 20 73 74 72 74 6f 6c     iEnd = strtol
2680: 28 26 7a 4c 65 66 74 5b 32 5d 2c 20 30 2c 20 30  (&zLeft[2], 0, 0
2690: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
26a0: 66 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66  f( zLeft && zLef
26b0: 74 5b 30 5d 3d 3d 27 62 27 20 29 7b 0a 20 20 20  t[0]=='b' ){.   
26c0: 20 20 20 20 20 69 6e 74 20 6f 66 73 74 2c 20 6e       int ofst, n
26d0: 42 79 74 65 2c 20 68 64 72 53 69 7a 65 3b 0a 20  Byte, hdrSize;. 
26e0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
26f0: 63 68 61 72 20 2a 61 3b 0a 20 20 20 20 20 20 20  char *a;.       
2700: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 31 20 29   if( iStart==1 )
2710: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 73 74  {.          ofst
2720: 20 3d 20 68 64 72 53 69 7a 65 20 3d 20 31 30 30   = hdrSize = 100
2730: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ;.          nByt
2740: 65 20 3d 20 70 61 67 65 73 69 7a 65 2d 31 30 30  e = pagesize-100
2750: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2760: 0a 20 20 20 20 20 20 20 20 20 20 68 64 72 53 69  .          hdrSi
2770: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
2780: 20 20 6f 66 73 74 20 3d 20 28 69 53 74 61 72 74    ofst = (iStart
2790: 2d 31 29 2a 70 61 67 65 73 69 7a 65 3b 0a 20 20  -1)*pagesize;.  
27a0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
27b0: 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20  pagesize;.      
27c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 20 3d 20    }.        a = 
27d0: 67 65 74 43 6f 6e 74 65 6e 74 28 6f 66 73 74 2c  getContent(ofst,
27e0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
27f0: 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f 70 61   decode_btree_pa
2800: 67 65 28 61 2c 20 69 53 74 61 72 74 2c 20 68 64  ge(a, iStart, hd
2810: 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  rSize);.        
2820: 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20 20  free(a);.       
2830: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2840: 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 65 66 74   }else if( zLeft
2850: 20 26 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27 74   && zLeft[0]=='t
2860: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73  ' ){.        uns
2870: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20  igned char *a;. 
2880: 20 20 20 20 20 20 20 69 6e 74 20 64 65 74 61 69         int detai
2890: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
28a0: 6e 74 20 72 65 63 75 72 73 69 76 65 20 3d 20 30  nt recursive = 0
28b0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  ;.        int i;
28c0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
28d0: 3b 20 7a 4c 65 66 74 5b 69 5d 3b 20 69 2b 2b 29  ; zLeft[i]; i++)
28e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
28f0: 7a 4c 65 66 74 5b 69 5d 3d 3d 27 72 27 20 29 20  zLeft[i]=='r' ) 
2900: 72 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  recursive = 1;. 
2910: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 65           if( zLe
2920: 66 74 5b 69 5d 3d 3d 27 64 27 20 29 20 64 65 74  ft[i]=='d' ) det
2930: 61 69 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ail = 1;.       
2940: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 63 6f 64   }.        decod
2950: 65 5f 74 72 75 6e 6b 5f 70 61 67 65 28 69 53 74  e_trunk_page(iSt
2960: 61 72 74 2c 20 70 61 67 65 73 69 7a 65 2c 20 64  art, pagesize, d
2970: 65 74 61 69 6c 2c 20 72 65 63 75 72 73 69 76 65  etail, recursive
2980: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
2990: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
29a0: 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  {.        iEnd =
29b0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 7d   iStart;.      }
29c0: 0a 20 20 20 20 20 20 69 66 28 20 69 53 74 61 72  .      if( iStar
29d0: 74 3c 31 20 7c 7c 20 69 45 6e 64 3c 69 53 74 61  t<1 || iEnd<iSta
29e0: 72 74 20 7c 7c 20 69 45 6e 64 3e 6d 78 50 61 67  rt || iEnd>mxPag
29f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
2a00: 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
2a10: 20 20 20 20 20 20 20 22 50 61 67 65 20 61 72 67         "Page arg
2a20: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
2a30: 4c 4f 57 45 52 3f 2e 2e 55 50 50 45 52 3f 2e 20  LOWER?..UPPER?. 
2a40: 20 52 61 6e 67 65 20 31 20 74 6f 20 25 64 5c 6e   Range 1 to %d\n
2a50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6d 78 50  ",.          mxP
2a60: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78  age);.        ex
2a70: 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
2a80: 20 20 20 20 20 77 68 69 6c 65 28 20 69 53 74 61       while( iSta
2a90: 72 74 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20  rt<=iEnd ){.    
2aa0: 20 20 20 20 70 72 69 6e 74 5f 70 61 67 65 28 69      print_page(i
2ab0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
2ac0: 69 53 74 61 72 74 2b 2b 3b 0a 20 20 20 20 20 20  iStart++;.      
2ad0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6c  }.    }.  }.  cl
2ae0: 6f 73 65 28 64 62 29 3b 0a 7d 0a                 ose(db);.}.