static sparkey_returncode seekblock()

in src/logreader.c [204:232]


static sparkey_returncode seekblock(sparkey_logiter *iter, sparkey_logreader *log, uint64_t position) {
  iter->block_offset = 0;
  if (iter->block_position == position) {
    return SPARKEY_SUCCESS;
  }
  if (sparkey_uses_compressor(log->header.compression_type)) {
    uint64_t pos = position;
    // TODO: assert that we're not reading > uint32_t
    uint32_t compressed_size = read_vlq(log->data, &pos);
    uint64_t next_pos = pos + compressed_size;
    uint32_t uncompressed_size = log->header.compression_block_size;

    sparkey_returncode ret = sparkey_compressors[log->header.compression_type].decompress(
      &log->data[pos], compressed_size, iter->compression_buf, &uncompressed_size);
    if (ret != SPARKEY_SUCCESS) {
      return ret;
    }

    iter->block_position = position;
    iter->next_block_position = next_pos;
    iter->block_len = uncompressed_size;
  } else {
    iter->compression_buf = &log->data[position];
    iter->block_position = position;
    iter->next_block_position = log->header.data_end;
    iter->block_len = log->data_len - position;
  }
  return SPARKEY_SUCCESS;
}