15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A utility for printing the differences between two SQLite database files.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PAGESIZE 1024
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int db1 = -1;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int db2 = -1;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, char **argv){
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iPg;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char a1[PAGESIZE], a2[PAGESIZE];
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( argc!=3 ){
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr,"Usage: %s FILENAME FILENAME\n", argv[0]);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exit(1);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db1 = open(argv[1], O_RDONLY);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db1<0 ){
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr,"%s: can't open %s\n", argv[0], argv[1]);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exit(1);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db2 = open(argv[2], O_RDONLY);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db2<0 ){
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr,"%s: can't open %s\n", argv[0], argv[2]);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exit(1);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iPg = 1;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( read(db1, a1, PAGESIZE)==PAGESIZE && read(db2,a2,PAGESIZE)==PAGESIZE ){
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( memcmp(a1,a2,PAGESIZE) ){
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      printf("Page %d\n", iPg);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iPg++;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printf("%d pages checked\n", iPg-1);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close(db1);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close(db2);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45