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