int get(const char *hashfile, const char *logfile, const char *key) { sparkey_hashreader *reader; sparkey_logreader *logreader; sparkey_logiter *iter; assert(sparkey_hash_open(&reader, hashfile, logfile)); logreader = sparkey_hash_getreader(reader); assert(sparkey_logiter_create(&iter, logreader)); uint64_t keylen = strlen(key); assert(sparkey_hash_get(reader, (uint8_t*) key, keylen, iter)); int exitcode = 2; if (sparkey_logiter_state(iter) == SPARKEY_ITER_ACTIVE) { exitcode = 0; uint8_t * res; uint64_t len; do { assert(sparkey_logiter_valuechunk(iter, logreader, 1 << 31, &res, &len)); assert(write_full(STDOUT_FILENO, res, len)); } while (len > 0); } sparkey_logiter_close(&iter); sparkey_hash_close(&reader); return exitcode; }
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); }
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; }