{
NTSTATUS status;
- status = rec->store(rec, data, flags);
+ status = rec->storev(rec, &data, 1, flags);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
struct db_record {
struct db_context *db;
TDB_DATA key, value;
- NTSTATUS (*store)(struct db_record *rec, TDB_DATA data, int flag);
+ NTSTATUS (*storev)(struct db_record *rec, const TDB_DATA *dbufs,
+ int num_dbufs, int flag);
NTSTATUS (*delete_rec)(struct db_record *rec);
void *private_data;
};
return -1;
}
-static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
+static NTSTATUS db_rbt_storev(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs, int flag)
{
struct db_rbt_ctx *db_ctx = talloc_get_type_abort(
rec->db->private_data, struct db_rbt_ctx);
struct db_rbt_node *parent_node = NULL;
ssize_t reclen;
- TDB_DATA this_key, this_val;
+ TDB_DATA data, this_key, this_val;
+ void *to_free = NULL;
if (db_ctx->traverse_read > 0) {
return NT_STATUS_MEDIA_WRITE_PROTECTED;
}
+ if (num_dbufs == 1) {
+ data = dbufs[0];
+ } else {
+ data = dbwrap_merge_dbufs(rec, dbufs, num_dbufs);
+ if (data.dptr == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ to_free = data.dptr;
+ }
+
if (rec_priv->node != NULL) {
/*
*/
memcpy(this_val.dptr, data.dptr, data.dsize);
rec_priv->node->valuesize = data.dsize;
+ TALLOC_FREE(to_free);
return NT_STATUS_OK;
}
}
reclen = db_rbt_reclen(rec->key.dsize, data.dsize);
if (reclen == -1) {
+ TALLOC_FREE(to_free);
return NT_STATUS_INSUFFICIENT_RESOURCES;
}
node = talloc_zero_size(db_ctx, reclen);
if (node == NULL) {
+ TALLOC_FREE(to_free);
return NT_STATUS_NO_MEMORY;
}
DLIST_ADD_AFTER(db_ctx->nodes, node, parent_node);
rb_insert_color(&node->rb_node, &db_ctx->tree);
+ TALLOC_FREE(to_free);
+
return NT_STATUS_OK;
}
rec_priv = (struct db_rbt_rec *)
((char *)result + DBWRAP_RBT_ALIGN(sizeof(struct db_record)));
- result->store = db_rbt_store;
+ result->storev = db_rbt_storev;
result->delete_rec = db_rbt_delete;
result->private_data = rec_priv;
ZERO_STRUCT(rec);
rec.db = db;
rec.private_data = &rec_priv;
- rec.store = db_rbt_store;
+ rec.storev = db_rbt_storev;
rec.delete_rec = db_rbt_delete;
db_rbt_parse_node(rec_priv.node, &rec.key, &rec.value);
} id;
};
-static NTSTATUS db_tdb_store(struct db_record *rec, TDB_DATA data, int flag);
+static NTSTATUS db_tdb_storev(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs, int flag);
static NTSTATUS db_tdb_delete(struct db_record *rec);
static void db_tdb_log_key(const char *prefix, TDB_DATA key)
talloc_set_destructor(state.result, db_tdb_record_destr);
state.result->private_data = ctx;
- state.result->store = db_tdb_store;
+ state.result->storev = db_tdb_storev;
state.result->delete_rec = db_tdb_delete;
DEBUG(10, ("Allocated locked data 0x%p\n", state.result));
return db_tdb_fetch_locked_internal(db, mem_ctx, key);
}
-
static int db_tdb_exists(struct db_context *db, TDB_DATA key)
{
struct db_tdb_ctx *ctx = talloc_get_type_abort(
return NT_STATUS_OK;
}
-static NTSTATUS db_tdb_store(struct db_record *rec, TDB_DATA data, int flag)
+static NTSTATUS db_tdb_storev(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs, int flag)
{
struct db_tdb_ctx *ctx = talloc_get_type_abort(rec->private_data,
struct db_tdb_ctx);
+ int ret;
/*
* This has a bug: We need to replace rec->value for correct
* anymore after it was stored.
*/
- return (tdb_store(ctx->wtdb->tdb, rec->key, data, flag) == 0) ?
- NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
+ ret = tdb_storev(ctx->wtdb->tdb, rec->key, dbufs, num_dbufs, flag);
+ return (ret == 0) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
}
static NTSTATUS db_tdb_delete(struct db_record *rec)
rec.key = kbuf;
rec.value = dbuf;
- rec.store = db_tdb_store;
+ rec.storev = db_tdb_storev;
rec.delete_rec = db_tdb_delete;
rec.private_data = ctx->db->private_data;
rec.db = ctx->db;
return tdb_traverse(db_ctx->wtdb->tdb, db_tdb_traverse_func, &ctx);
}
-static NTSTATUS db_tdb_store_deny(struct db_record *rec, TDB_DATA data, int flag)
+static NTSTATUS db_tdb_storev_deny(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs,
+ int flag)
{
return NT_STATUS_MEDIA_WRITE_PROTECTED;
}
rec.key = kbuf;
rec.value = dbuf;
- rec.store = db_tdb_store_deny;
+ rec.storev = db_tdb_storev_deny;
rec.delete_rec = db_tdb_delete_deny;
rec.private_data = ctx->db->private_data;
rec.db = ctx->db;
return true;
}
-static NTSTATUS db_ctdb_store_transaction(struct db_record *rec, TDB_DATA data, int flag);
+static NTSTATUS db_ctdb_storev_transaction(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs,
+ int flag);
static NTSTATUS db_ctdb_delete_transaction(struct db_record *rec);
static struct db_record *db_ctdb_fetch_locked_transaction(struct db_ctdb_ctx *ctx,
return NULL;
}
- result->store = db_ctdb_store_transaction;
+ result->storev = db_ctdb_storev_transaction;
result->delete_rec = db_ctdb_delete_transaction;
if (pull_newest_from_marshall_buffer(ctx->transaction->m_write, key,
/*
a record store inside a transaction
*/
-static NTSTATUS db_ctdb_store_transaction(struct db_record *rec, TDB_DATA data, int flag)
+static NTSTATUS db_ctdb_storev_transaction(
+ struct db_record *rec, const TDB_DATA *dbufs, int num_dbufs, int flag)
{
struct db_ctdb_transaction_handle *h = talloc_get_type_abort(
rec->private_data, struct db_ctdb_transaction_handle);
NTSTATUS status;
+ TDB_DATA data;
+
+ data = dbwrap_merge_dbufs(rec, dbufs, num_dbufs);
+ if (data.dptr == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
status = db_ctdb_transaction_store(h, rec->key, data);
+
+ TALLOC_FREE(data.dptr);
+
return status;
}
}
-static NTSTATUS db_ctdb_store(struct db_record *rec, TDB_DATA data, int flag)
+static NTSTATUS db_ctdb_storev(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs, int flag)
{
struct db_ctdb_rec *crec = talloc_get_type_abort(
rec->private_data, struct db_ctdb_rec);
+ NTSTATUS status;
+ TDB_DATA data;
+
+ data = dbwrap_merge_dbufs(rec, dbufs, num_dbufs);
+ if (data.dptr == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
- return db_ctdb_ltdb_store(crec->ctdb_ctx, rec->key, &(crec->header), data);
+ status = db_ctdb_ltdb_store(crec->ctdb_ctx, rec->key, &(crec->header),
+ data);
+ TALLOC_FREE(data.dptr);
+ return status;
}
* tdb-level cleanup
*/
- status = db_ctdb_store(rec, tdb_null, 0);
+ status = db_ctdb_storev(rec, &tdb_null, 1, 0);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
return NULL;
}
- result->store = db_ctdb_store;
+ result->storev = db_ctdb_storev;
result->delete_rec = db_ctdb_delete;
talloc_set_destructor(result, db_ctdb_record_destr);
return state.count;
}
-static NTSTATUS db_ctdb_store_deny(struct db_record *rec, TDB_DATA data, int flag)
+static NTSTATUS db_ctdb_storev_deny(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs, int flag)
{
return NT_STATUS_MEDIA_WRITE_PROTECTED;
}
rec.db = state->db;
rec.key = key;
rec.value = data;
- rec.store = db_ctdb_store_deny;
+ rec.storev = db_ctdb_storev_deny;
rec.delete_rec = db_ctdb_delete_deny;
rec.private_data = NULL;
state->fn(&rec, state->private_data);
rec.db = state->db;
rec.key = kbuf;
rec.value = dbuf;
- rec.store = db_ctdb_store_deny;
+ rec.storev = db_ctdb_storev_deny;
rec.delete_rec = db_ctdb_delete_deny;
rec.private_data = NULL;
bool deleted;
};
-static NTSTATUS dbwrap_watched_store(struct db_record *rec, TDB_DATA data,
- int flag);
+static NTSTATUS dbwrap_watched_storev(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs,
+ int flag);
static NTSTATUS dbwrap_watched_delete(struct db_record *rec);
static struct db_record *dbwrap_watched_fetch_locked(
rec->db = db;
rec->key = dbwrap_record_get_key(subrec->subrec);
- rec->store = dbwrap_watched_store;
+ rec->storev = dbwrap_watched_storev;
rec->delete_rec = dbwrap_watched_delete;
subrec_value = dbwrap_record_get_value(subrec->subrec);
return status;
}
-static NTSTATUS dbwrap_watched_store(struct db_record *rec, TDB_DATA data,
- int flag)
+static NTSTATUS dbwrap_watched_storev(struct db_record *rec,
+ const TDB_DATA *dbufs, int num_dbufs,
+ int flag)
{
struct db_watched_subrec *subrec = talloc_get_type_abort(
rec->private_data, struct db_watched_subrec);
+ NTSTATUS status;
+ TDB_DATA data;
+
+ data = dbwrap_merge_dbufs(rec, dbufs, num_dbufs);
+ if (data.dptr == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
dbwrap_watched_wakeup(rec, subrec);
subrec->deleted = false;
- return dbwrap_watched_save(subrec, data, flag);
+ status = dbwrap_watched_save(subrec, data, flag);
+
+ TALLOC_FREE(data.dptr);
+ return status;
}
static NTSTATUS dbwrap_watched_delete(struct db_record *rec)