static int checkpoint_read( struct deltadb *db, const char *filename ) { FILE * file = fopen(filename,"r"); if(!file) return 0; /* Load the entire checkpoint into one json object */ struct jx *jcheckpoint = jx_parse_stream(file); fclose(file); if(!jcheckpoint || jcheckpoint->type!=JX_OBJECT) { jx_delete(jcheckpoint); return compat_checkpoint_read(db,filename); } /* For each key and value, move the value over to the hash table. */ /* Skip objects that don't match the filter. */ struct jx_pair *p; for(p=jcheckpoint->u.pairs;p;p=p->next) { if(p->key->type!=JX_STRING) continue; if(!deltadb_boolean_expr(db->filter_expr,p->value)) continue; hash_table_insert(db->table,p->key->u.string_value,p->value); p->value = 0; } /* Delete the leftover object with empty pairs. */ jx_delete(jcheckpoint); return 1; }
static int checkpoint_read( struct jx_database *db, const char *filename ) { FILE * file = fopen(filename,"r"); if(!file) return 0; /* Load the entire checkpoint into one json object */ struct jx *jcheckpoint = jx_parse_stream(file); fclose(file); if(!jcheckpoint || jcheckpoint->type!=JX_OBJECT) { debug(D_NOTICE, "could not parse checkpoint file, falling back to compatibility mode"); jx_delete(jcheckpoint); return compat_checkpoint_read(db,filename); } /* For each key and value, move the value over to the hash table. */ struct jx_pair *p; for(p=jcheckpoint->u.pairs;p;p=p->next) { if(p->key->type!=JX_STRING) continue; hash_table_insert(db->table,p->key->u.string_value,p->value); p->value = 0; } /* Delete the leftover object with empty pairs. */ jx_delete(jcheckpoint); return 1; }
struct jx * jx_parse_file( const char *name ) { FILE *file = fopen(name,"r"); if(!file) return 0; struct jx *j = jx_parse_stream(file); fclose(file); return j; }
static struct jx* run_command(char* cmd){ FILE* out = sh_popen(cmd); if(out == NULL){ fatal("fast_popen returned a null FILE* pointer"); } struct jx* jx = jx_parse_stream(out); if(jx == NULL){ fatal("JX parse stream out returned a null jx object"); } sh_pclose(out); return jx; }
/* Parse the stream for the next summary */ struct rmsummary *rmsummary_parse_next(FILE *stream) { struct jx *j = jx_parse_stream(stream); if(!j) return NULL; struct rmsummary *s = json_to_rmsummary(j); jx_delete(j); return s; }