aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorregnat <rg@regnat.ovh>2020-12-08 21:07:52 +0100
committerThéophane Hufschmitt <regnat@users.noreply.github.com>2020-12-11 21:05:09 +0100
commit8914e01e37ad072d940e2000fede7c2e0f4b194c (patch)
treeb5b0a3a552ed7df8e98867a672609cf0a2bf0a46
parent3ac9d74eb1de0f696bb0384132f7ecc7d057f9d6 (diff)
Store the realisations as JSON in the binary cache
Fix #4332
-rw-r--r--src/libstore/binary-cache-store.cc5
-rw-r--r--src/libstore/realisation.cc61
-rw-r--r--src/libstore/realisation.hh5
3 files changed, 25 insertions, 46 deletions
diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc
index 085dc7ba1..5b081c1ae 100644
--- a/src/libstore/binary-cache-store.cc
+++ b/src/libstore/binary-cache-store.cc
@@ -449,7 +449,8 @@ std::optional<const Realisation> BinaryCacheStore::queryRealisation(const DrvOut
auto rawOutputInfo = getFile(outputInfoFilePath);
if (rawOutputInfo) {
- return { Realisation::parse(*rawOutputInfo, outputInfoFilePath) };
+ return {Realisation::fromJSON(
+ nlohmann::json::parse(*rawOutputInfo), outputInfoFilePath)};
} else {
return std::nullopt;
}
@@ -457,7 +458,7 @@ std::optional<const Realisation> BinaryCacheStore::queryRealisation(const DrvOut
void BinaryCacheStore::registerDrvOutput(const Realisation& info) {
auto filePath = realisationsPrefix + "/" + info.id.to_string() + ".doi";
- upsertFile(filePath, info.to_string(), "text/x-nix-derivertopath");
+ upsertFile(filePath, info.toJSON(), "application/json");
}
ref<FSAccessor> BinaryCacheStore::getFSAccessor()
diff --git a/src/libstore/realisation.cc b/src/libstore/realisation.cc
index fcc1a3825..47db1ec9f 100644
--- a/src/libstore/realisation.cc
+++ b/src/libstore/realisation.cc
@@ -1,5 +1,6 @@
#include "realisation.hh"
#include "store-api.hh"
+#include <nlohmann/json.hpp>
namespace nix {
@@ -20,52 +21,28 @@ std::string DrvOutput::to_string() const {
return std::string(drvPath.to_string()) + "!" + outputName;
}
-std::string Realisation::to_string() const {
- std::string res;
-
- res += "Id: " + id.to_string() + '\n';
- res += "OutPath: " + std::string(outPath.to_string()) + '\n';
-
- return res;
+nlohmann::json Realisation::toJSON() const {
+ return nlohmann::json{
+ {"id", id.to_string()},
+ {"outPath", outPath.to_string()},
+ };
}
-Realisation Realisation::parse(const std::string & s, const std::string & whence)
-{
- // XXX: Copy-pasted from NarInfo::NarInfo. Should be factored out
- auto corrupt = [&]() {
- return Error("Drv output info file '%1%' is corrupt", whence);
+Realisation Realisation::fromJSON(
+ const nlohmann::json& json,
+ const std::string& whence) {
+ auto getField = [&](std::string fieldName) -> std::string {
+ auto fieldIterator = json.find(fieldName);
+ if (fieldIterator == json.end())
+ throw Error(
+ "Drv output info file '%1%' is corrupt, missing field %2%",
+ whence, fieldName);
+ return *fieldIterator;
};
- std::optional<DrvOutput> id;
- std::optional<StorePath> outPath;
-
- size_t pos = 0;
- while (pos < s.size()) {
-
- size_t colon = s.find(':', pos);
- if (colon == std::string::npos) throw corrupt();
-
- std::string name(s, pos, colon - pos);
-
- size_t eol = s.find('\n', colon + 2);
- if (eol == std::string::npos) throw corrupt();
-
- std::string value(s, colon + 2, eol - colon - 2);
-
- if (name == "Id")
- id = DrvOutput::parse(value);
-
- if (name == "OutPath")
- outPath = StorePath(value);
-
- pos = eol + 1;
- }
-
- if (!outPath) corrupt();
- if (!id) corrupt();
- return Realisation {
- .id = *id,
- .outPath = *outPath,
+ return Realisation{
+ .id = DrvOutput::parse(getField("id")),
+ .outPath = StorePath(getField("outPath")),
};
}
diff --git a/src/libstore/realisation.hh b/src/libstore/realisation.hh
index c573e1bb4..08579b739 100644
--- a/src/libstore/realisation.hh
+++ b/src/libstore/realisation.hh
@@ -1,6 +1,7 @@
#pragma once
#include "path.hh"
+#include <nlohmann/json_fwd.hpp>
namespace nix {
@@ -25,8 +26,8 @@ struct Realisation {
DrvOutput id;
StorePath outPath;
- std::string to_string() const;
- static Realisation parse(const std::string & s, const std::string & whence);
+ nlohmann::json toJSON() const;
+ static Realisation fromJSON(const nlohmann::json& json, const std::string& whence);
};
typedef std::map<DrvOutput, Realisation> DrvOutputs;