| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ** A utility for printing all or part of an SQLite database file. | |
| 3 */ | |
| 4 #include <stdio.h> | |
| 5 #include <ctype.h> | |
| 6 #include <sys/types.h> | |
| 7 #include <sys/stat.h> | |
| 8 #include <fcntl.h> | |
| 9 #include <unistd.h> | |
| 10 #include <stdlib.h> | |
| 11 | |
| 12 | |
| 13 static int pagesize = 1024; | |
| 14 static int db = -1; | |
| 15 static int mxPage = 0; | |
| 16 static int perLine = 32; | |
| 17 | |
| 18 static void out_of_memory(void){ | |
| 19 fprintf(stderr,"Out of memory...\n"); | |
| 20 exit(1); | |
| 21 } | |
| 22 | |
| 23 static print_page(int iPg){ | |
| 24 unsigned char *aData; | |
| 25 int i, j; | |
| 26 aData = malloc(pagesize); | |
| 27 if( aData==0 ) out_of_memory(); | |
| 28 lseek(db, (iPg-1)*(long long int)pagesize, SEEK_SET); | |
| 29 read(db, aData, pagesize); | |
| 30 fprintf(stdout, "Page %d:\n", iPg); | |
| 31 for(i=0; i<pagesize; i += perLine){ | |
| 32 fprintf(stdout, " %03x: ",i); | |
| 33 for(j=0; j<perLine; j++){ | |
| 34 fprintf(stdout,"%02x ", aData[i+j]); | |
| 35 } | |
| 36 for(j=0; j<perLine; j++){ | |
| 37 fprintf(stdout,"%c", isprint(aData[i+j]) ? aData[i+j] : '.'); | |
| 38 } | |
| 39 fprintf(stdout,"\n"); | |
| 40 } | |
| 41 free(aData); | |
| 42 } | |
| 43 | |
| 44 int main(int argc, char **argv){ | |
| 45 struct stat sbuf; | |
| 46 if( argc<2 ){ | |
| 47 fprintf(stderr,"Usage: %s FILENAME ?PAGE? ...\n", argv[0]); | |
| 48 exit(1); | |
| 49 } | |
| 50 db = open(argv[1], O_RDONLY); | |
| 51 if( db<0 ){ | |
| 52 fprintf(stderr,"%s: can't open %s\n", argv[0], argv[1]); | |
| 53 exit(1); | |
| 54 } | |
| 55 fstat(db, &sbuf); | |
| 56 mxPage = sbuf.st_size/pagesize + 1; | |
| 57 if( argc==2 ){ | |
| 58 int i; | |
| 59 for(i=1; i<=mxPage; i++) print_page(i); | |
| 60 }else{ | |
| 61 int i; | |
| 62 for(i=2; i<argc; i++){ | |
| 63 int iStart, iEnd; | |
| 64 char *zLeft; | |
| 65 iStart = strtol(argv[i], &zLeft, 0); | |
| 66 if( zLeft && strcmp(zLeft,"..end")==0 ){ | |
| 67 iEnd = mxPage; | |
| 68 }else if( zLeft && zLeft[0]=='.' && zLeft[1]=='.' ){ | |
| 69 iEnd = strtol(&zLeft[2], 0, 0); | |
| 70 }else{ | |
| 71 iEnd = iStart; | |
| 72 } | |
| 73 if( iStart<1 || iEnd<iStart || iEnd>mxPage ){ | |
| 74 fprintf(stderr, | |
| 75 "Page argument should be LOWER?..UPPER?. Range 1 to %d\n", | |
| 76 mxPage); | |
| 77 exit(1); | |
| 78 } | |
| 79 while( iStart<=iEnd ){ | |
| 80 print_page(iStart); | |
| 81 iStart++; | |
| 82 } | |
| 83 } | |
| 84 } | |
| 85 close(db); | |
| 86 } | |
| OLD | NEW |