You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
1.7 KiB

  1. /*
  2. ** A utility for printing an SQLite database journal.
  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. static int pagesize = 1024;
  12. static int db = -1;
  13. static int mxPage = 0;
  14. static void out_of_memory(void){
  15. fprintf(stderr,"Out of memory...\n");
  16. exit(1);
  17. }
  18. static print_page(int iPg){
  19. unsigned char *aData;
  20. int i, j;
  21. aData = malloc(pagesize);
  22. if( aData==0 ) out_of_memory();
  23. read(db, aData, pagesize);
  24. fprintf(stdout, "Page %d:\n", iPg);
  25. for(i=0; i<pagesize; i += 16){
  26. fprintf(stdout, " %03x: ",i);
  27. for(j=0; j<16; j++){
  28. fprintf(stdout,"%02x ", aData[i+j]);
  29. }
  30. for(j=0; j<16; j++){
  31. fprintf(stdout,"%c", isprint(aData[i+j]) ? aData[i+j] : '.');
  32. }
  33. fprintf(stdout,"\n");
  34. }
  35. free(aData);
  36. }
  37. int main(int argc, char **argv){
  38. struct stat sbuf;
  39. unsigned int u;
  40. int rc;
  41. unsigned char zBuf[10];
  42. unsigned char zBuf2[sizeof(u)];
  43. if( argc!=2 ){
  44. fprintf(stderr,"Usage: %s FILENAME\n", argv[0]);
  45. exit(1);
  46. }
  47. db = open(argv[1], O_RDONLY);
  48. if( db<0 ){
  49. fprintf(stderr,"%s: can't open %s\n", argv[0], argv[1]);
  50. exit(1);
  51. }
  52. read(db, zBuf, 8);
  53. if( zBuf[7]==0xd6 ){
  54. read(db, &u, sizeof(u));
  55. printf("Records in Journal: %u\n", u);
  56. read(db, &u, sizeof(u));
  57. printf("Magic Number: 0x%08x\n", u);
  58. }
  59. read(db, zBuf2, sizeof(zBuf2));
  60. u = zBuf2[0]<<24 | zBuf2[1]<<16 | zBuf2[2]<<8 | zBuf2[3];
  61. printf("Database Size: %u\n", u);
  62. while( read(db, zBuf2, sizeof(zBuf2))==sizeof(zBuf2) ){
  63. u = zBuf2[0]<<24 | zBuf2[1]<<16 | zBuf2[2]<<8 | zBuf2[3];
  64. print_page(u);
  65. if( zBuf[7]==0xd6 ){
  66. read(db, &u, sizeof(u));
  67. printf("Checksum: 0x%08x\n", u);
  68. }
  69. }
  70. close(db);
  71. }