diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-29T15·11+0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-29T15·11+0100 |
commit | 0b907321cca39368c5abcb3f5e6d73d5ab2e3e40 (patch) | |
tree | 96109f761cd46823a7c52d10dac6b907e4c7c70b /src/libstore/store-api.cc | |
parent | 012f8d187c1a4260ecd931ef69c7d4c83029d088 (diff) |
Make store implementations pluggable
This for instance allows hydra-queue-runner to add the S3 backend at runtime.
Diffstat (limited to 'src/libstore/store-api.cc')
-rw-r--r-- | src/libstore/store-api.cc | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 24c05b8b4873..378233654225 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -314,27 +314,38 @@ void Store::exportPaths(const Paths & paths, #include "local-store.hh" #include "remote-store.hh" -#include "local-binary-cache-store.hh" namespace nix { +RegisterStoreImplementation::Implementations * RegisterStoreImplementation::implementations = 0; + + ref<Store> openStoreAt(const std::string & uri) { - if (std::string(uri, 0, 7) == "file://") { - auto store = make_ref<LocalBinaryCacheStore>(std::shared_ptr<Store>(0), - "", "", // FIXME: allow the signing key to be set - std::string(uri, 7)); - store->init(); - return store; + for (auto fun : *RegisterStoreImplementation::implementations) { + auto store = fun(uri); + if (store) return ref<Store>(store); } + throw Error(format("don't know how to open Nix store ‘%s’") % uri); +} + + +ref<Store> openStore() +{ + return openStoreAt(getEnv("NIX_REMOTE")); +} + + +static RegisterStoreImplementation regStore([](const std::string & uri) -> std::shared_ptr<Store> { enum { mDaemon, mLocal, mAuto } mode; - mode = - uri == "daemon" ? mDaemon : - uri == "local" ? mLocal : mAuto; + if (uri == "daemon") mode = mDaemon; + else if (uri == "local") mode = mLocal; + else if (uri == "") mode = mAuto; + else return 0; if (mode == mAuto) { if (LocalStore::haveWriteAccess()) @@ -346,15 +357,9 @@ ref<Store> openStoreAt(const std::string & uri) } return mode == mDaemon - ? (ref<Store>) make_ref<RemoteStore>() - : (ref<Store>) make_ref<LocalStore>(); -} - - -ref<Store> openStore() -{ - return openStoreAt(getEnv("NIX_REMOTE")); -} + ? std::shared_ptr<Store>(std::make_shared<RemoteStore>()) + : std::shared_ptr<Store>(std::make_shared<LocalStore>()); +}); } |