#include "dbwrap/dbwrap_private.h"
#include "util_tdb.h"
-/*
- * Fall back using fetch_locked if no genuine fetch operation is provided
- */
-
-static NTSTATUS dbwrap_fallback_fetch(struct db_context *db,
- TALLOC_CTX *mem_ctx,
- TDB_DATA key, TDB_DATA *data)
-{
- struct db_record *rec;
-
- rec = dbwrap_fetch_locked(db, mem_ctx, key);
- if (rec == NULL) {
- return NT_STATUS_UNSUCCESSFUL;
- }
-
- data->dsize = rec->value.dsize;
- data->dptr = talloc_move(mem_ctx, &rec->value.dptr);
- TALLOC_FREE(rec);
- return NT_STATUS_OK;
-}
-
/*
* Fall back using fetch if no genuine exists operation is provided
*/
result->private_data = (void *)db_ctdb;
result->fetch_locked = db_ctdb_fetch_locked;
- result->fetch = db_ctdb_fetch;
result->parse_record = db_ctdb_parse_record;
result->traverse = db_ctdb_traverse;
result->traverse_read = db_ctdb_traverse_read;
struct db_record *(*fetch_locked)(struct db_context *db,
TALLOC_CTX *mem_ctx,
TDB_DATA key);
- NTSTATUS (*fetch)(struct db_context *db, TALLOC_CTX *mem_ctx,
- TDB_DATA key, TDB_DATA *data);
int (*traverse)(struct db_context *db,
int (*f)(struct db_record *rec,
void *private_data),
return NT_STATUS_OK;
}
-static NTSTATUS db_rbt_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
- TDB_DATA key, TDB_DATA *data)
-{
- uint8_t *result;
- struct db_rbt_search_result res;
-
- bool found = db_rbt_search_internal(db, key, &res);
-
- if (!found) {
- *data = tdb_null;
- return NT_STATUS_NOT_FOUND;
- }
-
- result = (uint8_t*)talloc_memdup(mem_ctx, res.val.dptr, res.val.dsize);
- if (result == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- data->dptr = result;
- data->dsize = res.val.dsize;
- return NT_STATUS_OK;
-}
-
static int db_rbt_traverse_internal(struct rb_node *n,
int (*f)(struct db_record *db,
void *private_data),
}
result->fetch_locked = db_rbt_fetch_locked;
- result->fetch = db_rbt_fetch;
result->traverse = db_rbt_traverse;
result->traverse_read = db_rbt_traverse;
result->get_seqnum = db_rbt_get_seqnum;
return state.result;
}
-struct tdb_fetch_state {
- TALLOC_CTX *mem_ctx;
- NTSTATUS result;
- TDB_DATA data;
-};
-
-static int db_tdb_fetch_parse(TDB_DATA key, TDB_DATA data,
- void *private_data)
-{
- struct tdb_fetch_state *state =
- (struct tdb_fetch_state *)private_data;
-
- if (data.dptr == NULL) {
- /* should not happen */
- state->result = NT_STATUS_INTERNAL_DB_ERROR;
- return -1;
- }
-
- state->data.dptr = (uint8 *)talloc_memdup(state->mem_ctx, data.dptr,
- data.dsize);
- if (state->data.dptr == NULL) {
- state->result = NT_STATUS_NO_MEMORY;
- return -1;
- }
-
- state->data.dsize = data.dsize;
- return 0;
-}
-
-static NTSTATUS db_tdb_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
- TDB_DATA key, TDB_DATA *pdata)
-{
- struct db_tdb_ctx *ctx = talloc_get_type_abort(
- db->private_data, struct db_tdb_ctx);
-
- struct tdb_fetch_state state;
- int ret;
-
- state.mem_ctx = mem_ctx;
- state.result = NT_STATUS_OK;
- state.data = tdb_null;
-
- ret = tdb_parse_record(ctx->wtdb->tdb, key, db_tdb_fetch_parse, &state);
-
- if (ret != 0) {
- NTSTATUS status;
-
- if (!NT_STATUS_IS_OK(state.result)) {
- /* the parser has set an error code. return it */
- return state.result;
- }
-
- status = map_nt_error_from_tdb(tdb_error(ctx->wtdb->tdb));
- return status;
- }
-
- if (!NT_STATUS_IS_OK(state.result)) {
- return state.result;
- }
-
- *pdata = state.data;
- return NT_STATUS_OK;
-}
-
static int db_tdb_exists(struct db_context *db, TDB_DATA key)
{
struct db_tdb_ctx *ctx = talloc_get_type_abort(
}
result->fetch_locked = db_tdb_fetch_locked;
- result->fetch = db_tdb_fetch;
result->traverse = db_tdb_traverse;
result->traverse_read = db_tdb_traverse_read;
result->parse_record = db_tdb_parse;