X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plocate-build.cpp;h=ed252fc5a5ac755efb23b6d1ea621d3d28e3cd37;hb=db96666312961f730f7ea9e4a966fc43d73dbc1c;hp=e273e6ca79e6d369e959ba1c3e0df4b264e25ce4;hpb=18c832ba91a6a7e00451efb431bf4d55af1c13e5;p=plocate diff --git a/plocate-build.cpp b/plocate-build.cpp index e273e6c..ed252fc 100644 --- a/plocate-build.cpp +++ b/plocate-build.cpp @@ -2,20 +2,20 @@ #include "turbopfor-encode.h" #include -#include #include #include -#include -#include +#include +#include #include #include +#include #include +#include #include #include +#include #include -#include -#include -#include +#include #include #include @@ -144,7 +144,17 @@ void PostingListBuilder::write_header(uint32_t docid) class Corpus { public: Corpus(FILE *outfp, size_t block_size) - : invindex(new PostingListBuilder *[NUM_TRIGRAMS]), outfp(outfp), block_size(block_size) {} + : invindex(new PostingListBuilder *[NUM_TRIGRAMS]), outfp(outfp), block_size(block_size) + { + fill(invindex.get(), invindex.get() + NUM_TRIGRAMS, nullptr); + } + ~Corpus() + { + for (unsigned i = 0; i < NUM_TRIGRAMS; ++i) { + delete invindex[i]; + } + } + void add_file(string filename); void flush_block(); @@ -290,7 +300,8 @@ string zstd_compress(const string &src, string *tempbuf) if (tempbuf->size() < max_size) { tempbuf->resize(max_size); } - size_t size = ZSTD_compress(&(*tempbuf)[0], max_size, src.data(), src.size(), /*level=*/6); + static ZSTD_CCtx *ctx = ZSTD_createCCtx(); // Reused across calls. + size_t size = ZSTD_compressCCtx(ctx, &(*tempbuf)[0], max_size, src.data(), src.size(), /*level=*/6); return string(tempbuf->data(), size); } @@ -364,6 +375,7 @@ void do_build(const char *infile, const char *outfile, int block_size) hdr.version = -1; // Mark as broken. hdr.hashtable_size = 0; // Not known yet. hdr.extra_ht_slots = num_overflow_slots; + hdr.num_docids = 0; hdr.hash_table_offset_bytes = -1; // We don't know these offsets yet. hdr.filename_index_offset_bytes = -1; fwrite(&hdr, sizeof(hdr), 1, outfp); @@ -484,8 +496,66 @@ void do_build(const char *infile, const char *outfile, int block_size) dprintf("\n"); } +void usage() +{ + printf( + "Usage: plocate-build MLOCATE_DB PLOCATE_DB\n" + "\n" + "Generate plocate index from mlocate.db, typically /var/lib/mlocate/mlocate.db.\n" + "Normally, the destination should be /var/lib/mlocate/plocate.db.\n" + "\n" + " -b, --block-size SIZE number of filenames to store in each block (default 32)\n" + " --help print this help\n" + " --version print version information\n"); +} + +void version() +{ + printf("plocate-build %s\n", PLOCATE_VERSION); + printf("Copyright 2020 Steinar H. Gunderson\n"); + printf("License GPLv2+: GNU GPL version 2 or later .\n"); + printf("This is free software: you are free to change and redistribute it.\n"); + printf("There is NO WARRANTY, to the extent permitted by law.\n"); +} + int main(int argc, char **argv) { - do_build(argv[1], argv[2], 32); + static const struct option long_options[] = { + { "block-size", required_argument, 0, 'b' }, + { "help", no_argument, 0, 'h' }, + { "version", no_argument, 0, 'V' }, + { 0, 0, 0, 0 } + }; + + int block_size = 32; + + setlocale(LC_ALL, ""); + for (;;) { + int option_index = 0; + int c = getopt_long(argc, argv, "b:hV", long_options, &option_index); + if (c == -1) { + break; + } + switch (c) { + case 'b': + block_size = atoi(optarg); + break; + case 'h': + usage(); + exit(0); + case 'v': + version(); + exit(0); + default: + exit(1); + } + } + + if (argc - optind != 2) { + usage(); + exit(1); + } + + do_build(argv[optind], argv[optind + 1], block_size); exit(EXIT_SUCCESS); }