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;
}