mirror of
https://github.com/NixOS/nix.git
synced 2025-12-01 14:41:00 +01:00
The existing header is a bit too big. Now the following use-cases are separated, and get their own headers: - Using or implementing an arbitrary store: remaining `store-api.hh` This is closer to just being about the `Store` (and `StoreConfig`) classes, as one would expect. - Opening a store from a textual description: `store-open.hh` Opening an aribtrary store implementation like this requires some sort of store registration mechanism to exists, but the caller doesn't need to know how it works. This just exposes the functions which use such a mechanism, without exposing the mechanism itself - Registering a store implementation: `store-registration.hh` This requires understanding how the mechanism actually works, and the mechanism in question involves templated machinery in headers we rather not expose to things that don't need it, as it would slow down compilation for no reason.
182 lines
4.8 KiB
C++
182 lines
4.8 KiB
C++
#include "nix_api_store.h"
|
|
#include "nix_api_store_internal.h"
|
|
#include "nix_api_util.h"
|
|
#include "nix_api_util_internal.h"
|
|
|
|
#include "nix/store/path.hh"
|
|
#include "nix/store/store-api.hh"
|
|
#include "nix/store/store-open.hh"
|
|
#include "nix/store/build-result.hh"
|
|
|
|
#include "nix/store/globals.hh"
|
|
|
|
nix_err nix_libstore_init(nix_c_context * context)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
nix::initLibStore();
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|
|
|
|
nix_err nix_libstore_init_no_load_config(nix_c_context * context)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
nix::initLibStore(false);
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|
|
|
|
Store * nix_store_open(nix_c_context * context, const char * uri, const char *** params)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
std::string uri_str = uri ? uri : "";
|
|
|
|
if (uri_str.empty())
|
|
return new Store{nix::openStore()};
|
|
|
|
if (!params)
|
|
return new Store{nix::openStore(uri_str)};
|
|
|
|
nix::Store::Config::Params params_map;
|
|
for (size_t i = 0; params[i] != nullptr; i++) {
|
|
params_map[params[i][0]] = params[i][1];
|
|
}
|
|
return new Store{nix::openStore(uri_str, params_map)};
|
|
}
|
|
NIXC_CATCH_ERRS_NULL
|
|
}
|
|
|
|
void nix_store_free(Store * store)
|
|
{
|
|
delete store;
|
|
}
|
|
|
|
nix_err nix_store_get_uri(nix_c_context * context, Store * store, nix_get_string_callback callback, void * user_data)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
auto res = store->ptr->getUri();
|
|
return call_nix_get_string_callback(res, callback, user_data);
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|
|
|
|
nix_err
|
|
nix_store_get_storedir(nix_c_context * context, Store * store, nix_get_string_callback callback, void * user_data)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
return call_nix_get_string_callback(store->ptr->storeDir, callback, user_data);
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|
|
|
|
nix_err
|
|
nix_store_get_version(nix_c_context * context, Store * store, nix_get_string_callback callback, void * user_data)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
auto res = store->ptr->getVersion();
|
|
return call_nix_get_string_callback(res.value_or(""), callback, user_data);
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|
|
|
|
bool nix_store_is_valid_path(nix_c_context * context, Store * store, StorePath * path)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
return store->ptr->isValidPath(path->path);
|
|
}
|
|
NIXC_CATCH_ERRS_RES(false);
|
|
}
|
|
|
|
nix_err nix_store_real_path(
|
|
nix_c_context * context, Store * store, StorePath * path, nix_get_string_callback callback, void * user_data)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
auto res = store->ptr->toRealPath(path->path);
|
|
return call_nix_get_string_callback(res, callback, user_data);
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|
|
|
|
StorePath * nix_store_parse_path(nix_c_context * context, Store * store, const char * path)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
nix::StorePath s = store->ptr->parseStorePath(path);
|
|
return new StorePath{std::move(s)};
|
|
}
|
|
NIXC_CATCH_ERRS_NULL
|
|
}
|
|
|
|
nix_err nix_store_realise(
|
|
nix_c_context * context,
|
|
Store * store,
|
|
StorePath * path,
|
|
void * userdata,
|
|
void (*callback)(void * userdata, const char *, const char *))
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
|
|
const std::vector<nix::DerivedPath> paths{nix::DerivedPath::Built{
|
|
.drvPath = nix::makeConstantStorePathRef(path->path), .outputs = nix::OutputsSpec::All{}}};
|
|
|
|
const auto nixStore = store->ptr;
|
|
auto results = nixStore->buildPathsWithResults(paths, nix::bmNormal, nixStore);
|
|
|
|
if (callback) {
|
|
for (const auto & result : results) {
|
|
for (const auto & [outputName, realisation] : result.builtOutputs) {
|
|
auto op = store->ptr->printStorePath(realisation.outPath);
|
|
callback(userdata, outputName.c_str(), op.c_str());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|
|
|
|
void nix_store_path_name(const StorePath * store_path, nix_get_string_callback callback, void * user_data)
|
|
{
|
|
std::string_view name = store_path->path.name();
|
|
callback(name.data(), name.size(), user_data);
|
|
}
|
|
|
|
void nix_store_path_free(StorePath * sp)
|
|
{
|
|
delete sp;
|
|
}
|
|
|
|
StorePath * nix_store_path_clone(const StorePath * p)
|
|
{
|
|
return new StorePath{p->path};
|
|
}
|
|
|
|
nix_err nix_store_copy_closure(nix_c_context * context, Store * srcStore, Store * dstStore, StorePath * path)
|
|
{
|
|
if (context)
|
|
context->last_err_code = NIX_OK;
|
|
try {
|
|
nix::RealisedPath::Set paths;
|
|
paths.insert(path->path);
|
|
nix::copyClosure(*srcStore->ptr, *dstStore->ptr, paths);
|
|
}
|
|
NIXC_CATCH_ERRS
|
|
}
|