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