#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 void addToStore(const ValidPathInfo& info,
const ref<std::string>& nar,
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_;
};
} // namespace nix::store