#pragma once
#include <limits>
#include <string>
#include "libstore/store-api.hh"
namespace nix {
class Pipe;
class Pid;
struct FdSink;
struct FdSource;
template <typename T>
class Pool;
struct ConnectionHandle;
/* FIXME: RemoteStore is a misnomer - should be something like
DaemonStore. */
class RemoteStore : public virtual Store {
public:
const Setting<int> maxConnections{
(Store*)this, 1, "max-connections",
"maximum number of concurrent connections to the Nix daemon"};
const Setting<unsigned int> maxConnectionAge{
(Store*)this, std::numeric_limits<unsigned int>::max(),
"max-connection-age", "number of seconds to reuse a connection"};
virtual bool sameMachine() = 0;
RemoteStore(const Params& params);
/* Implementations of abstract store API methods. */
bool isValidPathUncached(const Path& path) override;
PathSet queryValidPaths(const PathSet& paths, SubstituteFlag maybeSubstitute =
NoSubstitute) override;
PathSet queryAllValidPaths() override;
void queryPathInfoUncached(
const Path& path,
Callback<std::shared_ptr<ValidPathInfo>> callback) noexcept override;
void queryReferrers(const Path& path, PathSet& referrers) override;
PathSet queryValidDerivers(const Path& path) override;
PathSet queryDerivationOutputs(const Path& path) override;
StringSet queryDerivationOutputNames(const Path& path) override;
Path queryPathFromHashPart(const std::string& hashPart) override;
PathSet querySubstitutablePaths(const PathSet& paths) override;
void querySubstitutablePathInfos(const PathSet& paths,
SubstitutablePathInfos& infos) override;
void addToStore(const ValidPathInfo& info, Source& source, RepairFlag repair,
CheckSigsFlag checkSigs,
std::shared_ptr<FSAccessor> accessor) override;
Path addToStore(const std::string& name, const Path& srcPath,
bool recursive = true, HashType hashAlgo = htSHA256,
PathFilter& filter = defaultPathFilter,
RepairFlag repair = NoRepair) override;
Path addTextToStore(const std::string& name, const std::string& s,
const PathSet& references, RepairFlag repair) override;
absl::Status buildPaths(std::ostream& log_sink, const PathSet& paths,
BuildMode build_mode) override;
BuildResult buildDerivation(const Path& drvPath, const BasicDerivation& drv,
BuildMode buildMode) override;
void ensurePath(const Path& path) override;
void addTempRoot(const Path& path) override;
void addIndirectRoot(const Path& path) override;
void syncWithGC() override;
Roots findRoots(bool censor) override;
void collectGarbage(const GCOptions& options, GCResults& results) override;
void optimiseStore() override;
bool verifyStore(bool checkContents, RepairFlag repair) override;
void addSignatures(const Path& storePath, const StringSet& sigs) override;
void queryMissing(const PathSet& targets, PathSet& willBuild,
PathSet& willSubstitute, PathSet& unknown,
unsigned long long& downloadSize,
unsigned long long& narSize) override;
void connect() override;
unsigned int getProtocol() override;
void flushBadConnections();
protected:
struct Connection {
AutoCloseFD fd;
FdSink to;
FdSource from;
unsigned int daemonVersion;
std::chrono::time_point<std::chrono::steady_clock> startTime;
virtual ~Connection();
std::exception_ptr processStderr(Sink* sink = 0, Source* source = 0);
};
ref<Connection> openConnectionWrapper();
virtual ref<Connection> openConnection() = 0;
void initConnection(Connection& conn);
ref<Pool<Connection>> connections;
virtual void setOptions(Connection& conn);
ConnectionHandle getConnection();
friend struct ConnectionHandle;
private:
std::atomic_bool failed{false};
};
} // namespace nix