sparkey_returncode sparkey_logwriter_append()

in src/logwriter.c [122:171]


sparkey_returncode sparkey_logwriter_append(sparkey_logwriter **log_ref, const char *filename) {
  sparkey_returncode returncode;
  int fd = 0;
  sparkey_logwriter *log = malloc(sizeof(sparkey_logwriter));
  if (log == NULL) {
    TRY(SPARKEY_INTERNAL_ERROR, error);
  }
  TRY(sparkey_load_logheader(&log->header, filename), error);

  if (log->header.major_version != LOG_MAJOR_VERSION) {
    TRY(SPARKEY_WRONG_LOG_MAJOR_VERSION, error);
  }
  if (log->header.minor_version != LOG_MINOR_VERSION) {
    TRY(SPARKEY_UNSUPPORTED_LOG_MINOR_VERSION, error);
  }

  if (sparkey_uses_compressor(log->header.compression_type)) {
    if (log->header.compression_block_size < 10) {
      TRY(SPARKEY_INVALID_COMPRESSION_BLOCK_SIZE, error);
    }
    log->max_compressed_size = sparkey_compressors[log->header.compression_type].max_compressed_size(
      log->header.compression_block_size);
    log->compressed = malloc(log->max_compressed_size);
  } else {
    log->header.compression_block_size = 0;
    log->compressed = NULL;
  }

  fd = open(filename, O_WRONLY, 00644);
  if (fd == -1) {
    int e = errno;
    TRY(sparkey_create_returncode(e), error);
  }
  log->fd = fd;

  lseek(fd, log->header.data_end, SEEK_SET);

  TRY(buf_init(&log->file_buf, 1024*1024), error);
  TRY(buf_init(&log->block_buf, log->header.compression_block_size), error);

  log->entry_count = 0;

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