static int log_play_time( struct deltadb *db, time_t starttime, time_t stoptime ) { int file_errors = 0; struct tm *starttm = localtime(&starttime); int year = starttm->tm_year + 1900; int day = starttm->tm_yday; struct tm *stoptm = localtime(&stoptime); int stopyear = stoptm->tm_year + 1900; int stopday = stoptm->tm_yday; char *filename = string_format("%s/%d/%d.ckpt",db->logdir,year,day); checkpoint_read(db,filename); free(filename); while(1) { char *filename = string_format("%s/%d/%d.log",db->logdir,year,day); FILE *file = fopen(filename,"r"); if(!file) { file_errors += 1; fprintf(stderr,"couldn't open %s: %s\n",filename,strerror(errno)); free(filename); if (file_errors>5) break; } else { free(filename); int keepgoing = deltadb_process_stream(db,file,starttime,stoptime); starttime = 0; fclose(file); // If we reached the endtime in the file, stop. if(!keepgoing) break; } day++; if(day>=days_in_year(year)) { year++; day = 0; } // If we have passed the file, stop. if(year>=stopyear && day>stopday) break; } return 1; }
static int log_recover( struct jx_database *db, time_t snapshot ) { char filename[PATH_MAX]; struct tm *t = gmtime(&snapshot); int year = t->tm_year + 1900; int day = t->tm_yday; sprintf(filename,"%s/%d/%d.ckpt",db->logdir,year,day); checkpoint_read(db,filename); sprintf(filename,"%s/%d/%d.log",db->logdir,year,day); log_replay(db,filename,snapshot); return 1; }
static int parse_input( struct deltadb *db ) { checkpoint_read(db); printf(".Checkpoint End.\n"); while(1) { int keepgoing = log_play(db); if(!keepgoing) break; } printf(".Log End.\n"); return 1; }