/ Hex Artifact Content
Login

Artifact 3559eac5a3b46e9b558d50856946b25e77633236:


0000: 2f 2a 0a 2a 2a 20 41 20 75 74 69 6c 69 74 79 20  /*.** A utility 
0010: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 61 6c 6c  for printing all
0020: 20 6f 72 20 70 61 72 74 20 6f 66 20 61 6e 20 53   or part of an S
0030: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66  QLite database f
0040: 69 6c 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ile..*/.#include
0050: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0060: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0070: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
0080: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  s.h>.#include <s
0090: 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c  ys/stat.h>.#incl
00a0: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69  ude <fcntl.h>.#i
00b0: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
00c0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
00d0: 69 62 2e 68 3e 0a 0a 0a 73 74 61 74 69 63 20 69  ib.h>...static i
00e0: 6e 74 20 70 61 67 65 73 69 7a 65 20 3d 20 31 30  nt pagesize = 10
00f0: 32 34 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 64  24;.static int d
0100: 62 20 3d 20 2d 31 3b 0a 73 74 61 74 69 63 20 69  b = -1;.static i
0110: 6e 74 20 6d 78 50 61 67 65 20 3d 20 30 3b 0a 0a  nt mxPage = 0;..
0120: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 5f  static void out_
0130: 6f 66 5f 6d 65 6d 6f 72 79 28 76 6f 69 64 29 7b  of_memory(void){
0140: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
0150: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
0160: 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28  ...\n");.  exit(
0170: 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 70 72  1);.}..static pr
0180: 69 6e 74 5f 70 61 67 65 28 69 6e 74 20 69 50 67  int_page(int iPg
0190: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
01a0: 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74  ar *aData;.  int
01b0: 20 69 2c 20 6a 3b 0a 20 20 61 44 61 74 61 20 3d   i, j;.  aData =
01c0: 20 6d 61 6c 6c 6f 63 28 70 61 67 65 73 69 7a 65   malloc(pagesize
01d0: 29 3b 0a 20 20 69 66 28 20 61 44 61 74 61 3d 3d  );.  if( aData==
01e0: 30 20 29 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  0 ) out_of_memor
01f0: 79 28 29 3b 0a 20 20 6c 73 65 65 6b 28 64 62 2c  y();.  lseek(db,
0200: 20 28 69 50 67 2d 31 29 2a 70 61 67 65 73 69 7a   (iPg-1)*pagesiz
0210: 65 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  e, SEEK_SET);.  
0220: 72 65 61 64 28 64 62 2c 20 61 44 61 74 61 2c 20  read(db, aData, 
0230: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 66 70 72  pagesize);.  fpr
0240: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 50 61  intf(stdout, "Pa
0250: 67 65 20 25 64 3a 5c 6e 22 2c 20 69 50 67 29 3b  ge %d:\n", iPg);
0260: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 61  .  for(i=0; i<pa
0270: 67 65 73 69 7a 65 3b 20 69 20 2b 3d 20 31 36 29  gesize; i += 16)
0280: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
0290: 64 6f 75 74 2c 20 22 20 25 30 33 78 3a 20 22 2c  dout, " %03x: ",
02a0: 69 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  i);.    for(j=0;
02b0: 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
02c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75     fprintf(stdou
02d0: 74 2c 22 25 30 32 78 20 22 2c 20 61 44 61 74 61  t,"%02x ", aData
02e0: 5b 69 2b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  [i+j]);.    }.  
02f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b    for(j=0; j<16;
0300: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72   j++){.      fpr
0310: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 63 22  intf(stdout,"%c"
0320: 2c 20 69 73 70 72 69 6e 74 28 61 44 61 74 61 5b  , isprint(aData[
0330: 69 2b 6a 5d 29 20 3f 20 61 44 61 74 61 5b 69 2b  i+j]) ? aData[i+
0340: 6a 5d 20 3a 20 27 2e 27 29 3b 0a 20 20 20 20 7d  j] : '.');.    }
0350: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
0360: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  out,"\n");.  }. 
0370: 20 66 72 65 65 28 61 44 61 74 61 29 3b 0a 7d 0a   free(aData);.}.
0380: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
0390: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
03a0: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
03b0: 73 62 75 66 3b 0a 20 20 69 66 28 20 61 72 67 63  sbuf;.  if( argc
03c0: 3c 32 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  <2 ){.    fprint
03d0: 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65 3a  f(stderr,"Usage:
03e0: 20 25 73 20 46 49 4c 45 4e 41 4d 45 20 3f 50 41   %s FILENAME ?PA
03f0: 47 45 3f 20 2e 2e 2e 5c 6e 22 2c 20 61 72 67 76  GE? ...\n", argv
0400: 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  [0]);.    exit(1
0410: 29 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 6f 70  );.  }.  db = op
0420: 65 6e 28 61 72 67 76 5b 31 5d 2c 20 4f 5f 52 44  en(argv[1], O_RD
0430: 4f 4e 4c 59 29 3b 0a 20 20 69 66 28 20 64 62 3c  ONLY);.  if( db<
0440: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
0450: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e  (stderr,"%s: can
0460: 27 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61  't open %s\n", a
0470: 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 29  rgv[0], argv[1])
0480: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
0490: 20 7d 0a 20 20 66 73 74 61 74 28 64 62 2c 20 26   }.  fstat(db, &
04a0: 73 62 75 66 29 3b 0a 20 20 6d 78 50 61 67 65 20  sbuf);.  mxPage 
04b0: 3d 20 73 62 75 66 2e 73 74 5f 73 69 7a 65 2f 70  = sbuf.st_size/p
04c0: 61 67 65 73 69 7a 65 20 2b 20 31 3b 0a 20 20 69  agesize + 1;.  i
04d0: 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20  f( argc==2 ){.  
04e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
04f0: 28 69 3d 31 3b 20 69 3c 3d 6d 78 50 61 67 65 3b  (i=1; i<=mxPage;
0500: 20 69 2b 2b 29 20 70 72 69 6e 74 5f 70 61 67 65   i++) print_page
0510: 28 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (i);.  }else{.  
0520: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
0530: 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=2; i<argc; i+
0540: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  +){.      int iS
0550: 74 61 72 74 2c 20 69 45 6e 64 3b 0a 20 20 20 20  tart, iEnd;.    
0560: 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 3b 0a 20    char *zLeft;. 
0570: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 74       iStart = st
0580: 72 74 6f 6c 28 61 72 67 76 5b 69 5d 2c 20 26 7a  rtol(argv[i], &z
0590: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
05a0: 69 66 28 20 7a 4c 65 66 74 20 26 26 20 73 74 72  if( zLeft && str
05b0: 63 6d 70 28 7a 4c 65 66 74 2c 22 2e 2e 65 6e 64  cmp(zLeft,"..end
05c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
05d0: 20 69 45 6e 64 20 3d 20 6d 78 50 61 67 65 3b 0a   iEnd = mxPage;.
05e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
05f0: 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66 74 5b 30  zLeft && zLeft[0
0600: 5d 3d 3d 27 2e 27 20 26 26 20 7a 4c 65 66 74 5b  ]=='.' && zLeft[
0610: 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  1]=='.' ){.     
0620: 20 20 20 69 45 6e 64 20 3d 20 73 74 72 74 6f 6c     iEnd = strtol
0630: 28 26 7a 4c 65 66 74 5b 32 5d 2c 20 30 2c 20 30  (&zLeft[2], 0, 0
0640: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
0650: 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69          iEnd = i
0660: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Start;.      }. 
0670: 20 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c       if( iStart<
0680: 31 20 7c 7c 20 69 45 6e 64 3c 69 53 74 61 72 74  1 || iEnd<iStart
0690: 20 7c 7c 20 69 45 6e 64 3e 6d 78 50 61 67 65 20   || iEnd>mxPage 
06a0: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
06b0: 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
06c0: 20 20 20 20 20 22 50 61 67 65 20 61 72 67 75 6d       "Page argum
06d0: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 4c 4f  ent should be LO
06e0: 57 45 52 3f 2e 2e 55 50 50 45 52 3f 2e 20 20 52  WER?..UPPER?.  R
06f0: 61 6e 67 65 20 31 20 74 6f 20 25 64 5c 6e 22 2c  ange 1 to %d\n",
0700: 0a 20 20 20 20 20 20 20 20 20 20 6d 78 50 61 67  .          mxPag
0710: 65 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  e);.        exit
0720: 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
0730: 20 20 20 77 68 69 6c 65 28 20 69 53 74 61 72 74     while( iStart
0740: 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  <=iEnd ){.      
0750: 20 20 70 72 69 6e 74 5f 70 61 67 65 28 69 53 74    print_page(iSt
0760: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 69 53  art);.        iS
0770: 74 61 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  tart++;.      }.
0780: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6c 6f 73      }.  }.  clos
0790: 65 28 64 62 29 3b 0a 7d 0a                       e(db);.}.