@@ -821,18 +821,20 @@ int write_node_raw(struct connection *conn, TDB_DATA *key, struct node *node,
}
/*
- * Write the node. If the node is written, caller can find the key used in
- * node->key. This can later be used if the change needs to be reverted.
+ * Write the node. If the node is written, caller can find the DB name used in
+ * node->db_name. This can later be used if the change needs to be reverted.
*/
static int write_node(struct connection *conn, struct node *node,
enum write_node_mode mode, bool no_quota_check)
{
int ret;
+ TDB_DATA key;
- if (access_node(conn, node, NODE_ACCESS_WRITE, &node->key))
+ if (access_node(conn, node, NODE_ACCESS_WRITE, &node->db_name))
return errno;
- ret = write_node_raw(conn, &node->key, node, mode, no_quota_check);
+ set_tdb_key(node->db_name, &key);
+ ret = write_node_raw(conn, &key, node, mode, no_quota_check);
if (ret && conn && conn->transaction) {
/*
* Reverting access_node() is hard, so just fail the
@@ -1450,10 +1452,13 @@ nomem:
static void destroy_node_rm(struct connection *conn, struct node *node)
{
+ TDB_DATA key;
+
if (streq(node->name, "/"))
corrupt(NULL, "Destroying root node!");
- do_tdb_delete(conn, &node->key, &node->acc);
+ set_tdb_key(node->db_name, &key);
+ do_tdb_delete(conn, &key, &node->acc);
}
static int destroy_node(struct connection *conn, struct node *node)
@@ -1643,10 +1648,11 @@ static int delnode_sub(const void *ctx, struct connection *conn,
const char *root = arg;
bool watch_exact;
int ret;
+ const char *db_name;
TDB_DATA key;
/* Any error here will probably be repeated for all following calls. */
- ret = access_node(conn, node, NODE_ACCESS_DELETE, &key);
+ ret = access_node(conn, node, NODE_ACCESS_DELETE, &db_name);
if (ret > 0)
return WALK_TREE_SUCCESS_STOP;
@@ -1654,6 +1660,7 @@ static int delnode_sub(const void *ctx, struct connection *conn,
return WALK_TREE_ERROR_STOP;
/* In case of error stop the walk. */
+ set_tdb_key(db_name, &key);
if (!ret && do_tdb_delete(conn, &key, &node->acc))
return WALK_TREE_ERROR_STOP;
@@ -181,8 +181,8 @@ struct node_account_data {
struct node {
const char *name;
- /* Key used to update TDB */
- TDB_DATA key;
+ /* Name used to access data base. */
+ const char *db_name;
/* Parent (optional) */
struct node *parent;
@@ -227,7 +227,7 @@ void transaction_prepend(struct connection *conn, const char *name,
* to be accessed in the data base.
*/
int access_node(struct connection *conn, struct node *node,
- enum node_access_type type, TDB_DATA *key)
+ enum node_access_type type, const char **db_name)
{
struct accessed_node *i = NULL;
struct transaction *trans;
@@ -243,8 +243,8 @@ int access_node(struct connection *conn, struct node *node,
if (!conn || !conn->transaction) {
/* They're changing the global database. */
- if (key)
- set_tdb_key(node->name, key);
+ if (db_name)
+ *db_name = node->name;
return 0;
}
@@ -308,8 +308,8 @@ int access_node(struct connection *conn, struct node *node,
/* Nothing to delete. */
return -1;
- if (key) {
- set_tdb_key(i->trans_name, key);
+ if (db_name) {
+ *db_name = i->trans_name;
if (type == NODE_ACCESS_WRITE)
i->ta_node = true;
if (type == NODE_ACCESS_DELETE)
@@ -41,7 +41,7 @@ void ta_node_created(struct transaction *trans);
/* This node was accessed. */
int __must_check access_node(struct connection *conn, struct node *node,
- enum node_access_type type, TDB_DATA *key);
+ enum node_access_type type, const char **db_name);
/* Queue watches for a modified node. */
void queue_watches(struct connection *conn, const char *name, bool watch_exact);