int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage:\n"); fprintf(stderr, "create_discodb discodb.out input.txt\n"); fprintf(stderr, "where input.txt contain a key-value pair on each line, devided by space.\n"); exit(1); } FILE *in; FILE *out; uint64_t size; char *data; struct ddb_cons *db = ddb_cons_new(); uint64_t flags = 0; flags |= getenv("DONT_COMPRESS") ? DDB_OPT_DISABLE_COMPRESSION: 0; flags |= getenv("UNIQUE_ITEMS") ? DDB_OPT_UNIQUE_ITEMS: 0; if (!db) { fprintf(stderr, "DB init failed\n"); exit(1); } if (!(in = fopen(argv[2], "r"))) { fprintf(stderr, "Couldn't open %s\n", argv[2]); exit(1); } if (getenv("KEYS_ONLY")) read_keys(in, db); else read_pairs(in, db); fprintf(stderr, "Packing the index..\n"); if (!(data = ddb_finalize(db, &size, flags))) { fprintf(stderr, "Packing the index failed\n"); exit(1); } ddb_cons_free(db); if (!(out = fopen(argv[1], "w"))) { fprintf(stderr, "Opening file %s failed\n", argv[1]); exit(1); } if (!fwrite(data, size, 1, out)) { fprintf(stderr, "Writing file %s failed\n", argv[1]); exit(1); } fclose(out); free(data); fprintf(stderr, "Ok! Index written to %s\n", argv[1]); return 0; }
struct ddb_cons *ddb_cons_ddb(struct ddb *db) { struct ddb_cons *cons; struct ddb_cursor *keys = NULL, *vals = NULL; const struct ddb_entry *k, *v; int errno = 0; if (!(cons = ddb_cons_new())) goto error; if (!(keys = ddb_keys(db))) goto error; while ((k = ddb_next(keys, &errno))) { if (!(vals = ddb_getitem(db, k))) goto error; while ((v = ddb_next(vals, &errno))) if (ddb_cons_add(cons, k, v)) goto error; if (errno) goto error; ddb_free_cursor(vals); } if (errno) goto error; ddb_free_cursor(keys); return cons; error: if (cons) ddb_cons_free(cons); if (keys) ddb_free_cursor(keys); if (vals) ddb_free_cursor(vals); return NULL; }
static void ddb_cons_dealloc(struct ddb_cons *cons) { if (cons) ddb_cons_free(cons); }