示例#1
0
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;
}
示例#2
0
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);
}
示例#3
0
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;
}