Example #1
0
static void sparkey_randomaccess(int n, int lookups) {
    sparkey_hashreader *myreader;
    sparkey_logiter *myiter;
    sparkey_assert(sparkey_hash_open(&myreader, "test.spi", "test.spl"));
    sparkey_logreader *logreader = sparkey_hash_getreader(myreader);
    sparkey_assert(sparkey_logiter_create(&myiter, logreader));

    uint8_t *valuebuf = malloc(sparkey_logreader_maxvaluelen(logreader));

    for (int i = 0; i < lookups; i++) {
        char mykey[100];
        char myvalue[100];
        int r = rand() % n;
        sprintf(mykey, "key_%d", r);
        sprintf(myvalue, "value_%d", r);
        sparkey_assert(sparkey_hash_get(myreader, (uint8_t*)mykey, strlen(mykey), myiter));
        if (sparkey_logiter_state(myiter) != SPARKEY_ITER_ACTIVE) {
            printf("Failed to lookup key: %s\n", mykey);
            exit(1);
        }

        uint64_t wanted_valuelen = sparkey_logiter_valuelen(myiter);
        uint64_t actual_valuelen;
        sparkey_assert(sparkey_logiter_fill_value(myiter, logreader, wanted_valuelen, valuebuf, &actual_valuelen));
        if (actual_valuelen != strlen(myvalue) || memcmp(myvalue, valuebuf, actual_valuelen)) {
            printf("Did not get the expected value for key: %s\n", mykey);
            exit(1);
        }
    }
    sparkey_logiter_close(&myiter);
    sparkey_hash_close(&myreader);
}
Example #2
0
geonames_generic_t *geodb_get_len(char *key, size_t len) {
    if (geodb == NULL || geodb->hash_reader == NULL || geodb->log_iter == NULL) return NULL;
    sparkey_returncode ret = sparkey_hash_get(geodb->hash_reader, (uint8_t *)key, len, geodb->log_iter);
    if (sparkey_logiter_state(geodb->log_iter) == SPARKEY_ITER_ACTIVE) {
        uint64_t expected_value_len = sparkey_logiter_valuelen(geodb->log_iter);
        uint64_t actual_value_len;
        ret = sparkey_logiter_fill_value(geodb->log_iter, sparkey_hash_getreader(geodb->hash_reader), expected_value_len, (uint8_t *)geodb->value_buf->a, &actual_value_len);
        if (ret == SPARKEY_SUCCESS) {
            geonames_generic_t *generic = malloc(sizeof(geonames_generic_t));
            if (geonames_generic_deserialize(&generic->type, geodb->geoname, geodb->postal_code, geodb->value_buf)) {
                if (generic->type == GEONAMES_PLACE) {
                    generic->geoname = geodb->geoname;
                } else if (generic->type == GEONAMES_POSTAL_CODE) {
                    generic->postal_code = geodb->postal_code;
                } else {
                    free(generic);
                    return NULL;
                }
                return generic;
            }
        }
    } 
    return NULL;
}