Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
static void
ddb_cons_dealloc(struct ddb_cons *cons)
{
  if (cons)
      ddb_cons_free(cons);
}