From d812957a3162d37ec355b2e2673f3e7297626da7 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 28 Oct 2005 03:43:39 +0000 Subject: r11353: a bit of an improvement to the ldb_tdb error handling (This used to be commit 896704f5c139c8bce30dfc898bb3a12be10035ed) --- source4/lib/ldb/common/ldb.c | 42 +++++++++++++++++----------------- source4/lib/ldb/ldb_tdb/ldb_index.c | 2 -- source4/lib/ldb/ldb_tdb/ldb_tdb.c | 45 ++++++++++++++++++++++++++++++++----- 3 files changed, 61 insertions(+), 28 deletions(-) (limited to 'source4') diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c index abd2c03aa3..791e66ea51 100644 --- a/source4/lib/ldb/common/ldb.c +++ b/source4/lib/ldb/common/ldb.c @@ -222,6 +222,24 @@ int ldb_search_bytree(struct ldb_context *ldb, return module->ops->search_bytree(module, base, scope, tree, attrs, res); } +/* + check for an error return from an op + if an op fails, but has not setup an error string, then setup one now +*/ +static int ldb_op_finish(struct ldb_context *ldb, int status) +{ + if (status == LDB_SUCCESS) { + return ldb_transaction_commit(ldb); + } + if (ldb->err_string == NULL) { + /* no error string was setup by the backend */ + ldb_set_errstring(ldb->modules, + talloc_asprintf(ldb, "ldb error %d", status)); + } + ldb_transaction_cancel(ldb); + return status; +} + /* add a record to the database. Will fail if a record with the given class and key already exists @@ -244,11 +262,7 @@ int ldb_add(struct ldb_context *ldb, if (status != LDB_SUCCESS) return status; status = module->ops->add_record(module, message); - if (status != LDB_SUCCESS) { - ldb_transaction_cancel(ldb); - return status; - } - return ldb_transaction_commit(ldb); + return ldb_op_finish(ldb, status); } return module->ops->add_record(module, message); @@ -275,11 +289,7 @@ int ldb_modify(struct ldb_context *ldb, if (status != LDB_SUCCESS) return status; status = module->ops->modify_record(module, message); - if (status != LDB_SUCCESS) { - ldb_transaction_cancel(ldb); - return status; - } - return ldb_transaction_commit(ldb); + return ldb_op_finish(ldb, status); } return module->ops->modify_record(module, message); @@ -303,11 +313,7 @@ int ldb_delete(struct ldb_context *ldb, const struct ldb_dn *dn) if (status != LDB_SUCCESS) return status; status = module->ops->delete_record(module, dn); - if (status != LDB_SUCCESS) { - ldb_transaction_cancel(ldb); - return status; - } - return ldb_transaction_commit(ldb); + return ldb_op_finish(ldb, status); } return module->ops->delete_record(module, dn); @@ -330,11 +336,7 @@ int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct if (status != LDB_SUCCESS) return status; status = module->ops->rename_record(module, olddn, newdn); - if (status != LDB_SUCCESS) { - ldb_transaction_cancel(ldb); - return status; - } - return ldb_transaction_commit(ldb); + return ldb_op_finish(ldb, status); } return module->ops->rename_record(module, olddn, newdn); diff --git a/source4/lib/ldb/ldb_tdb/ldb_index.c b/source4/lib/ldb/ldb_tdb/ldb_index.c index 275aadbd78..093b0dab1d 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_index.c +++ b/source4/lib/ldb/ldb_tdb/ldb_index.c @@ -1119,14 +1119,12 @@ int ltdb_reindex(struct ldb_module *module) /* first traverse the database deleting any @INDEX records */ ret = tdb_traverse(ltdb->tdb, delete_index, NULL); if (ret == -1) { - errno = EIO; return -1; } /* now traverse adding any indexes for normal LDB records */ ret = tdb_traverse(ltdb->tdb, re_index, module); if (ret == -1) { - errno = EIO; return -1; } diff --git a/source4/lib/ldb/ldb_tdb/ldb_tdb.c b/source4/lib/ldb/ldb_tdb/ldb_tdb.c index b9404a557b..5b2feb741b 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_tdb.c +++ b/source4/lib/ldb/ldb_tdb/ldb_tdb.c @@ -41,6 +41,37 @@ #include "ldb/include/ldb_private.h" #include "ldb/ldb_tdb/ldb_tdb.h" + +/* + map a tdb error code to a ldb error code +*/ +static int ltdb_err_map(enum TDB_ERROR tdb_code) +{ + switch (tdb_code) { + case TDB_SUCCESS: + return LDB_SUCCESS; + case TDB_ERR_CORRUPT: + case TDB_ERR_OOM: + case TDB_ERR_EINVAL: + return LDB_ERR_OPERATIONS_ERROR; + case TDB_ERR_IO: + return LDB_ERR_PROTOCOL_ERROR; + case TDB_ERR_LOCK: + case TDB_ERR_NOLOCK: + return LDB_ERR_BUSY; + case TDB_ERR_LOCK_TIMEOUT: + return LDB_ERR_TIME_LIMIT_EXCEEDED; + case TDB_ERR_EXISTS: + return LDB_ERR_ENTRY_ALREADY_EXISTS; + case TDB_ERR_NOEXIST: + return LDB_ERR_NO_SUCH_OBJECT; + case TDB_ERR_RDONLY: + return LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS; + } + return LDB_ERR_OTHER; +} + + /* form a TDB_DATA for a record key caller frees @@ -168,7 +199,7 @@ int ltdb_store(struct ldb_module *module, const struct ldb_message *msg, int flg ret = tdb_store(ltdb->tdb, tdb_key, tdb_data, flgs); if (ret == -1) { - ret = LDB_ERR_OTHER; + ret = ltdb_err_map(tdb_error(ltdb->tdb)); goto done; } @@ -229,7 +260,9 @@ int ltdb_delete_noindex(struct ldb_module *module, const struct ldb_dn *dn) ret = tdb_delete(ltdb->tdb, tdb_key); talloc_free(tdb_key.dptr); - if (ret != 0) ret = LDB_ERR_OTHER; + if (ret != 0) { + ret = ltdb_err_map(tdb_error(ltdb->tdb)); + } return ret; } @@ -450,7 +483,7 @@ int ltdb_modify_internal(struct ldb_module *module, const struct ldb_message *ms tdb_data = tdb_fetch(ltdb->tdb, tdb_key); if (!tdb_data.dptr) { talloc_free(tdb_key.dptr); - return LDB_ERR_OTHER; + return ltdb_err_map(tdb_error(ltdb->tdb)); } msg2 = talloc(tdb_key.dptr, struct ldb_message); @@ -672,7 +705,7 @@ static int ltdb_start_trans(struct ldb_module *module) struct ltdb_private *ltdb = module->private_data; if (tdb_transaction_start(ltdb->tdb) != 0) { - return LDB_ERR_OPERATIONS_ERROR; + return ltdb_err_map(tdb_error(ltdb->tdb)); } return LDB_SUCCESS; @@ -683,7 +716,7 @@ static int ltdb_end_trans(struct ldb_module *module) struct ltdb_private *ltdb = module->private_data; if (tdb_transaction_commit(ltdb->tdb) != 0) { - return LDB_ERR_OPERATIONS_ERROR; + return ltdb_err_map(tdb_error(ltdb->tdb)); } return LDB_SUCCESS; @@ -694,7 +727,7 @@ static int ltdb_del_trans(struct ldb_module *module) struct ltdb_private *ltdb = module->private_data; if (tdb_transaction_cancel(ltdb->tdb) != 0) { - return LDB_ERR_OPERATIONS_ERROR; + return ltdb_err_map(tdb_error(ltdb->tdb)); } return LDB_SUCCESS; -- cgit