about summary refs log tree commit diff
path: root/third_party/nix/src/libstore/rpc-store.hh
blob: dd421caf44c4c59d8a07249ee7e9d7701f6ac73b (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#pragma once

#include "libproto/worker.grpc.pb.h"
#include "libproto/worker.pb.h"
#include "libstore/remote-store.hh"
#include "libstore/store-api.hh"

namespace nix::store {

// TODO(grfn): Currently, since the RPCStore is only used for the connection to
// the nix daemon over a unix socket, it inherits from the LocalFSStore since it
// shares a filesystem with the daemon. This will not always be the case, at
// which point we should tease these two things apart.
class RpcStore : public LocalFSStore, public virtual Store {
 public:
  RpcStore(const Params& params,
           std::unique_ptr<nix::proto::WorkerService::Stub> stub)
      : Store(params), LocalFSStore(params), stub_(std::move(stub)) {}

  RpcStore(std::string uri, const Params& params,
           std::unique_ptr<nix::proto::WorkerService::Stub> stub)
      : Store(params),
        LocalFSStore(params),
        uri_(uri),
        stub_(std::move(stub)) {}

  std::string getUri() override {
    if (uri_.has_value()) {
      return uri_.value();
    } else {
      return "daemon";
    }
  };

  virtual PathSet queryAllValidPaths() override;

  virtual void queryReferrers(const Path& path, PathSet& referrers) override;

  virtual PathSet queryValidDerivers(const Path& path) override;

  virtual PathSet queryDerivationOutputs(const Path& path) override;

  virtual StringSet queryDerivationOutputNames(const Path& path) override;

  virtual Path queryPathFromHashPart(const std::string& hashPart) override;

  virtual PathSet querySubstitutablePaths(const PathSet& paths) override;

  virtual void querySubstitutablePathInfos(
      const PathSet& paths, SubstitutablePathInfos& infos) override;

  virtual bool wantMassQuery() override { return true; }

  virtual void addToStore(const ValidPathInfo& info, Source& narSource,
                          RepairFlag repair = NoRepair,
                          CheckSigsFlag checkSigs = CheckSigs,
                          std::shared_ptr<FSAccessor> accessor = 0) override;

  virtual Path addToStore(const std::string& name, const Path& srcPath,
                          bool recursive = true, HashType hashAlgo = htSHA256,
                          PathFilter& filter = defaultPathFilter,
                          RepairFlag repair = NoRepair) override;

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

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

  virtual void buildPaths(const PathSet& paths,
                          BuildMode buildMode = bmNormal) override;

  virtual BuildResult buildDerivation(const Path& drvPath,
                                      const BasicDerivation& drv,
                                      BuildMode buildMode = bmNormal) override;

  virtual void ensurePath(const Path& path) override;

  virtual void addTempRoot(const Path& path) override;

  virtual void addIndirectRoot(const Path& path) override;

  virtual void syncWithGC() override;

  virtual Roots findRoots(bool censor) override;

  virtual void collectGarbage(const GCOptions& options,
                              GCResults& results) override;

  virtual void optimiseStore() override;

  virtual bool verifyStore(bool checkContents,
                           RepairFlag repair = NoRepair) override;

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

  virtual void computeFSClosure(const PathSet& paths, PathSet& paths_,
                                bool flipDirection = false,
                                bool includeOutputs = false,
                                bool includeDerivers = false) override;

  virtual void queryMissing(const PathSet& targets, PathSet& willBuild,
                            PathSet& willSubstitute, PathSet& unknown,
                            unsigned long long& downloadSize,
                            unsigned long long& narSize) override;

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

  virtual void connect() override;

  virtual unsigned int getProtocol() override;

  virtual int getPriority() override;

  virtual Path toRealPath(const Path& storePath) override;

  virtual void createUser(const std::string& userName, uid_t userId) override;

 protected:
  virtual bool isValidPathUncached(const Path& path) override;

  virtual PathSet queryValidPaths(
      const PathSet& paths,
      SubstituteFlag maybeSubstitute = NoSubstitute) override;

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

 private:
  std::optional<std::string> uri_;
  std::unique_ptr<nix::proto::WorkerService::Stub> stub_;

  void const SuccessOrThrow(const grpc::Status& status) const;
};

}  // namespace nix::store