static int compat_checkpoint_read( struct deltadb *db, const char *filename ) { FILE * file = fopen(filename,"r"); if(!file) return 0; while(1) { struct nvpair *nv = nvpair_create(); if(nvpair_parse_stream(nv,file)) { const char *key = nvpair_lookup_string(nv,"key"); if(key) { nvpair_delete(hash_table_remove(db->table,key)); struct jx *j = nvpair_to_jx(nv); /* skip objects that don't match the filter */ if(deltadb_boolean_expr(db->filter_expr,j)) { hash_table_insert(db->table,key,j); } else { jx_delete(j); } } nvpair_delete(nv); } else { nvpair_delete(nv); break; } } fclose(file); return 1; }
static int compat_checkpoint_read( struct jx_database *db, const char *filename ) { FILE * file = fopen(filename,"r"); if(!file) return 0; while(1) { struct nvpair *nv = nvpair_create(); if(nvpair_parse_stream(nv,file)) { const char *key = nvpair_lookup_string(nv,"key"); if(key) { nvpair_delete(hash_table_remove(db->table,key)); struct jx *j = nvpair_to_jx(nv); hash_table_insert(db->table,key,j); } nvpair_delete(nv); } else { nvpair_delete(nv); break; } } fclose(file); return 1; }
static int log_replay( struct nvpair_database *db, const char *filename, time_t snapshot) { FILE *file = fopen(filename,"r"); if(!file) return 0; time_t current = 0; struct nvpair *nv; char line[NVPAIR_LINE_MAX]; char key[NVPAIR_LINE_MAX]; char name[NVPAIR_LINE_MAX]; char value[NVPAIR_LINE_MAX]; char oper; while(fgets(line,sizeof(line),file)) { int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value); if(n<1) continue; switch(oper) { case 'C': nv = nvpair_create(); nvpair_parse_stream(nv,file); nvpair_delete(hash_table_remove(db->table,name)); hash_table_insert(db->table,key,nv); break; case 'D': nv = hash_table_remove(db->table,key); if(nv) nvpair_delete(nv); break; case 'U': nv = hash_table_lookup(db->table,key); if(nv) nvpair_insert_string(nv,name,value); break; case 'R': nv = hash_table_lookup(db->table,key); if(nv) nvpair_remove(nv,name); break; case 'T': current = atol(key); if(current>snapshot) break; break; default: debug(D_NOTICE,"corrupt log data in %s: %s",filename,line); break; } } fclose(file); return 1; }
static int checkpoint_read( struct deltadb *db ) { FILE * file = stdin; if(!file) return 0; char firstline[NVPAIR_LINE_MAX]; fgets(firstline, sizeof(firstline), file); printf("%s",firstline); while(1) { int keep = 0; struct nvpair *nv = nvpair_create(); int num_pairs = nvpair_parse_stream(nv,file); if(num_pairs>0) { const char *key = nvpair_lookup_string(nv,"key"); if(key) { keep = 1; struct argument *arg = db->args; while (arg!=NULL){ const char *var = nvpair_lookup_string(nv,arg->param); if ( var!=NULL && keep_object(arg,var)==0 ){ keep = 0; break; } arg = arg->next; } nvpair_delete(hash_table_remove(db->table,key)); if (keep==1){ nvpair_print_text(nv,stdout); hash_table_insert(db->table,key,nv); } } else debug(D_NOTICE,"no key in object create."); } else if (num_pairs == -1) { return 1; } else { break; } if (!keep) nvpair_delete(nv); } return 1; }
int main( int argc, char *argv[] ) { int count =0; int first = 0; printf("{\n"); while(1) { struct nvpair *nv = nvpair_create(); int r = nvpair_parse_stream(nv,stdin); if(r) { struct jx *j = nvpair_to_jx(nv); const char *name = jx_lookup_string(j,"name"); const char *host = jx_lookup_string(j,"host"); int port = jx_lookup_integer(j,"port"); if(first) { first = 0; } else { printf(",\n"); } printf("\"%s:%s:%d\":",name,host,port); jx_print_stream(j,stdout); count++; } else if(r<0) { fprintf(stderr,"nvpair conversion error!\n"); } else { break; } } printf("\n}\n"); fprintf(stderr,"%d records converted.\n",count); return 0; }
static int log_replay( struct jx_database *db, const char *filename, time_t snapshot) { char line[LOG_LINE_MAX]; char value[LOG_LINE_MAX]; char name[LOG_LINE_MAX]; char key[LOG_LINE_MAX]; int n; struct jx *jvalue, *jobject; long long current = 0; FILE *file = fopen(filename,"r"); if(!file) return 0; while(fgets(line,sizeof(line),file)) { if(line[0]=='C') { n = sscanf(line,"C %s %[^\n]",key,value); if(n==1) { struct nvpair *nv = nvpair_create(); nvpair_parse_stream(nv,file); jvalue = nvpair_to_jx(nv); hash_table_insert(db->table,key,jvalue); } else if(n==2) { jvalue = jx_parse_string(value); if(jvalue) { hash_table_insert(db->table,key,jvalue); } else { corrupt_data(filename,line); } } else { corrupt_data(filename,line); continue; } } else if(line[0]=='D') { n = sscanf(line,"D %s\n",key); if(n!=1) { corrupt_data(filename,line); continue; } jx_delete(hash_table_remove(db->table,key)); } else if(line[0]=='U') { n=sscanf(line,"U %s %s %[^\n],",key,name,value); if(n!=3) { corrupt_data(filename,line); continue; } jobject = hash_table_lookup(db->table,key); if(!jobject) { corrupt_data(filename,line); continue; } jvalue = jx_parse_string(value); if(!jvalue) jvalue = jx_string(value); struct jx *jname = jx_string(name); jx_delete(jx_remove(jobject,jname)); jx_insert(jobject,jname,jvalue); } else if(line[0]=='R') { n=sscanf(line,"R %s %s",key,name); if(n!=2) { corrupt_data(filename,line); continue; } jobject = hash_table_lookup(db->table,key); if(!jobject) { corrupt_data(filename,line); continue; } struct jx *jname = jx_string(name); jx_delete(jx_remove(jobject,jname)); jx_delete(jname); } else if(line[0]=='T') { n = sscanf(line,"T %lld",¤t); if(n!=1) { corrupt_data(filename,line); continue; } if(current>snapshot) break; } else if(line[0]=='\n') { continue; } else { corrupt_data(filename,line); } } fclose(file); return 1; }
static int log_play( struct deltadb *db, FILE *stream ) { time_t current = 0; time_t previous_time = 0; int line_number = 0; char line[NVPAIR_LINE_MAX]; char key[NVPAIR_LINE_MAX]; char name[NVPAIR_LINE_MAX]; char value[NVPAIR_LINE_MAX]; char oper; while(fgets(line,sizeof(line),stream)) { //debug(D_NOTICE,"Processed line: %s",line); line_number += 1; if (line[0]=='\n') break; int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value); if(n<1) continue; struct nvpair *nv; switch(oper) { case 'C': nv = nvpair_create(); int num_pairs = nvpair_parse_stream(nv,stream); if(num_pairs>0) { nvpair_delete(hash_table_remove(db->table,key)); hash_table_insert(db->table,key,nv); } else if (num_pairs == -1) { nvpair_delete(nv); break; } else { nvpair_delete(nv); } break; case 'D': nv = hash_table_remove(db->table,key); if(nv) nvpair_delete(nv); break; case 'U': nv = hash_table_lookup(db->table,key); if(nv) nvpair_insert_string(nv,name,value); break; case 'R': nv = hash_table_lookup(db->table,key); if(nv) nvpair_remove(nv,name); break; case 'T': previous_time = current; current = atol(key); emit_table_values(db,previous_time); break; default: debug(D_NOTICE,"corrupt log data[%i]: %s",line_number,line); fflush(stderr); break; } } emit_table_values(db,current); return 1; }
static int log_play( struct deltadb *db ) { FILE *stream = stdin; time_t current = 0; struct nvpair *nv; int line_number = 0; struct hash_table *table = db->table; char line[NVPAIR_LINE_MAX]; char key[NVPAIR_LINE_MAX]; char name[NVPAIR_LINE_MAX]; char value[NVPAIR_LINE_MAX]; char oper; int notime = 1; while(fgets(line,sizeof(line),stream)) { line_number += 1; int keep = 0; if (line[0]=='.') return 0; int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value); if(n<1) continue; switch(oper) { case 'C': nv = nvpair_create(); int res = nvpair_parse_stream(nv,stream); if (res>0){ keep = 1; struct argument *arg = db->args; while (arg!=NULL){ const char *var = nvpair_lookup_string(nv,arg->param); if ( var!=NULL && keep_object(arg,var)==0 ){ keep = 0; break; } arg = arg->next; } nvpair_delete(hash_table_remove(db->table,key)); if (keep==1){ if (notime){ printf("T %lld\n",(long long)current); notime = 0; } nvpair_print_text(nv,stdout); hash_table_insert(db->table,key,nv); } } if (!keep) nvpair_delete(nv); break; case 'D': nv = hash_table_remove(table,key); if(nv){ if (notime){ printf("T %lld\n",(long long)current); notime = 0; } printf("%s",line); }//nvpair_delete(nv); break; case 'U': nv = hash_table_lookup(table,key); if(nv){ if (notime){ printf("T %lld\n",(long long)current); notime = 0; } printf("%s",line); }//nvpair_insert_string(nv,name,value); break; case 'R': nv = hash_table_lookup(table,key); if(nv){ if (notime){ printf("T %lld\n",(long long)current); notime = 0; } printf("%s",line); }//nvpair_remove(nv,name); break; case 'T': current = atol(key); notime = 1; break; default: debug(D_NOTICE,"corrupt log data[%i]: %s",line_number,line); fflush(stderr); break; } } return 1; }
/* Replay a given log file into the hash table, up to the given snapshot time. Return true if the stoptime was reached. */ static int log_play( struct deltadb *db, FILE *stream ) { struct nvpair *nv; char line[NVPAIR_LINE_MAX]; char key[NVPAIR_LINE_MAX]; char name[NVPAIR_LINE_MAX]; char value[NVPAIR_LINE_MAX]; char oper; int first_output = 1; time_t previous_time = 0; while(fgets(line,sizeof(line),stream)) { //debug(D_NOTICE,"Processed line: %s",line); int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value); if(n<1) continue; if(line[0]=='\n') break; switch(oper) { case 'C': nv = nvpair_create(); nvpair_parse_stream(nv,stream); nvpair_delete(hash_table_remove(db->table,name)); hash_table_insert(db->table,key,nv); break; case 'D': nv = hash_table_remove(db->table,key); if(nv) nvpair_delete(nv); break; case 'U': nv = hash_table_lookup(db->table,key); if(nv) nvpair_insert_string(nv,name,value); break; case 'R': nv = hash_table_lookup(db->table,key); if(nv) nvpair_remove(nv,name); break; case 'T': current = atol(key); break; default: debug(D_NOTICE,"corrupt log data: %s",line); break; } if (previous_time==0){ previous_time = current; } else if(previous_time!=current) { emit_all_deltadb_reductions(db,previous_time,first_output); first_output = 0; previous_time = current; } } emit_all_deltadb_reductions(db,previous_time,first_output); return 0; }