struct ddb_view *ddb_view_cons_finalize(const struct ddb_view_cons *cons, struct ddb *db) { uint32_t n = ddb_map_num_items(cons->map); struct ddb_cursor *cursor = ddb_unique_values(db); struct ddb_view *view = malloc(4 + n * sizeof(valueid_t)); const struct ddb_entry *value; valueid_t id = 0; int err = 0; if (!(cursor && view)) goto err; view->num_values = 0; while (n && (value = ddb_next(cursor, &err))){ ++id; if (ddb_map_lookup_str(cons->map, value)){ view->values[view->num_values++] = id; --n; } } if (!err){ ddb_free_cursor(cursor); return view; } err: ddb_view_free(view); ddb_free_cursor(cursor); return NULL; }
static PyObject * DiscoDB_unique_values(DiscoDB *self) { struct ddb_cursor *cursor = ddb_unique_values(self->discodb); if (cursor == NULL) if (ddb_has_error(self->discodb)) return NULL; return DiscoDBIter_new(&DiscoDBIterEntryType, self, cursor); }
int main(int argc, char **argv) { if (argc < 3) usage(); struct ddb *db = open_discodb(argv[1]); if (!strcmp(argv[2], "-info")) print_info(db); else if (!strcmp(argv[2], "-keys")) print_cursor(db, ddb_keys(db)); else if (!strcmp(argv[2], "-values")) print_cursor(db, ddb_values(db)); else if (!strcmp(argv[2], "-uvalues")) print_cursor(db, ddb_unique_values(db)); else if (!strcmp(argv[2], "-item")){ if (argc < 4){ fprintf(stderr, "Specify query\n"); exit(1); } struct ddb_entry e; e.data = argv[3]; e.length = strlen(argv[3]); print_cursor(db, ddb_getitem(db, &e)); }else if (!strcmp(argv[2], "-cnf")){ if (argc < 4){ fprintf(stderr, "Specify query\n"); exit(1); } int num_q = 0; struct ddb_query_clause *q = parse_cnf(&argv[3], argc - 3, &num_q); print_cursor(db, ddb_query(db, q, num_q)); free(q[0].terms); free(q); }else usage(); ddb_free(db); return 0; }