aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2022-03-09 15:27:48 +0000
committerJohn Ericson <John.Ericson@Obsidian.Systems>2022-03-11 13:32:33 +0000
commita03b1fd7f60788304f358d5f4dc063c7c9e650a9 (patch)
treee5ec34a44b96ad4b384aca9343033292b26606fb /src/libstore
parent678d1c2aa0f499466c723d3461277dc197515f57 (diff)
Deduplicate the Store downcasting with a template
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/daemon.cc9
-rw-r--r--src/libstore/gc-store.cc13
-rw-r--r--src/libstore/gc-store.hh4
-rw-r--r--src/libstore/log-store.cc13
-rw-r--r--src/libstore/log-store.hh2
-rw-r--r--src/libstore/store-cast.hh16
6 files changed, 25 insertions, 32 deletions
diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc
index 1e24a1c79..9f21ecf36 100644
--- a/src/libstore/daemon.cc
+++ b/src/libstore/daemon.cc
@@ -3,6 +3,7 @@
#include "worker-protocol.hh"
#include "build-result.hh"
#include "store-api.hh"
+#include "store-cast.hh"
#include "gc-store.hh"
#include "log-store.hh"
#include "path-with-outputs.hh"
@@ -646,7 +647,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
Path path = absPath(readString(from));
logger->startWork();
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
gcStore.addIndirectRoot(path);
logger->stopWork();
@@ -664,7 +665,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
case wopFindRoots: {
logger->startWork();
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
Roots roots = gcStore.findRoots(!trusted);
logger->stopWork();
@@ -696,7 +697,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
logger->startWork();
if (options.ignoreLiveness)
throw Error("you are not allowed to ignore liveness");
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
gcStore.collectGarbage(options, results);
logger->stopWork();
@@ -954,7 +955,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
logger->startWork();
if (!trusted)
throw Error("you are not privileged to add logs");
- auto & logStore = LogStore::require(*store);
+ auto & logStore = require<LogStore>(*store);
{
FramedSource source(from);
StringSink sink;
diff --git a/src/libstore/gc-store.cc b/src/libstore/gc-store.cc
deleted file mode 100644
index dc2b82166..000000000
--- a/src/libstore/gc-store.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "gc-store.hh"
-
-namespace nix {
-
-GcStore & GcStore::require(Store & store)
-{
- auto * gcStore = dynamic_cast<GcStore *>(&store);
- if (!gcStore)
- throw UsageError("Garbage collection not supported by store '%s'", store.getUri());
- return *gcStore;
-}
-
-}
diff --git a/src/libstore/gc-store.hh b/src/libstore/gc-store.hh
index 462cc097b..b3cbbad74 100644
--- a/src/libstore/gc-store.hh
+++ b/src/libstore/gc-store.hh
@@ -61,6 +61,8 @@ struct GCResults
struct GcStore : public virtual Store
{
+ inline static std::string operationName = "Garbage collection";
+
/* Add an indirect root, which is merely a symlink to `path' from
/nix/var/nix/gcroots/auto/<hash of `path'>. `path' is supposed
to be a symlink to a store path. The garbage collector will
@@ -77,8 +79,6 @@ struct GcStore : public virtual Store
/* Perform a garbage collection. */
virtual void collectGarbage(const GCOptions & options, GCResults & results) = 0;
-
- static GcStore & require(Store & store);
};
}
diff --git a/src/libstore/log-store.cc b/src/libstore/log-store.cc
deleted file mode 100644
index 56aec91f2..000000000
--- a/src/libstore/log-store.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "log-store.hh"
-
-namespace nix {
-
-LogStore & LogStore::require(Store & store)
-{
- auto * gcStore = dynamic_cast<LogStore *>(&store);
- if (!gcStore)
- throw UsageError("Build log storage and retrieval not supported by store '%s'", store.getUri());
- return *gcStore;
-}
-
-}
diff --git a/src/libstore/log-store.hh b/src/libstore/log-store.hh
index ad17cbe6e..ff1b92e17 100644
--- a/src/libstore/log-store.hh
+++ b/src/libstore/log-store.hh
@@ -7,6 +7,8 @@ namespace nix {
struct LogStore : public virtual Store
{
+ inline static std::string operationName = "Build log storage and retrieval";
+
/* Return the build log of the specified store path, if available,
or null otherwise. */
virtual std::optional<std::string> getBuildLog(const StorePath & path) = 0;
diff --git a/src/libstore/store-cast.hh b/src/libstore/store-cast.hh
new file mode 100644
index 000000000..ff62fc359
--- /dev/null
+++ b/src/libstore/store-cast.hh
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "store-api.hh"
+
+namespace nix {
+
+template<typename T>
+T & require(Store & store)
+{
+ auto * castedStore = dynamic_cast<T *>(&store);
+ if (!castedStore)
+ throw UsageError("%s not supported by store '%s'", T::operationName, store.getUri());
+ return *castedStore;
+}
+
+}