/ Hex Artifact Content
Login

Artifact 1f3fe634d6f690b8d39ab1b9fd34583d468921e1:


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 0a 23  ude <fcntl.h>..#
00b0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 4d 53 43  if !defined(_MSC
00c0: 5f 56 45 52 29 0a 23 69 6e 63 6c 75 64 65 20 3c  _VER).#include <
00d0: 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66  unistd.h>.#endif
00e0: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
00f0: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0100: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0110: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
0120: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
0130: 73 69 7a 65 20 3d 20 31 30 32 34 3b 20 20 20 20  size = 1024;    
0140: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 64 61   /* Size of a da
0150: 74 61 62 61 73 65 20 70 61 67 65 20 2a 2f 0a 73  tabase page */.s
0160: 74 61 74 69 63 20 69 6e 74 20 64 62 20 3d 20 2d  tatic int db = -
0170: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
0180: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
0190: 72 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  r for reading th
01a0: 65 20 44 42 20 2a 2f 0a 73 74 61 74 69 63 20 69  e DB */.static i
01b0: 6e 74 20 6d 78 50 61 67 65 20 3d 20 30 3b 20 20  nt mxPage = 0;  
01c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
01d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 73  page number */.s
01e0: 74 61 74 69 63 20 69 6e 74 20 70 65 72 4c 69 6e  tatic int perLin
01f0: 65 20 3d 20 31 36 3b 20 20 20 20 20 20 20 20 2f  e = 16;        /
0200: 2a 20 48 45 58 20 65 6c 65 6d 65 6e 74 73 20 74  * HEX elements t
0210: 6f 20 70 72 69 6e 74 20 70 65 72 20 6c 69 6e 65  o print per line
0220: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 6c 6f 6e   */..typedef lon
0230: 67 20 6c 6f 6e 67 20 69 6e 74 20 69 36 34 3b 20  g long int i64; 
0240: 20 20 20 20 20 2f 2a 20 44 61 74 61 74 79 70 65       /* Datatype
0250: 20 66 6f 72 20 36 34 2d 62 69 74 20 69 6e 74 65   for 64-bit inte
0260: 67 65 72 73 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  gers */.../*.** 
0270: 43 6f 6e 76 65 72 74 20 74 68 65 20 76 61 72 2d  Convert the var-
0280: 69 6e 74 20 66 6f 72 6d 61 74 20 69 6e 74 6f 20  int format into 
0290: 69 36 34 2e 20 20 52 65 74 75 72 6e 20 74 68 65  i64.  Return the
02a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
02b0: 0a 2a 2a 20 69 6e 20 74 68 65 20 76 61 72 2d 69  .** in the var-i
02c0: 6e 74 2e 20 20 57 72 69 74 65 20 74 68 65 20 76  nt.  Write the v
02d0: 61 72 2d 69 6e 74 20 76 61 6c 75 65 20 69 6e 74  ar-int value int
02e0: 6f 20 2a 70 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74  o *pVal..*/.stat
02f0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 56 61 72  ic int decodeVar
0300: 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  int(const unsign
0310: 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 36 34 20  ed char *z, i64 
0320: 2a 70 56 61 6c 29 7b 0a 20 20 69 36 34 20 76 20  *pVal){.  i64 v 
0330: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
0340: 66 6f 72 28 69 3d 30 3b 20 69 3c 38 3b 20 69 2b  for(i=0; i<8; i+
0350: 2b 29 7b 0a 20 20 20 20 76 20 3d 20 28 76 3c 3c  +){.    v = (v<<
0360: 37 29 20 2b 20 28 7a 5b 69 5d 26 30 78 37 66 29  7) + (z[i]&0x7f)
0370: 3b 0a 20 20 20 20 69 66 28 20 28 7a 5b 69 5d 26  ;.    if( (z[i]&
0380: 30 78 38 30 29 3d 3d 30 20 29 7b 20 2a 70 56 61  0x80)==0 ){ *pVa
0390: 6c 20 3d 20 76 3b 20 72 65 74 75 72 6e 20 69 2b  l = v; return i+
03a0: 31 3b 20 7d 0a 20 20 7d 0a 20 20 76 20 3d 20 28  1; }.  }.  v = (
03b0: 76 3c 3c 38 29 20 2b 20 28 7a 5b 69 5d 26 30 78  v<<8) + (z[i]&0x
03c0: 66 66 29 3b 0a 20 20 2a 70 56 61 6c 20 3d 20 76  ff);.  *pVal = v
03d0: 3b 0a 20 20 72 65 74 75 72 6e 20 39 3b 0a 7d 0a  ;.  return 9;.}.
03e0: 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 61  ./*.** Extract a
03f0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62   big-endian 32-b
0400: 69 74 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74  it integer.*/.st
0410: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
0420: 74 20 64 65 63 6f 64 65 49 6e 74 33 32 28 63 6f  t decodeInt32(co
0430: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
0440: 72 20 2a 7a 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *z){.  return 
0450: 28 7a 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 7a 5b  (z[0]<<24) + (z[
0460: 31 5d 3c 3c 31 36 29 20 2b 20 28 7a 5b 32 5d 3c  1]<<16) + (z[2]<
0470: 3c 38 29 20 2b 20 7a 5b 33 5d 3b 0a 7d 0a 0a 2f  <8) + z[3];.}../
0480: 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d  * Report an out-
0490: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
04a0: 61 6e 64 20 64 69 65 2e 0a 2a 2f 0a 73 74 61 74  and die..*/.stat
04b0: 69 63 20 76 6f 69 64 20 6f 75 74 5f 6f 66 5f 6d  ic void out_of_m
04c0: 65 6d 6f 72 79 28 76 6f 69 64 29 7b 0a 20 20 66  emory(void){.  f
04d0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
04e0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 2e 2e 5c  ut of memory...\
04f0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
0500: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 63 6f  }../*.** Read co
0510: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66  ntent from the f
0520: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ile..**.** Space
0530: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 6f 6e   to hold the con
0540: 74 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  tent is obtained
0550: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
0560: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a  nd needs to be.*
0570: 2a 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  * freed by the c
0580: 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
0590: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
05a0: 67 65 74 43 6f 6e 74 65 6e 74 28 69 6e 74 20 6f  getContent(int o
05b0: 66 73 74 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  fst, int nByte){
05c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
05d0: 20 2a 61 44 61 74 61 3b 0a 20 20 61 44 61 74 61   *aData;.  aData
05e0: 20 3d 20 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 2b   = malloc(nByte+
05f0: 33 32 29 3b 0a 20 20 69 66 28 20 61 44 61 74 61  32);.  if( aData
0600: 3d 3d 30 20 29 20 6f 75 74 5f 6f 66 5f 6d 65 6d  ==0 ) out_of_mem
0610: 6f 72 79 28 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ory();.  memset(
0620: 61 44 61 74 61 2c 20 30 2c 20 6e 42 79 74 65 2b  aData, 0, nByte+
0630: 33 32 29 3b 0a 20 20 6c 73 65 65 6b 28 64 62 2c  32);.  lseek(db,
0640: 20 6f 66 73 74 2c 20 53 45 45 4b 5f 53 45 54 29   ofst, SEEK_SET)
0650: 3b 0a 20 20 72 65 61 64 28 64 62 2c 20 61 44 61  ;.  read(db, aDa
0660: 74 61 2c 20 6e 42 79 74 65 29 3b 0a 20 20 72 65  ta, nByte);.  re
0670: 74 75 72 6e 20 61 44 61 74 61 3b 0a 7d 0a 0a 2f  turn aData;.}../
0680: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 72 61 6e  *.** Print a ran
0690: 67 65 20 6f 66 20 62 79 74 65 73 20 61 73 20 68  ge of bytes as h
06a0: 65 78 20 61 6e 64 20 61 73 20 61 73 63 69 69 2e  ex and as ascii.
06b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
06c0: 6e 65 64 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  ned char *print_
06d0: 62 79 74 65 5f 72 61 6e 67 65 28 0a 20 20 69 6e  byte_range(.  in
06e0: 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
06f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 69   /* First byte i
0700: 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 62  n the range of b
0710: 79 74 65 73 20 74 6f 20 70 72 69 6e 74 20 2a 2f  ytes to print */
0720: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
0730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0740: 6f 66 20 62 79 74 65 73 20 74 6f 20 70 72 69 6e  of bytes to prin
0750: 74 20 2a 2f 0a 20 20 69 6e 74 20 70 72 69 6e 74  t */.  int print
0760: 4f 66 73 74 20 20 20 20 20 20 2f 2a 20 41 64 64  Ofst      /* Add
0770: 20 74 68 69 73 20 61 6d 6f 75 6e 74 20 74 6f 20   this amount to 
0780: 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 68 65  the index on the
0790: 20 6c 65 66 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   left column */.
07a0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
07b0: 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74  ar *aData;.  int
07c0: 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63   i, j;.  const c
07d0: 68 61 72 20 2a 7a 4f 66 73 74 46 6d 74 3b 0a 0a  har *zOfstFmt;..
07e0: 20 20 69 66 28 20 28 28 70 72 69 6e 74 4f 66 73    if( ((printOfs
07f0: 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66 66 29  t+nByte)&~0xfff)
0800: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74  ==0 ){.    zOfst
0810: 46 6d 74 20 3d 20 22 20 25 30 33 78 3a 20 22 3b  Fmt = " %03x: ";
0820: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 28 70  .  }else if( ((p
0830: 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74 65 29 26  rintOfst+nByte)&
0840: 7e 30 78 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20  ~0xffff)==0 ){. 
0850: 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20     zOfstFmt = " 
0860: 25 30 34 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65  %04x: ";.  }else
0870: 20 69 66 28 20 28 28 70 72 69 6e 74 4f 66 73 74   if( ((printOfst
0880: 2b 6e 42 79 74 65 29 26 7e 30 78 66 66 66 66 66  +nByte)&~0xfffff
0890: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73  )==0 ){.    zOfs
08a0: 74 46 6d 74 20 3d 20 22 20 25 30 35 78 3a 20 22  tFmt = " %05x: "
08b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 28  ;.  }else if( ((
08c0: 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74 65 29  printOfst+nByte)
08d0: 26 7e 30 78 66 66 66 66 66 66 29 3d 3d 30 20 29  &~0xffffff)==0 )
08e0: 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d  {.    zOfstFmt =
08f0: 20 22 20 25 30 36 78 3a 20 22 3b 0a 20 20 7d 65   " %06x: ";.  }e
0900: 6c 73 65 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d  lse{.    zOfstFm
0910: 74 20 3d 20 22 20 25 30 38 78 3a 20 22 3b 0a 20  t = " %08x: ";. 
0920: 20 7d 0a 0a 20 20 61 44 61 74 61 20 3d 20 67 65   }..  aData = ge
0930: 74 43 6f 6e 74 65 6e 74 28 6f 66 73 74 2c 20 6e  tContent(ofst, n
0940: 42 79 74 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Byte);.  for(i=0
0950: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 20 2b 3d 20  ; i<nByte; i += 
0960: 70 65 72 4c 69 6e 65 29 7b 0a 20 20 20 20 66 70  perLine){.    fp
0970: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 7a 4f  rintf(stdout, zO
0980: 66 73 74 46 6d 74 2c 20 69 2b 70 72 69 6e 74 4f  fstFmt, i+printO
0990: 66 73 74 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  fst);.    for(j=
09a0: 30 3b 20 6a 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b  0; j<perLine; j+
09b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 2b  +){.      if( i+
09c0: 6a 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  j>nByte ){.     
09d0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75     fprintf(stdou
09e0: 74 2c 20 22 20 20 20 22 29 3b 0a 20 20 20 20 20  t, "   ");.     
09f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0a00: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 22  fprintf(stdout,"
0a10: 25 30 32 78 20 22 2c 20 61 44 61 74 61 5b 69 2b  %02x ", aData[i+
0a20: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
0a30: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
0a40: 6a 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b  j<perLine; j++){
0a50: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e  .      if( i+j>n
0a60: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
0a70: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
0a80: 22 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  " ");.      }els
0a90: 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
0aa0: 74 66 28 73 74 64 6f 75 74 2c 22 25 63 22 2c 20  tf(stdout,"%c", 
0ab0: 69 73 70 72 69 6e 74 28 61 44 61 74 61 5b 69 2b  isprint(aData[i+
0ac0: 6a 5d 29 20 3f 20 61 44 61 74 61 5b 69 2b 6a 5d  j]) ? aData[i+j]
0ad0: 20 3a 20 27 2e 27 29 3b 0a 20 20 20 20 20 20 7d   : '.');.      }
0ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
0af0: 74 66 28 73 74 64 6f 75 74 2c 22 5c 6e 22 29 3b  tf(stdout,"\n");
0b00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 44  .  }.  return aD
0b10: 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ata;.}../*.** Pr
0b20: 69 6e 74 20 61 6e 20 65 6e 74 69 72 65 20 70 61  int an entire pa
0b30: 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 61 73  ge of content as
0b40: 20 68 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76   hex.*/.static v
0b50: 6f 69 64 20 70 72 69 6e 74 5f 70 61 67 65 28 69  oid print_page(i
0b60: 6e 74 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 69  nt iPg){.  int i
0b70: 53 74 61 72 74 3b 0a 20 20 75 6e 73 69 67 6e 65  Start;.  unsigne
0b80: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20  d char *aData;. 
0b90: 20 69 53 74 61 72 74 20 3d 20 28 69 50 67 2d 31   iStart = (iPg-1
0ba0: 29 2a 70 61 67 65 73 69 7a 65 3b 0a 20 20 66 70  )*pagesize;.  fp
0bb0: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 50  rintf(stdout, "P
0bc0: 61 67 65 20 25 64 3a 20 20 20 28 6f 66 66 73 65  age %d:   (offse
0bd0: 74 73 20 30 78 25 78 2e 2e 30 78 25 78 29 5c 6e  ts 0x%x..0x%x)\n
0be0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 50 67  ",.          iPg
0bf0: 2c 20 69 53 74 61 72 74 2c 20 69 53 74 61 72 74  , iStart, iStart
0c00: 2b 70 61 67 65 73 69 7a 65 2d 31 29 3b 0a 20 20  +pagesize-1);.  
0c10: 61 44 61 74 61 20 3d 20 70 72 69 6e 74 5f 62 79  aData = print_by
0c20: 74 65 5f 72 61 6e 67 65 28 69 53 74 61 72 74 2c  te_range(iStart,
0c30: 20 70 61 67 65 73 69 7a 65 2c 20 30 29 3b 0a 20   pagesize, 0);. 
0c40: 20 66 72 65 65 28 61 44 61 74 61 29 3b 0a 7d 0a   free(aData);.}.
0c50: 0a 2f 2a 20 50 72 69 6e 74 20 61 20 6c 69 6e 65  ./* Print a line
0c60: 20 6f 66 20 64 65 63 6f 64 65 20 6f 75 74 70 75   of decode outpu
0c70: 74 20 73 68 6f 77 69 6e 67 20 61 20 34 2d 62 79  t showing a 4-by
0c80: 74 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  te integer..*/.s
0c90: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
0ca0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 0a 20 20  _decode_line(.  
0cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
0cc0: 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 43 6f  Data,      /* Co
0cd0: 6e 74 65 6e 74 20 62 65 69 6e 67 20 64 65 63 6f  ntent being deco
0ce0: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ded */.  int ofs
0cf0: 74 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  t, int nByte,   
0d00: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 61 6e 64      /* Start and
0d10: 20 73 69 7a 65 20 6f 66 20 64 65 63 6f 64 65 20   size of decode 
0d20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0d30: 2a 7a 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  *zMsg           
0d40: 2f 2a 20 4d 65 73 73 61 67 65 20 74 6f 20 61 70  /* Message to ap
0d50: 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
0d60: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 76 61 6c   i, j;.  int val
0d70: 20 3d 20 61 44 61 74 61 5b 6f 66 73 74 5d 3b 0a   = aData[ofst];.
0d80: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
0d90: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
0da0: 2c 20 22 20 25 30 33 78 3a 20 25 30 32 78 22 2c  , " %03x: %02x",
0db0: 20 6f 66 73 74 2c 20 61 44 61 74 61 5b 6f 66 73   ofst, aData[ofs
0dc0: 74 5d 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65  t]);.  i = strle
0dd0: 6e 28 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 6a  n(zBuf);.  for(j
0de0: 3d 31 3b 20 6a 3c 34 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<4; j++){. 
0df0: 20 20 20 69 66 28 20 6a 3e 3d 6e 42 79 74 65 20     if( j>=nByte 
0e00: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
0e10: 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 20 20 22  (&zBuf[i], "   "
0e20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
0e30: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
0e40: 66 5b 69 5d 2c 20 22 20 25 30 32 78 22 2c 20 61  f[i], " %02x", a
0e50: 44 61 74 61 5b 6f 66 73 74 2b 6a 5d 29 3b 0a 20  Data[ofst+j]);. 
0e60: 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a 32       val = val*2
0e70: 35 36 20 2b 20 61 44 61 74 61 5b 6f 66 73 74 2b  56 + aData[ofst+
0e80: 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  j];.    }.    i 
0e90: 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 42 75 66 5b  += strlen(&zBuf[
0ea0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 70 72 69 6e  i]);.  }.  sprin
0eb0: 74 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 20  tf(&zBuf[i], "  
0ec0: 20 25 39 64 22 2c 20 76 61 6c 29 3b 0a 20 20 70   %9d", val);.  p
0ed0: 72 69 6e 74 66 28 22 25 73 20 20 25 73 5c 6e 22  rintf("%s  %s\n"
0ee0: 2c 20 7a 42 75 66 2c 20 7a 4d 73 67 29 3b 0a 7d  , zBuf, zMsg);.}
0ef0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
0f00: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
0f10: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
0f20: 69 64 20 70 72 69 6e 74 5f 64 62 5f 68 65 61 64  id print_db_head
0f30: 65 72 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69  er(void){.  unsi
0f40: 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
0f50: 3b 0a 20 20 61 44 61 74 61 20 3d 20 70 72 69 6e  ;.  aData = prin
0f60: 74 5f 62 79 74 65 5f 72 61 6e 67 65 28 30 2c 20  t_byte_range(0, 
0f70: 31 30 30 2c 20 30 29 3b 0a 20 20 70 72 69 6e 74  100, 0);.  print
0f80: 66 28 22 44 65 63 6f 64 65 64 3a 5c 6e 22 29 3b  f("Decoded:\n");
0f90: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
0fa0: 6c 69 6e 65 28 61 44 61 74 61 2c 20 31 36 2c 20  line(aData, 16, 
0fb0: 32 2c 20 22 44 61 74 61 62 61 73 65 20 70 61 67  2, "Database pag
0fc0: 65 20 73 69 7a 65 22 29 3b 0a 20 20 70 72 69 6e  e size");.  prin
0fd0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
0fe0: 61 74 61 2c 20 31 38 2c 20 31 2c 20 22 46 69 6c  ata, 18, 1, "Fil
0ff0: 65 20 66 6f 72 6d 61 74 20 77 72 69 74 65 20 76  e format write v
1000: 65 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72 69 6e  ersion");.  prin
1010: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1020: 61 74 61 2c 20 31 39 2c 20 31 2c 20 22 46 69 6c  ata, 19, 1, "Fil
1030: 65 20 66 6f 72 6d 61 74 20 72 65 61 64 20 76 65  e format read ve
1040: 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72 69 6e 74  rsion");.  print
1050: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1060: 74 61 2c 20 32 30 2c 20 31 2c 20 22 52 65 73 65  ta, 20, 1, "Rese
1070: 72 76 65 64 20 73 70 61 63 65 20 61 74 20 65 6e  rved space at en
1080: 64 20 6f 66 20 70 61 67 65 22 29 3b 0a 20 20 70  d of page");.  p
1090: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
10a0: 28 61 44 61 74 61 2c 20 32 34 2c 20 34 2c 20 22  (aData, 24, 4, "
10b0: 46 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  File change coun
10c0: 74 65 72 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  ter");.  print_d
10d0: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
10e0: 2c 20 32 38 2c 20 34 2c 20 22 53 69 7a 65 20 6f  , 28, 4, "Size o
10f0: 66 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  f database in pa
1100: 67 65 73 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  ges");.  print_d
1110: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
1120: 2c 20 33 32 2c 20 34 2c 20 22 50 61 67 65 20 6e  , 32, 4, "Page n
1130: 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 66  umber of first f
1140: 72 65 65 6c 69 73 74 20 70 61 67 65 22 29 3b 0a  reelist page");.
1150: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
1160: 69 6e 65 28 61 44 61 74 61 2c 20 33 36 2c 20 34  ine(aData, 36, 4
1170: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 66 72 65  , "Number of fre
1180: 65 6c 69 73 74 20 70 61 67 65 73 22 29 3b 0a 20  elist pages");. 
1190: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
11a0: 6e 65 28 61 44 61 74 61 2c 20 34 30 2c 20 34 2c  ne(aData, 40, 4,
11b0: 20 22 53 63 68 65 6d 61 20 63 6f 6f 6b 69 65 22   "Schema cookie"
11c0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
11d0: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 34 34  e_line(aData, 44
11e0: 2c 20 34 2c 20 22 53 63 68 65 6d 61 20 66 6f 72  , 4, "Schema for
11f0: 6d 61 74 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20  mat version");. 
1200: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1210: 6e 65 28 61 44 61 74 61 2c 20 34 38 2c 20 34 2c  ne(aData, 48, 4,
1220: 20 22 44 65 66 61 75 6c 74 20 70 61 67 65 20 63   "Default page c
1230: 61 63 68 65 20 73 69 7a 65 22 29 3b 0a 20 20 70  ache size");.  p
1240: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1250: 28 61 44 61 74 61 2c 20 35 32 2c 20 34 2c 20 22  (aData, 52, 4, "
1260: 4c 61 72 67 65 73 74 20 61 75 74 6f 2d 76 61 63  Largest auto-vac
1270: 20 72 6f 6f 74 20 70 61 67 65 22 29 3b 0a 20 20   root page");.  
1280: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1290: 65 28 61 44 61 74 61 2c 20 35 36 2c 20 34 2c 20  e(aData, 56, 4, 
12a0: 22 54 65 78 74 20 65 6e 63 6f 64 69 6e 67 22 29  "Text encoding")
12b0: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
12c0: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 36 30 2c  _line(aData, 60,
12d0: 20 34 2c 20 22 55 73 65 72 20 76 65 72 73 69 6f   4, "User versio
12e0: 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  n");.  print_dec
12f0: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
1300: 36 34 2c 20 34 2c 20 22 49 6e 63 72 65 6d 65 6e  64, 4, "Incremen
1310: 74 61 6c 2d 76 61 63 75 75 6d 20 6d 6f 64 65 22  tal-vacuum mode"
1320: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1330: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 36 38  e_line(aData, 68
1340: 2c 20 34 2c 20 22 41 70 70 6c 69 63 61 74 69 6f  , 4, "Applicatio
1350: 6e 20 49 44 22 29 3b 0a 20 20 70 72 69 6e 74 5f  n ID");.  print_
1360: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
1370: 61 2c 20 37 32 2c 20 34 2c 20 22 6d 65 74 61 5b  a, 72, 4, "meta[
1380: 38 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  8]");.  print_de
1390: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
13a0: 20 37 36 2c 20 34 2c 20 22 6d 65 74 61 5b 39 5d   76, 4, "meta[9]
13b0: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
13c0: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 38  de_line(aData, 8
13d0: 30 2c 20 34 2c 20 22 6d 65 74 61 5b 31 30 5d 22  0, 4, "meta[10]"
13e0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
13f0: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 38 34  e_line(aData, 84
1400: 2c 20 34 2c 20 22 6d 65 74 61 5b 31 31 5d 22 29  , 4, "meta[11]")
1410: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1420: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 38 38 2c  _line(aData, 88,
1430: 20 34 2c 20 22 6d 65 74 61 5b 31 32 5d 22 29 3b   4, "meta[12]");
1440: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1450: 6c 69 6e 65 28 61 44 61 74 61 2c 20 39 32 2c 20  line(aData, 92, 
1460: 34 2c 20 22 43 68 61 6e 67 65 20 63 6f 75 6e 74  4, "Change count
1470: 65 72 20 66 6f 72 20 76 65 72 73 69 6f 6e 20 6e  er for version n
1480: 75 6d 62 65 72 22 29 3b 0a 20 20 70 72 69 6e 74  umber");.  print
1490: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
14a0: 74 61 2c 20 39 36 2c 20 34 2c 20 22 53 51 4c 69  ta, 96, 4, "SQLi
14b0: 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
14c0: 72 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  r");.}../*.** De
14d0: 73 63 72 69 62 65 20 63 65 6c 6c 20 63 6f 6e 74  scribe cell cont
14e0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
14f0: 6e 74 20 64 65 73 63 72 69 62 65 43 6f 6e 74 65  nt describeConte
1500: 6e 74 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  nt(.  unsigned c
1510: 68 61 72 20 2a 61 2c 20 20 20 20 20 20 20 2f 2a  har *a,       /*
1520: 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   Cell content */
1530: 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 2c 20 20  .  int nLocal,  
1540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1550: 74 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  tes in a[] */.  
1560: 63 68 61 72 20 2a 7a 44 65 73 63 20 20 20 20 20  char *zDesc     
1570: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1580: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 68 65 72   description her
1590: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 44  e */.){.  int nD
15a0: 65 73 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  esc = 0;.  int n
15b0: 2c 20 69 2c 20 6a 3b 0a 20 20 69 36 34 20 78 2c  , i, j;.  i64 x,
15c0: 20 76 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   v;.  const unsi
15d0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
15e0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
15f0: 65 64 20 63 68 61 72 20 2a 70 4c 69 6d 69 74 3b  ed char *pLimit;
1600: 0a 20 20 63 68 61 72 20 73 65 70 20 3d 20 27 20  .  char sep = ' 
1610: 27 3b 0a 0a 20 20 70 4c 69 6d 69 74 20 3d 20 26  ';..  pLimit = &
1620: 61 5b 6e 4c 6f 63 61 6c 5d 3b 0a 20 20 6e 20 3d  a[nLocal];.  n =
1630: 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28 61 2c   decodeVarint(a,
1640: 20 26 78 29 3b 0a 20 20 70 44 61 74 61 20 3d 20   &x);.  pData = 
1650: 26 61 5b 78 5d 3b 0a 20 20 61 20 2b 3d 20 6e 3b  &a[x];.  a += n;
1660: 0a 20 20 69 20 3d 20 78 20 2d 20 6e 3b 0a 20 20  .  i = x - n;.  
1670: 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 70 44  while( i>0 && pD
1680: 61 74 61 3c 3d 70 4c 69 6d 69 74 20 29 7b 0a 20  ata<=pLimit ){. 
1690: 20 20 20 6e 20 3d 20 64 65 63 6f 64 65 56 61 72     n = decodeVar
16a0: 69 6e 74 28 61 2c 20 26 78 29 3b 0a 20 20 20 20  int(a, &x);.    
16b0: 61 20 2b 3d 20 6e 3b 0a 20 20 20 20 69 20 2d 3d  a += n;.    i -=
16c0: 20 6e 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 2d   n;.    nLocal -
16d0: 3d 20 6e 3b 0a 20 20 20 20 7a 44 65 73 63 5b 30  = n;.    zDesc[0
16e0: 5d 20 3d 20 73 65 70 3b 0a 20 20 20 20 73 65 70  ] = sep;.    sep
16f0: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 6e 44 65 73   = ',';.    nDes
1700: 63 2b 2b 3b 0a 20 20 20 20 7a 44 65 73 63 2b 2b  c++;.    zDesc++
1710: 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
1720: 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
1730: 7a 44 65 73 63 2c 20 22 2a 22 29 3b 20 20 20 20  zDesc, "*");    
1740: 20 2f 2a 20 4e 55 4c 4c 20 69 73 20 61 20 22 2a   /* NULL is a "*
1750: 22 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  " */.    }else i
1760: 66 28 20 78 3e 3d 31 20 26 26 20 78 3c 3d 36 20  f( x>=1 && x<=6 
1770: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 73 69  ){.      v = (si
1780: 67 6e 65 64 20 63 68 61 72 29 70 44 61 74 61 5b  gned char)pData[
1790: 30 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2b  0];.      pData+
17a0: 2b 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  +;.      switch(
17b0: 20 78 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61   x ){.        ca
17c0: 73 65 20 36 3a 20 20 76 20 3d 20 28 76 3c 3c 31  se 6:  v = (v<<1
17d0: 36 29 20 2b 20 28 70 44 61 74 61 5b 30 5d 3c 3c  6) + (pData[0]<<
17e0: 38 29 20 2b 20 70 44 61 74 61 5b 31 5d 3b 20 20  8) + pData[1];  
17f0: 70 44 61 74 61 20 2b 3d 20 32 3b 0a 20 20 20 20  pData += 2;.    
1800: 20 20 20 20 63 61 73 65 20 35 3a 20 20 76 20 3d      case 5:  v =
1810: 20 28 76 3c 3c 31 36 29 20 2b 20 28 70 44 61 74   (v<<16) + (pDat
1820: 61 5b 30 5d 3c 3c 38 29 20 2b 20 70 44 61 74 61  a[0]<<8) + pData
1830: 5b 31 5d 3b 20 20 70 44 61 74 61 20 2b 3d 20 32  [1];  pData += 2
1840: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 34  ;.        case 4
1850: 3a 20 20 76 20 3d 20 28 76 3c 3c 38 29 20 2b 20  :  v = (v<<8) + 
1860: 70 44 61 74 61 5b 30 5d 3b 20 20 70 44 61 74 61  pData[0];  pData
1870: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ++;.        case
1880: 20 33 3a 20 20 76 20 3d 20 28 76 3c 3c 38 29 20   3:  v = (v<<8) 
1890: 2b 20 70 44 61 74 61 5b 30 5d 3b 20 20 70 44 61  + pData[0];  pDa
18a0: 74 61 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 61  ta++;.        ca
18b0: 73 65 20 32 3a 20 20 76 20 3d 20 28 76 3c 3c 38  se 2:  v = (v<<8
18c0: 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b 20 20 70  ) + pData[0];  p
18d0: 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Data++;.      }.
18e0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44        sprintf(zD
18f0: 65 73 63 2c 20 22 25 6c 6c 64 22 2c 20 76 29 3b  esc, "%lld", v);
1900: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78  .    }else if( x
1910: 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 73 70 72  ==7 ){.      spr
1920: 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 72 65 61  intf(zDesc, "rea
1930: 6c 22 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61  l");.      pData
1940: 20 2b 3d 20 38 3b 0a 20 20 20 20 7d 65 6c 73 65   += 8;.    }else
1950: 20 69 66 28 20 78 3d 3d 38 20 29 7b 0a 20 20 20   if( x==8 ){.   
1960: 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73 63     sprintf(zDesc
1970: 2c 20 22 30 22 29 3b 0a 20 20 20 20 7d 65 6c 73  , "0");.    }els
1980: 65 20 69 66 28 20 78 3d 3d 39 20 29 7b 0a 20 20  e if( x==9 ){.  
1990: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73      sprintf(zDes
19a0: 63 2c 20 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c  c, "1");.    }el
19b0: 73 65 20 69 66 28 20 78 3e 3d 31 32 20 29 7b 0a  se if( x>=12 ){.
19c0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
19d0: 20 28 78 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20   (x-12)/2;.     
19e0: 20 69 66 28 20 28 78 26 31 29 3d 3d 30 20 29 7b   if( (x&1)==0 ){
19f0: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
1a00: 28 7a 44 65 73 63 2c 20 22 62 6c 6f 62 28 25 64  (zDesc, "blob(%d
1a10: 29 22 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20  )", size);.     
1a20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a30: 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22  sprintf(zDesc, "
1a40: 74 78 74 28 25 64 29 22 2c 20 73 69 7a 65 29 3b  txt(%d)", size);
1a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a60: 44 61 74 61 20 2b 3d 20 73 69 7a 65 3b 0a 20 20  Data += size;.  
1a70: 20 20 7d 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c    }.    j = strl
1a80: 65 6e 28 7a 44 65 73 63 29 3b 0a 20 20 20 20 7a  en(zDesc);.    z
1a90: 44 65 73 63 20 2b 3d 20 6a 3b 0a 20 20 20 20 6e  Desc += j;.    n
1aa0: 44 65 73 63 20 2b 3d 20 6a 3b 0a 20 20 7d 0a 20  Desc += j;.  }. 
1ab0: 20 72 65 74 75 72 6e 20 6e 44 65 73 63 3b 0a 7d   return nDesc;.}
1ac0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
1ad0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
1ae0: 64 20 73 69 7a 65 20 67 69 76 65 6e 20 74 68 65  d size given the
1af0: 20 74 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   total payload s
1b00: 69 7a 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70  ize and.** the p
1b10: 61 67 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  age size..*/.sta
1b20: 74 69 63 20 69 6e 74 20 6c 6f 63 61 6c 50 61 79  tic int localPay
1b30: 6c 6f 61 64 28 69 36 34 20 6e 50 61 79 6c 6f 61  load(i64 nPayloa
1b40: 64 2c 20 63 68 61 72 20 63 54 79 70 65 29 7b 0a  d, char cType){.
1b50: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 0a    int maxLocal;.
1b60: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 0a    int minLocal;.
1b70: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 0a 20    int surplus;. 
1b80: 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69   int nLocal;.  i
1b90: 66 28 20 63 54 79 70 65 3d 3d 31 33 20 29 7b 0a  f( cType==13 ){.
1ba0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 65 61      /* Table lea
1bb0: 66 20 2a 2f 0a 20 20 20 20 6d 61 78 4c 6f 63 61  f */.    maxLoca
1bc0: 6c 20 3d 20 70 61 67 65 73 69 7a 65 2d 33 35 3b  l = pagesize-35;
1bd0: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
1be0: 28 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 33 32  (pagesize-12)*32
1bf0: 2f 32 35 35 2d 32 33 3b 0a 20 20 7d 65 6c 73 65  /255-23;.  }else
1c00: 7b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  {.    maxLocal =
1c10: 20 28 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 36   (pagesize-12)*6
1c20: 34 2f 32 35 35 2d 32 33 3b 0a 20 20 20 20 6d 69  4/255-23;.    mi
1c30: 6e 4c 6f 63 61 6c 20 3d 20 28 70 61 67 65 73 69  nLocal = (pagesi
1c40: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 2d 32 33  ze-12)*32/255-23
1c50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79  ;.  }.  if( nPay
1c60: 6c 6f 61 64 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  load>maxLocal ){
1c70: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
1c80: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
1c90: 6f 61 64 2d 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  oad-minLocal)%(p
1ca0: 61 67 65 73 69 7a 65 2d 34 29 3b 0a 20 20 20 20  agesize-4);.    
1cb0: 69 66 28 20 73 75 72 70 6c 75 73 3c 3d 6d 61 78  if( surplus<=max
1cc0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
1cd0: 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b  Local = surplus;
1ce0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cf0: 20 20 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f    nLocal = minLo
1d00: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  cal;.    }.  }el
1d10: 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
1d20: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
1d30: 20 72 65 74 75 72 6e 20 6e 4c 6f 63 61 6c 3b 0a   return nLocal;.
1d40: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  }.  ../*.** Crea
1d50: 74 65 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  te a description
1d60: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 65   for a single ce
1d70: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ll..**.** The re
1d80: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1d90: 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 73 69 7a  e local cell siz
1da0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1db0: 20 64 65 73 63 72 69 62 65 43 65 6c 6c 28 0a 20   describeCell(. 
1dc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
1dd0: 54 79 70 65 2c 20 20 20 20 2f 2a 20 50 61 67 65  Type,    /* Page
1de0: 20 74 79 70 65 20 2a 2f 0a 20 20 75 6e 73 69 67   type */.  unsig
1df0: 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 20 20 20  ned char *a,    
1e00: 20 20 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e 74 65     /* Cell conte
1e10: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77  nt */.  int show
1e20: 43 65 6c 6c 43 6f 6e 74 65 6e 74 2c 20 20 20 20  CellContent,    
1e30: 2f 2a 20 53 68 6f 77 20 63 65 6c 6c 20 63 6f 6e  /* Show cell con
1e40: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
1e50: 20 20 63 68 61 72 20 2a 2a 70 7a 44 65 73 63 20    char **pzDesc 
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
1e70: 72 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 68  re description h
1e80: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1e90: 69 3b 0a 20 20 69 6e 74 20 6e 44 65 73 63 20 3d  i;.  int nDesc =
1ea0: 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b   0;.  int n = 0;
1eb0: 0a 20 20 69 6e 74 20 6c 65 66 74 43 68 69 6c 64  .  int leftChild
1ec0: 3b 0a 20 20 69 36 34 20 6e 50 61 79 6c 6f 61 64  ;.  i64 nPayload
1ed0: 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 20  ;.  i64 rowid;. 
1ee0: 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 20 20 73   int nLocal;.  s
1ef0: 74 61 74 69 63 20 63 68 61 72 20 7a 44 65 73 63  tatic char zDesc
1f00: 5b 31 30 30 30 5d 3b 0a 20 20 69 20 3d 20 30 3b  [1000];.  i = 0;
1f10: 0a 20 20 69 66 28 20 63 54 79 70 65 3c 3d 35 20  .  if( cType<=5 
1f20: 29 7b 0a 20 20 20 20 6c 65 66 74 43 68 69 6c 64  ){.    leftChild
1f30: 20 3d 20 28 28 61 5b 30 5d 2a 32 35 36 20 2b 20   = ((a[0]*256 + 
1f40: 61 5b 31 5d 29 2a 32 35 36 20 2b 20 61 5b 32 5d  a[1])*256 + a[2]
1f50: 29 2a 32 35 36 20 2b 20 61 5b 33 5d 3b 0a 20 20  )*256 + a[3];.  
1f60: 20 20 61 20 2b 3d 20 34 3b 0a 20 20 20 20 6e 20    a += 4;.    n 
1f70: 2b 3d 20 34 3b 0a 20 20 20 20 73 70 72 69 6e 74  += 4;.    sprint
1f80: 66 28 7a 44 65 73 63 2c 20 22 6c 78 3a 20 25 64  f(zDesc, "lx: %d
1f90: 20 22 2c 20 6c 65 66 74 43 68 69 6c 64 29 3b 0a   ", leftChild);.
1fa0: 20 20 20 20 6e 44 65 73 63 20 3d 20 73 74 72 6c      nDesc = strl
1fb0: 65 6e 28 7a 44 65 73 63 29 3b 0a 20 20 7d 0a 20  en(zDesc);.  }. 
1fc0: 20 69 66 28 20 63 54 79 70 65 21 3d 35 20 29 7b   if( cType!=5 ){
1fd0: 0a 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56  .    i = decodeV
1fe0: 61 72 69 6e 74 28 61 2c 20 26 6e 50 61 79 6c 6f  arint(a, &nPaylo
1ff0: 61 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b  ad);.    a += i;
2000: 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20  .    n += i;.   
2010: 20 73 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b   sprintf(&zDesc[
2020: 6e 44 65 73 63 5d 2c 20 22 6e 3a 20 25 6c 6c 64  nDesc], "n: %lld
2030: 20 22 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20   ", nPayload);. 
2040: 20 20 20 6e 44 65 73 63 20 2b 3d 20 73 74 72 6c     nDesc += strl
2050: 65 6e 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d  en(&zDesc[nDesc]
2060: 29 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  );.    nLocal = 
2070: 6c 6f 63 61 6c 50 61 79 6c 6f 61 64 28 6e 50 61  localPayload(nPa
2080: 79 6c 6f 61 64 2c 20 63 54 79 70 65 29 3b 0a 20  yload, cType);. 
2090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
20a0: 6c 6f 61 64 20 3d 20 6e 4c 6f 63 61 6c 20 3d 20  load = nLocal = 
20b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79  0;.  }.  if( cTy
20c0: 70 65 3d 3d 35 20 7c 7c 20 63 54 79 70 65 3d 3d  pe==5 || cType==
20d0: 31 33 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65  13 ){.    i = de
20e0: 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 72  codeVarint(a, &r
20f0: 6f 77 69 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20  owid);.    a += 
2100: 69 3b 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20  i;.    n += i;. 
2110: 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44 65 73     sprintf(&zDes
2120: 63 5b 6e 44 65 73 63 5d 2c 20 22 72 3a 20 25 6c  c[nDesc], "r: %l
2130: 6c 64 20 22 2c 20 72 6f 77 69 64 29 3b 0a 20 20  ld ", rowid);.  
2140: 20 20 6e 44 65 73 63 20 2b 3d 20 73 74 72 6c 65    nDesc += strle
2150: 6e 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 29  n(&zDesc[nDesc])
2160: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
2170: 61 6c 3c 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  al<nPayload ){. 
2180: 20 20 20 69 6e 74 20 6f 76 66 6c 3b 0a 20 20 20     int ovfl;.   
2190: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21a0: 62 20 3d 20 26 61 5b 6e 4c 6f 63 61 6c 5d 3b 0a  b = &a[nLocal];.
21b0: 20 20 20 20 6f 76 66 6c 20 3d 20 28 28 62 5b 30      ovfl = ((b[0
21c0: 5d 2a 32 35 36 20 2b 20 62 5b 31 5d 29 2a 32 35  ]*256 + b[1])*25
21d0: 36 20 2b 20 62 5b 32 5d 29 2a 32 35 36 20 2b 20  6 + b[2])*256 + 
21e0: 62 5b 33 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74  b[3];.    sprint
21f0: 66 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c  f(&zDesc[nDesc],
2200: 20 22 6f 76 3a 20 25 64 20 22 2c 20 6f 76 66 6c   "ov: %d ", ovfl
2210: 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20  );.    nDesc += 
2220: 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b 6e 44  strlen(&zDesc[nD
2230: 65 73 63 5d 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  esc]);.    n += 
2240: 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 68 6f  4;.  }.  if( sho
2250: 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 20 26 26 20  wCellContent && 
2260: 63 54 79 70 65 21 3d 35 20 29 7b 0a 20 20 20 20  cType!=5 ){.    
2270: 6e 44 65 73 63 20 2b 3d 20 64 65 73 63 72 69 62  nDesc += describ
2280: 65 43 6f 6e 74 65 6e 74 28 61 2c 20 6e 4c 6f 63  eContent(a, nLoc
2290: 61 6c 2c 20 26 7a 44 65 73 63 5b 6e 44 65 73 63  al, &zDesc[nDesc
22a0: 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 7a 44  -1]);.  }.  *pzD
22b0: 65 73 63 20 3d 20 7a 44 65 73 63 3b 0a 20 20 72  esc = zDesc;.  r
22c0: 65 74 75 72 6e 20 6e 4c 6f 63 61 6c 2b 6e 3b 0a  eturn nLocal+n;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
22e0: 61 20 62 74 72 65 65 20 70 61 67 65 0a 2a 2f 0a  a btree page.*/.
22f0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f  static void deco
2300: 64 65 5f 62 74 72 65 65 5f 70 61 67 65 28 0a 20  de_btree_page(. 
2310: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2320: 61 2c 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a,   /* Page con
2330: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67  tent */.  int pg
2340: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
2350: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
2360: 20 20 69 6e 74 20 68 64 72 53 69 7a 65 2c 20 20    int hdrSize,  
2370: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2380: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
2390: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
23a0: 20 63 68 61 72 20 2a 7a 41 72 67 73 20 20 20 20   char *zArgs    
23b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
23c0: 20 63 6f 6e 74 72 6f 6c 20 66 6f 72 6d 61 74 74   control formatt
23d0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
23e0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
23f0: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 69 6e 74  "unknown";.  int
2400: 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 2c   nCell;.  int i,
2410: 20 6a 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 50   j;.  int iCellP
2420: 74 72 3b 0a 20 20 69 6e 74 20 73 68 6f 77 43 65  tr;.  int showCe
2430: 6c 6c 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 20  llContent = 0;. 
2440: 20 69 6e 74 20 73 68 6f 77 4d 61 70 20 3d 20 30   int showMap = 0
2450: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 70 20 3d  ;.  char *zMap =
2460: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 61 5b   0;.  switch( a[
2470: 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20 32  0] ){.    case 2
2480: 3a 20 20 7a 54 79 70 65 20 3d 20 22 69 6e 64 65  :  zType = "inde
2490: 78 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 22  x interior node"
24a0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
24b0: 73 65 20 35 3a 20 20 7a 54 79 70 65 20 3d 20 22  se 5:  zType = "
24c0: 74 61 62 6c 65 20 69 6e 74 65 72 69 6f 72 20 6e  table interior n
24d0: 6f 64 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ode";  break;.  
24e0: 20 20 63 61 73 65 20 31 30 3a 20 7a 54 79 70 65    case 10: zType
24f0: 20 3d 20 22 69 6e 64 65 78 20 6c 65 61 66 22 3b   = "index leaf";
2500: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2510: 3b 0a 20 20 20 20 63 61 73 65 20 31 33 3a 20 7a  ;.    case 13: z
2520: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 20 6c 65  Type = "table le
2530: 61 66 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  af";           b
2540: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  reak;.  }.  whil
2550: 65 28 20 7a 41 72 67 73 5b 30 5d 20 29 7b 0a 20  e( zArgs[0] ){. 
2560: 20 20 20 73 77 69 74 63 68 28 20 7a 41 72 67 73     switch( zArgs
2570: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73  [0] ){.      cas
2580: 65 20 27 63 27 3a 20 73 68 6f 77 43 65 6c 6c 43  e 'c': showCellC
2590: 6f 6e 74 65 6e 74 20 3d 20 31 3b 20 20 62 72 65  ontent = 1;  bre
25a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27  ak;.      case '
25b0: 6d 27 3a 20 73 68 6f 77 4d 61 70 20 3d 20 31 3b  m': showMap = 1;
25c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
25d0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 41 72 67 73  .    }.    zArgs
25e0: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66  ++;.  }.  printf
25f0: 28 22 44 65 63 6f 64 65 20 6f 66 20 62 74 72 65  ("Decode of btre
2600: 65 20 70 61 67 65 20 25 64 3a 5c 6e 22 2c 20 70  e page %d:\n", p
2610: 67 6e 6f 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  gno);.  print_de
2620: 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20  code_line(a, 0, 
2630: 31 2c 20 7a 54 79 70 65 29 3b 0a 20 20 70 72 69  1, zType);.  pri
2640: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
2650: 2c 20 31 2c 20 32 2c 20 22 4f 66 66 73 65 74 20  , 1, 2, "Offset 
2660: 74 6f 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  to first freeblo
2670: 63 6b 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  ck");.  print_de
2680: 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 33 2c 20  code_line(a, 3, 
2690: 32 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 63 65  2, "Number of ce
26a0: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  lls on this page
26b0: 22 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 61 5b  ");.  nCell = a[
26c0: 33 5d 2a 32 35 36 20 2b 20 61 5b 34 5d 3b 0a 20  3]*256 + a[4];. 
26d0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
26e0: 6e 65 28 61 2c 20 35 2c 20 32 2c 20 22 4f 66 66  ne(a, 5, 2, "Off
26f0: 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
2700: 65 6e 74 20 61 72 65 61 22 29 3b 0a 20 20 70 72  ent area");.  pr
2710: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
2720: 61 2c 20 37 2c 20 31 2c 20 22 46 72 61 67 6d 65  a, 7, 1, "Fragme
2730: 6e 74 65 64 20 62 79 74 65 20 63 6f 75 6e 74 22  nted byte count"
2740: 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3d 3d 32  );.  if( a[0]==2
2750: 20 7c 7c 20 61 5b 30 5d 3d 3d 35 20 29 7b 0a 20   || a[0]==5 ){. 
2760: 20 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f     print_decode_
2770: 6c 69 6e 65 28 61 2c 20 38 2c 20 34 2c 20 22 52  line(a, 8, 4, "R
2780: 69 67 68 74 20 63 68 69 6c 64 22 29 3b 0a 20 20  ight child");.  
2790: 20 20 69 43 65 6c 6c 50 74 72 20 3d 20 31 32 3b    iCellPtr = 12;
27a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 43  .  }else{.    iC
27b0: 65 6c 6c 50 74 72 20 3d 20 38 3b 0a 20 20 7d 0a  ellPtr = 8;.  }.
27c0: 20 20 69 66 28 20 6e 43 65 6c 6c 3e 30 20 29 7b    if( nCell>0 ){
27d0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 6b 65  .    printf(" ke
27e0: 79 3a 20 6c 78 3d 6c 65 66 74 2d 63 68 69 6c 64  y: lx=left-child
27f0: 20 6e 3d 70 61 79 6c 6f 61 64 2d 73 69 7a 65 20   n=payload-size 
2800: 72 3d 72 6f 77 69 64 5c 6e 22 29 3b 0a 20 20 7d  r=rowid\n");.  }
2810: 0a 20 20 69 66 28 20 73 68 6f 77 4d 61 70 20 29  .  if( showMap )
2820: 7b 0a 20 20 20 20 7a 4d 61 70 20 3d 20 6d 61 6c  {.    zMap = mal
2830: 6c 6f 63 28 70 61 67 65 73 69 7a 65 29 3b 0a 20  loc(pagesize);. 
2840: 20 20 20 6d 65 6d 73 65 74 28 7a 4d 61 70 2c 20     memset(zMap, 
2850: 27 2e 27 2c 20 70 61 67 65 73 69 7a 65 29 3b 0a  '.', pagesize);.
2860: 20 20 20 20 6d 65 6d 73 65 74 28 7a 4d 61 70 2c      memset(zMap,
2870: 20 27 31 27 2c 20 68 64 72 53 69 7a 65 29 3b 0a   '1', hdrSize);.
2880: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4d 61 70      memset(&zMap
2890: 5b 68 64 72 53 69 7a 65 5d 2c 20 27 48 27 2c 20  [hdrSize], 'H', 
28a0: 69 43 65 6c 6c 50 74 72 29 3b 0a 20 20 20 20 6d  iCellPtr);.    m
28b0: 65 6d 73 65 74 28 26 7a 4d 61 70 5b 68 64 72 53  emset(&zMap[hdrS
28c0: 69 7a 65 2b 69 43 65 6c 6c 50 74 72 5d 2c 20 27  ize+iCellPtr], '
28d0: 50 27 2c 20 32 2a 6e 43 65 6c 6c 29 3b 0a 20 20  P', 2*nCell);.  
28e0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
28f0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2900: 69 6e 74 20 63 6f 66 73 74 20 3d 20 69 43 65 6c  int cofst = iCel
2910: 6c 50 74 72 20 2b 20 69 2a 32 3b 0a 20 20 20 20  lPtr + i*2;.    
2920: 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20  char *zDesc;.   
2930: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 63 6f 66   int n;..    cof
2940: 73 74 20 3d 20 61 5b 63 6f 66 73 74 5d 2a 32 35  st = a[cofst]*25
2950: 36 20 2b 20 61 5b 63 6f 66 73 74 2b 31 5d 3b 0a  6 + a[cofst+1];.
2960: 20 20 20 20 6e 20 3d 20 64 65 73 63 72 69 62 65      n = describe
2970: 43 65 6c 6c 28 61 5b 30 5d 2c 20 26 61 5b 63 6f  Cell(a[0], &a[co
2980: 66 73 74 2d 68 64 72 53 69 7a 65 5d 2c 20 73 68  fst-hdrSize], sh
2990: 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 2c 20 26  owCellContent, &
29a0: 7a 44 65 73 63 29 3b 0a 20 20 20 20 69 66 28 20  zDesc);.    if( 
29b0: 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20 20  showMap ){.     
29c0: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
29d0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4d        memset(&zM
29e0: 61 70 5b 63 6f 66 73 74 5d 2c 20 27 2a 27 2c 20  ap[cofst], '*', 
29f0: 6e 29 3b 0a 20 20 20 20 20 20 7a 4d 61 70 5b 63  n);.      zMap[c
2a00: 6f 66 73 74 5d 20 3d 20 27 5b 27 3b 0a 20 20 20  ofst] = '[';.   
2a10: 20 20 20 7a 4d 61 70 5b 63 6f 66 73 74 2b 6e 2d     zMap[cofst+n-
2a20: 31 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20  1] = ']';.      
2a30: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
2a40: 64 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 6a 20  d", i);.      j 
2a50: 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
2a60: 20 20 20 20 20 20 69 66 28 20 6a 3c 3d 6e 2d 32        if( j<=n-2
2a70: 20 29 20 6d 65 6d 63 70 79 28 26 7a 4d 61 70 5b   ) memcpy(&zMap[
2a80: 63 6f 66 73 74 2b 31 5d 2c 20 7a 42 75 66 2c 20  cofst+1], zBuf, 
2a90: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  j);.    }.    pr
2aa0: 69 6e 74 66 28 22 20 25 30 33 78 3a 20 63 65 6c  intf(" %03x: cel
2ab0: 6c 5b 25 64 5d 20 25 73 5c 6e 22 2c 20 63 6f 66  l[%d] %s\n", cof
2ac0: 73 74 2c 20 69 2c 20 7a 44 65 73 63 29 3b 0a 20  st, i, zDesc);. 
2ad0: 20 7d 0a 20 20 69 66 28 20 73 68 6f 77 4d 61 70   }.  if( showMap
2ae0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2af0: 20 69 3c 70 61 67 65 73 69 7a 65 3b 20 69 2b 3d   i<pagesize; i+=
2b00: 36 34 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  64){.      print
2b10: 66 28 22 20 25 30 33 78 3a 20 25 2e 36 34 73 5c  f(" %03x: %.64s\
2b20: 6e 22 2c 20 69 2c 20 26 7a 4d 61 70 5b 69 5d 29  n", i, &zMap[i])
2b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
2b40: 28 7a 4d 61 70 29 3b 0a 20 20 7d 20 20 0a 7d 0a  (zMap);.  }  .}.
2b50: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
2b60: 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2b70: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
2b80: 6f 69 64 20 64 65 63 6f 64 65 5f 74 72 75 6e 6b  oid decode_trunk
2b90: 5f 70 61 67 65 28 0a 20 20 69 6e 74 20 70 67 6e  _page(.  int pgn
2ba0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o,             /
2bb0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
2bc0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 73  r */.  int pages
2bd0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ize,         /* 
2be0: 53 69 7a 65 20 6f 66 20 65 61 63 68 20 70 61 67  Size of each pag
2bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 74 61 69  e */.  int detai
2c00: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l,           /* 
2c10: 53 68 6f 77 20 6c 65 61 66 20 70 61 67 65 73 20  Show leaf pages 
2c20: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
2c30: 20 72 65 63 75 72 73 69 76 65 20 20 20 20 20 20   recursive      
2c40: 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 20 74 68 65     /* Follow the
2c50: 20 74 72 75 6e 6b 20 63 68 61 6e 67 65 20 69 66   trunk change if
2c60: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
2c70: 74 20 6e 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e  t n, i;.  unsign
2c80: 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 77 68  ed char *a;.  wh
2c90: 69 6c 65 28 20 70 67 6e 6f 3e 30 20 29 7b 0a 20  ile( pgno>0 ){. 
2ca0: 20 20 20 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e     a = getConten
2cb0: 74 28 28 70 67 6e 6f 2d 31 29 2a 70 61 67 65 73  t((pgno-1)*pages
2cc0: 69 7a 65 2c 20 70 61 67 65 73 69 7a 65 29 3b 0a  ize, pagesize);.
2cd0: 20 20 20 20 70 72 69 6e 74 66 28 22 44 65 63 6f      printf("Deco
2ce0: 64 65 20 6f 66 20 66 72 65 65 6c 69 73 74 20 74  de of freelist t
2cf0: 72 75 6e 6b 20 70 61 67 65 20 25 64 3a 5c 6e 22  runk page %d:\n"
2d00: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70 72 69  , pgno);.    pri
2d10: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
2d20: 2c 20 30 2c 20 34 2c 20 22 4e 65 78 74 20 66 72  , 0, 4, "Next fr
2d30: 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2d40: 65 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 5f 64  e");.    print_d
2d50: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 34 2c  ecode_line(a, 4,
2d60: 20 34 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 65   4, "Number of e
2d70: 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70  ntries on this p
2d80: 61 67 65 22 29 3b 0a 20 20 20 20 69 66 28 20 64  age");.    if( d
2d90: 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6e  etail ){.      n
2da0: 20 3d 20 28 69 6e 74 29 64 65 63 6f 64 65 49 6e   = (int)decodeIn
2db0: 74 33 32 28 26 61 5b 34 5d 29 3b 0a 20 20 20 20  t32(&a[4]);.    
2dc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
2dd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  i++){.        un
2de0: 73 69 67 6e 65 64 20 69 6e 74 20 78 20 3d 20 64  signed int x = d
2df0: 65 63 6f 64 65 49 6e 74 33 32 28 26 61 5b 38 2b  ecodeInt32(&a[8+
2e00: 34 2a 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 63  4*i]);.        c
2e10: 68 61 72 20 7a 49 64 78 5b 31 30 5d 3b 0a 20 20  har zIdx[10];.  
2e20: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 49        sprintf(zI
2e30: 64 78 2c 20 22 5b 25 64 5d 22 2c 20 69 29 3b 0a  dx, "[%d]", i);.
2e40: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
2e50: 20 20 25 35 73 20 25 37 75 22 2c 20 7a 49 64 78    %5s %7u", zIdx
2e60: 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , x);.        if
2e70: 28 20 69 25 35 3d 3d 34 20 29 20 70 72 69 6e 74  ( i%5==4 ) print
2e80: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  f("\n");.      }
2e90: 0a 20 20 20 20 20 20 69 66 28 20 69 25 35 21 3d  .      if( i%5!=
2ea0: 30 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29  0 ) printf("\n")
2eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ec0: 21 72 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  !recursive ){.  
2ed0: 20 20 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20      pgno = 0;.  
2ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2ef0: 67 6e 6f 20 3d 20 28 69 6e 74 29 64 65 63 6f 64  gno = (int)decod
2f00: 65 49 6e 74 33 32 28 26 61 5b 30 5d 29 3b 0a 20  eInt32(&a[0]);. 
2f10: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 29     }.    free(a)
2f20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2f30: 20 73 68 6f 72 74 20 74 65 78 74 20 63 6f 6d 6d   short text comm
2f40: 65 6e 74 20 6f 6e 20 74 68 65 20 75 73 65 20 6f  ent on the use o
2f50: 66 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2f 0a  f each page..*/.
2f60: 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 7a 50  static char **zP
2f70: 61 67 65 55 73 65 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ageUse;../*.** A
2f80: 64 64 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  dd a comment on 
2f90: 74 68 65 20 75 73 65 20 6f 66 20 61 20 70 61 67  the use of a pag
2fa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2fb0: 64 20 70 61 67 65 5f 75 73 61 67 65 5f 6d 73 67  d page_usage_msg
2fc0: 28 69 6e 74 20 70 67 6e 6f 2c 20 63 6f 6e 73 74  (int pgno, const
2fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
3000: 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  ;..  va_start(ap
3010: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d  , zFormat);.  zM
3020: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  sg = sqlite3_vmp
3030: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
3040: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
3050: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 30 20  ;.  if( pgno<=0 
3060: 7c 7c 20 70 67 6e 6f 3e 6d 78 50 61 67 65 20 29  || pgno>mxPage )
3070: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 45 52  {.    printf("ER
3080: 52 4f 52 3a 20 70 61 67 65 20 25 64 20 6f 75 74  ROR: page %d out
3090: 20 6f 66 20 72 61 6e 67 65 20 31 2e 2e 25 64 3a   of range 1..%d:
30a0: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
30b0: 20 20 20 20 70 67 6e 6f 2c 20 6d 78 50 61 67 65      pgno, mxPage
30c0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  , zMsg);.    sql
30d0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b  ite3_free(zMsg);
30e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
30f0: 0a 20 20 69 66 28 20 7a 50 61 67 65 55 73 65 5b  .  if( zPageUse[
3100: 70 67 6e 6f 5d 21 3d 30 20 29 7b 0a 20 20 20 20  pgno]!=0 ){.    
3110: 70 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 70  printf("ERROR: p
3120: 61 67 65 20 25 64 20 75 73 65 64 20 6d 75 6c 74  age %d used mult
3130: 69 70 6c 65 20 74 69 6d 65 73 3a 5c 6e 22 2c 20  iple times:\n", 
3140: 70 67 6e 6f 29 3b 0a 20 20 20 20 70 72 69 6e 74  pgno);.    print
3150: 66 28 22 45 52 52 4f 52 3a 20 20 20 20 70 72 65  f("ERROR:    pre
3160: 76 69 6f 75 73 3a 20 25 73 5c 6e 22 2c 20 7a 50  vious: %s\n", zP
3170: 61 67 65 55 73 65 5b 70 67 6e 6f 5d 29 3b 0a 20  ageUse[pgno]);. 
3180: 20 20 20 70 72 69 6e 74 66 28 22 45 52 52 4f 52     printf("ERROR
3190: 3a 20 20 20 20 63 75 72 72 65 6e 74 3a 20 20 25  :    current:  %
31a0: 73 5c 6e 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  s\n", zMsg);.   
31b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
31c0: 61 67 65 55 73 65 5b 70 67 6e 6f 5d 29 3b 0a 20  ageUse[pgno]);. 
31d0: 20 7d 0a 20 20 7a 50 61 67 65 55 73 65 5b 70 67   }.  zPageUse[pg
31e0: 6e 6f 5d 20 3d 20 7a 4d 73 67 3b 0a 7d 0a 0a 2f  no] = zMsg;.}../
31f0: 2a 0a 2a 2a 20 46 69 6e 64 20 6f 76 65 72 66 6c  *.** Find overfl
3200: 6f 77 20 70 61 67 65 73 20 6f 66 20 61 20 63 65  ow pages of a ce
3210: 6c 6c 20 61 6e 64 20 64 65 73 63 72 69 62 65 20  ll and describe 
3220: 74 68 65 69 72 20 75 73 61 67 65 2e 0a 2a 2f 0a  their usage..*/.
3230: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
3240: 5f 75 73 61 67 65 5f 63 65 6c 6c 28 0a 20 20 75  _usage_cell(.  u
3250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 54 79  nsigned char cTy
3260: 70 65 2c 20 20 20 20 2f 2a 20 50 61 67 65 20 74  pe,    /* Page t
3270: 79 70 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ype */.  unsigne
3280: 64 20 63 68 61 72 20 2a 61 2c 20 20 20 20 20 20  d char *a,      
3290: 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74   /* Cell content
32a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 2c 20   */.  int pgno, 
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32c0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
32d0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
32e0: 6e 74 20 63 65 6c 6c 6e 6f 20 20 20 20 20 20 20  nt cellno       
32f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3300: 6f 66 20 74 68 65 20 63 65 6c 6c 20 6f 6e 20 74  of the cell on t
3310: 68 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  he page */.){.  
3320: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 20 3d  int i;.  int n =
3330: 20 30 3b 0a 20 20 69 36 34 20 6e 50 61 79 6c 6f   0;.  i64 nPaylo
3340: 61 64 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b  ad;.  i64 rowid;
3350: 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 20  .  int nLocal;. 
3360: 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 54   i = 0;.  if( cT
3370: 79 70 65 3c 3d 35 20 29 7b 0a 20 20 20 20 61 20  ype<=5 ){.    a 
3380: 2b 3d 20 34 3b 0a 20 20 20 20 6e 20 2b 3d 20 34  += 4;.    n += 4
3390: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70  ;.  }.  if( cTyp
33a0: 65 21 3d 35 20 29 7b 0a 20 20 20 20 69 20 3d 20  e!=5 ){.    i = 
33b0: 64 65 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20  decodeVarint(a, 
33c0: 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  &nPayload);.    
33d0: 61 20 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d  a += i;.    n +=
33e0: 20 69 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d   i;.    nLocal =
33f0: 20 6c 6f 63 61 6c 50 61 79 6c 6f 61 64 28 6e 50   localPayload(nP
3400: 61 79 6c 6f 61 64 2c 20 63 54 79 70 65 29 3b 0a  ayload, cType);.
3410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61    }else{.    nPa
3420: 79 6c 6f 61 64 20 3d 20 6e 4c 6f 63 61 6c 20 3d  yload = nLocal =
3430: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 54   0;.  }.  if( cT
3440: 79 70 65 3d 3d 35 20 7c 7c 20 63 54 79 70 65 3d  ype==5 || cType=
3450: 3d 31 33 20 29 7b 0a 20 20 20 20 69 20 3d 20 64  =13 ){.    i = d
3460: 65 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26  ecodeVarint(a, &
3470: 72 6f 77 69 64 29 3b 0a 20 20 20 20 61 20 2b 3d  rowid);.    a +=
3480: 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a   i;.    n += i;.
3490: 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 61 6c    }.  if( nLocal
34a0: 3c 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  <nPayload ){.   
34b0: 20 69 6e 74 20 6f 76 66 6c 20 3d 20 64 65 63 6f   int ovfl = deco
34c0: 64 65 49 6e 74 33 32 28 61 2b 6e 4c 6f 63 61 6c  deInt32(a+nLocal
34d0: 29 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  );.    int cnt =
34e0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6f   0;.    while( o
34f0: 76 66 6c 20 26 26 20 28 63 6e 74 2b 2b 29 3c 6d  vfl && (cnt++)<m
3500: 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 70  xPage ){.      p
3510: 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 6f 76  age_usage_msg(ov
3520: 66 6c 2c 20 22 6f 76 65 72 66 6c 6f 77 20 25 64  fl, "overflow %d
3530: 20 66 72 6f 6d 20 63 65 6c 6c 20 25 64 20 6f 66   from cell %d of
3540: 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20   page %d",.     
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 63 6e 74 2c 20 63 65 6c 6c 6e 6f 2c 20 70 67 6e  cnt, cellno, pgn
3570: 6f 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 67 65  o);.      a = ge
3580: 74 43 6f 6e 74 65 6e 74 28 28 6f 76 66 6c 2d 31  tContent((ovfl-1
3590: 29 2a 70 61 67 65 73 69 7a 65 2c 20 34 29 3b 0a  )*pagesize, 4);.
35a0: 20 20 20 20 20 20 6f 76 66 6c 20 3d 20 64 65 63        ovfl = dec
35b0: 6f 64 65 49 6e 74 33 32 28 61 29 3b 0a 20 20 20  odeInt32(a);.   
35c0: 20 20 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20     free(a);.    
35d0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
35e0: 44 65 73 63 72 69 62 65 20 74 68 65 20 75 73 61  Describe the usa
35f0: 67 65 73 20 6f 66 20 61 20 62 2d 74 72 65 65 20  ges of a b-tree 
3600: 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  page.*/.static v
3610: 6f 69 64 20 70 61 67 65 5f 75 73 61 67 65 5f 62  oid page_usage_b
3620: 74 72 65 65 28 0a 20 20 69 6e 74 20 70 67 6e 6f  tree(.  int pgno
3630: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3640: 20 50 61 67 65 20 74 6f 20 64 65 73 63 72 69 62   Page to describ
3650: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  e */.  int paren
3660: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
3670: 50 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 70  Parent of this p
3680: 61 67 65 2e 20 20 30 20 66 6f 72 20 72 6f 6f 74  age.  0 for root
3690: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
36a0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
36b0: 20 20 2f 2a 20 57 68 69 63 68 20 63 68 69 6c 64    /* Which child
36c0: 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 2a   of the parent *
36d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
36e0: 7a 4e 61 6d 65 20 20 20 20 20 2f 2a 20 4e 61 6d  zName     /* Nam
36f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
3700: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
3710: 63 68 61 72 20 2a 61 3b 0a 20 20 63 6f 6e 73 74  char *a;.  const
3720: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22   char *zType = "
3730: 63 6f 72 72 75 70 74 20 6e 6f 64 65 22 3b 0a 20  corrupt node";. 
3740: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
3750: 74 20 69 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d  t i;.  int hdr =
3760: 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a   pgno==1 ? 100 :
3770: 20 30 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3c   0;..  if( pgno<
3780: 3d 30 20 7c 7c 20 70 67 6e 6f 3e 6d 78 50 61 67  =0 || pgno>mxPag
3790: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 20  e ) return;.  a 
37a0: 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28 28 70 67  = getContent((pg
37b0: 6e 6f 2d 31 29 2a 70 61 67 65 73 69 7a 65 2c 20  no-1)*pagesize, 
37c0: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 73 77 69  pagesize);.  swi
37d0: 74 63 68 28 20 61 5b 68 64 72 5d 20 29 7b 0a 20  tch( a[hdr] ){. 
37e0: 20 20 20 63 61 73 65 20 32 3a 20 20 7a 54 79 70     case 2:  zTyp
37f0: 65 20 3d 20 22 69 6e 74 65 72 69 6f 72 20 6e 6f  e = "interior no
3800: 64 65 20 6f 66 20 69 6e 64 65 78 22 3b 20 20 62  de of index";  b
3810: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 35  reak;.    case 5
3820: 3a 20 20 7a 54 79 70 65 20 3d 20 22 69 6e 74 65  :  zType = "inte
3830: 72 69 6f 72 20 6e 6f 64 65 20 6f 66 20 74 61 62  rior node of tab
3840: 6c 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  le";  break;.   
3850: 20 63 61 73 65 20 31 30 3a 20 7a 54 79 70 65 20   case 10: zType 
3860: 3d 20 22 6c 65 61 66 20 6f 66 20 69 6e 64 65 78  = "leaf of index
3870: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
3880: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 33 3a  ak;.    case 13:
3890: 20 7a 54 79 70 65 20 3d 20 22 6c 65 61 66 20 6f   zType = "leaf o
38a0: 66 20 74 61 62 6c 65 22 3b 20 20 20 20 20 20 20  f table";       
38b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
38c0: 20 69 66 28 20 70 61 72 65 6e 74 20 29 7b 0a 20   if( parent ){. 
38d0: 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 6d 73     page_usage_ms
38e0: 67 28 70 67 6e 6f 2c 20 22 25 73 20 5b 25 73 5d  g(pgno, "%s [%s]
38f0: 2c 20 63 68 69 6c 64 20 25 64 20 6f 66 20 70 61  , child %d of pa
3900: 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ge %d",.        
3910: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
3920: 2c 20 7a 4e 61 6d 65 2c 20 69 64 78 2c 20 70 61  , zName, idx, pa
3930: 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rent);.  }else{.
3940: 20 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 6d      page_usage_m
3950: 73 67 28 70 67 6e 6f 2c 20 22 72 6f 6f 74 20 25  sg(pgno, "root %
3960: 73 20 5b 25 73 5d 22 2c 20 7a 54 79 70 65 2c 20  s [%s]", zType, 
3970: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 43  zName);.  }.  nC
3980: 65 6c 6c 20 3d 20 61 5b 68 64 72 2b 33 5d 2a 32  ell = a[hdr+3]*2
3990: 35 36 20 2b 20 61 5b 68 64 72 2b 34 5d 3b 0a 20  56 + a[hdr+4];. 
39a0: 20 69 66 28 20 61 5b 68 64 72 5d 3d 3d 32 20 7c   if( a[hdr]==2 |
39b0: 7c 20 61 5b 68 64 72 5d 3d 3d 35 20 29 7b 0a 20  | a[hdr]==5 ){. 
39c0: 20 20 20 69 6e 74 20 63 65 6c 6c 73 74 61 72 74     int cellstart
39d0: 20 3d 20 68 64 72 2b 31 32 3b 0a 20 20 20 20 75   = hdr+12;.    u
39e0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 68 69 6c  nsigned int chil
39f0: 64 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  d;.    for(i=0; 
3a00: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
3a10: 20 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 0a       int ofst;..
3a20: 20 20 20 20 20 20 6f 66 73 74 20 3d 20 63 65 6c        ofst = cel
3a30: 6c 73 74 61 72 74 20 2b 20 69 2a 32 3b 0a 20 20  lstart + i*2;.  
3a40: 20 20 20 20 6f 66 73 74 20 3d 20 61 5b 6f 66 73      ofst = a[ofs
3a50: 74 5d 2a 32 35 36 20 2b 20 61 5b 6f 66 73 74 2b  t]*256 + a[ofst+
3a60: 31 5d 3b 0a 20 20 20 20 20 20 63 68 69 6c 64 20  1];.      child 
3a70: 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28 61 2b  = decodeInt32(a+
3a80: 6f 66 73 74 29 3b 0a 20 20 20 20 20 20 70 61 67  ofst);.      pag
3a90: 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28 63 68  e_usage_btree(ch
3aa0: 69 6c 64 2c 20 70 67 6e 6f 2c 20 69 2c 20 7a 4e  ild, pgno, i, zN
3ab0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
3ac0: 63 68 69 6c 64 20 3d 20 64 65 63 6f 64 65 49 6e  child = decodeIn
3ad0: 74 33 32 28 61 2b 63 65 6c 6c 73 74 61 72 74 2d  t32(a+cellstart-
3ae0: 34 29 3b 0a 20 20 20 20 70 61 67 65 5f 75 73 61  4);.    page_usa
3af0: 67 65 5f 62 74 72 65 65 28 63 68 69 6c 64 2c 20  ge_btree(child, 
3b00: 70 67 6e 6f 2c 20 69 2c 20 7a 4e 61 6d 65 29 3b  pgno, i, zName);
3b10: 0a 20 20 7d 0a 20 20 69 66 28 20 61 5b 68 64 72  .  }.  if( a[hdr
3b20: 5d 3d 3d 32 20 7c 7c 20 61 5b 68 64 72 5d 3d 3d  ]==2 || a[hdr]==
3b30: 31 30 20 7c 7c 20 61 5b 68 64 72 5d 3d 3d 31 33  10 || a[hdr]==13
3b40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 65 6c 6c   ){.    int cell
3b50: 73 74 61 72 74 20 3d 20 68 64 72 20 2b 20 38 20  start = hdr + 8 
3b60: 2b 20 34 2a 28 61 5b 68 64 72 5d 3c 3d 35 29 3b  + 4*(a[hdr]<=5);
3b70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3b80: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
3b90: 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20     int ofst;.   
3ba0: 20 20 20 6f 66 73 74 20 3d 20 63 65 6c 6c 73 74     ofst = cellst
3bb0: 61 72 74 20 2b 20 69 2a 32 3b 0a 20 20 20 20 20  art + i*2;.     
3bc0: 20 6f 66 73 74 20 3d 20 61 5b 6f 66 73 74 5d 2a   ofst = a[ofst]*
3bd0: 32 35 36 20 2b 20 61 5b 6f 66 73 74 2b 31 5d 3b  256 + a[ofst+1];
3be0: 0a 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67  .      page_usag
3bf0: 65 5f 63 65 6c 6c 28 61 5b 68 64 72 5d 2c 20 61  e_cell(a[hdr], a
3c00: 2b 6f 66 73 74 2c 20 70 67 6e 6f 2c 20 69 29 3b  +ofst, pgno, i);
3c10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65  .    }.  }.  fre
3c20: 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  e(a);.}../*.** D
3c30: 65 74 65 72 6d 69 6e 65 20 70 61 67 65 20 75 73  etermine page us
3c40: 61 67 65 20 62 79 20 74 68 65 20 66 72 65 65 6c  age by the freel
3c50: 69 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ist.*/.static vo
3c60: 69 64 20 70 61 67 65 5f 75 73 61 67 65 5f 66 72  id page_usage_fr
3c70: 65 65 6c 69 73 74 28 69 6e 74 20 70 67 6e 6f 29  eelist(int pgno)
3c80: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
3c90: 72 20 2a 61 3b 0a 20 20 69 6e 74 20 63 6e 74 20  r *a;.  int cnt 
3ca0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
3cb0: 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 4e 65  int n;.  int iNe
3cc0: 78 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74  xt;.  int parent
3cd0: 20 3d 20 31 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 1;..  while( 
3ce0: 70 67 6e 6f 3e 30 20 26 26 20 70 67 6e 6f 3c 3d  pgno>0 && pgno<=
3cf0: 6d 78 50 61 67 65 20 26 26 20 28 63 6e 74 2b 2b  mxPage && (cnt++
3d00: 29 3c 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  )<mxPage ){.    
3d10: 70 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70  page_usage_msg(p
3d20: 67 6e 6f 2c 20 22 66 72 65 65 6c 69 73 74 20 74  gno, "freelist t
3d30: 72 75 6e 6b 20 23 25 64 20 63 68 69 6c 64 20 6f  runk #%d child o
3d40: 66 20 25 64 22 2c 20 63 6e 74 2c 20 70 61 72 65  f %d", cnt, pare
3d50: 6e 74 29 3b 0a 20 20 20 20 61 20 3d 20 67 65 74  nt);.    a = get
3d60: 43 6f 6e 74 65 6e 74 28 28 70 67 6e 6f 2d 31 29  Content((pgno-1)
3d70: 2a 70 61 67 65 73 69 7a 65 2c 20 70 61 67 65 73  *pagesize, pages
3d80: 69 7a 65 29 3b 0a 20 20 20 20 69 4e 65 78 74 20  ize);.    iNext 
3d90: 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28 61 29  = decodeInt32(a)
3da0: 3b 0a 20 20 20 20 6e 20 3d 20 64 65 63 6f 64 65  ;.    n = decode
3db0: 49 6e 74 33 32 28 61 2b 34 29 3b 0a 20 20 20 20  Int32(a+4);.    
3dc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
3dd0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 68  +){.      int ch
3de0: 69 6c 64 20 3d 20 64 65 63 6f 64 65 49 6e 74 33  ild = decodeInt3
3df0: 32 28 61 20 2b 20 28 69 2a 34 2b 38 29 29 3b 0a  2(a + (i*4+8));.
3e00: 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67 65        page_usage
3e10: 5f 6d 73 67 28 63 68 69 6c 64 2c 20 22 66 72 65  _msg(child, "fre
3e20: 65 6c 69 73 74 20 6c 65 61 66 2c 20 63 68 69 6c  elist leaf, chil
3e30: 64 20 25 64 20 6f 66 20 74 72 75 6e 6b 20 70 61  d %d of trunk pa
3e40: 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ge %d",.        
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20               i, 
3e60: 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pgno);.    }.   
3e70: 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20 70 61   free(a);.    pa
3e80: 72 65 6e 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  rent = pgno;.   
3e90: 20 70 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20   pgno = iNext;. 
3ea0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
3eb0: 72 6d 69 6e 65 20 70 61 67 65 73 20 75 73 65 64  rmine pages used
3ec0: 20 61 73 20 50 54 52 4d 41 50 20 70 61 67 65 73   as PTRMAP pages
3ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3ee0: 70 61 67 65 5f 75 73 61 67 65 5f 70 74 72 6d 61  page_usage_ptrma
3ef0: 70 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  p(unsigned char 
3f00: 2a 61 29 7b 0a 20 20 69 66 28 20 61 5b 35 35 5d  *a){.  if( a[55]
3f10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 73 61 62   ){.    int usab
3f20: 6c 65 20 3d 20 70 61 67 65 73 69 7a 65 20 2d 20  le = pagesize - 
3f30: 61 5b 32 30 5d 3b 0a 20 20 20 20 69 6e 74 20 70  a[20];.    int p
3f40: 67 6e 6f 20 3d 20 32 3b 0a 20 20 20 20 69 6e 74  gno = 2;.    int
3f50: 20 70 65 72 50 61 67 65 20 3d 20 75 73 61 62 6c   perPage = usabl
3f60: 65 2f 35 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  e/5;.    while( 
3f70: 70 67 6e 6f 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  pgno<=mxPage ){.
3f80: 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67 65        page_usage
3f90: 5f 6d 73 67 28 70 67 6e 6f 2c 20 22 50 54 52 4d  _msg(pgno, "PTRM
3fa0: 41 50 20 70 61 67 65 20 63 6f 76 65 72 69 6e 67  AP page covering
3fb0: 20 25 64 2e 2e 25 64 22 2c 0a 20 20 20 20 20 20   %d..%d",.      
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 20 70 67 6e 6f 2b 31 2c 20 70 67 6e       pgno+1, pgn
3fe0: 6f 2b 70 65 72 50 61 67 65 29 3b 0a 20 20 20 20  o+perPage);.    
3ff0: 20 20 70 67 6e 6f 20 2b 3d 20 70 65 72 50 61 67    pgno += perPag
4000: 65 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e + 1;.    }.  }
4010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
4020: 20 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   figure out how 
4030: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
4040: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4050: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 2a  is being used..*
4060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
4070: 67 65 5f 75 73 61 67 65 5f 72 65 70 6f 72 74 28  ge_usage_report(
4080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
4090: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ame){.  int i, j
40a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
40b0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
40c0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
40d0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
40e0: 72 20 2a 61 3b 0a 20 20 63 68 61 72 20 7a 51 75  r *a;.  char zQu
40f0: 65 72 79 5b 32 30 30 5d 3b 0a 0a 20 20 2f 2a 20  ery[200];..  /* 
4100: 41 76 6f 69 64 20 74 68 65 20 70 61 74 68 6f 6c  Avoid the pathol
4110: 6f 67 69 63 61 6c 20 63 61 73 65 20 2a 2f 0a 20  ogical case */. 
4120: 20 69 66 28 20 6d 78 50 61 67 65 3c 31 20 29 7b   if( mxPage<1 ){
4130: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 65 6d 70  .    printf("emp
4140: 74 79 20 64 61 74 61 62 61 73 65 5c 6e 22 29 3b  ty database\n");
4150: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4160: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
4170: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
4180: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
4190: 6f 70 65 6e 28 7a 44 62 4e 61 6d 65 2c 20 26 64  open(zDbName, &d
41a0: 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  b);.  if( rc ){.
41b0: 20 20 20 20 70 72 69 6e 74 66 28 22 63 61 6e 6e      printf("cann
41c0: 6f 74 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ot open database
41d0: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
41e0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
41f0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
4200: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  db);.    return;
4210: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75  .  }..  /* Set u
4220: 70 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  p global variabl
4230: 65 73 20 7a 50 61 67 65 55 73 65 5b 5d 20 61 6e  es zPageUse[] an
4240: 64 20 6d 78 50 61 67 65 20 74 6f 20 72 65 63 6f  d mxPage to reco
4250: 72 64 20 70 61 67 65 0a 20 20 2a 2a 20 75 73 61  rd page.  ** usa
4260: 67 65 73 20 2a 2f 0a 20 20 7a 50 61 67 65 55 73  ges */.  zPageUs
4270: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
4280: 6f 63 28 20 73 69 7a 65 6f 66 28 7a 50 61 67 65  oc( sizeof(zPage
4290: 55 73 65 5b 30 5d 29 2a 28 6d 78 50 61 67 65 2b  Use[0])*(mxPage+
42a0: 31 29 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 67  1) );.  if( zPag
42b0: 65 55 73 65 3d 3d 30 20 29 20 6f 75 74 5f 6f 66  eUse==0 ) out_of
42c0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6d 65 6d  _memory();.  mem
42d0: 73 65 74 28 7a 50 61 67 65 55 73 65 2c 20 30 2c  set(zPageUse, 0,
42e0: 20 73 69 7a 65 6f 66 28 7a 50 61 67 65 55 73 65   sizeof(zPageUse
42f0: 5b 30 5d 29 2a 28 6d 78 50 61 67 65 2b 31 29 29  [0])*(mxPage+1))
4300: 3b 0a 0a 20 20 2f 2a 20 44 69 73 63 6f 76 65 72  ;..  /* Discover
4310: 20 74 68 65 20 75 73 61 67 65 20 6f 66 20 65 61   the usage of ea
4320: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 61 20 3d  ch page */.  a =
4330: 20 67 65 74 43 6f 6e 74 65 6e 74 28 30 2c 20 31   getContent(0, 1
4340: 30 30 29 3b 0a 20 20 70 61 67 65 5f 75 73 61 67  00);.  page_usag
4350: 65 5f 66 72 65 65 6c 69 73 74 28 64 65 63 6f 64  e_freelist(decod
4360: 65 49 6e 74 33 32 28 61 2b 33 32 29 29 3b 0a 20  eInt32(a+32));. 
4370: 20 70 61 67 65 5f 75 73 61 67 65 5f 70 74 72 6d   page_usage_ptrm
4380: 61 70 28 61 29 3b 0a 20 20 66 72 65 65 28 61 29  ap(a);.  free(a)
4390: 3b 0a 20 20 70 61 67 65 5f 75 73 61 67 65 5f 62  ;.  page_usage_b
43a0: 74 72 65 65 28 31 2c 20 30 2c 20 30 2c 20 22 73  tree(1, 0, 0, "s
43b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a  qlite_master");.
43c0: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
43d0: 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
43e0: 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20  ble_schema=ON", 
43f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  0, 0, 0);.  for(
4400: 6a 3d 30 3b 20 6a 3c 32 3b 20 6a 2b 2b 29 7b 0a  j=0; j<2; j++){.
4410: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4420: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 51 75 65  intf(sizeof(zQue
4430: 72 79 29 2c 20 7a 51 75 65 72 79 2c 0a 20 20 20  ry), zQuery,.   
4440: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
4450: 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f  T type, name, ro
4460: 6f 74 70 61 67 65 20 46 52 4f 4d 20 53 51 4c 49  otpage FROM SQLI
4470: 54 45 5f 4d 41 53 54 45 52 20 57 48 45 52 45 20  TE_MASTER WHERE 
4480: 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20  rootpage".      
4490: 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
44a0: 59 20 72 6f 77 69 64 20 25 73 22 2c 20 6a 3f 22  Y rowid %s", j?"
44b0: 44 45 53 43 22 3a 22 22 29 3b 0a 20 20 20 20 72  DESC":"");.    r
44c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
44d0: 61 72 65 5f 76 32 28 64 62 2c 20 7a 51 75 65 72  are_v2(db, zQuer
44e0: 79 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  y, -1, &pStmt, 0
44f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
4500: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4510: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
4520: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
4530: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
4540: 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 73      int pgno = s
4550: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
4560: 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
4570: 20 20 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f       page_usage_
4580: 62 74 72 65 65 28 70 67 6e 6f 2c 20 30 2c 20 30  btree(pgno, 0, 0
4590: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
45a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
45b0: 78 74 28 70 53 74 6d 74 2c 31 29 29 3b 0a 20 20  xt(pStmt,1));.  
45c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
45d0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45  .      printf("E
45e0: 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 71 75 65  RROR: cannot que
45f0: 72 79 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c  ry database: %s\
4600: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
4610: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
4620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4630: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
4640: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
4650: 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
4660: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c    }.  sqlite3_cl
4670: 6f 73 65 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 50  ose(db);..  /* P
4680: 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20  rint the report 
4690: 61 6e 64 20 66 72 65 65 20 6d 65 6d 6f 72 79 20  and free memory 
46a0: 75 73 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  used */.  for(i=
46b0: 31 3b 20 69 3c 3d 6d 78 50 61 67 65 3b 20 69 2b  1; i<=mxPage; i+
46c0: 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  +){.    printf("
46d0: 25 35 64 3a 20 25 73 5c 6e 22 2c 20 69 2c 20 7a  %5d: %s\n", i, z
46e0: 50 61 67 65 55 73 65 5b 69 5d 20 3f 20 7a 50 61  PageUse[i] ? zPa
46f0: 67 65 55 73 65 5b 69 5d 20 3a 20 22 3f 3f 3f 22  geUse[i] : "???"
4700: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
4710: 72 65 65 28 7a 50 61 67 65 55 73 65 5b 69 5d 29  ree(zPageUse[i])
4720: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
4730: 66 72 65 65 28 7a 50 61 67 65 55 73 65 29 3b 0a  free(zPageUse);.
4740: 20 20 7a 50 61 67 65 55 73 65 20 3d 20 30 3b 0a    zPageUse = 0;.
4750: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
4760: 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 65  figure out how e
4770: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
4780: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
4790: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 2a 2f  s being used..*/
47a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
47b0: 6d 61 70 5f 63 6f 76 65 72 61 67 65 5f 72 65 70  map_coverage_rep
47c0: 6f 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ort(const char *
47d0: 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 75 6e 73 69  zDbName){.  unsi
47e0: 67 6e 65 64 20 69 6e 74 20 70 67 6e 6f 3b 0a 20  gned int pgno;. 
47f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4800: 61 48 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  aHdr;.  unsigned
4810: 20 63 68 61 72 20 2a 61 3b 0a 20 20 69 6e 74 20   char *a;.  int 
4820: 75 73 61 62 6c 65 3b 0a 20 20 69 6e 74 20 70 65  usable;.  int pe
4830: 72 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65  rPage;.  unsigne
4840: 64 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41  d int i;..  /* A
4850: 76 6f 69 64 20 74 68 65 20 70 61 74 68 6f 6c 6f  void the patholo
4860: 67 69 63 61 6c 20 63 61 73 65 20 2a 2f 0a 20 20  gical case */.  
4870: 69 66 28 20 6d 78 50 61 67 65 3c 31 20 29 7b 0a  if( mxPage<1 ){.
4880: 20 20 20 20 70 72 69 6e 74 66 28 22 65 6d 70 74      printf("empt
4890: 79 20 64 61 74 61 62 61 73 65 5c 6e 22 29 3b 0a  y database\n");.
48a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
48b0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
48c0: 50 54 52 4d 41 50 73 20 61 72 65 20 75 73 65 64  PTRMAPs are used
48d0: 20 69 6e 20 74 68 69 73 20 64 61 74 61 62 61 73   in this databas
48e0: 65 20 2a 2f 0a 20 20 61 48 64 72 20 3d 20 67 65  e */.  aHdr = ge
48f0: 74 43 6f 6e 74 65 6e 74 28 30 2c 20 31 30 30 29  tContent(0, 100)
4900: 3b 0a 20 20 69 66 28 20 61 48 64 72 5b 35 35 5d  ;.  if( aHdr[55]
4910: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ==0 ){.    print
4920: 66 28 22 64 61 74 61 62 61 73 65 20 64 6f 65 73  f("database does
4930: 20 6e 6f 74 20 75 73 65 20 50 54 52 4d 41 50 20   not use PTRMAP 
4940: 70 61 67 65 73 5c 6e 22 29 3b 0a 20 20 20 20 72  pages\n");.    r
4950: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 75 73 61  eturn;.  }.  usa
4960: 62 6c 65 20 3d 20 70 61 67 65 73 69 7a 65 20 2d  ble = pagesize -
4970: 20 61 48 64 72 5b 32 30 5d 3b 0a 20 20 70 65 72   aHdr[20];.  per
4980: 50 61 67 65 20 3d 20 75 73 61 62 6c 65 2f 35 3b  Page = usable/5;
4990: 0a 20 20 66 72 65 65 28 61 48 64 72 29 3b 0a 20  .  free(aHdr);. 
49a0: 20 70 72 69 6e 74 66 28 22 25 35 64 3a 20 72 6f   printf("%5d: ro
49b0: 6f 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73  ot of sqlite_mas
49c0: 74 65 72 5c 6e 22 2c 20 31 29 3b 0a 20 20 66 6f  ter\n", 1);.  fo
49d0: 72 28 70 67 6e 6f 3d 32 3b 20 70 67 6e 6f 3c 3d  r(pgno=2; pgno<=
49e0: 6d 78 50 61 67 65 3b 20 70 67 6e 6f 20 2b 3d 20  mxPage; pgno += 
49f0: 70 65 72 50 61 67 65 2b 31 29 7b 0a 20 20 20 20  perPage+1){.    
4a00: 70 72 69 6e 74 66 28 22 25 35 64 3a 20 50 54 52  printf("%5d: PTR
4a10: 4d 41 50 20 70 61 67 65 20 63 6f 76 65 72 69 6e  MAP page coverin
4a20: 67 20 25 64 2e 2e 25 64 5c 6e 22 2c 20 70 67 6e  g %d..%d\n", pgn
4a30: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 67  o,.           pg
4a40: 6e 6f 2b 31 2c 20 70 67 6e 6f 2b 70 65 72 50 61  no+1, pgno+perPa
4a50: 67 65 29 3b 0a 20 20 20 20 61 20 3d 20 67 65 74  ge);.    a = get
4a60: 43 6f 6e 74 65 6e 74 28 28 70 67 6e 6f 2d 31 29  Content((pgno-1)
4a70: 2a 70 61 67 65 73 69 7a 65 2c 20 75 73 61 62 6c  *pagesize, usabl
4a80: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  e);.    for(i=0;
4a90: 20 69 2b 35 3c 3d 75 73 61 62 6c 65 20 26 26 20   i+5<=usable && 
4aa0: 70 67 6e 6f 2b 31 2b 69 2f 35 3c 3d 6d 78 50 61  pgno+1+i/5<=mxPa
4ab0: 67 65 3b 20 69 2b 3d 35 29 7b 0a 20 20 20 20 20  ge; i+=5){.     
4ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
4ad0: 70 65 20 3d 20 22 3f 3f 3f 22 3b 0a 20 20 20 20  pe = "???";.    
4ae0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
4af0: 46 72 6f 6d 20 3d 20 64 65 63 6f 64 65 49 6e 74  From = decodeInt
4b00: 33 32 28 26 61 5b 69 2b 31 5d 29 3b 0a 20 20 20  32(&a[i+1]);.   
4b10: 20 20 20 73 77 69 74 63 68 28 20 61 5b 69 5d 20     switch( a[i] 
4b20: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
4b30: 31 3a 20 20 7a 54 79 70 65 20 3d 20 22 62 2d 74  1:  zType = "b-t
4b40: 72 65 65 20 72 6f 6f 74 20 70 61 67 65 22 3b 20  ree root page"; 
4b50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4b60: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a        case 2:  z
4b70: 54 79 70 65 20 3d 20 22 66 72 65 65 6c 69 73 74  Type = "freelist
4b80: 20 70 61 67 65 22 3b 20 20 20 20 20 20 20 20 20   page";         
4b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4ba0: 20 63 61 73 65 20 33 3a 20 20 7a 54 79 70 65 20   case 3:  zType 
4bb0: 3d 20 22 66 69 72 73 74 20 70 61 67 65 20 6f 66  = "first page of
4bc0: 20 6f 76 65 72 66 6c 6f 77 22 3b 20 20 62 72 65   overflow";  bre
4bd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
4be0: 20 34 3a 20 20 7a 54 79 70 65 20 3d 20 22 6c 61   4:  zType = "la
4bf0: 74 65 72 20 70 61 67 65 20 6f 66 20 6f 76 65 72  ter page of over
4c00: 66 6c 6f 77 22 3b 20 20 62 72 65 61 6b 3b 0a 20  flow";  break;. 
4c10: 20 20 20 20 20 20 20 63 61 73 65 20 35 3a 20 20         case 5:  
4c20: 7a 54 79 70 65 20 3d 20 22 62 2d 74 72 65 65 20  zType = "b-tree 
4c30: 6e 6f 6e 2d 72 6f 6f 74 20 70 61 67 65 22 3b 20  non-root page"; 
4c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4c50: 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
4c60: 25 35 64 3a 20 25 73 2c 20 70 61 72 65 6e 74 3d  %5d: %s, parent=
4c70: 25 75 5c 6e 22 2c 20 70 67 6e 6f 2b 31 2b 69 2f  %u\n", pgno+1+i/
4c80: 35 2c 20 7a 54 79 70 65 2c 20 69 46 72 6f 6d 29  5, zType, iFrom)
4c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
4ca0: 28 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (a);.  }.}../*.*
4cb0: 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20  * Print a usage 
4cc0: 63 6f 6d 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  comment.*/.stati
4cd0: 63 20 76 6f 69 64 20 75 73 61 67 65 28 63 6f 6e  c void usage(con
4ce0: 73 74 20 63 68 61 72 20 2a 61 72 67 76 30 29 7b  st char *argv0){
4cf0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
4d00: 72 2c 20 22 55 73 61 67 65 20 25 73 20 46 49 4c  r, "Usage %s FIL
4d10: 45 4e 41 4d 45 20 3f 61 72 67 73 2e 2e 2e 3f 5c  ENAME ?args...?\
4d20: 6e 5c 6e 22 2c 20 61 72 67 76 30 29 3b 0a 20 20  n\n", argv0);.  
4d30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
4d40: 20 20 20 20 22 61 72 67 73 3a 5c 6e 22 0a 20 20      "args:\n".  
4d50: 20 20 22 20 20 20 20 64 62 68 65 61 64 65 72 20    "    dbheader 
4d60: 20 20 20 20 20 20 20 53 68 6f 77 20 64 61 74 61         Show data
4d70: 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22 0a 20  base header\n". 
4d80: 20 20 20 22 20 20 20 20 70 67 69 64 78 20 20 20     "    pgidx   
4d90: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66          Index of
4da0: 20 68 6f 77 20 65 61 63 68 20 70 61 67 65 20 69   how each page i
4db0: 73 20 75 73 65 64 5c 6e 22 0a 20 20 20 20 22 20  s used\n".    " 
4dc0: 20 20 20 70 74 72 6d 61 70 20 20 20 20 20 20 20     ptrmap       
4dd0: 20 20 20 53 68 6f 77 20 61 6c 6c 20 50 54 52 4d     Show all PTRM
4de0: 41 50 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 5c  AP page content\
4df0: 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 2e  n".    "    NNN.
4e00: 2e 4d 4d 4d 20 20 20 20 20 20 20 20 53 68 6f 77  .MMM        Show
4e10: 20 68 65 78 20 6f 66 20 70 61 67 65 73 20 4e 4e   hex of pages NN
4e20: 4e 20 74 68 72 6f 75 67 68 20 4d 4d 4d 5c 6e 22  N through MMM\n"
4e30: 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 2e 2e 65  .    "    NNN..e
4e40: 6e 64 20 20 20 20 20 20 20 20 53 68 6f 77 20 68  nd        Show h
4e50: 65 78 20 6f 66 20 70 61 67 65 73 20 4e 4e 4e 20  ex of pages NNN 
4e60: 74 68 72 6f 75 67 68 20 65 6e 64 20 6f 66 20 66  through end of f
4e70: 69 6c 65 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ile\n".    "    
4e80: 4e 4e 4e 62 20 20 20 20 20 20 20 20 20 20 20 20  NNNb            
4e90: 44 65 63 6f 64 65 20 62 74 72 65 65 20 70 61 67  Decode btree pag
4ea0: 65 20 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22 20 20  e NNN\n".    "  
4eb0: 20 20 4e 4e 4e 62 63 20 20 20 20 20 20 20 20 20    NNNbc         
4ec0: 20 20 44 65 63 6f 64 65 20 62 74 72 65 65 20 70    Decode btree p
4ed0: 61 67 65 20 4e 4e 4e 20 61 6e 64 20 73 68 6f 77  age NNN and show
4ee0: 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20   content\n".    
4ef0: 22 20 20 20 20 4e 4e 4e 62 6d 20 20 20 20 20 20  "    NNNbm      
4f00: 20 20 20 20 20 44 65 63 6f 64 65 20 62 74 72 65       Decode btre
4f10: 65 20 70 61 67 65 20 4e 4e 4e 20 61 6e 64 20 73  e page NNN and s
4f20: 68 6f 77 20 61 20 6c 61 79 6f 75 74 20 6d 61 70  how a layout map
4f30: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e  \n".    "    NNN
4f40: 74 20 20 20 20 20 20 20 20 20 20 20 20 44 65 63  t            Dec
4f50: 6f 64 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  ode freelist tru
4f60: 6e 6b 20 70 61 67 65 20 4e 4e 4e 5c 6e 22 0a 20  nk page NNN\n". 
4f70: 20 20 20 22 20 20 20 20 4e 4e 4e 74 64 20 20 20     "    NNNtd   
4f80: 20 20 20 20 20 20 20 20 53 68 6f 77 20 6c 65 61          Show lea
4f90: 66 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73  f freelist pages
4fa0: 20 6f 6e 20 74 68 65 20 64 65 63 6f 64 65 5c 6e   on the decode\n
4fb0: 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 74 72  ".    "    NNNtr
4fc0: 20 20 20 20 20 20 20 20 20 20 20 52 65 63 75 72             Recur
4fd0: 69 73 76 65 6c 79 20 64 65 63 6f 64 65 20 66 72  isvely decode fr
4fe0: 65 65 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  eelist starting 
4ff0: 61 74 20 4e 4e 4e 5c 6e 22 0a 20 20 29 3b 0a 7d  at NNN\n".  );.}
5000: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
5010: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
5020: 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
5030: 20 73 62 75 66 3b 0a 20 20 75 6e 73 69 67 6e 65   sbuf;.  unsigne
5040: 64 20 63 68 61 72 20 7a 50 67 53 7a 5b 32 5d 3b  d char zPgSz[2];
5050: 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20 29 7b  .  if( argc<2 ){
5060: 0a 20 20 20 20 75 73 61 67 65 28 61 72 67 76 5b  .    usage(argv[
5070: 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  0]);.    exit(1)
5080: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 6f 70 65  ;.  }.  db = ope
5090: 6e 28 61 72 67 76 5b 31 5d 2c 20 4f 5f 52 44 4f  n(argv[1], O_RDO
50a0: 4e 4c 59 29 3b 0a 20 20 69 66 28 20 64 62 3c 30  NLY);.  if( db<0
50b0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
50c0: 73 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e 27  stderr,"%s: can'
50d0: 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61 72  t open %s\n", ar
50e0: 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 29 3b  gv[0], argv[1]);
50f0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
5100: 7d 0a 20 20 7a 50 67 53 7a 5b 30 5d 20 3d 20 30  }.  zPgSz[0] = 0
5110: 3b 0a 20 20 7a 50 67 53 7a 5b 31 5d 20 3d 20 30  ;.  zPgSz[1] = 0
5120: 3b 0a 20 20 6c 73 65 65 6b 28 64 62 2c 20 31 36  ;.  lseek(db, 16
5130: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72  , SEEK_SET);.  r
5140: 65 61 64 28 64 62 2c 20 7a 50 67 53 7a 2c 20 32  ead(db, zPgSz, 2
5150: 29 3b 0a 20 20 70 61 67 65 73 69 7a 65 20 3d 20  );.  pagesize = 
5160: 7a 50 67 53 7a 5b 30 5d 2a 32 35 36 20 2b 20 7a  zPgSz[0]*256 + z
5170: 50 67 53 7a 5b 31 5d 2a 36 35 35 33 36 3b 0a 20  PgSz[1]*65536;. 
5180: 20 69 66 28 20 70 61 67 65 73 69 7a 65 3d 3d 30   if( pagesize==0
5190: 20 29 20 70 61 67 65 73 69 7a 65 20 3d 20 31 30   ) pagesize = 10
51a0: 32 34 3b 0a 20 20 70 72 69 6e 74 66 28 22 50 61  24;.  printf("Pa
51b0: 67 65 73 69 7a 65 3a 20 25 64 5c 6e 22 2c 20 70  gesize: %d\n", p
51c0: 61 67 65 73 69 7a 65 29 3b 0a 20 20 66 73 74 61  agesize);.  fsta
51d0: 74 28 64 62 2c 20 26 73 62 75 66 29 3b 0a 20 20  t(db, &sbuf);.  
51e0: 6d 78 50 61 67 65 20 3d 20 73 62 75 66 2e 73 74  mxPage = sbuf.st
51f0: 5f 73 69 7a 65 2f 70 61 67 65 73 69 7a 65 3b 0a  _size/pagesize;.
5200: 20 20 70 72 69 6e 74 66 28 22 41 76 61 69 6c 61    printf("Availa
5210: 62 6c 65 20 70 61 67 65 73 3a 20 31 2e 2e 25 64  ble pages: 1..%d
5220: 5c 6e 22 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  \n", mxPage);.  
5230: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
5240: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
5250: 72 28 69 3d 31 3b 20 69 3c 3d 6d 78 50 61 67 65  r(i=1; i<=mxPage
5260: 3b 20 69 2b 2b 29 20 70 72 69 6e 74 5f 70 61 67  ; i++) print_pag
5270: 65 28 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(i);.  }else{. 
5280: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
5290: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=2; i<argc; i
52a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
52b0: 53 74 61 72 74 2c 20 69 45 6e 64 3b 0a 20 20 20  Start, iEnd;.   
52c0: 20 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 3b 0a     char *zLeft;.
52d0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
52e0: 28 61 72 67 76 5b 69 5d 2c 20 22 64 62 68 65 61  (argv[i], "dbhea
52f0: 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  der")==0 ){.    
5300: 20 20 20 20 70 72 69 6e 74 5f 64 62 5f 68 65 61      print_db_hea
5310: 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20 63  der();.        c
5320: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
5330: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
5340: 70 28 61 72 67 76 5b 69 5d 2c 20 22 70 67 69 64  p(argv[i], "pgid
5350: 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
5360: 20 20 70 61 67 65 5f 75 73 61 67 65 5f 72 65 70    page_usage_rep
5370: 6f 72 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ort(argv[1]);.  
5380: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
53a0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
53b0: 2c 20 22 70 74 72 6d 61 70 22 29 3d 3d 30 20 29  , "ptrmap")==0 )
53c0: 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
53d0: 5f 63 6f 76 65 72 61 67 65 5f 72 65 70 6f 72 74  _coverage_report
53e0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20  (argv[1]);.     
53f0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5400: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
5410: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22  trcmp(argv[i], "
5420: 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  help")==0 ){.   
5430: 20 20 20 20 20 75 73 61 67 65 28 61 72 67 76 5b       usage(argv[
5440: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0]);.        con
5450: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
5460: 20 20 20 20 20 69 66 28 20 21 69 73 64 69 67 69       if( !isdigi
5470: 74 28 61 72 67 76 5b 69 5d 5b 30 5d 29 20 29 7b  t(argv[i][0]) ){
5480: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
5490: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20 75 6e  (stderr, "%s: un
54a0: 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5b 25  known option: [%
54b0: 73 5d 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 2c 20  s]\n", argv[0], 
54c0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
54d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
54e0: 20 20 7d 0a 20 20 20 20 20 20 69 53 74 61 72 74    }.      iStart
54f0: 20 3d 20 73 74 72 74 6f 6c 28 61 72 67 76 5b 69   = strtol(argv[i
5500: 5d 2c 20 26 7a 4c 65 66 74 2c 20 30 29 3b 0a 20  ], &zLeft, 0);. 
5510: 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74 20 26       if( zLeft &
5520: 26 20 73 74 72 63 6d 70 28 7a 4c 65 66 74 2c 22  & strcmp(zLeft,"
5530: 2e 2e 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ..end")==0 ){.  
5540: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 6d 78 50        iEnd = mxP
5550: 61 67 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  age;.      }else
5560: 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c   if( zLeft && zL
5570: 65 66 74 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 7a  eft[0]=='.' && z
5580: 4c 65 66 74 5b 31 5d 3d 3d 27 2e 27 20 29 7b 0a  Left[1]=='.' ){.
5590: 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73          iEnd = s
55a0: 74 72 74 6f 6c 28 26 7a 4c 65 66 74 5b 32 5d 2c  trtol(&zLeft[2],
55b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   0, 0);.      }e
55c0: 6c 73 65 20 69 66 28 20 7a 4c 65 66 74 20 26 26  lse if( zLeft &&
55d0: 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27 62 27 20 29   zLeft[0]=='b' )
55e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 66  {.        int of
55f0: 73 74 2c 20 6e 42 79 74 65 2c 20 68 64 72 53 69  st, nByte, hdrSi
5600: 7a 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ze;.        unsi
5610: 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20  gned char *a;.  
5620: 20 20 20 20 20 20 69 66 28 20 69 53 74 61 72 74        if( iStart
5630: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
5640: 20 6f 66 73 74 20 3d 20 68 64 72 53 69 7a 65 20   ofst = hdrSize 
5650: 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20 20  = 100;.         
5660: 20 6e 42 79 74 65 20 3d 20 70 61 67 65 73 69 7a   nByte = pagesiz
5670: 65 2d 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d  e-100;.        }
5680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5690: 68 64 72 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  hdrSize = 0;.   
56a0: 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 28 69         ofst = (i
56b0: 53 74 61 72 74 2d 31 29 2a 70 61 67 65 73 69 7a  Start-1)*pagesiz
56c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79  e;.          nBy
56d0: 74 65 20 3d 20 70 61 67 65 73 69 7a 65 3b 0a 20  te = pagesize;. 
56e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
56f0: 20 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28   a = getContent(
5700: 6f 66 73 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ofst, nByte);.  
5710: 20 20 20 20 20 20 64 65 63 6f 64 65 5f 62 74 72        decode_btr
5720: 65 65 5f 70 61 67 65 28 61 2c 20 69 53 74 61 72  ee_page(a, iStar
5730: 74 2c 20 68 64 72 53 69 7a 65 2c 20 26 7a 4c 65  t, hdrSize, &zLe
5740: 66 74 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ft[1]);.        
5750: 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20 20  free(a);.       
5760: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5770: 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 65 66 74   }else if( zLeft
5780: 20 26 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27 74   && zLeft[0]=='t
5790: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ' ){.        int
57a0: 20 64 65 74 61 69 6c 20 3d 20 30 3b 0a 20 20 20   detail = 0;.   
57b0: 20 20 20 20 20 69 6e 74 20 72 65 63 75 72 73 69       int recursi
57c0: 76 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ve = 0;.        
57d0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
57e0: 6f 72 28 69 3d 31 3b 20 7a 4c 65 66 74 5b 69 5d  or(i=1; zLeft[i]
57f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5800: 20 20 69 66 28 20 7a 4c 65 66 74 5b 69 5d 3d 3d    if( zLeft[i]==
5810: 27 72 27 20 29 20 72 65 63 75 72 73 69 76 65 20  'r' ) recursive 
5820: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 1;.          i
5830: 66 28 20 7a 4c 65 66 74 5b 69 5d 3d 3d 27 64 27  f( zLeft[i]=='d'
5840: 20 29 20 64 65 74 61 69 6c 20 3d 20 31 3b 0a 20   ) detail = 1;. 
5850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5860: 20 64 65 63 6f 64 65 5f 74 72 75 6e 6b 5f 70 61   decode_trunk_pa
5870: 67 65 28 69 53 74 61 72 74 2c 20 70 61 67 65 73  ge(iStart, pages
5880: 69 7a 65 2c 20 64 65 74 61 69 6c 2c 20 72 65 63  ize, detail, rec
5890: 75 72 73 69 76 65 29 3b 0a 20 20 20 20 20 20 20  ursive);.       
58a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
58b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
58c0: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 3b 0a 20  iEnd = iStart;. 
58d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
58e0: 20 69 53 74 61 72 74 3c 31 20 7c 7c 20 69 45 6e   iStart<1 || iEn
58f0: 64 3c 69 53 74 61 72 74 20 7c 7c 20 69 45 6e 64  d<iStart || iEnd
5900: 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
5910: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
5920: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 50 61  r,.          "Pa
5930: 67 65 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  ge argument shou
5940: 6c 64 20 62 65 20 4c 4f 57 45 52 3f 2e 2e 55 50  ld be LOWER?..UP
5950: 50 45 52 3f 2e 20 20 52 61 6e 67 65 20 31 20 74  PER?.  Range 1 t
5960: 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %d\n",.       
5970: 20 20 20 6d 78 50 61 67 65 29 3b 0a 20 20 20 20     mxPage);.    
5980: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
5990: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
59a0: 28 20 69 53 74 61 72 74 3c 3d 69 45 6e 64 20 29  ( iStart<=iEnd )
59b0: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 5f  {.        print_
59c0: 70 61 67 65 28 69 53 74 61 72 74 29 3b 0a 20 20  page(iStart);.  
59d0: 20 20 20 20 20 20 69 53 74 61 72 74 2b 2b 3b 0a        iStart++;.
59e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
59f0: 7d 0a 20 20 63 6c 6f 73 65 28 64 62 29 3b 0a 20  }.  close(db);. 
5a00: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a            return 0;.}.