#pragma once #include "crypto.hh" #include "store-api.hh" #include "pool.hh" #include namespace nix { struct NarInfo; class BinaryCacheStore : public Store { public: const Setting compression{this, "xz", "compression", "NAR compression method ('xz', 'bzip2', or 'none')"}; const Setting writeNARListing{this, false, "write-nar-listing", "whether to write a JSON file listing the files in each NAR"}; const Setting writeDebugInfo{this, false, "index-debug-info", "whether to index DWARF debug info files by build ID"}; const Setting secretKeyFile{this, "", "secret-key", "path to secret key used to sign the binary cache"}; const Setting localNarCache{this, "", "local-nar-cache", "path to a local cache of NARs"}; const Setting parallelCompression{this, false, "parallel-compression", "enable multi-threading compression, available for xz only currently"}; private: std::unique_ptr secretKey; protected: BinaryCacheStore(const Params & params); public: virtual bool fileExists(const std::string & path) = 0; virtual void upsertFile(const std::string & path, const std::string & data, const std::string & mimeType) = 0; /* Note: subclasses must implement at least one of the two following getFile() methods. */ /* Dump the contents of the specified file to a sink. */ virtual void getFile(const std::string & path, Sink & sink); /* Fetch the specified file and call the specified callback with the result. A subclass may implement this asynchronously. */ virtual void getFile(const std::string & path, Callback> callback) noexcept; std::shared_ptr getFile(const std::string & path); protected: bool wantMassQuery_ = false; int priority = 50; public: virtual void init(); private: std::string narMagic; std::string narInfoFileFor(const StorePath & storePath); void writeNarInfo(ref narInfo); public: bool isValidPathUncached(const StorePath & path) override; void queryPathInfoUncached(const StorePath & path, Callback> callback) noexcept override; std::optional queryPathFromHashPart(const std::string & hashPart) override { unsupported("queryPathFromHashPart"); } bool wantMassQuery() override { return wantMassQuery_; } void addToStore(const ValidPathInfo & info, const ref & nar, RepairFlag repair, CheckSigsFlag checkSigs, std::shared_ptr accessor) override; StorePath addToStore(const string & name, const Path & srcPath, bool recursive, HashType hashAlgo, PathFilter & filter, RepairFlag repair) override; StorePath addTextToStore(const string & name, const string & s, const StorePathSet & references, RepairFlag repair) override; void narFromPath(const StorePath & path, Sink & sink) override; BuildResult buildDerivation(const StorePath & drvPath, const BasicDerivation & drv, BuildMode buildMode) override { unsupported("buildDerivation"); } void ensurePath(const StorePath & path) override { unsupported("ensurePath"); } ref getFSAccessor() override; void addSignatures(const StorePath & storePath, const StringSet & sigs) override; std::shared_ptr getBuildLog(const StorePath & path) override; int getPriority() override { return priority; } }; MakeError(NoSuchBinaryCacheFile, Error); }