string buf;
buf.resize(buf_size);
size_t ret = ZDICT_trainFromBuffer(&buf[0], buf_size, dictionary_buf.data(), lengths.data(), lengths.size());
- if (ret == size_t(-1)) {
+ if (ZDICT_isError(ret)) {
return "";
}
dprintf("Sampled %zu bytes in %zu blocks, built a dictionary of size %zu\n", dictionary_buf.size(), lengths.size(), ret);
}
}
-void Corpus::compress_dir_times(size_t allowed_slop) {
+void Corpus::compress_dir_times(size_t allowed_slop)
+{
while (dir_times.size() >= allowed_slop) {
size_t old_size = dir_times_compressed.size();
dir_times_compressed.resize(old_size + 4096);
compress_dir_times(/*allowed_slop=*/0);
assert(dir_times.empty());
- for ( ;; ) {
+ for (;;) {
size_t old_size = dir_times_compressed.size();
dir_times_compressed.resize(old_size + 4096);
return ht;
}
-DatabaseBuilder::DatabaseBuilder(const char *outfile, gid_t owner, int block_size, string dictionary)
+DatabaseBuilder::DatabaseBuilder(const char *outfile, gid_t owner, int block_size, string dictionary, bool check_visibility)
: outfile(outfile), block_size(block_size)
{
umask(0027);
if (path.empty()) {
path = ".";
}
+#ifdef O_TMPFILE
int fd = open(path.c_str(), O_WRONLY | O_TMPFILE, 0640);
if (fd == -1) {
perror(path.c_str());
exit(1);
}
+#else
+ temp_filename = string(outfile) + ".XXXXXX";
+ int fd = mkstemp(&temp_filename[0]);
+ if (fd == -1) {
+ perror(temp_filename.c_str());
+ exit(1);
+ }
+ if (fchmod(fd, 0640) == -1) {
+ perror("fchmod");
+ exit(1);
+ }
+#endif
if (owner != (gid_t)-1) {
if (fchown(fd, (uid_t)-1, owner) == -1) {
hdr.max_version = 2;
hdr.filename_index_offset_bytes = -1;
hdr.zstd_dictionary_length_bytes = -1;
+ hdr.check_visibility = check_visibility;
fwrite(&hdr, sizeof(hdr), 1, outfp);
if (dictionary.empty()) {
// And the configuration block.
if (!conf_block.empty()) {
- hdr.next_zstd_dictionary_offset_bytes = ftell(outfp);
- hdr.next_zstd_dictionary_length_bytes = conf_block.size();
+ hdr.conf_block_offset_bytes = ftell(outfp);
+ hdr.conf_block_length_bytes = conf_block.size();
fwrite(conf_block.data(), conf_block.size(), 1, outfp);
}
fseek(outfp, 0, SEEK_SET);
fwrite(&hdr, sizeof(hdr), 1, outfp);
+#ifdef O_TMPFILE
// Give the file a proper name, making it visible in the file system.
// TODO: It would be nice to be able to do this atomically, like with rename.
unlink(outfile.c_str());
perror("linkat");
exit(1);
}
+#else
+ if (rename(temp_filename.c_str(), outfile.c_str()) == -1) {
+ perror("rename");
+ exit(1);
+ }
+#endif
fclose(outfp);