/ Hex Artifact Content
Login

Artifact 525ecc443578647703051308ad50a93de6ba2c4b:


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 70   hex.*/.static p
0b50: 72 69 6e 74 5f 70 61 67 65 28 69 6e 74 20 69 50  rint_page(int iP
0b60: 67 29 7b 0a 20 20 69 6e 74 20 69 53 74 61 72 74  g){.  int iStart
0b70: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
0b80: 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 53 74 61  r *aData;.  iSta
0b90: 72 74 20 3d 20 28 69 50 67 2d 31 29 2a 70 61 67  rt = (iPg-1)*pag
0ba0: 65 73 69 7a 65 3b 0a 20 20 66 70 72 69 6e 74 66  esize;.  fprintf
0bb0: 28 73 74 64 6f 75 74 2c 20 22 50 61 67 65 20 25  (stdout, "Page %
0bc0: 64 3a 20 20 20 28 6f 66 66 73 65 74 73 20 30 78  d:   (offsets 0x
0bd0: 25 78 2e 2e 30 78 25 78 29 5c 6e 22 2c 0a 20 20  %x..0x%x)\n",.  
0be0: 20 20 20 20 20 20 20 20 69 50 67 2c 20 69 53 74          iPg, iSt
0bf0: 61 72 74 2c 20 69 53 74 61 72 74 2b 70 61 67 65  art, iStart+page
0c00: 73 69 7a 65 2d 31 29 3b 0a 20 20 61 44 61 74 61  size-1);.  aData
0c10: 20 3d 20 70 72 69 6e 74 5f 62 79 74 65 5f 72 61   = print_byte_ra
0c20: 6e 67 65 28 69 53 74 61 72 74 2c 20 70 61 67 65  nge(iStart, page
0c30: 73 69 7a 65 2c 20 30 29 3b 0a 20 20 66 72 65 65  size, 0);.  free
0c40: 28 61 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 20 50  (aData);.}../* P
0c50: 72 69 6e 74 20 61 20 6c 69 6e 65 20 6f 66 20 64  rint a line of d
0c60: 65 63 6f 64 65 20 6f 75 74 70 75 74 20 73 68 6f  ecode output sho
0c70: 77 69 6e 67 20 61 20 34 2d 62 79 74 65 20 69 6e  wing a 4-byte in
0c80: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
0c90: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
0ca0: 6e 65 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ne(.  unsigned c
0cb0: 68 61 72 20 2a 61 44 61 74 61 2c 20 20 20 20 20  har *aData,     
0cc0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 62 65 69 6e   /* Content bein
0cd0: 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69  g decoded */.  i
0ce0: 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 42 79  nt ofst, int nBy
0cf0: 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 53 74 61  te,       /* Sta
0d00: 72 74 20 61 6e 64 20 73 69 7a 65 20 6f 66 20 64  rt and size of d
0d10: 65 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecode */.  const
0d20: 20 63 68 61 72 20 2a 7a 4d 73 67 20 20 20 20 20   char *zMsg     
0d30: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
0d40: 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   to append */.){
0d50: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
0d60: 6e 74 20 76 61 6c 20 3d 20 61 44 61 74 61 5b 6f  nt val = aData[o
0d70: 66 73 74 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  fst];.  char zBu
0d80: 66 5b 31 30 30 5d 3b 0a 20 20 73 70 72 69 6e 74  f[100];.  sprint
0d90: 66 28 7a 42 75 66 2c 20 22 20 25 30 33 78 3a 20  f(zBuf, " %03x: 
0da0: 25 30 32 78 22 2c 20 6f 66 73 74 2c 20 61 44 61  %02x", ofst, aDa
0db0: 74 61 5b 6f 66 73 74 5d 29 3b 0a 20 20 69 20 3d  ta[ofst]);.  i =
0dc0: 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20   strlen(zBuf);. 
0dd0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34 3b 20 6a   for(j=1; j<4; j
0de0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  ++){.    if( j>=
0df0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 73  nByte ){.      s
0e00: 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d 2c  printf(&zBuf[i],
0e10: 20 22 20 20 20 22 29 3b 0a 20 20 20 20 7d 65 6c   "   ");.    }el
0e20: 73 65 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  se{.      sprint
0e30: 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 25 30  f(&zBuf[i], " %0
0e40: 32 78 22 2c 20 61 44 61 74 61 5b 6f 66 73 74 2b  2x", aData[ofst+
0e50: 6a 5d 29 3b 0a 20 20 20 20 20 20 76 61 6c 20 3d  j]);.      val =
0e60: 20 76 61 6c 2a 32 35 36 20 2b 20 61 44 61 74 61   val*256 + aData
0e70: 5b 6f 66 73 74 2b 6a 5d 3b 0a 20 20 20 20 7d 0a  [ofst+j];.    }.
0e80: 20 20 20 20 69 20 2b 3d 20 73 74 72 6c 65 6e 28      i += strlen(
0e90: 26 7a 42 75 66 5b 69 5d 29 3b 0a 20 20 7d 0a 20  &zBuf[i]);.  }. 
0ea0: 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69   sprintf(&zBuf[i
0eb0: 5d 2c 20 22 20 20 20 25 39 64 22 2c 20 76 61 6c  ], "   %9d", val
0ec0: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73 20  );.  printf("%s 
0ed0: 20 25 73 5c 6e 22 2c 20 7a 42 75 66 2c 20 7a 4d   %s\n", zBuf, zM
0ee0: 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  sg);.}../*.** De
0ef0: 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
0f00: 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 73 74 61  e header..*/.sta
0f10: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 64  tic void print_d
0f20: 62 5f 68 65 61 64 65 72 28 76 6f 69 64 29 7b 0a  b_header(void){.
0f30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0f40: 2a 61 44 61 74 61 3b 0a 20 20 61 44 61 74 61 20  *aData;.  aData 
0f50: 3d 20 70 72 69 6e 74 5f 62 79 74 65 5f 72 61 6e  = print_byte_ran
0f60: 67 65 28 30 2c 20 31 30 30 2c 20 30 29 3b 0a 20  ge(0, 100, 0);. 
0f70: 20 70 72 69 6e 74 66 28 22 44 65 63 6f 64 65 64   printf("Decoded
0f80: 3a 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  :\n");.  print_d
0f90: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
0fa0: 2c 20 31 36 2c 20 32 2c 20 22 44 61 74 61 62 61  , 16, 2, "Databa
0fb0: 73 65 20 70 61 67 65 20 73 69 7a 65 22 29 3b 0a  se page size");.
0fc0: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
0fd0: 69 6e 65 28 61 44 61 74 61 2c 20 31 38 2c 20 31  ine(aData, 18, 1
0fe0: 2c 20 22 46 69 6c 65 20 66 6f 72 6d 61 74 20 77  , "File format w
0ff0: 72 69 74 65 20 76 65 72 73 69 6f 6e 22 29 3b 0a  rite version");.
1000: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
1010: 69 6e 65 28 61 44 61 74 61 2c 20 31 39 2c 20 31  ine(aData, 19, 1
1020: 2c 20 22 46 69 6c 65 20 66 6f 72 6d 61 74 20 72  , "File format r
1030: 65 61 64 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20  ead version");. 
1040: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1050: 6e 65 28 61 44 61 74 61 2c 20 32 30 2c 20 31 2c  ne(aData, 20, 1,
1060: 20 22 52 65 73 65 72 76 65 64 20 73 70 61 63 65   "Reserved space
1070: 20 61 74 20 65 6e 64 20 6f 66 20 70 61 67 65 22   at end of page"
1080: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1090: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 32 34  e_line(aData, 24
10a0: 2c 20 34 2c 20 22 46 69 6c 65 20 63 68 61 6e 67  , 4, "File chang
10b0: 65 20 63 6f 75 6e 74 65 72 22 29 3b 0a 20 20 70  e counter");.  p
10c0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
10d0: 28 61 44 61 74 61 2c 20 32 38 2c 20 34 2c 20 22  (aData, 28, 4, "
10e0: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
10f0: 20 69 6e 20 70 61 67 65 73 22 29 3b 0a 20 20 70   in pages");.  p
1100: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1110: 28 61 44 61 74 61 2c 20 33 32 2c 20 34 2c 20 22  (aData, 32, 4, "
1120: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1130: 69 72 73 74 20 66 72 65 65 6c 69 73 74 20 70 61  irst freelist pa
1140: 67 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  ge");.  print_de
1150: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1160: 20 33 36 2c 20 34 2c 20 22 4e 75 6d 62 65 72 20   36, 4, "Number 
1170: 6f 66 20 66 72 65 65 6c 69 73 74 20 70 61 67 65  of freelist page
1180: 73 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  s");.  print_dec
1190: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
11a0: 34 30 2c 20 34 2c 20 22 53 63 68 65 6d 61 20 63  40, 4, "Schema c
11b0: 6f 6f 6b 69 65 22 29 3b 0a 20 20 70 72 69 6e 74  ookie");.  print
11c0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
11d0: 74 61 2c 20 34 34 2c 20 34 2c 20 22 53 63 68 65  ta, 44, 4, "Sche
11e0: 6d 61 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f  ma format versio
11f0: 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  n");.  print_dec
1200: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
1210: 34 38 2c 20 34 2c 20 22 44 65 66 61 75 6c 74 20  48, 4, "Default 
1220: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 22  page cache size"
1230: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1240: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 35 32  e_line(aData, 52
1250: 2c 20 34 2c 20 22 4c 61 72 67 65 73 74 20 61 75  , 4, "Largest au
1260: 74 6f 2d 76 61 63 20 72 6f 6f 74 20 70 61 67 65  to-vac root page
1270: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1280: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 35  de_line(aData, 5
1290: 36 2c 20 34 2c 20 22 54 65 78 74 20 65 6e 63 6f  6, 4, "Text enco
12a0: 64 69 6e 67 22 29 3b 0a 20 20 70 72 69 6e 74 5f  ding");.  print_
12b0: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
12c0: 61 2c 20 36 30 2c 20 34 2c 20 22 55 73 65 72 20  a, 60, 4, "User 
12d0: 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72 69  version");.  pri
12e0: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
12f0: 44 61 74 61 2c 20 36 34 2c 20 34 2c 20 22 49 6e  Data, 64, 4, "In
1300: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1310: 20 6d 6f 64 65 22 29 3b 0a 20 20 70 72 69 6e 74   mode");.  print
1320: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1330: 74 61 2c 20 36 38 2c 20 34 2c 20 22 41 70 70 6c  ta, 68, 4, "Appl
1340: 69 63 61 74 69 6f 6e 20 49 44 22 29 3b 0a 20 20  ication ID");.  
1350: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1360: 65 28 61 44 61 74 61 2c 20 37 32 2c 20 34 2c 20  e(aData, 72, 4, 
1370: 22 6d 65 74 61 5b 38 5d 22 29 3b 0a 20 20 70 72  "meta[8]");.  pr
1380: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1390: 61 44 61 74 61 2c 20 37 36 2c 20 34 2c 20 22 6d  aData, 76, 4, "m
13a0: 65 74 61 5b 39 5d 22 29 3b 0a 20 20 70 72 69 6e  eta[9]");.  prin
13b0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
13c0: 61 74 61 2c 20 38 30 2c 20 34 2c 20 22 6d 65 74  ata, 80, 4, "met
13d0: 61 5b 31 30 5d 22 29 3b 0a 20 20 70 72 69 6e 74  a[10]");.  print
13e0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
13f0: 74 61 2c 20 38 34 2c 20 34 2c 20 22 6d 65 74 61  ta, 84, 4, "meta
1400: 5b 31 31 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f  [11]");.  print_
1410: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
1420: 61 2c 20 38 38 2c 20 34 2c 20 22 6d 65 74 61 5b  a, 88, 4, "meta[
1430: 31 32 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  12]");.  print_d
1440: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
1450: 2c 20 39 32 2c 20 34 2c 20 22 43 68 61 6e 67 65  , 92, 4, "Change
1460: 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 76 65 72   counter for ver
1470: 73 69 6f 6e 20 6e 75 6d 62 65 72 22 29 3b 0a 20  sion number");. 
1480: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1490: 6e 65 28 61 44 61 74 61 2c 20 39 36 2c 20 34 2c  ne(aData, 96, 4,
14a0: 20 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e   "SQLite version
14b0: 20 6e 75 6d 62 65 72 22 29 3b 0a 7d 0a 0a 2f 2a   number");.}../*
14c0: 0a 2a 2a 20 44 65 73 63 72 69 62 65 20 63 65 6c  .** Describe cel
14d0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74  l content..*/.st
14e0: 61 74 69 63 20 69 6e 74 20 64 65 73 63 72 69 62  atic int describ
14f0: 65 43 6f 6e 74 65 6e 74 28 0a 20 20 75 6e 73 69  eContent(.  unsi
1500: 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 20 20  gned char *a,   
1510: 20 20 20 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e 74      /* Cell cont
1520: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ent */.  int nLo
1530: 63 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  cal,            
1540: 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 61 5b 5d   /* Bytes in a[]
1550: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
1560: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c             /*
1570: 20 57 72 69 74 65 20 64 65 73 63 72 69 70 74 69   Write descripti
1580: 6f 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  on here */.){.  
1590: 69 6e 74 20 6e 44 65 73 63 20 3d 20 30 3b 0a 20  int nDesc = 0;. 
15a0: 20 69 6e 74 20 6e 2c 20 69 2c 20 6a 3b 0a 20 20   int n, i, j;.  
15b0: 69 36 34 20 78 2c 20 76 3b 0a 20 20 63 6f 6e 73  i64 x, v;.  cons
15c0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15d0: 2a 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  *pData;.  const 
15e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
15f0: 4c 69 6d 69 74 3b 0a 20 20 63 68 61 72 20 73 65  Limit;.  char se
1600: 70 20 3d 20 27 20 27 3b 0a 0a 20 20 70 4c 69 6d  p = ' ';..  pLim
1610: 69 74 20 3d 20 26 61 5b 6e 4c 6f 63 61 6c 5d 3b  it = &a[nLocal];
1620: 0a 20 20 6e 20 3d 20 64 65 63 6f 64 65 56 61 72  .  n = decodeVar
1630: 69 6e 74 28 61 2c 20 26 78 29 3b 0a 20 20 70 44  int(a, &x);.  pD
1640: 61 74 61 20 3d 20 26 61 5b 78 5d 3b 0a 20 20 61  ata = &a[x];.  a
1650: 20 2b 3d 20 6e 3b 0a 20 20 69 20 3d 20 78 20 2d   += n;.  i = x -
1660: 20 6e 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   n;.  while( i>0
1670: 20 26 26 20 70 44 61 74 61 3c 3d 70 4c 69 6d 69   && pData<=pLimi
1680: 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 64 65 63  t ){.    n = dec
1690: 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 78 29  odeVarint(a, &x)
16a0: 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20 20  ;.    a += n;.  
16b0: 20 20 69 20 2d 3d 20 6e 3b 0a 20 20 20 20 6e 4c    i -= n;.    nL
16c0: 6f 63 61 6c 20 2d 3d 20 6e 3b 0a 20 20 20 20 7a  ocal -= n;.    z
16d0: 44 65 73 63 5b 30 5d 20 3d 20 73 65 70 3b 0a 20  Desc[0] = sep;. 
16e0: 20 20 20 73 65 70 20 3d 20 27 2c 27 3b 0a 20 20     sep = ',';.  
16f0: 20 20 6e 44 65 73 63 2b 2b 3b 0a 20 20 20 20 7a    nDesc++;.    z
1700: 44 65 73 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Desc++;.    if( 
1710: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  x==0 ){.      sp
1720: 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 2a 22  rintf(zDesc, "*"
1730: 29 3b 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 69  );     /* NULL i
1740: 73 20 61 20 22 2a 22 20 2a 2f 0a 20 20 20 20 7d  s a "*" */.    }
1750: 65 6c 73 65 20 69 66 28 20 78 3e 3d 31 20 26 26  else if( x>=1 &&
1760: 20 78 3c 3d 36 20 29 7b 0a 20 20 20 20 20 20 76   x<=6 ){.      v
1770: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
1780: 70 44 61 74 61 5b 30 5d 3b 0a 20 20 20 20 20 20  pData[0];.      
1790: 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20 73  pData++;.      s
17a0: 77 69 74 63 68 28 20 78 20 29 7b 0a 20 20 20 20  witch( x ){.    
17b0: 20 20 20 20 63 61 73 65 20 36 3a 20 20 76 20 3d      case 6:  v =
17c0: 20 28 76 3c 3c 31 36 29 20 2b 20 28 70 44 61 74   (v<<16) + (pDat
17d0: 61 5b 30 5d 3c 3c 38 29 20 2b 20 70 44 61 74 61  a[0]<<8) + pData
17e0: 5b 31 5d 3b 20 20 70 44 61 74 61 20 2b 3d 20 32  [1];  pData += 2
17f0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 35  ;.        case 5
1800: 3a 20 20 76 20 3d 20 28 76 3c 3c 31 36 29 20 2b  :  v = (v<<16) +
1810: 20 28 70 44 61 74 61 5b 30 5d 3c 3c 38 29 20 2b   (pData[0]<<8) +
1820: 20 70 44 61 74 61 5b 31 5d 3b 20 20 70 44 61 74   pData[1];  pDat
1830: 61 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  a += 2;.        
1840: 63 61 73 65 20 34 3a 20 20 76 20 3d 20 28 76 3c  case 4:  v = (v<
1850: 3c 38 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b 20  <8) + pData[0]; 
1860: 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20   pData++;.      
1870: 20 20 63 61 73 65 20 33 3a 20 20 76 20 3d 20 28    case 3:  v = (
1880: 76 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30 5d  v<<8) + pData[0]
1890: 3b 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20  ;  pData++;.    
18a0: 20 20 20 20 63 61 73 65 20 32 3a 20 20 76 20 3d      case 2:  v =
18b0: 20 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b   (v<<8) + pData[
18c0: 30 5d 3b 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20  0];  pData++;.  
18d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 70 72 69      }.      spri
18e0: 6e 74 66 28 7a 44 65 73 63 2c 20 22 25 6c 6c 64  ntf(zDesc, "%lld
18f0: 22 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ", v);.    }else
1900: 20 69 66 28 20 78 3d 3d 37 20 29 7b 0a 20 20 20   if( x==7 ){.   
1910: 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73 63     sprintf(zDesc
1920: 2c 20 22 72 65 61 6c 22 29 3b 0a 20 20 20 20 20  , "real");.     
1930: 20 70 44 61 74 61 20 2b 3d 20 38 3b 0a 20 20 20   pData += 8;.   
1940: 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d 38 20   }else if( x==8 
1950: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
1960: 28 7a 44 65 73 63 2c 20 22 30 22 29 3b 0a 20 20  (zDesc, "0");.  
1970: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d 39    }else if( x==9
1980: 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   ){.      sprint
1990: 66 28 7a 44 65 73 63 2c 20 22 31 22 29 3b 0a 20  f(zDesc, "1");. 
19a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3e 3d     }else if( x>=
19b0: 31 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  12 ){.      int 
19c0: 73 69 7a 65 20 3d 20 28 78 2d 31 32 29 2f 32 3b  size = (x-12)/2;
19d0: 0a 20 20 20 20 20 20 69 66 28 20 28 78 26 31 29  .      if( (x&1)
19e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
19f0: 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 62  printf(zDesc, "b
1a00: 6c 6f 62 28 25 64 29 22 2c 20 73 69 7a 65 29 3b  lob(%d)", size);
1a10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a20: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44        sprintf(zD
1a30: 65 73 63 2c 20 22 74 78 74 28 25 64 29 22 2c 20  esc, "txt(%d)", 
1a40: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  size);.      }. 
1a50: 20 20 20 20 20 70 44 61 74 61 20 2b 3d 20 73 69       pData += si
1a60: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  ze;.    }.    j 
1a70: 3d 20 73 74 72 6c 65 6e 28 7a 44 65 73 63 29 3b  = strlen(zDesc);
1a80: 0a 20 20 20 20 7a 44 65 73 63 20 2b 3d 20 6a 3b  .    zDesc += j;
1a90: 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20 6a 3b  .    nDesc += j;
1aa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 44  .  }.  return nD
1ab0: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  esc;.}../*.** Co
1ac0: 6d 70 75 74 65 20 74 68 65 20 6c 6f 63 61 6c 20  mpute the local 
1ad0: 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 67 69 76  payload size giv
1ae0: 65 6e 20 74 68 65 20 74 6f 74 61 6c 20 70 61 79  en the total pay
1af0: 6c 6f 61 64 20 73 69 7a 65 20 61 6e 64 0a 2a 2a  load size and.**
1b00: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
1b20: 63 61 6c 50 61 79 6c 6f 61 64 28 69 36 34 20 6e  calPayload(i64 n
1b30: 50 61 79 6c 6f 61 64 2c 20 63 68 61 72 20 63 54  Payload, char cT
1b40: 79 70 65 29 7b 0a 20 20 69 6e 74 20 6d 61 78 4c  ype){.  int maxL
1b50: 6f 63 61 6c 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c  ocal;.  int minL
1b60: 6f 63 61 6c 3b 0a 20 20 69 6e 74 20 73 75 72 70  ocal;.  int surp
1b70: 6c 75 73 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  lus;.  int nLoca
1b80: 6c 3b 0a 20 20 69 66 28 20 63 54 79 70 65 3d 3d  l;.  if( cType==
1b90: 31 33 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 62  13 ){.    /* Tab
1ba0: 6c 65 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 6d  le leaf */.    m
1bb0: 61 78 4c 6f 63 61 6c 20 3d 20 70 61 67 65 73 69  axLocal = pagesi
1bc0: 7a 65 2d 33 35 3b 0a 20 20 20 20 6d 69 6e 4c 6f  ze-35;.    minLo
1bd0: 63 61 6c 20 3d 20 28 70 61 67 65 73 69 7a 65 2d  cal = (pagesize-
1be0: 31 32 29 2a 33 32 2f 32 35 35 2d 32 33 3b 0a 20  12)*32/255-23;. 
1bf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 78 4c   }else{.    maxL
1c00: 6f 63 61 6c 20 3d 20 28 70 61 67 65 73 69 7a 65  ocal = (pagesize
1c10: 2d 31 32 29 2a 36 34 2f 32 35 35 2d 32 33 3b 0a  -12)*64/255-23;.
1c20: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28      minLocal = (
1c30: 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 33 32 2f  pagesize-12)*32/
1c40: 32 35 35 2d 32 33 3b 0a 20 20 7d 0a 20 20 69 66  255-23;.  }.  if
1c50: 28 20 6e 50 61 79 6c 6f 61 64 3e 6d 61 78 4c 6f  ( nPayload>maxLo
1c60: 63 61 6c 20 29 7b 0a 20 20 20 20 73 75 72 70 6c  cal ){.    surpl
1c70: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
1c80: 28 6e 50 61 79 6c 6f 61 64 2d 6d 69 6e 4c 6f 63  (nPayload-minLoc
1c90: 61 6c 29 25 28 70 61 67 65 73 69 7a 65 2d 34 29  al)%(pagesize-4)
1ca0: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
1cb0: 73 3c 3d 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  s<=maxLocal ){. 
1cc0: 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 73 75       nLocal = su
1cd0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
1ce0: 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
1cf0: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
1d00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1d10: 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  ocal = nPayload;
1d20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 4c  .  }.  return nL
1d30: 6f 63 61 6c 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a  ocal;.}.  ../*.*
1d40: 2a 20 43 72 65 61 74 65 20 61 20 64 65 73 63 72  * Create a descr
1d50: 69 70 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  iption for a sin
1d60: 67 6c 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  gle cell..**.** 
1d70: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1d80: 20 69 73 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   is the local ce
1d90: 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ll size..*/.stat
1da0: 69 63 20 69 6e 74 20 64 65 73 63 72 69 62 65 43  ic int describeC
1db0: 65 6c 6c 28 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell(.  unsigned 
1dc0: 63 68 61 72 20 63 54 79 70 65 2c 20 20 20 20 2f  char cType,    /
1dd0: 2a 20 50 61 67 65 20 74 79 70 65 20 2a 2f 0a 20  * Page type */. 
1de0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1df0: 61 2c 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  a,       /* Cell
1e00: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
1e10: 74 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e  t showCellConten
1e20: 74 2c 20 20 20 20 2f 2a 20 53 68 6f 77 20 63 65  t,    /* Show ce
1e30: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ll content if tr
1e40: 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ue */.  char **p
1e50: 7a 44 65 73 63 20 20 20 20 20 20 20 20 20 20 20  zDesc           
1e60: 2f 2a 20 53 74 6f 72 65 20 64 65 73 63 72 69 70  /* Store descrip
1e70: 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tion here */.){.
1e80: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
1e90: 44 65 73 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Desc = 0;.  int 
1ea0: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 65 66  n = 0;.  int lef
1eb0: 74 43 68 69 6c 64 3b 0a 20 20 69 36 34 20 6e 50  tChild;.  i64 nP
1ec0: 61 79 6c 6f 61 64 3b 0a 20 20 69 36 34 20 72 6f  ayload;.  i64 ro
1ed0: 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  wid;.  int nLoca
1ee0: 6c 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  l;.  static char
1ef0: 20 7a 44 65 73 63 5b 31 30 30 30 5d 3b 0a 20 20   zDesc[1000];.  
1f00: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 54 79  i = 0;.  if( cTy
1f10: 70 65 3c 3d 35 20 29 7b 0a 20 20 20 20 6c 65 66  pe<=5 ){.    lef
1f20: 74 43 68 69 6c 64 20 3d 20 28 28 61 5b 30 5d 2a  tChild = ((a[0]*
1f30: 32 35 36 20 2b 20 61 5b 31 5d 29 2a 32 35 36 20  256 + a[1])*256 
1f40: 2b 20 61 5b 32 5d 29 2a 32 35 36 20 2b 20 61 5b  + a[2])*256 + a[
1f50: 33 5d 3b 0a 20 20 20 20 61 20 2b 3d 20 34 3b 0a  3];.    a += 4;.
1f60: 20 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20 20 20      n += 4;.    
1f70: 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22  sprintf(zDesc, "
1f80: 6c 78 3a 20 25 64 20 22 2c 20 6c 65 66 74 43 68  lx: %d ", leftCh
1f90: 69 6c 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20  ild);.    nDesc 
1fa0: 3d 20 73 74 72 6c 65 6e 28 7a 44 65 73 63 29 3b  = strlen(zDesc);
1fb0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65  .  }.  if( cType
1fc0: 21 3d 35 20 29 7b 0a 20 20 20 20 69 20 3d 20 64  !=5 ){.    i = d
1fd0: 65 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26  ecodeVarint(a, &
1fe0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 61  nPayload);.    a
1ff0: 20 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20   += i;.    n += 
2000: 69 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  i;.    sprintf(&
2010: 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20 22 6e  zDesc[nDesc], "n
2020: 3a 20 25 6c 6c 64 20 22 2c 20 6e 50 61 79 6c 6f  : %lld ", nPaylo
2030: 61 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b  ad);.    nDesc +
2040: 3d 20 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b  = strlen(&zDesc[
2050: 6e 44 65 73 63 5d 29 3b 0a 20 20 20 20 6e 4c 6f  nDesc]);.    nLo
2060: 63 61 6c 20 3d 20 6c 6f 63 61 6c 50 61 79 6c 6f  cal = localPaylo
2070: 61 64 28 6e 50 61 79 6c 6f 61 64 2c 20 63 54 79  ad(nPayload, cTy
2080: 70 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pe);.  }else{.  
2090: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 4c 6f    nPayload = nLo
20a0: 63 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  cal = 0;.  }.  i
20b0: 66 28 20 63 54 79 70 65 3d 3d 35 20 7c 7c 20 63  f( cType==5 || c
20c0: 54 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20 20 20  Type==13 ){.    
20d0: 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  i = decodeVarint
20e0: 28 61 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  (a, &rowid);.   
20f0: 20 61 20 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b   a += i;.    n +
2100: 3d 20 69 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  = i;.    sprintf
2110: 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20  (&zDesc[nDesc], 
2120: 22 72 3a 20 25 6c 6c 64 20 22 2c 20 72 6f 77 69  "r: %lld ", rowi
2130: 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d  d);.    nDesc +=
2140: 20 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b 6e   strlen(&zDesc[n
2150: 44 65 73 63 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  Desc]);.  }.  if
2160: 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79 6c 6f 61  ( nLocal<nPayloa
2170: 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 76 66  d ){.    int ovf
2180: 6c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  l;.    unsigned 
2190: 63 68 61 72 20 2a 62 20 3d 20 26 61 5b 6e 4c 6f  char *b = &a[nLo
21a0: 63 61 6c 5d 3b 0a 20 20 20 20 6f 76 66 6c 20 3d  cal];.    ovfl =
21b0: 20 28 28 62 5b 30 5d 2a 32 35 36 20 2b 20 62 5b   ((b[0]*256 + b[
21c0: 31 5d 29 2a 32 35 36 20 2b 20 62 5b 32 5d 29 2a  1])*256 + b[2])*
21d0: 32 35 36 20 2b 20 62 5b 33 5d 3b 0a 20 20 20 20  256 + b[3];.    
21e0: 73 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b 6e  sprintf(&zDesc[n
21f0: 44 65 73 63 5d 2c 20 22 6f 76 3a 20 25 64 20 22  Desc], "ov: %d "
2200: 2c 20 6f 76 66 6c 29 3b 0a 20 20 20 20 6e 44 65  , ovfl);.    nDe
2210: 73 63 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 44  sc += strlen(&zD
2220: 65 73 63 5b 6e 44 65 73 63 5d 29 3b 0a 20 20 20  esc[nDesc]);.   
2230: 20 6e 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69   n += 4;.  }.  i
2240: 66 28 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65  f( showCellConte
2250: 6e 74 20 26 26 20 63 54 79 70 65 21 3d 35 20 29  nt && cType!=5 )
2260: 7b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20 64  {.    nDesc += d
2270: 65 73 63 72 69 62 65 43 6f 6e 74 65 6e 74 28 61  escribeContent(a
2280: 2c 20 6e 4c 6f 63 61 6c 2c 20 26 7a 44 65 73 63  , nLocal, &zDesc
2290: 5b 6e 44 65 73 63 2d 31 5d 29 3b 0a 20 20 7d 0a  [nDesc-1]);.  }.
22a0: 20 20 2a 70 7a 44 65 73 63 20 3d 20 7a 44 65 73    *pzDesc = zDes
22b0: 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 4c 6f 63  c;.  return nLoc
22c0: 61 6c 2b 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  al+n;.}../*.** D
22d0: 65 63 6f 64 65 20 61 20 62 74 72 65 65 20 70 61  ecode a btree pa
22e0: 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ge.*/.static voi
22f0: 64 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f 70  d decode_btree_p
2300: 61 67 65 28 0a 20 20 75 6e 73 69 67 6e 65 64 20  age(.  unsigned 
2310: 63 68 61 72 20 2a 61 2c 20 20 20 2f 2a 20 50 61  char *a,   /* Pa
2320: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ge content */.  
2330: 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  int pgno,       
2340: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2350: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 53  er */.  int hdrS
2360: 69 7a 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  ize,        /* S
2370: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ize of the page 
2380: 68 65 61 64 65 72 2e 20 20 30 20 6f 72 20 31 30  header.  0 or 10
2390: 30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72  0 */.  char *zAr
23a0: 67 73 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  gs         /* Fl
23b0: 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 66  ags to control f
23c0: 6f 72 6d 61 74 74 69 6e 67 20 2a 2f 0a 29 7b 0a  ormatting */.){.
23d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
23e0: 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ype = "unknown";
23f0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
2400: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
2410: 69 43 65 6c 6c 50 74 72 3b 0a 20 20 69 6e 74 20  iCellPtr;.  int 
2420: 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 20  showCellContent 
2430: 3d 20 30 3b 0a 20 20 69 6e 74 20 73 68 6f 77 4d  = 0;.  int showM
2440: 61 70 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ap = 0;.  char *
2450: 7a 4d 61 70 20 3d 20 30 3b 0a 20 20 73 77 69 74  zMap = 0;.  swit
2460: 63 68 28 20 61 5b 30 5d 20 29 7b 0a 20 20 20 20  ch( a[0] ){.    
2470: 63 61 73 65 20 32 3a 20 20 7a 54 79 70 65 20 3d  case 2:  zType =
2480: 20 22 69 6e 64 65 78 20 69 6e 74 65 72 69 6f 72   "index interior
2490: 20 6e 6f 64 65 22 3b 20 20 62 72 65 61 6b 3b 0a   node";  break;.
24a0: 20 20 20 20 63 61 73 65 20 35 3a 20 20 7a 54 79      case 5:  zTy
24b0: 70 65 20 3d 20 22 74 61 62 6c 65 20 69 6e 74 65  pe = "table inte
24c0: 72 69 6f 72 20 6e 6f 64 65 22 3b 20 20 62 72 65  rior node";  bre
24d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 30 3a  ak;.    case 10:
24e0: 20 7a 54 79 70 65 20 3d 20 22 69 6e 64 65 78 20   zType = "index 
24f0: 6c 65 61 66 22 3b 20 20 20 20 20 20 20 20 20 20  leaf";          
2500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2510: 20 31 33 3a 20 7a 54 79 70 65 20 3d 20 22 74 61   13: zType = "ta
2520: 62 6c 65 20 6c 65 61 66 22 3b 20 20 20 20 20 20  ble leaf";      
2530: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
2540: 20 20 77 68 69 6c 65 28 20 7a 41 72 67 73 5b 30    while( zArgs[0
2550: 5d 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ] ){.    switch(
2560: 20 7a 41 72 67 73 5b 30 5d 20 29 7b 0a 20 20 20   zArgs[0] ){.   
2570: 20 20 20 63 61 73 65 20 27 63 27 3a 20 73 68 6f     case 'c': sho
2580: 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 20 3d 20 31  wCellContent = 1
2590: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
25a0: 63 61 73 65 20 27 6d 27 3a 20 73 68 6f 77 4d 61  case 'm': showMa
25b0: 70 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  p = 1;          
25c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
25d0: 20 7a 41 72 67 73 2b 2b 3b 0a 20 20 7d 0a 20 20   zArgs++;.  }.  
25e0: 70 72 69 6e 74 66 28 22 44 65 63 6f 64 65 20 6f  printf("Decode o
25f0: 66 20 62 74 72 65 65 20 70 61 67 65 20 25 64 3a  f btree page %d:
2600: 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 72  \n", pgno);.  pr
2610: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
2620: 61 2c 20 30 2c 20 31 2c 20 7a 54 79 70 65 29 3b  a, 0, 1, zType);
2630: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
2640: 6c 69 6e 65 28 61 2c 20 31 2c 20 32 2c 20 22 4f  line(a, 1, 2, "O
2650: 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 66  ffset to first f
2660: 72 65 65 62 6c 6f 63 6b 22 29 3b 0a 20 20 70 72  reeblock");.  pr
2670: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
2680: 61 2c 20 33 2c 20 32 2c 20 22 4e 75 6d 62 65 72  a, 3, 2, "Number
2690: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69   of cells on thi
26a0: 73 20 70 61 67 65 22 29 3b 0a 20 20 6e 43 65 6c  s page");.  nCel
26b0: 6c 20 3d 20 61 5b 33 5d 2a 32 35 36 20 2b 20 61  l = a[3]*256 + a
26c0: 5b 34 5d 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  [4];.  print_dec
26d0: 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 35 2c 20 32  ode_line(a, 5, 2
26e0: 2c 20 22 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  , "Offset to cel
26f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22 29  l content area")
2700: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
2710: 5f 6c 69 6e 65 28 61 2c 20 37 2c 20 31 2c 20 22  _line(a, 7, 1, "
2720: 46 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 20  Fragmented byte 
2730: 63 6f 75 6e 74 22 29 3b 0a 20 20 69 66 28 20 61  count");.  if( a
2740: 5b 30 5d 3d 3d 32 20 7c 7c 20 61 5b 30 5d 3d 3d  [0]==2 || a[0]==
2750: 35 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 5f 64  5 ){.    print_d
2760: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 38 2c  ecode_line(a, 8,
2770: 20 34 2c 20 22 52 69 67 68 74 20 63 68 69 6c 64   4, "Right child
2780: 22 29 3b 0a 20 20 20 20 69 43 65 6c 6c 50 74 72  ");.    iCellPtr
2790: 20 3d 20 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = 12;.  }else{.
27a0: 20 20 20 20 69 43 65 6c 6c 50 74 72 20 3d 20 38      iCellPtr = 8
27b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 65 6c  ;.  }.  if( nCel
27c0: 6c 3e 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  l>0 ){.    print
27d0: 66 28 22 20 6b 65 79 3a 20 6c 78 3d 6c 65 66 74  f(" key: lx=left
27e0: 2d 63 68 69 6c 64 20 6e 3d 70 61 79 6c 6f 61 64  -child n=payload
27f0: 2d 73 69 7a 65 20 72 3d 72 6f 77 69 64 5c 6e 22  -size r=rowid\n"
2800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 68 6f  );.  }.  if( sho
2810: 77 4d 61 70 20 29 7b 0a 20 20 20 20 7a 4d 61 70  wMap ){.    zMap
2820: 20 3d 20 6d 61 6c 6c 6f 63 28 70 61 67 65 73 69   = malloc(pagesi
2830: 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ze);.    memset(
2840: 7a 4d 61 70 2c 20 27 2e 27 2c 20 70 61 67 65 73  zMap, '.', pages
2850: 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ize);.    memset
2860: 28 7a 4d 61 70 2c 20 27 31 27 2c 20 68 64 72 53  (zMap, '1', hdrS
2870: 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ize);.    memset
2880: 28 26 7a 4d 61 70 5b 68 64 72 53 69 7a 65 5d 2c  (&zMap[hdrSize],
2890: 20 27 48 27 2c 20 69 43 65 6c 6c 50 74 72 29 3b   'H', iCellPtr);
28a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4d 61  .    memset(&zMa
28b0: 70 5b 68 64 72 53 69 7a 65 2b 69 43 65 6c 6c 50  p[hdrSize+iCellP
28c0: 74 72 5d 2c 20 27 50 27 2c 20 32 2a 6e 43 65 6c  tr], 'P', 2*nCel
28d0: 6c 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  l);.  }.  for(i=
28e0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
28f0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 66 73 74 20  {.    int cofst 
2900: 3d 20 69 43 65 6c 6c 50 74 72 20 2b 20 69 2a 32  = iCellPtr + i*2
2910: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 65 73  ;.    char *zDes
2920: 63 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20  c;.    int n;.. 
2930: 20 20 20 63 6f 66 73 74 20 3d 20 61 5b 63 6f 66     cofst = a[cof
2940: 73 74 5d 2a 32 35 36 20 2b 20 61 5b 63 6f 66 73  st]*256 + a[cofs
2950: 74 2b 31 5d 3b 0a 20 20 20 20 6e 20 3d 20 64 65  t+1];.    n = de
2960: 73 63 72 69 62 65 43 65 6c 6c 28 61 5b 30 5d 2c  scribeCell(a[0],
2970: 20 26 61 5b 63 6f 66 73 74 2d 68 64 72 53 69 7a   &a[cofst-hdrSiz
2980: 65 5d 2c 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74  e], showCellCont
2990: 65 6e 74 2c 20 26 7a 44 65 73 63 29 3b 0a 20 20  ent, &zDesc);.  
29a0: 20 20 69 66 28 20 73 68 6f 77 4d 61 70 20 29 7b    if( showMap ){
29b0: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
29c0: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  [30];.      mems
29d0: 65 74 28 26 7a 4d 61 70 5b 63 6f 66 73 74 5d 2c  et(&zMap[cofst],
29e0: 20 27 2a 27 2c 20 6e 29 3b 0a 20 20 20 20 20 20   '*', n);.      
29f0: 7a 4d 61 70 5b 63 6f 66 73 74 5d 20 3d 20 27 5b  zMap[cofst] = '[
2a00: 27 3b 0a 20 20 20 20 20 20 7a 4d 61 70 5b 63 6f  ';.      zMap[co
2a10: 66 73 74 2b 6e 2d 31 5d 20 3d 20 27 5d 27 3b 0a  fst+n-1] = ']';.
2a20: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
2a30: 75 66 2c 20 22 25 64 22 2c 20 69 29 3b 0a 20 20  uf, "%d", i);.  
2a40: 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
2a50: 42 75 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Buf);.      if( 
2a60: 6a 3c 3d 6e 2d 32 20 29 20 6d 65 6d 63 70 79 28  j<=n-2 ) memcpy(
2a70: 26 7a 4d 61 70 5b 63 6f 66 73 74 2b 31 5d 2c 20  &zMap[cofst+1], 
2a80: 7a 42 75 66 2c 20 6a 29 3b 0a 20 20 20 20 7d 0a  zBuf, j);.    }.
2a90: 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 30 33      printf(" %03
2aa0: 78 3a 20 63 65 6c 6c 5b 25 64 5d 20 25 73 5c 6e  x: cell[%d] %s\n
2ab0: 22 2c 20 63 6f 66 73 74 2c 20 69 2c 20 7a 44 65  ", cofst, i, zDe
2ac0: 73 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  sc);.  }.  if( s
2ad0: 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20 66 6f  howMap ){.    fo
2ae0: 72 28 69 3d 30 3b 20 69 3c 70 61 67 65 73 69 7a  r(i=0; i<pagesiz
2af0: 65 3b 20 69 2b 3d 36 34 29 7b 0a 20 20 20 20 20  e; i+=64){.     
2b00: 20 70 72 69 6e 74 66 28 22 20 25 30 33 78 3a 20   printf(" %03x: 
2b10: 25 2e 36 34 73 5c 6e 22 2c 20 69 2c 20 26 7a 4d  %.64s\n", i, &zM
2b20: 61 70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ap[i]);.    }.  
2b30: 20 20 66 72 65 65 28 7a 4d 61 70 29 3b 0a 20 20    free(zMap);.  
2b40: 7d 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  }  .}../*.** Dec
2b50: 6f 64 65 20 61 20 66 72 65 65 6c 69 73 74 20 74  ode a freelist t
2b60: 72 75 6e 6b 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  runk page..*/.st
2b70: 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65  atic void decode
2b80: 5f 74 72 75 6e 6b 5f 70 61 67 65 28 0a 20 20 69  _trunk_page(.  i
2b90: 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  nt pgno,        
2ba0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2bb0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
2bc0: 20 70 61 67 65 73 69 7a 65 2c 20 20 20 20 20 20   pagesize,      
2bd0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
2be0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ch page */.  int
2bf0: 20 64 65 74 61 69 6c 2c 20 20 20 20 20 20 20 20   detail,        
2c00: 20 20 20 2f 2a 20 53 68 6f 77 20 6c 65 61 66 20     /* Show leaf 
2c10: 70 61 67 65 73 20 69 66 20 74 72 75 65 20 2a 2f  pages if true */
2c20: 0a 20 20 69 6e 74 20 72 65 63 75 72 73 69 76 65  .  int recursive
2c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c           /* Foll
2c40: 6f 77 20 74 68 65 20 74 72 75 6e 6b 20 63 68 61  ow the trunk cha
2c50: 6e 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  nge if true */.)
2c60: 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20 6b 3b  {.  int n, i, k;
2c70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2c80: 20 2a 61 3b 0a 20 20 77 68 69 6c 65 28 20 70 67   *a;.  while( pg
2c90: 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 61 20 3d 20  no>0 ){.    a = 
2ca0: 67 65 74 43 6f 6e 74 65 6e 74 28 28 70 67 6e 6f  getContent((pgno
2cb0: 2d 31 29 2a 70 61 67 65 73 69 7a 65 2c 20 70 61  -1)*pagesize, pa
2cc0: 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 70 72 69  gesize);.    pri
2cd0: 6e 74 66 28 22 44 65 63 6f 64 65 20 6f 66 20 66  ntf("Decode of f
2ce0: 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2cf0: 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67 6e 6f 29  ge %d:\n", pgno)
2d00: 3b 0a 20 20 20 20 70 72 69 6e 74 5f 64 65 63 6f  ;.    print_deco
2d10: 64 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 34 2c  de_line(a, 0, 4,
2d20: 20 22 4e 65 78 74 20 66 72 65 65 6c 69 73 74 20   "Next freelist 
2d30: 74 72 75 6e 6b 20 70 61 67 65 22 29 3b 0a 20 20  trunk page");.  
2d40: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
2d50: 69 6e 65 28 61 2c 20 34 2c 20 34 2c 20 22 4e 75  ine(a, 4, 4, "Nu
2d60: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2d70: 6f 6e 20 74 68 69 73 20 70 61 67 65 22 29 3b 0a  on this page");.
2d80: 20 20 20 20 69 66 28 20 64 65 74 61 69 6c 20 29      if( detail )
2d90: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  {.      n = (int
2da0: 29 64 65 63 6f 64 65 49 6e 74 33 32 28 26 61 5b  )decodeInt32(&a[
2db0: 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
2dc0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
2dd0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2de0: 69 6e 74 20 78 20 3d 20 64 65 63 6f 64 65 49 6e  int x = decodeIn
2df0: 74 33 32 28 26 61 5b 38 2b 34 2a 69 5d 29 3b 0a  t32(&a[8+4*i]);.
2e00: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 49 64          char zId
2e10: 78 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  x[10];.        s
2e20: 70 72 69 6e 74 66 28 7a 49 64 78 2c 20 22 5b 25  printf(zIdx, "[%
2e30: 64 5d 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  d]", i);.       
2e40: 20 70 72 69 6e 74 66 28 22 20 20 25 35 73 20 25   printf("  %5s %
2e50: 37 75 22 2c 20 7a 49 64 78 2c 20 78 29 3b 0a 20  7u", zIdx, x);. 
2e60: 20 20 20 20 20 20 20 69 66 28 20 69 25 35 3d 3d         if( i%5==
2e70: 34 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29  4 ) printf("\n")
2e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e90: 69 66 28 20 69 25 35 21 3d 30 20 29 20 70 72 69  if( i%5!=0 ) pri
2ea0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
2eb0: 0a 20 20 20 20 69 66 28 20 21 72 65 63 75 72 73  .    if( !recurs
2ec0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  ive ){.      pgn
2ed0: 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  o = 0;.    }else
2ee0: 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 28  {.      pgno = (
2ef0: 69 6e 74 29 64 65 63 6f 64 65 49 6e 74 33 32 28  int)decodeInt32(
2f00: 26 61 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  &a[0]);.    }.  
2f10: 20 20 66 72 65 65 28 61 29 3b 0a 20 20 7d 0a 7d    free(a);.  }.}
2f20: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 68 6f 72 74 20  ../*.** A short 
2f30: 74 65 78 74 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  text comment on 
2f40: 74 68 65 20 75 73 65 20 6f 66 20 65 61 63 68 20  the use of each 
2f50: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2f60: 63 68 61 72 20 2a 2a 7a 50 61 67 65 55 73 65 3b  char **zPageUse;
2f70: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 63 6f  ../*.** Add a co
2f80: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 75 73 65  mment on the use
2f90: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2f 0a 73   of a page..*/.s
2fa0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
2fb0: 75 73 61 67 65 5f 6d 73 67 28 69 6e 74 20 70 67  usage_msg(int pg
2fc0: 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  no, const char *
2fd0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
2fe0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2ff0: 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20 20 76 61  har *zMsg;..  va
3000: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
3010: 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71  at);.  zMsg = sq
3020: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
3030: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
3040: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
3050: 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f   pgno<=0 || pgno
3060: 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 70  >mxPage ){.    p
3070: 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 70 61  rintf("ERROR: pa
3080: 67 65 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  ge %d out of ran
3090: 67 65 20 31 2e 2e 25 64 3a 20 25 73 5c 6e 22 2c  ge 1..%d: %s\n",
30a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e  .            pgn
30b0: 6f 2c 20 6d 78 50 61 67 65 2c 20 7a 4d 73 67 29  o, mxPage, zMsg)
30c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
30d0: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 72 65  ee(zMsg);.    re
30e0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
30f0: 7a 50 61 67 65 55 73 65 5b 70 67 6e 6f 5d 21 3d  zPageUse[pgno]!=
3100: 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  0 ){.    printf(
3110: 22 45 52 52 4f 52 3a 20 70 61 67 65 20 25 64 20  "ERROR: page %d 
3120: 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  used multiple ti
3130: 6d 65 73 3a 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a  mes:\n", pgno);.
3140: 20 20 20 20 70 72 69 6e 74 66 28 22 45 52 52 4f      printf("ERRO
3150: 52 3a 20 20 20 20 70 72 65 76 69 6f 75 73 3a 20  R:    previous: 
3160: 25 73 5c 6e 22 2c 20 7a 50 61 67 65 55 73 65 5b  %s\n", zPageUse[
3170: 70 67 6e 6f 5d 29 3b 0a 20 20 20 20 70 72 69 6e  pgno]);.    prin
3180: 74 66 28 22 45 52 52 4f 52 3a 20 20 20 20 63 75  tf("ERROR:    cu
3190: 72 72 65 6e 74 3a 20 20 25 73 5c 6e 22 2c 20 7a  rrent:  %s\n", z
31a0: 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
31b0: 33 5f 66 72 65 65 28 7a 50 61 67 65 55 73 65 5b  3_free(zPageUse[
31c0: 70 67 6e 6f 5d 29 3b 0a 20 20 7d 0a 20 20 7a 50  pgno]);.  }.  zP
31d0: 61 67 65 55 73 65 5b 70 67 6e 6f 5d 20 3d 20 7a  ageUse[pgno] = z
31e0: 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Msg;.}../*.** Fi
31f0: 6e 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nd overflow page
3200: 73 20 6f 66 20 61 20 63 65 6c 6c 20 61 6e 64 20  s of a cell and 
3210: 64 65 73 63 72 69 62 65 20 74 68 65 69 72 20 75  describe their u
3220: 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
3230: 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67 65 5f  void page_usage_
3240: 63 65 6c 6c 28 0a 20 20 75 6e 73 69 67 6e 65 64  cell(.  unsigned
3250: 20 63 68 61 72 20 63 54 79 70 65 2c 20 20 20 20   char cType,    
3260: 2f 2a 20 50 61 67 65 20 74 79 70 65 20 2a 2f 0a  /* Page type */.
3270: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3280: 2a 61 2c 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  *a,       /* Cel
3290: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
32a0: 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  nt pgno,        
32b0: 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 20 63         /* page c
32c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
32d0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ll */.  int cell
32e0: 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
32f0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
3300: 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
3310: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
3320: 20 20 69 6e 74 20 6e 44 65 73 63 20 3d 20 30 3b    int nDesc = 0;
3330: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
3340: 69 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  i64 nPayload;.  
3350: 69 36 34 20 72 6f 77 69 64 3b 0a 20 20 69 6e 74  i64 rowid;.  int
3360: 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69 20 3d 20 30   nLocal;.  i = 0
3370: 3b 0a 20 20 69 66 28 20 63 54 79 70 65 3c 3d 35  ;.  if( cType<=5
3380: 20 29 7b 0a 20 20 20 20 61 20 2b 3d 20 34 3b 0a   ){.    a += 4;.
3390: 20 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20 7d 0a      n += 4;.  }.
33a0: 20 20 69 66 28 20 63 54 79 70 65 21 3d 35 20 29    if( cType!=5 )
33b0: 7b 0a 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65  {.    i = decode
33c0: 56 61 72 69 6e 74 28 61 2c 20 26 6e 50 61 79 6c  Varint(a, &nPayl
33d0: 6f 61 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69  oad);.    a += i
33e0: 3b 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20  ;.    n += i;.  
33f0: 20 20 6e 4c 6f 63 61 6c 20 3d 20 6c 6f 63 61 6c    nLocal = local
3400: 50 61 79 6c 6f 61 64 28 6e 50 61 79 6c 6f 61 64  Payload(nPayload
3410: 2c 20 63 54 79 70 65 29 3b 0a 20 20 7d 65 6c 73  , cType);.  }els
3420: 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  e{.    nPayload 
3430: 3d 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20  = nLocal = 0;.  
3440: 7d 0a 20 20 69 66 28 20 63 54 79 70 65 3d 3d 35  }.  if( cType==5
3450: 20 7c 7c 20 63 54 79 70 65 3d 3d 31 33 20 29 7b   || cType==13 ){
3460: 0a 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56  .    i = decodeV
3470: 61 72 69 6e 74 28 61 2c 20 26 72 6f 77 69 64 29  arint(a, &rowid)
3480: 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b 0a 20 20  ;.    a += i;.  
3490: 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20    n += i;.  }.  
34a0: 69 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79 6c  if( nLocal<nPayl
34b0: 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oad ){.    int o
34c0: 76 66 6c 20 3d 20 64 65 63 6f 64 65 49 6e 74 33  vfl = decodeInt3
34d0: 32 28 61 2b 6e 4c 6f 63 61 6c 29 3b 0a 20 20 20  2(a+nLocal);.   
34e0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
34f0: 20 20 77 68 69 6c 65 28 20 6f 76 66 6c 20 26 26    while( ovfl &&
3500: 20 28 63 6e 74 2b 2b 29 3c 6d 78 50 61 67 65 20   (cnt++)<mxPage 
3510: 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 75 73  ){.      page_us
3520: 61 67 65 5f 6d 73 67 28 6f 76 66 6c 2c 20 22 6f  age_msg(ovfl, "o
3530: 76 65 72 66 6c 6f 77 20 25 64 20 66 72 6f 6d 20  verflow %d from 
3540: 63 65 6c 6c 20 25 64 20 6f 66 20 70 61 67 65 20  cell %d of page 
3550: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
3560: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 63            cnt, c
3570: 65 6c 6c 6e 6f 2c 20 70 67 6e 6f 29 3b 0a 20 20  ellno, pgno);.  
3580: 20 20 20 20 61 20 3d 20 67 65 74 43 6f 6e 74 65      a = getConte
3590: 6e 74 28 28 6f 76 66 6c 2d 31 29 2a 70 61 67 65  nt((ovfl-1)*page
35a0: 73 69 7a 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  size, 4);.      
35b0: 6f 76 66 6c 20 3d 20 64 65 63 6f 64 65 49 6e 74  ovfl = decodeInt
35c0: 33 32 28 61 29 3b 0a 20 20 20 20 20 20 66 72 65  32(a);.      fre
35d0: 65 28 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(a);.    }.  }.
35e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 63 72 69  }.../*.** Descri
35f0: 62 65 20 74 68 65 20 75 73 61 67 65 73 20 6f 66  be the usages of
3600: 20 61 20 62 2d 74 72 65 65 20 70 61 67 65 0a 2a   a b-tree page.*
3610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
3620: 67 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28 0a  ge_usage_btree(.
3630: 20 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20    int pgno,     
3640: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
3650: 74 6f 20 64 65 73 63 72 69 62 65 20 2a 2f 0a 20  to describe */. 
3660: 20 69 6e 74 20 70 61 72 65 6e 74 2c 20 20 20 20   int parent,    
3670: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
3680: 20 6f 66 20 74 68 69 73 20 70 61 67 65 2e 20 20   of this page.  
3690: 30 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  0 for root pages
36a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
36c0: 68 69 63 68 20 63 68 69 6c 64 20 6f 66 20 74 68  hich child of th
36d0: 65 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 63 6f  e parent */.  co
36e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
36f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3700: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
3710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3720: 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  a;.  const char 
3730: 2a 7a 54 79 70 65 20 3d 20 22 63 6f 72 72 75 70  *zType = "corrup
3740: 74 20 6e 6f 64 65 22 3b 0a 20 20 69 6e 74 20 6e  t node";.  int n
3750: 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cell;.  int i;. 
3760: 20 69 6e 74 20 68 64 72 20 3d 20 70 67 6e 6f 3d   int hdr = pgno=
3770: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 0a 20  =1 ? 100 : 0;.. 
3780: 20 69 66 28 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20   if( pgno<=0 || 
3790: 70 67 6e 6f 3e 6d 78 50 61 67 65 20 29 20 72 65  pgno>mxPage ) re
37a0: 74 75 72 6e 3b 0a 20 20 61 20 3d 20 67 65 74 43  turn;.  a = getC
37b0: 6f 6e 74 65 6e 74 28 28 70 67 6e 6f 2d 31 29 2a  ontent((pgno-1)*
37c0: 70 61 67 65 73 69 7a 65 2c 20 70 61 67 65 73 69  pagesize, pagesi
37d0: 7a 65 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  ze);.  switch( a
37e0: 5b 68 64 72 5d 20 29 7b 0a 20 20 20 20 63 61 73  [hdr] ){.    cas
37f0: 65 20 32 3a 20 20 7a 54 79 70 65 20 3d 20 22 69  e 2:  zType = "i
3800: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 6f 66 20  nterior node of 
3810: 69 6e 64 65 78 22 3b 20 20 62 72 65 61 6b 3b 0a  index";  break;.
3820: 20 20 20 20 63 61 73 65 20 35 3a 20 20 7a 54 79      case 5:  zTy
3830: 70 65 20 3d 20 22 69 6e 74 65 72 69 6f 72 20 6e  pe = "interior n
3840: 6f 64 65 20 6f 66 20 74 61 62 6c 65 22 3b 20 20  ode of table";  
3850: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3860: 31 30 3a 20 7a 54 79 70 65 20 3d 20 22 6c 65 61  10: zType = "lea
3870: 66 20 6f 66 20 69 6e 64 65 78 22 3b 20 20 20 20  f of index";    
3880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3890: 20 20 63 61 73 65 20 31 33 3a 20 7a 54 79 70 65    case 13: zType
38a0: 20 3d 20 22 6c 65 61 66 20 6f 66 20 74 61 62 6c   = "leaf of tabl
38b0: 65 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  e";           br
38c0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
38d0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 70 61 67  arent ){.    pag
38e0: 65 5f 75 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f  e_usage_msg(pgno
38f0: 2c 20 22 25 73 20 5b 25 73 5d 2c 20 63 68 69 6c  , "%s [%s], chil
3900: 64 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22  d %d of page %d"
3910: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3920: 20 20 20 20 20 7a 54 79 70 65 2c 20 7a 4e 61 6d       zType, zNam
3930: 65 2c 20 69 64 78 2c 20 70 61 72 65 6e 74 29 3b  e, idx, parent);
3940: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61  .  }else{.    pa
3950: 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70 67 6e  ge_usage_msg(pgn
3960: 6f 2c 20 22 72 6f 6f 74 20 25 73 20 5b 25 73 5d  o, "root %s [%s]
3970: 22 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 29  ", zType, zName)
3980: 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
3990: 61 5b 68 64 72 2b 33 5d 2a 32 35 36 20 2b 20 61  a[hdr+3]*256 + a
39a0: 5b 68 64 72 2b 34 5d 3b 0a 20 20 69 66 28 20 61  [hdr+4];.  if( a
39b0: 5b 68 64 72 5d 3d 3d 32 20 7c 7c 20 61 5b 68 64  [hdr]==2 || a[hd
39c0: 72 5d 3d 3d 35 20 29 7b 0a 20 20 20 20 69 6e 74  r]==5 ){.    int
39d0: 20 63 65 6c 6c 73 74 61 72 74 20 3d 20 68 64 72   cellstart = hdr
39e0: 2b 31 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  +12;.    unsigne
39f0: 64 20 69 6e 74 20 63 68 69 6c 64 3b 0a 20 20 20  d int child;.   
3a00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
3a10: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
3a20: 6e 74 20 6f 66 73 74 3b 0a 0a 20 20 20 20 20 20  nt ofst;..      
3a30: 6f 66 73 74 20 3d 20 63 65 6c 6c 73 74 61 72 74  ofst = cellstart
3a40: 20 2b 20 69 2a 32 3b 0a 20 20 20 20 20 20 6f 66   + i*2;.      of
3a50: 73 74 20 3d 20 61 5b 6f 66 73 74 5d 2a 32 35 36  st = a[ofst]*256
3a60: 20 2b 20 61 5b 6f 66 73 74 2b 31 5d 3b 0a 20 20   + a[ofst+1];.  
3a70: 20 20 20 20 63 68 69 6c 64 20 3d 20 64 65 63 6f      child = deco
3a80: 64 65 49 6e 74 33 32 28 61 2b 6f 66 73 74 29 3b  deInt32(a+ofst);
3a90: 0a 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67  .      page_usag
3aa0: 65 5f 62 74 72 65 65 28 63 68 69 6c 64 2c 20 70  e_btree(child, p
3ab0: 67 6e 6f 2c 20 69 2c 20 7a 4e 61 6d 65 29 3b 0a  gno, i, zName);.
3ac0: 20 20 20 20 7d 0a 20 20 20 20 63 68 69 6c 64 20      }.    child 
3ad0: 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28 61 2b  = decodeInt32(a+
3ae0: 63 65 6c 6c 73 74 61 72 74 2d 34 29 3b 0a 20 20  cellstart-4);.  
3af0: 20 20 70 61 67 65 5f 75 73 61 67 65 5f 62 74 72    page_usage_btr
3b00: 65 65 28 63 68 69 6c 64 2c 20 70 67 6e 6f 2c 20  ee(child, pgno, 
3b10: 69 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i, zName);.  }. 
3b20: 20 69 66 28 20 61 5b 68 64 72 5d 3d 3d 32 20 7c   if( a[hdr]==2 |
3b30: 7c 20 61 5b 68 64 72 5d 3d 3d 31 30 20 7c 7c 20  | a[hdr]==10 || 
3b40: 61 5b 68 64 72 5d 3d 3d 31 33 20 29 7b 0a 20 20  a[hdr]==13 ){.  
3b50: 20 20 69 6e 74 20 63 65 6c 6c 73 74 61 72 74 20    int cellstart 
3b60: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 61  = hdr + 8 + 4*(a
3b70: 5b 68 64 72 5d 3c 3d 35 29 3b 0a 20 20 20 20 66  [hdr]<=5);.    f
3b80: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
3b90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
3ba0: 20 6f 66 73 74 3b 0a 20 20 20 20 20 20 6f 66 73   ofst;.      ofs
3bb0: 74 20 3d 20 63 65 6c 6c 73 74 61 72 74 20 2b 20  t = cellstart + 
3bc0: 69 2a 32 3b 0a 20 20 20 20 20 20 6f 66 73 74 20  i*2;.      ofst 
3bd0: 3d 20 61 5b 6f 66 73 74 5d 2a 32 35 36 20 2b 20  = a[ofst]*256 + 
3be0: 61 5b 6f 66 73 74 2b 31 5d 3b 0a 20 20 20 20 20  a[ofst+1];.     
3bf0: 20 70 61 67 65 5f 75 73 61 67 65 5f 63 65 6c 6c   page_usage_cell
3c00: 28 61 5b 68 64 72 5d 2c 20 61 2b 6f 66 73 74 2c  (a[hdr], a+ofst,
3c10: 20 70 67 6e 6f 2c 20 69 29 3b 0a 20 20 20 20 7d   pgno, i);.    }
3c20: 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 29 3b 0a  .  }.  free(a);.
3c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
3c40: 6e 65 20 70 61 67 65 20 75 73 61 67 65 20 62 79  ne page usage by
3c50: 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 2a 2f   the freelist.*/
3c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
3c70: 65 5f 75 73 61 67 65 5f 66 72 65 65 6c 69 73 74  e_usage_freelist
3c80: 28 69 6e 74 20 70 67 6e 6f 29 7b 0a 20 20 75 6e  (int pgno){.  un
3c90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a  signed char *a;.
3ca0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
3cb0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b   int i;.  int n;
3cc0: 0a 20 20 69 6e 74 20 69 4e 65 78 74 3b 0a 20 20  .  int iNext;.  
3cd0: 69 6e 74 20 70 61 72 65 6e 74 20 3d 20 31 3b 0a  int parent = 1;.
3ce0: 0a 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 3e 30  .  while( pgno>0
3cf0: 20 26 26 20 70 67 6e 6f 3c 3d 6d 78 50 61 67 65   && pgno<=mxPage
3d00: 20 26 26 20 28 63 6e 74 2b 2b 29 3c 6d 78 50 61   && (cnt++)<mxPa
3d10: 67 65 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 75  ge ){.    page_u
3d20: 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f 2c 20 22  sage_msg(pgno, "
3d30: 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 23  freelist trunk #
3d40: 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 22 2c  %d child of %d",
3d50: 20 63 6e 74 2c 20 70 61 72 65 6e 74 29 3b 0a 20   cnt, parent);. 
3d60: 20 20 20 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e     a = getConten
3d70: 74 28 28 70 67 6e 6f 2d 31 29 2a 70 61 67 65 73  t((pgno-1)*pages
3d80: 69 7a 65 2c 20 70 61 67 65 73 69 7a 65 29 3b 0a  ize, pagesize);.
3d90: 20 20 20 20 69 4e 65 78 74 20 3d 20 64 65 63 6f      iNext = deco
3da0: 64 65 49 6e 74 33 32 28 61 29 3b 0a 20 20 20 20  deInt32(a);.    
3db0: 6e 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28  n = decodeInt32(
3dc0: 61 2b 34 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  a+4);.    for(i=
3dd0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
3de0: 20 20 20 20 69 6e 74 20 63 68 69 6c 64 20 3d 20      int child = 
3df0: 64 65 63 6f 64 65 49 6e 74 33 32 28 61 20 2b 20  decodeInt32(a + 
3e00: 28 69 2a 34 2b 38 29 29 3b 0a 20 20 20 20 20 20  (i*4+8));.      
3e10: 70 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 63  page_usage_msg(c
3e20: 68 69 6c 64 2c 20 22 66 72 65 65 6c 69 73 74 20  hild, "freelist 
3e30: 6c 65 61 66 2c 20 63 68 69 6c 64 20 25 64 20 6f  leaf, child %d o
3e40: 66 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 22  f trunk page %d"
3e50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3e60: 20 20 20 20 20 20 20 69 2c 20 70 67 6e 6f 29 3b         i, pgno);
3e70: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
3e80: 61 29 3b 0a 20 20 20 20 70 61 72 65 6e 74 20 3d  a);.    parent =
3e90: 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20   pgno;.    pgno 
3ea0: 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a  = iNext;.  }.}..
3eb0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
3ec0: 70 61 67 65 73 20 75 73 65 64 20 61 73 20 50 54  pages used as PT
3ed0: 52 4d 41 50 20 70 61 67 65 73 0a 2a 2f 0a 73 74  RMAP pages.*/.st
3ee0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 75  atic void page_u
3ef0: 73 61 67 65 5f 70 74 72 6d 61 70 28 75 6e 73 69  sage_ptrmap(unsi
3f00: 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20  gned char *a){. 
3f10: 20 69 66 28 20 61 5b 35 35 5d 20 29 7b 0a 20 20   if( a[55] ){.  
3f20: 20 20 69 6e 74 20 75 73 61 62 6c 65 20 3d 20 70    int usable = p
3f30: 61 67 65 73 69 7a 65 20 2d 20 61 5b 32 30 5d 3b  agesize - a[20];
3f40: 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
3f50: 32 3b 0a 20 20 20 20 69 6e 74 20 70 65 72 50 61  2;.    int perPa
3f60: 67 65 20 3d 20 75 73 61 62 6c 65 2f 35 3b 0a 20  ge = usable/5;. 
3f70: 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 3c 3d     while( pgno<=
3f80: 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
3f90: 70 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70  page_usage_msg(p
3fa0: 67 6e 6f 2c 20 22 50 54 52 4d 41 50 20 70 61 67  gno, "PTRMAP pag
3fb0: 65 20 63 6f 76 65 72 69 6e 67 20 25 64 2e 2e 25  e covering %d..%
3fc0: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3fe0: 67 6e 6f 2b 31 2c 20 70 67 6e 6f 2b 70 65 72 50  gno+1, pgno+perP
3ff0: 61 67 65 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  age);.      pgno
4000: 20 2b 3d 20 70 65 72 50 61 67 65 20 2b 20 31 3b   += perPage + 1;
4010: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4020: 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72  .** Try to figur
4030: 65 20 6f 75 74 20 68 6f 77 20 65 76 65 72 79 20  e out how every 
4040: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
4050: 62 61 73 65 20 66 69 6c 65 20 69 73 20 62 65 69  base file is bei
4060: 6e 67 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  ng used..*/.stat
4070: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 75 73 61  ic void page_usa
4080: 67 65 5f 72 65 70 6f 72 74 28 63 6f 6e 73 74 20  ge_report(const 
4090: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
40a0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
40b0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
40c0: 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  *db;.  sqlite3_s
40d0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 75 6e  tmt *pStmt;.  un
40e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a  signed char *a;.
40f0: 20 20 63 68 61 72 20 7a 51 75 65 72 79 5b 32 30    char zQuery[20
4100: 30 5d 3b 0a 0a 20 20 2f 2a 20 41 76 6f 69 64 20  0];..  /* Avoid 
4110: 74 68 65 20 70 61 74 68 6f 6c 6f 67 69 63 61 6c  the pathological
4120: 20 63 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 6d   case */.  if( m
4130: 78 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 70  xPage<1 ){.    p
4140: 72 69 6e 74 66 28 22 65 6d 70 74 79 20 64 61 74  rintf("empty dat
4150: 61 62 61 73 65 5c 6e 22 29 3b 0a 20 20 20 20 72  abase\n");.    r
4160: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
4170: 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   Open the databa
4180: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 72 63 20  se file */.  rc 
4190: 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
41a0: 44 62 4e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  DbName, &db);.  
41b0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 72  if( rc ){.    pr
41c0: 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 6f 70 65  intf("cannot ope
41d0: 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e  n database: %s\n
41e0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
41f0: 67 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  g(db));.    sqli
4200: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
4210: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
4220: 20 20 2f 2a 20 53 65 74 20 75 70 20 67 6c 6f 62    /* Set up glob
4230: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 50 61  al variables zPa
4240: 67 65 55 73 65 5b 5d 20 61 6e 64 20 6d 78 50 61  geUse[] and mxPa
4250: 67 65 20 74 6f 20 72 65 63 6f 72 64 20 70 61 67  ge to record pag
4260: 65 0a 20 20 2a 2a 20 75 73 61 67 65 73 20 2a 2f  e.  ** usages */
4270: 0a 20 20 7a 50 61 67 65 55 73 65 20 3d 20 73 71  .  zPageUse = sq
4280: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
4290: 7a 65 6f 66 28 7a 50 61 67 65 55 73 65 5b 30 5d  zeof(zPageUse[0]
42a0: 29 2a 28 6d 78 50 61 67 65 2b 31 29 20 29 3b 0a  )*(mxPage+1) );.
42b0: 20 20 69 66 28 20 7a 50 61 67 65 55 73 65 3d 3d    if( zPageUse==
42c0: 30 20 29 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  0 ) out_of_memor
42d0: 79 28 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 50  y();.  memset(zP
42e0: 61 67 65 55 73 65 2c 20 30 2c 20 73 69 7a 65 6f  ageUse, 0, sizeo
42f0: 66 28 7a 50 61 67 65 55 73 65 5b 30 5d 29 2a 28  f(zPageUse[0])*(
4300: 6d 78 50 61 67 65 2b 31 29 29 3b 0a 0a 20 20 2f  mxPage+1));..  /
4310: 2a 20 44 69 73 63 6f 76 65 72 20 74 68 65 20 75  * Discover the u
4320: 73 61 67 65 20 6f 66 20 65 61 63 68 20 70 61 67  sage of each pag
4330: 65 20 2a 2f 0a 20 20 61 20 3d 20 67 65 74 43 6f  e */.  a = getCo
4340: 6e 74 65 6e 74 28 30 2c 20 31 30 30 29 3b 0a 20  ntent(0, 100);. 
4350: 20 70 61 67 65 5f 75 73 61 67 65 5f 66 72 65 65   page_usage_free
4360: 6c 69 73 74 28 64 65 63 6f 64 65 49 6e 74 33 32  list(decodeInt32
4370: 28 61 2b 33 32 29 29 3b 0a 20 20 70 61 67 65 5f  (a+32));.  page_
4380: 75 73 61 67 65 5f 70 74 72 6d 61 70 28 61 29 3b  usage_ptrmap(a);
4390: 0a 20 20 66 72 65 65 28 61 29 3b 0a 20 20 70 61  .  free(a);.  pa
43a0: 67 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28 31  ge_usage_btree(1
43b0: 2c 20 30 2c 20 30 2c 20 22 73 71 6c 69 74 65 5f  , 0, 0, "sqlite_
43c0: 6d 61 73 74 65 72 22 29 3b 0a 20 20 73 71 6c 69  master");.  sqli
43d0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 50 52  te3_exec(db, "PR
43e0: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
43f0: 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20  hema=ON", 0, 0, 
4400: 30 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  0);.  for(j=0; j
4410: 3c 32 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71  <2; j++){.    sq
4420: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
4430: 69 7a 65 6f 66 28 7a 51 75 65 72 79 29 2c 20 7a  izeof(zQuery), z
4440: 51 75 65 72 79 2c 0a 20 20 20 20 20 20 20 20 20  Query,.         
4450: 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65      "SELECT type
4460: 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  , name, rootpage
4470: 20 46 52 4f 4d 20 53 51 4c 49 54 45 5f 4d 41 53   FROM SQLITE_MAS
4480: 54 45 52 20 57 48 45 52 45 20 72 6f 6f 74 70 61  TER WHERE rootpa
4490: 67 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge".            
44a0: 20 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69   " ORDER BY rowi
44b0: 64 20 25 73 22 2c 20 6a 3f 22 44 45 53 43 22 3a  d %s", j?"DESC":
44c0: 22 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  "");.    rc = sq
44d0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
44e0: 28 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  (db, zQuery, -1,
44f0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
4500: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4510: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  OK ){.      whil
4520: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
4530: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
4540: 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OW ){.        in
4550: 74 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33  t pgno = sqlite3
4560: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
4570: 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 2);.        p
4580: 61 67 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28  age_usage_btree(
4590: 70 67 6e 6f 2c 20 30 2c 20 30 2c 20 73 71 6c 69  pgno, 0, 0, sqli
45a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
45b0: 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20  pStmt, 1));.    
45c0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
45d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 45 52 52       printf("ERR
45e0: 4f 52 3a 20 63 61 6e 6e 6f 74 20 71 75 65 72 79  OR: cannot query
45f0: 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22   database: %s\n"
4600: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
4610: 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (db));.    }.   
4620: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
4630: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
4640: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
4650: 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
4660: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  }.  sqlite3_clos
4670: 65 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 50 72 69  e(db);..  /* Pri
4680: 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 61 6e  nt the report an
4690: 64 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 75 73  d free memory us
46a0: 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
46b0: 20 69 3c 3d 6d 78 50 61 67 65 3b 20 69 2b 2b 29   i<=mxPage; i++)
46c0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 35  {.    printf("%5
46d0: 64 3a 20 25 73 5c 6e 22 2c 20 69 2c 20 7a 50 61  d: %s\n", i, zPa
46e0: 67 65 55 73 65 5b 69 5d 20 3f 20 7a 50 61 67 65  geUse[i] ? zPage
46f0: 55 73 65 5b 69 5d 20 3a 20 22 3f 3f 3f 22 29 3b  Use[i] : "???");
4700: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4710: 65 28 7a 50 61 67 65 55 73 65 5b 69 5d 29 3b 0a  e(zPageUse[i]);.
4720: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
4730: 65 65 28 7a 50 61 67 65 55 73 65 29 3b 0a 20 20  ee(zPageUse);.  
4740: 7a 50 61 67 65 55 73 65 20 3d 20 30 3b 0a 7d 0a  zPageUse = 0;.}.
4750: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69  ./*.** Try to fi
4760: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 65 76 65  gure out how eve
4770: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ry page in the d
4780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
4790: 62 65 69 6e 67 20 75 73 65 64 2e 0a 2a 2f 0a 73  being used..*/.s
47a0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
47b0: 70 5f 63 6f 76 65 72 61 67 65 5f 72 65 70 6f 72  p_coverage_repor
47c0: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  t(const char *zD
47d0: 62 4e 61 6d 65 29 7b 0a 20 20 75 6e 73 69 67 6e  bName){.  unsign
47e0: 65 64 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 75  ed int pgno;.  u
47f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 48  nsigned char *aH
4800: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
4810: 68 61 72 20 2a 61 3b 0a 20 20 69 6e 74 20 75 73  har *a;.  int us
4820: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 70 65 72 50  able;.  int perP
4830: 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  age;.  unsigned 
4840: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 76 6f  int i;..  /* Avo
4850: 69 64 20 74 68 65 20 70 61 74 68 6f 6c 6f 67 69  id the pathologi
4860: 63 61 6c 20 63 61 73 65 20 2a 2f 0a 20 20 69 66  cal case */.  if
4870: 28 20 6d 78 50 61 67 65 3c 31 20 29 7b 0a 20 20  ( mxPage<1 ){.  
4880: 20 20 70 72 69 6e 74 66 28 22 65 6d 70 74 79 20    printf("empty 
4890: 64 61 74 61 62 61 73 65 5c 6e 22 29 3b 0a 20 20  database\n");.  
48a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
48b0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 50 54   /* Make sure PT
48c0: 52 4d 41 50 73 20 61 72 65 20 75 73 65 64 20 69  RMAPs are used i
48d0: 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
48e0: 2a 2f 0a 20 20 61 48 64 72 20 3d 20 67 65 74 43  */.  aHdr = getC
48f0: 6f 6e 74 65 6e 74 28 30 2c 20 31 30 30 29 3b 0a  ontent(0, 100);.
4900: 20 20 69 66 28 20 61 48 64 72 5b 35 35 5d 3d 3d    if( aHdr[55]==
4910: 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  0 ){.    printf(
4920: 22 64 61 74 61 62 61 73 65 20 64 6f 65 73 20 6e  "database does n
4930: 6f 74 20 75 73 65 20 50 54 52 4d 41 50 20 70 61  ot use PTRMAP pa
4940: 67 65 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ges\n");.    ret
4950: 75 72 6e 3b 0a 20 20 7d 0a 20 20 75 73 61 62 6c  urn;.  }.  usabl
4960: 65 20 3d 20 70 61 67 65 73 69 7a 65 20 2d 20 61  e = pagesize - a
4970: 48 64 72 5b 32 30 5d 3b 0a 20 20 70 65 72 50 61  Hdr[20];.  perPa
4980: 67 65 20 3d 20 75 73 61 62 6c 65 2f 35 3b 0a 20  ge = usable/5;. 
4990: 20 66 72 65 65 28 61 48 64 72 29 3b 0a 20 20 70   free(aHdr);.  p
49a0: 72 69 6e 74 66 28 22 25 35 64 3a 20 72 6f 6f 74  rintf("%5d: root
49b0: 20 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   of sqlite_maste
49c0: 72 5c 6e 22 2c 20 31 29 3b 0a 20 20 66 6f 72 28  r\n", 1);.  for(
49d0: 70 67 6e 6f 3d 32 3b 20 70 67 6e 6f 3c 3d 6d 78  pgno=2; pgno<=mx
49e0: 50 61 67 65 3b 20 70 67 6e 6f 20 2b 3d 20 70 65  Page; pgno += pe
49f0: 72 50 61 67 65 2b 31 29 7b 0a 20 20 20 20 70 72  rPage+1){.    pr
4a00: 69 6e 74 66 28 22 25 35 64 3a 20 50 54 52 4d 41  intf("%5d: PTRMA
4a10: 50 20 70 61 67 65 20 63 6f 76 65 72 69 6e 67 20  P page covering 
4a20: 25 64 2e 2e 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c  %d..%d\n", pgno,
4a30: 0a 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  .           pgno
4a40: 2b 31 2c 20 70 67 6e 6f 2b 70 65 72 50 61 67 65  +1, pgno+perPage
4a50: 29 3b 0a 20 20 20 20 61 20 3d 20 67 65 74 43 6f  );.    a = getCo
4a60: 6e 74 65 6e 74 28 28 70 67 6e 6f 2d 31 29 2a 70  ntent((pgno-1)*p
4a70: 61 67 65 73 69 7a 65 2c 20 75 73 61 62 6c 65 29  agesize, usable)
4a80: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4a90: 2b 35 3c 3d 75 73 61 62 6c 65 20 26 26 20 70 67  +5<=usable && pg
4aa0: 6e 6f 2b 31 2b 69 2f 35 3c 3d 6d 78 50 61 67 65  no+1+i/5<=mxPage
4ab0: 3b 20 69 2b 3d 35 29 7b 0a 20 20 20 20 20 20 63  ; i+=5){.      c
4ac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
4ad0: 20 3d 20 22 3f 3f 3f 22 3b 0a 20 20 20 20 20 20   = "???";.      
4ae0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 46 72  unsigned int iFr
4af0: 6f 6d 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32  om = decodeInt32
4b00: 28 26 61 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20  (&a[i+1]);.     
4b10: 20 73 77 69 74 63 68 28 20 61 5b 69 5d 20 29 7b   switch( a[i] ){
4b20: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
4b30: 20 20 7a 54 79 70 65 20 3d 20 22 62 2d 74 72 65    zType = "b-tre
4b40: 65 20 72 6f 6f 74 20 70 61 67 65 22 3b 20 20 20  e root page";   
4b50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b60: 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a 54 79      case 2:  zTy
4b70: 70 65 20 3d 20 22 66 72 65 65 6c 69 73 74 20 70  pe = "freelist p
4b80: 61 67 65 22 3b 20 20 20 20 20 20 20 20 20 20 20  age";           
4b90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
4ba0: 61 73 65 20 33 3a 20 20 7a 54 79 70 65 20 3d 20  ase 3:  zType = 
4bb0: 22 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 6f  "first page of o
4bc0: 76 65 72 66 6c 6f 77 22 3b 20 20 62 72 65 61 6b  verflow";  break
4bd0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 34  ;.        case 4
4be0: 3a 20 20 7a 54 79 70 65 20 3d 20 22 6c 61 74 65  :  zType = "late
4bf0: 72 20 70 61 67 65 20 6f 66 20 6f 76 65 72 66 6c  r page of overfl
4c00: 6f 77 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ow";  break;.   
4c10: 20 20 20 20 20 63 61 73 65 20 35 3a 20 20 7a 54       case 5:  zT
4c20: 79 70 65 20 3d 20 22 62 2d 74 72 65 65 20 6e 6f  ype = "b-tree no
4c30: 6e 2d 72 6f 6f 74 20 70 61 67 65 22 3b 20 20 20  n-root page";   
4c40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4c50: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 35        printf("%5
4c60: 64 3a 20 25 73 2c 20 70 61 72 65 6e 74 3d 25 75  d: %s, parent=%u
4c70: 5c 6e 22 2c 20 70 67 6e 6f 2b 31 2b 69 2f 35 2c  \n", pgno+1+i/5,
4c80: 20 7a 54 79 70 65 2c 20 69 46 72 6f 6d 29 3b 0a   zType, iFrom);.
4c90: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61      }.    free(a
4ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4cb0: 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 63 6f  Print a usage co
4cc0: 6d 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  mment.*/.static 
4cd0: 76 6f 69 64 20 75 73 61 67 65 28 63 6f 6e 73 74  void usage(const
4ce0: 20 63 68 61 72 20 2a 61 72 67 76 30 29 7b 0a 20   char *argv0){. 
4cf0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
4d00: 20 22 55 73 61 67 65 20 25 73 20 46 49 4c 45 4e   "Usage %s FILEN
4d10: 41 4d 45 20 3f 61 72 67 73 2e 2e 2e 3f 5c 6e 5c  AME ?args...?\n\
4d20: 6e 22 2c 20 61 72 67 76 30 29 3b 0a 20 20 66 70  n", argv0);.  fp
4d30: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
4d40: 20 20 22 61 72 67 73 3a 5c 6e 22 0a 20 20 20 20    "args:\n".    
4d50: 22 20 20 20 20 64 62 68 65 61 64 65 72 20 20 20  "    dbheader   
4d60: 20 20 20 20 20 53 68 6f 77 20 64 61 74 61 62 61       Show databa
4d70: 73 65 20 68 65 61 64 65 72 5c 6e 22 0a 20 20 20  se header\n".   
4d80: 20 22 20 20 20 20 70 67 69 64 78 20 20 20 20 20   "    pgidx     
4d90: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 68        Index of h
4da0: 6f 77 20 65 61 63 68 20 70 61 67 65 20 69 73 20  ow each page is 
4db0: 75 73 65 64 5c 6e 22 0a 20 20 20 20 22 20 20 20  used\n".    "   
4dc0: 20 70 74 72 6d 61 70 20 20 20 20 20 20 20 20 20   ptrmap         
4dd0: 20 53 68 6f 77 20 61 6c 6c 20 50 54 52 4d 41 50   Show all PTRMAP
4de0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 5c 6e 22   page content\n"
4df0: 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 2e 2e 4d  .    "    NNN..M
4e00: 4d 4d 20 20 20 20 20 20 20 20 53 68 6f 77 20 68  MM        Show h
4e10: 65 78 20 6f 66 20 70 61 67 65 73 20 4e 4e 4e 20  ex of pages NNN 
4e20: 74 68 72 6f 75 67 68 20 4d 4d 4d 5c 6e 22 0a 20  through MMM\n". 
4e30: 20 20 20 22 20 20 20 20 4e 4e 4e 2e 2e 65 6e 64     "    NNN..end
4e40: 20 20 20 20 20 20 20 20 53 68 6f 77 20 68 65 78          Show hex
4e50: 20 6f 66 20 70 61 67 65 73 20 4e 4e 4e 20 74 68   of pages NNN th
4e60: 72 6f 75 67 68 20 65 6e 64 20 6f 66 20 66 69 6c  rough end of fil
4e70: 65 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e  e\n".    "    NN
4e80: 4e 62 20 20 20 20 20 20 20 20 20 20 20 20 44 65  Nb            De
4e90: 63 6f 64 65 20 62 74 72 65 65 20 70 61 67 65 20  code btree page 
4ea0: 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  NNN\n".    "    
4eb0: 4e 4e 4e 62 63 20 20 20 20 20 20 20 20 20 20 20  NNNbc           
4ec0: 44 65 63 6f 64 65 20 62 74 72 65 65 20 70 61 67  Decode btree pag
4ed0: 65 20 4e 4e 4e 20 61 6e 64 20 73 68 6f 77 20 63  e NNN and show c
4ee0: 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 22 20  ontent\n".    " 
4ef0: 20 20 20 4e 4e 4e 62 6d 20 20 20 20 20 20 20 20     NNNbm        
4f00: 20 20 20 44 65 63 6f 64 65 20 62 74 72 65 65 20     Decode btree 
4f10: 70 61 67 65 20 4e 4e 4e 20 61 6e 64 20 73 68 6f  page NNN and sho
4f20: 77 20 61 20 6c 61 79 6f 75 74 20 6d 61 70 5c 6e  w a layout map\n
4f30: 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 74 20  ".    "    NNNt 
4f40: 20 20 20 20 20 20 20 20 20 20 20 44 65 63 6f 64             Decod
4f50: 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
4f60: 20 70 61 67 65 20 4e 4e 4e 5c 6e 22 0a 20 20 20   page NNN\n".   
4f70: 20 22 20 20 20 20 4e 4e 4e 74 64 20 20 20 20 20   "    NNNtd     
4f80: 20 20 20 20 20 20 53 68 6f 77 20 6c 65 61 66 20        Show leaf 
4f90: 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 20 6f  freelist pages o
4fa0: 6e 20 74 68 65 20 64 65 63 6f 64 65 5c 6e 22 0a  n the decode\n".
4fb0: 20 20 20 20 22 20 20 20 20 4e 4e 4e 74 72 20 20      "    NNNtr  
4fc0: 20 20 20 20 20 20 20 20 20 52 65 63 75 72 69 73           Recuris
4fd0: 76 65 6c 79 20 64 65 63 6f 64 65 20 66 72 65 65  vely decode free
4fe0: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
4ff0: 20 4e 4e 4e 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 0a   NNN\n".  );.}..
5000: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
5010: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
5020: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
5030: 62 75 66 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  buf;.  unsigned 
5040: 63 68 61 72 20 7a 50 67 53 7a 5b 32 5d 3b 0a 20  char zPgSz[2];. 
5050: 20 69 66 28 20 61 72 67 63 3c 32 20 29 7b 0a 20   if( argc<2 ){. 
5060: 20 20 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d     usage(argv[0]
5070: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
5080: 20 20 7d 0a 20 20 64 62 20 3d 20 6f 70 65 6e 28    }.  db = open(
5090: 61 72 67 76 5b 31 5d 2c 20 4f 5f 52 44 4f 4e 4c  argv[1], O_RDONL
50a0: 59 29 3b 0a 20 20 69 66 28 20 64 62 3c 30 20 29  Y);.  if( db<0 )
50b0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
50c0: 64 65 72 72 2c 22 25 73 3a 20 63 61 6e 27 74 20  derr,"%s: can't 
50d0: 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76  open %s\n", argv
50e0: 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20  [0], argv[1]);. 
50f0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
5100: 20 20 7a 50 67 53 7a 5b 30 5d 20 3d 20 30 3b 0a    zPgSz[0] = 0;.
5110: 20 20 7a 50 67 53 7a 5b 31 5d 20 3d 20 30 3b 0a    zPgSz[1] = 0;.
5120: 20 20 6c 73 65 65 6b 28 64 62 2c 20 31 36 2c 20    lseek(db, 16, 
5130: 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 72 65 61  SEEK_SET);.  rea
5140: 64 28 64 62 2c 20 7a 50 67 53 7a 2c 20 32 29 3b  d(db, zPgSz, 2);
5150: 0a 20 20 70 61 67 65 73 69 7a 65 20 3d 20 7a 50  .  pagesize = zP
5160: 67 53 7a 5b 30 5d 2a 32 35 36 20 2b 20 7a 50 67  gSz[0]*256 + zPg
5170: 53 7a 5b 31 5d 2a 36 35 35 33 36 3b 0a 20 20 69  Sz[1]*65536;.  i
5180: 66 28 20 70 61 67 65 73 69 7a 65 3d 3d 30 20 29  f( pagesize==0 )
5190: 20 70 61 67 65 73 69 7a 65 20 3d 20 31 30 32 34   pagesize = 1024
51a0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 50 61 67 65  ;.  printf("Page
51b0: 73 69 7a 65 3a 20 25 64 5c 6e 22 2c 20 70 61 67  size: %d\n", pag
51c0: 65 73 69 7a 65 29 3b 0a 20 20 66 73 74 61 74 28  esize);.  fstat(
51d0: 64 62 2c 20 26 73 62 75 66 29 3b 0a 20 20 6d 78  db, &sbuf);.  mx
51e0: 50 61 67 65 20 3d 20 73 62 75 66 2e 73 74 5f 73  Page = sbuf.st_s
51f0: 69 7a 65 2f 70 61 67 65 73 69 7a 65 3b 0a 20 20  ize/pagesize;.  
5200: 70 72 69 6e 74 66 28 22 41 76 61 69 6c 61 62 6c  printf("Availabl
5210: 65 20 70 61 67 65 73 3a 20 31 2e 2e 25 64 5c 6e  e pages: 1..%d\n
5220: 22 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 69 66  ", mxPage);.  if
5230: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
5240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5250: 69 3d 31 3b 20 69 3c 3d 6d 78 50 61 67 65 3b 20  i=1; i<=mxPage; 
5260: 69 2b 2b 29 20 70 72 69 6e 74 5f 70 61 67 65 28  i++) print_page(
5270: 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  i);.  }else{.   
5280: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5290: 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=2; i<argc; i++
52a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 74  ){.      int iSt
52b0: 61 72 74 2c 20 69 45 6e 64 3b 0a 20 20 20 20 20  art, iEnd;.     
52c0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 3b 0a 20 20   char *zLeft;.  
52d0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
52e0: 72 67 76 5b 69 5d 2c 20 22 64 62 68 65 61 64 65  rgv[i], "dbheade
52f0: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
5300: 20 20 70 72 69 6e 74 5f 64 62 5f 68 65 61 64 65    print_db_heade
5310: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  r();.        con
5320: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
5330: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
5340: 61 72 67 76 5b 69 5d 2c 20 22 70 67 69 64 78 22  argv[i], "pgidx"
5350: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5360: 70 61 67 65 5f 75 73 61 67 65 5f 72 65 70 6f 72  page_usage_repor
5370: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
5380: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
5390: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
53a0: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20  strcmp(argv[i], 
53b0: 22 70 74 72 6d 61 70 22 29 3d 3d 30 20 29 7b 0a  "ptrmap")==0 ){.
53c0: 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 5f 63          ptrmap_c
53d0: 6f 76 65 72 61 67 65 5f 72 65 70 6f 72 74 28 61  overage_report(a
53e0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[1]);.       
53f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5400: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
5410: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22 68 65  cmp(argv[i], "he
5420: 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
5430: 20 20 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d     usage(argv[0]
5440: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
5450: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5460: 20 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28     if( !isdigit(
5470: 61 72 67 76 5b 69 5d 5b 30 5d 29 20 29 7b 0a 20  argv[i][0]) ){. 
5480: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
5490: 74 64 65 72 72 2c 20 22 25 73 3a 20 75 6e 6b 6e  tderr, "%s: unkn
54a0: 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5b 25 73 5d  own option: [%s]
54b0: 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72  \n", argv[0], ar
54c0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[i]);.        
54d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
54e0: 7d 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  }.      iStart =
54f0: 20 73 74 72 74 6f 6c 28 61 72 67 76 5b 69 5d 2c   strtol(argv[i],
5500: 20 26 7a 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20   &zLeft, 0);.   
5510: 20 20 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20     if( zLeft && 
5520: 73 74 72 63 6d 70 28 7a 4c 65 66 74 2c 22 2e 2e  strcmp(zLeft,"..
5530: 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  end")==0 ){.    
5540: 20 20 20 20 69 45 6e 64 20 3d 20 6d 78 50 61 67      iEnd = mxPag
5550: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
5560: 66 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66  f( zLeft && zLef
5570: 74 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 7a 4c 65  t[0]=='.' && zLe
5580: 66 74 5b 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20  ft[1]=='.' ){.  
5590: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 74 72        iEnd = str
55a0: 74 6f 6c 28 26 7a 4c 65 66 74 5b 32 5d 2c 20 30  tol(&zLeft[2], 0
55b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
55c0: 65 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20 7a  e if( zLeft && z
55d0: 4c 65 66 74 5b 30 5d 3d 3d 27 62 27 20 29 7b 0a  Left[0]=='b' ){.
55e0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 66 73 74          int ofst
55f0: 2c 20 6e 42 79 74 65 2c 20 68 64 72 53 69 7a 65  , nByte, hdrSize
5600: 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
5610: 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 20 20  ed char *a;.    
5620: 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d      if( iStart==
5630: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  1 ){.          o
5640: 66 73 74 20 3d 20 68 64 72 53 69 7a 65 20 3d 20  fst = hdrSize = 
5650: 31 30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  100;.          n
5660: 42 79 74 65 20 3d 20 70 61 67 65 73 69 7a 65 2d  Byte = pagesize-
5670: 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  100;.        }el
5680: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 68 64  se{.          hd
5690: 72 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  rSize = 0;.     
56a0: 20 20 20 20 20 6f 66 73 74 20 3d 20 28 69 53 74       ofst = (iSt
56b0: 61 72 74 2d 31 29 2a 70 61 67 65 73 69 7a 65 3b  art-1)*pagesize;
56c0: 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65  .          nByte
56d0: 20 3d 20 70 61 67 65 73 69 7a 65 3b 0a 20 20 20   = pagesize;.   
56e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
56f0: 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28 6f 66   = getContent(of
5700: 73 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  st, nByte);.    
5710: 20 20 20 20 64 65 63 6f 64 65 5f 62 74 72 65 65      decode_btree
5720: 5f 70 61 67 65 28 61 2c 20 69 53 74 61 72 74 2c  _page(a, iStart,
5730: 20 68 64 72 53 69 7a 65 2c 20 26 7a 4c 65 66 74   hdrSize, &zLeft
5740: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 72  [1]);.        fr
5750: 65 65 28 61 29 3b 0a 20 20 20 20 20 20 20 20 63  ee(a);.        c
5760: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
5770: 65 6c 73 65 20 69 66 28 20 7a 4c 65 66 74 20 26  else if( zLeft &
5780: 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27 74 27 20  & zLeft[0]=='t' 
5790: 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  ){.        unsig
57a0: 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 20  ned char *a;.   
57b0: 20 20 20 20 20 69 6e 74 20 64 65 74 61 69 6c 20       int detail 
57c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
57d0: 20 72 65 63 75 72 73 69 76 65 20 3d 20 30 3b 0a   recursive = 0;.
57e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
57f0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
5800: 7a 4c 65 66 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zLeft[i]; i++){.
5810: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c            if( zL
5820: 65 66 74 5b 69 5d 3d 3d 27 72 27 20 29 20 72 65  eft[i]=='r' ) re
5830: 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
5840: 20 20 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74         if( zLeft
5850: 5b 69 5d 3d 3d 27 64 27 20 29 20 64 65 74 61 69  [i]=='d' ) detai
5860: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  l = 1;.        }
5870: 0a 20 20 20 20 20 20 20 20 64 65 63 6f 64 65 5f  .        decode_
5880: 74 72 75 6e 6b 5f 70 61 67 65 28 69 53 74 61 72  trunk_page(iStar
5890: 74 2c 20 70 61 67 65 73 69 7a 65 2c 20 64 65 74  t, pagesize, det
58a0: 61 69 6c 2c 20 72 65 63 75 72 73 69 76 65 29 3b  ail, recursive);
58b0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
58c0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
58d0: 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69          iEnd = i
58e0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Start;.      }. 
58f0: 20 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c       if( iStart<
5900: 31 20 7c 7c 20 69 45 6e 64 3c 69 53 74 61 72 74  1 || iEnd<iStart
5910: 20 7c 7c 20 69 45 6e 64 3e 6d 78 50 61 67 65 20   || iEnd>mxPage 
5920: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
5930: 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
5940: 20 20 20 20 20 22 50 61 67 65 20 61 72 67 75 6d       "Page argum
5950: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 4c 4f  ent should be LO
5960: 57 45 52 3f 2e 2e 55 50 50 45 52 3f 2e 20 20 52  WER?..UPPER?.  R
5970: 61 6e 67 65 20 31 20 74 6f 20 25 64 5c 6e 22 2c  ange 1 to %d\n",
5980: 0a 20 20 20 20 20 20 20 20 20 20 6d 78 50 61 67  .          mxPag
5990: 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  e);.        exit
59a0: 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
59b0: 20 20 20 77 68 69 6c 65 28 20 69 53 74 61 72 74     while( iStart
59c0: 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  <=iEnd ){.      
59d0: 20 20 70 72 69 6e 74 5f 70 61 67 65 28 69 53 74    print_page(iSt
59e0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 69 53  art);.        iS
59f0: 74 61 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  tart++;.      }.
5a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6c 6f 73      }.  }.  clos
5a10: 65 28 64 62 29 3b 0a 7d 0a                       e(db);.}.