Skip to content
This repository has been archived by the owner on Oct 15, 2024. It is now read-only.

Commit

Permalink
kdb-cli: rewrite set
Browse files Browse the repository at this point in the history
... and (partial) fix #3742, fix #4028, fix #1164
  • Loading branch information
hannes99 committed Mar 1, 2023
1 parent acdd19f commit 0caff97
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 137 deletions.
2 changes: 0 additions & 2 deletions src/tools/kdb/factory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
#include <pluginlist.hpp>
#include <remount.hpp>
#include <rm.hpp>
#include <set.hpp>
#include <sget.hpp>
#include <shell.hpp>
#include <showmeta.hpp>
Expand Down Expand Up @@ -84,7 +83,6 @@ class Factory
Factory () : m_factory ()
{
// TODO: to add a new command, 2.) add a line here -> and you are done
m_factory.insert (std::make_pair ("set", std::make_shared<Cnstancer<SetCommand>> ()));
m_factory.insert (std::make_pair ("rm", std::make_shared<Cnstancer<RemoveCommand>> ()));
m_factory.insert (std::make_pair ("cache", std::make_shared<Cnstancer<CacheCommand>> ()));
m_factory.insert (std::make_pair ("complete", std::make_shared<Cnstancer<CompleteCommand>> ()));
Expand Down
2 changes: 2 additions & 0 deletions src/tools/kdb/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <ls.h>
#include <mountpoint.h>
#include <namespace.h>
#include <set.h>

#include <command.h>
#include <kdb.h>
Expand All @@ -34,6 +35,7 @@ command subcommands[] = {
{ "ls", addLsSpec, execLs },
{ "mountpoint", addMountpointSpec, execMountpoint },
{ "namespace", addNamespaceSpec, execNamespace },
{ "set", addSetSpec, execSet },
};

void printWarnings (Key * errorKey)
Expand Down
103 changes: 103 additions & 0 deletions src/tools/kdb/set.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/**
* @file
*
* @brief KDB set subcommand
*
* @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
*/

#include <colors.h>
#include <command.h>
#include <kdbassert.h>
#include <kdbease.h>
#include <kdberrors.h>
#include <set.h>
#include <stdio.h>
#include <string.h>

#define COMMAND_NAME "set"

#define GET_OPTION_KEY(options, name) GET_OPT_KEY (options, COMMAND_BASE_KEY (COMMAND_NAME) "/" name)
#define GET_OPTION(options, name) GET_OPT (options, COMMAND_BASE_KEY (COMMAND_NAME) "/" name)

void addSetSpec (KeySet * spec)
{
ksAppendKey (spec, keyNew (COMMAND_SPEC_KEY (COMMAND_NAME), KEY_META, "description", "Set the value of an individual key.",
KEY_META, "command", COMMAND_NAME, KEY_END));
ksAppendKey (spec, keyNew (COMMAND_SPEC_KEY (COMMAND_NAME) "/force", KEY_META, "description", "Force setting the value", KEY_META,
"opt", "f", KEY_META, "opt/long", "force", KEY_META, "opt/arg", "none", KEY_END));
ksAppendKey (spec, keyNew (COMMAND_SPEC_KEY (COMMAND_NAME) "/name", KEY_META, "description", "The name of the key", KEY_META,
"args", "indexed", KEY_META, "args/index", "0", KEY_END));

ksAppendKey (spec, keyNew (COMMAND_SPEC_KEY (COMMAND_NAME) "/value", KEY_META, "description", "The value that should be set",
KEY_META, "args", "indexed", KEY_META, "args/index", "1", KEY_END));

ADD_BASIC_OPTIONS (spec, COMMAND_SPEC_KEY (COMMAND_NAME))
}

int execSet (KeySet * options, Key * errorKey)
{
int ret = 0;
GET_BASIC_OPTIONS

bool force = false;
tmp = GET_OPTION_KEY (options, "force");
if (tmp != NULL)
{
elektraKeyToBoolean (GET_OPTION_KEY (options, "all"), &force);
}

const char * name = getKeyNameFromOptions (options, GET_OPTION (options, "name"), errorKey, verbose);
if (name == NULL) return 1;

const char * value = GET_OPTION (options, "value");

Key * parentKey = keyNew (name, KEY_END);

if (keyGetNamespace (parentKey) == KEY_NS_NONE || keyGetNamespace (parentKey) == KEY_NS_CASCADING) {
ret = 1;
ELEKTRA_SET_VALIDATION_SYNTACTIC_ERROR (errorKey, "key does not specify a namespace");
elektraFree ((void*) name);
keyDel (parentKey);
return ret;
}

keySetNamespace (parentKey, KEY_NS_CASCADING);
KeySet * conf = ksNew (0, KS_END);
KDB * handle = kdbOpen (NULL, errorKey);

if (kdbGet (handle, conf, parentKey) == -1)
{
ELEKTRA_SET_VALIDATION_SEMANTIC_ERRORF (errorKey, "could not load '%s': %s", name, GET_ERR (parentKey));
ret = 1;
goto cleanup;
}

Key * key = ksLookup (conf, parentKey, KDB_O_NONE);
if (key == NULL)
{
ELEKTRA_SET_VALIDATION_SEMANTIC_ERRORF (errorKey, "could not load '%s': %s", name, GET_ERR (parentKey));
ret = 1;
goto cleanup;
}
keySetString (key, value); // can't fail, since neither value or key can be null

if (kdbSet (handle, conf, parentKey) == -1)
{
ret = 1;
ELEKTRA_SET_VALIDATION_SEMANTIC_ERRORF (errorKey, "could not set value for '%s': %s", name, GET_ERR (parentKey));
}

keyDel (key);

cleanup:
if (!noNewLine)
{
printf ("\n");
}
elektraFree ((void*) name);
keyDel (parentKey);
ksDel (conf);
kdbClose (handle, errorKey);
return ret;
}
86 changes: 0 additions & 86 deletions src/tools/kdb/set.cpp

This file was deleted.

33 changes: 33 additions & 0 deletions src/tools/kdb/set.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* @file
*
* @brief KDB set subcommand header
*
* @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
*/

#ifndef ELEKTRA_KDB_SET_H
#define ELEKTRA_KDB_SET_H

#include <kdb.h>

/**
* Adds options specification of set command to keySet
*
* @param spec the base spec where the commands spec should be added
*/
void addSetSpec (KeySet * spec);

/**
* Runs the set command
*
* @param options cli options and arguments as specified in addSetSpec()
* @param errorKey key where errors and warnings should be saved
*
* @retval 0 set command ran without errors
* @retval 1 errors occurred, keySetMeta (errorKey, "error/reason") for info
*
*/
int execSet (KeySet * options, Key * errorKey);

#endif // ELEKTRA_KDB_SET_H
49 changes: 0 additions & 49 deletions src/tools/kdb/set.hpp

This file was deleted.

0 comments on commit 0caff97

Please sign in to comment.