sparkey_returncode sparkey_logwriter_create()

in src/logwriter.c [52:120]


sparkey_returncode sparkey_logwriter_create(sparkey_logwriter **log_ref, const char *filename, sparkey_compression_type compression_type, int compression_block_size) {
  sparkey_returncode returncode;
  int fd = 0;
  sparkey_logwriter *l = malloc(sizeof(sparkey_logwriter));
  if (l == NULL) {
    TRY(SPARKEY_INTERNAL_ERROR, error);
  }
  if (sparkey_uses_compressor(compression_type)) {
    if (compression_block_size < 10) {
      TRY(SPARKEY_INVALID_COMPRESSION_BLOCK_SIZE, error);
    }
    l->max_compressed_size = sparkey_compressors[compression_type].max_compressed_size(compression_block_size);
    l->compressed = malloc(l->max_compressed_size);
    if (l->compressed == NULL) {
      TRY(SPARKEY_INTERNAL_ERROR, error);
    }
  } else {
    compression_block_size = 0;
    l->compressed = NULL;
  }

  // Try removing it first, to avoid overwriting existing files that readers may be using.
  if (remove(filename) < 0) {
    int e = errno;
    if (e != ENOENT) {
      TRY(sparkey_remove_returncode(e), error);
    }
  }

  fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 00644);
  if (fd == -1) {
    TRY(sparkey_create_returncode(errno), error);
  }
  l->fd = fd;

  l->header.compression_block_size = compression_block_size;
  l->header.compression_type = compression_type;

  TRY(rand32(&(l->header.file_identifier)), error);
  l->header.data_end = LOG_HEADER_SIZE;
  l->header.major_version = LOG_MAJOR_VERSION;
  l->header.minor_version = LOG_MINOR_VERSION;
  l->header.put_size = 0;
  l->header.delete_size = 0;
  l->header.num_puts = 0;
  l->header.num_deletes = 0;
  l->header.max_entries_per_block = 0;
  l->header.max_key_len = 0;
  l->header.max_value_len = 0;

  TRY(write_logheader(fd, &l->header), error);
  off_t pos = lseek(fd, 0, SEEK_CUR);
  if (pos != LOG_HEADER_SIZE) {
    TRY(SPARKEY_INTERNAL_ERROR, error);
  }

  TRY(buf_init(&l->file_buf, 1024*1024), error);
  TRY(buf_init(&l->block_buf, compression_block_size), error);

  l->entry_count = 0;

  l->open_status = MAGIC_VALUE_LOGWRITER;
  *log_ref = l;
  return SPARKEY_SUCCESS;
error:
  free(l);
  if (fd > 0) close(fd);
  return returncode;
}