Separate the instantiation and initialisation of the stores
Add a new `init()` method to the `Store` class that is supposed to handle all the effectful initialisation needed to set-up the store. The constructor should remain side-effect free and just initialize the c++ data structure. The goal behind that is that we can create “dummy” instances of each store to query static properties about it (the parameters it accepts for example)
This commit is contained in:
parent
fa32560169
commit
3b57181f8e
9 changed files with 43 additions and 6 deletions
|
@ -58,7 +58,7 @@ public:
|
|||
|
||||
public:
|
||||
|
||||
virtual void init();
|
||||
virtual void init() override;
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
@ -5,6 +5,10 @@ namespace nix {
|
|||
struct DummyStore : public Store
|
||||
{
|
||||
DummyStore(const std::string uri, const Params & params)
|
||||
: DummyStore(params)
|
||||
{ }
|
||||
|
||||
DummyStore(const Params & params)
|
||||
: Store(params)
|
||||
{ }
|
||||
|
||||
|
|
|
@ -23,6 +23,12 @@ private:
|
|||
|
||||
public:
|
||||
|
||||
HttpBinaryCacheStore(
|
||||
const Params & params)
|
||||
: HttpBinaryCacheStore("dummy", params)
|
||||
{
|
||||
}
|
||||
|
||||
HttpBinaryCacheStore(
|
||||
const Path & _cacheUri,
|
||||
const Params & params)
|
||||
|
|
|
@ -37,6 +37,9 @@ struct LegacySSHStore : public Store
|
|||
|
||||
static std::vector<std::string> uriPrefixes() { return {"ssh"}; }
|
||||
|
||||
LegacySSHStore(const Params & params)
|
||||
: LegacySSHStore("dummy", params)
|
||||
{}
|
||||
|
||||
LegacySSHStore(const string & host, const Params & params)
|
||||
: Store(params)
|
||||
|
|
|
@ -12,6 +12,12 @@ private:
|
|||
|
||||
public:
|
||||
|
||||
LocalBinaryCacheStore(
|
||||
const Params & params)
|
||||
: LocalBinaryCacheStore("dummy", params)
|
||||
{
|
||||
}
|
||||
|
||||
LocalBinaryCacheStore(
|
||||
const Path & binaryCacheDir,
|
||||
const Params & params)
|
||||
|
|
|
@ -192,6 +192,9 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
|
||||
S3Helper s3Helper;
|
||||
|
||||
S3BinaryCacheStoreImpl(const Params & params)
|
||||
: S3BinaryCacheStoreImpl("dummy-bucket", params) {}
|
||||
|
||||
S3BinaryCacheStoreImpl(
|
||||
const std::string & bucketName,
|
||||
const Params & params)
|
||||
|
|
|
@ -17,6 +17,12 @@ public:
|
|||
const Setting<Path> remoteProgram{(Store*) this, "nix-daemon", "remote-program", "path to the nix-daemon executable on the remote system"};
|
||||
const Setting<std::string> remoteStore{(Store*) this, "", "remote-store", "URI of the store on the remote system"};
|
||||
|
||||
SSHStore(
|
||||
const Params & params)
|
||||
: SSHStore("dummy", params)
|
||||
{
|
||||
}
|
||||
|
||||
SSHStore(const std::string & host, const Params & params)
|
||||
: Store(params)
|
||||
, RemoteStore(params)
|
||||
|
|
|
@ -1094,8 +1094,9 @@ ref<Store> openStore(const std::string & uri_,
|
|||
}
|
||||
|
||||
for (auto implem : *Implementations::registered) {
|
||||
auto store = implem.open(uri, params);
|
||||
auto store = implem.create(uri, params);
|
||||
if (store) {
|
||||
store->init();
|
||||
store->warnUnknownSettings();
|
||||
return ref<Store>(store);
|
||||
}
|
||||
|
|
|
@ -200,9 +200,12 @@ protected:
|
|||
|
||||
Store(const Params & params);
|
||||
|
||||
std::shared_ptr<Config> getConfig();
|
||||
|
||||
public:
|
||||
/**
|
||||
* Perform any necessary effectful operation to make the store up and
|
||||
* running
|
||||
*/
|
||||
virtual void init() {};
|
||||
|
||||
virtual ~Store() { }
|
||||
|
||||
|
@ -749,7 +752,8 @@ std::list<ref<Store>> getDefaultSubstituters();
|
|||
|
||||
struct StoreFactory
|
||||
{
|
||||
std::function<std::shared_ptr<Store> (const std::string & uri, const Store::Params & params)> open;
|
||||
std::function<std::shared_ptr<Store> (const std::string & uri, const Store::Params & params)> create;
|
||||
std::function<std::shared_ptr<Store> (const Store::Params & params)> createDummy;
|
||||
};
|
||||
struct Implementations
|
||||
{
|
||||
|
@ -760,10 +764,14 @@ struct Implementations
|
|||
{
|
||||
if (!registered) registered = new std::vector<StoreFactory>();
|
||||
StoreFactory factory{
|
||||
.open =
|
||||
.create =
|
||||
([](const std::string & uri, const Store::Params & params)
|
||||
-> std::shared_ptr<Store>
|
||||
{ return std::make_shared<T>(uri, params); }),
|
||||
.createDummy =
|
||||
([](const Store::Params & params)
|
||||
-> std::shared_ptr<Store>
|
||||
{ return std::make_shared<T>(params); })
|
||||
};
|
||||
registered->push_back(factory);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue