static sparkey_returncode fill_hash()

in src/hashwriter.c [315:351]


static sparkey_returncode fill_hash(uint8_t *hashtable, const char *hash_filename, sparkey_hashheader *old_header, sparkey_hashheader *new_header) {
  int fd = open(hash_filename, O_RDONLY);
  if (fd < 0) {
    return sparkey_open_returncode(errno);
  }

  lseek(fd, old_header->header_size, SEEK_SET);

  int slot_size = old_header->address_size + old_header->hash_size;
  uint64_t buffer_size = slot_size * 1024;
  uint8_t *buf = malloc(buffer_size);
  if (buf == NULL) {
    fprintf(stderr, "fill_hash():%d bug: could not malloc %"PRIu64" bytes\n", __LINE__, buffer_size);
    return SPARKEY_INTERNAL_ERROR;
  }

  sparkey_returncode returncode = SPARKEY_SUCCESS;
  uint64_t remaining = old_header->hash_capacity * slot_size;
  while (buffer_size <= remaining) {
    TRY(read_fully(fd, buf, buffer_size), free);
    TRY(hash_copy(hashtable, buf, buffer_size, old_header, new_header), free);
    remaining -= buffer_size;
  }
  TRY(read_fully(fd, buf, remaining), free);
  TRY(hash_copy(hashtable, buf, remaining, old_header, new_header), free);

free:
  free(buf);
  if (close(fd) < 0) {
    if (returncode == SPARKEY_SUCCESS) {
      fprintf(stderr, "fill_hash():%d bug: could not close file. errno = %d\n", __LINE__, errno);
      returncode = SPARKEY_INTERNAL_ERROR;
    }
  }

  return returncode;
}