about summary refs log tree commit diff
path: root/third_party/nix/src/libstore/binary-cache-store.hh
blob: 40c636f60ac297e0a78643fae4dbdf5bee7694db (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#pragma once

#include <atomic>

#include "libstore/crypto.hh"
#include "libstore/store-api.hh"
#include "libutil/pool.hh"

namespace nix {

struct NarInfo;

class BinaryCacheStore : public Store {
 public:
  const Setting<std::string> compression{
      this, "xz", "compression",
      "NAR compression method ('xz', 'bzip2', or 'none')"};
  const Setting<bool> writeNARListing{
      this, false, "write-nar-listing",
      "whether to write a JSON file listing the files in each NAR"};
  const Setting<Path> secretKeyFile{
      this, "", "secret-key",
      "path to secret key used to sign the binary cache"};
  const Setting<Path> localNarCache{this, "", "local-nar-cache",
                                    "path to a local cache of NARs"};
  const Setting<bool> parallelCompression{
      this, false, "parallel-compression",
      "enable multi-threading compression, available for xz only currently"};

 private:
  std::unique_ptr<SecretKey> 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<std::shared_ptr<std::string>> callback) noexcept;

  std::shared_ptr<std::string> getFile(const std::string& path);

 protected:
  bool wantMassQuery_ = false;
  int priority = 50;

 public:
  virtual void init();

 private:
  std::string narMagic;

  std::string narInfoFileFor(const Path& storePath);

  void writeNarInfo(const ref<NarInfo>& narInfo);

 public:
  bool isValidPathUncached(const Path& path) override;

  void queryPathInfoUncached(
      const Path& path,
      Callback<std::shared_ptr<ValidPathInfo>> callback) noexcept override;

  Path queryPathFromHashPart(const std::string& hashPart) override {
    unsupported("queryPathFromHashPart");
  }

  bool wantMassQuery() override { return wantMassQuery_; }

  void addToStore(const ValidPathInfo& info, const ref<std::string>& nar,
                  RepairFlag repair, CheckSigsFlag checkSigs,
                  std::shared_ptr<FSAccessor> accessor) override;

  Path addToStore(const std::string& name, const Path& srcPath, bool recursive,
                  HashType hashAlgo, PathFilter& filter,
                  RepairFlag repair) override;

  Path addTextToStore(const std::string& name, const std::string& s,
                      const PathSet& references, RepairFlag repair) override;

  void narFromPath(const Path& path, Sink& sink) override;

  BuildResult buildDerivation(std::ostream& /*log_sink*/, const Path& drvPath,
                              const BasicDerivation& drv,
                              BuildMode buildMode) override {
    unsupported("buildDerivation");
  }

  void ensurePath(const Path& path) override { unsupported("ensurePath"); }

  ref<FSAccessor> getFSAccessor() override;

  void addSignatures(const Path& storePath, const StringSet& sigs) override;

  std::shared_ptr<std::string> getBuildLog(const Path& path) override;

  int getPriority() override { return priority; }
};

MakeError(NoSuchBinaryCacheFile, Error);

}  // namespace nix