]> git.sesse.net Git - plocate/blobdiff - database-builder.cpp
Install CACHEDIR.tag in /var/lib/plocate.
[plocate] / database-builder.cpp
index 642420f3c5942b6021157a2e19d559b751cdb255..89a06d6c59a52399a11c05a6513df780f4edb281 100644 (file)
@@ -163,7 +163,7 @@ string DictionaryBuilder::train(size_t buf_size)
        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);
@@ -224,7 +224,8 @@ void Corpus::add_file(string filename, dir_time dt)
        }
 }
 
-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);
@@ -313,7 +314,7 @@ string Corpus::get_compressed_dir_times()
        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);
 
@@ -416,7 +417,7 @@ unique_ptr<Trigram[]> create_hashtable(Corpus &corpus, const vector<uint32_t> &a
        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);
@@ -426,11 +427,24 @@ DatabaseBuilder::DatabaseBuilder(const char *outfile, gid_t owner, int block_siz
        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) {
@@ -455,6 +469,7 @@ DatabaseBuilder::DatabaseBuilder(const char *outfile, gid_t owner, int block_siz
        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()) {
@@ -596,8 +611,8 @@ void DatabaseBuilder::finish_corpus()
 
        // 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);
        }
 
@@ -606,6 +621,7 @@ void DatabaseBuilder::finish_corpus()
        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());
@@ -615,6 +631,12 @@ void DatabaseBuilder::finish_corpus()
                perror("linkat");
                exit(1);
        }
+#else
+       if (rename(temp_filename.c_str(), outfile.c_str()) == -1) {
+               perror("rename");
+               exit(1);
+       }
+#endif
 
        fclose(outfp);