summaryrefslogtreecommitdiff
path: root/source4/lib/ldb/common/ldb_modules.c
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2009-10-27 10:43:51 +1100
committerAndrew Tridgell <tridge@samba.org>2009-10-27 11:32:14 +1100
commit3c6c230b2d5c8a2632163a5f11d9e3f1f3db1639 (patch)
tree8101d4d680ca4ebafb3227eccebb690d4d02a2a3 /source4/lib/ldb/common/ldb_modules.c
parent53b160e1b80f66b0728020783df5bf433048a148 (diff)
downloadsamba-3c6c230b2d5c8a2632163a5f11d9e3f1f3db1639.tar.gz
samba-3c6c230b2d5c8a2632163a5f11d9e3f1f3db1639.tar.bz2
samba-3c6c230b2d5c8a2632163a5f11d9e3f1f3db1639.zip
s4:ldb Add additional tracing of the ldb API
This helps pin down where errors occour, by printing a call stack and setting error strings and trace messages in the transaction case. Andrew Bartlett
Diffstat (limited to 'source4/lib/ldb/common/ldb_modules.c')
-rw-r--r--source4/lib/ldb/common/ldb_modules.c64
1 files changed, 60 insertions, 4 deletions
diff --git a/source4/lib/ldb/common/ldb_modules.c b/source4/lib/ldb/common/ldb_modules.c
index 69b8ed0bf4..e79f072d50 100644
--- a/source4/lib/ldb/common/ldb_modules.c
+++ b/source4/lib/ldb/common/ldb_modules.c
@@ -481,6 +481,10 @@ int ldb_load_modules(struct ldb_context *ldb, const char *options[])
#define FIND_OP_NOERR(module, op) do { \
module = module->next; \
while (module && module->ops->op == NULL) module = module->next; \
+ if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) { \
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_trace_next_request: (%s)->" #op, \
+ module->ops->name); \
+ } \
} while (0)
#define FIND_OP(module, op) do { \
@@ -611,31 +615,83 @@ int ldb_next_init(struct ldb_module *module)
int ldb_next_start_trans(struct ldb_module *module)
{
+ int ret;
FIND_OP(module, start_transaction);
- return module->ops->start_transaction(module);
+ ret = module->ops->start_transaction(module);
+ if (ret == LDB_SUCCESS) {
+ return ret;
+ }
+ if (!ldb_errstring(module->ldb)) {
+ /* Set a default error string, to place the blame somewhere */
+ ldb_asprintf_errstring(module->ldb, "start_trans error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
+ }
+ if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_start_trans error: %s",
+ ldb_errstring(module->ldb));
+ }
+ return ret;
}
int ldb_next_end_trans(struct ldb_module *module)
{
+ int ret;
FIND_OP(module, end_transaction);
- return module->ops->end_transaction(module);
+ ret = module->ops->end_transaction(module);
+ if (ret == LDB_SUCCESS) {
+ return ret;
+ }
+ if (!ldb_errstring(module->ldb)) {
+ /* Set a default error string, to place the blame somewhere */
+ ldb_asprintf_errstring(module->ldb, "end_trans error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
+ }
+ if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_end_trans error: %s",
+ ldb_errstring(module->ldb));
+ }
+ return ret;
}
int ldb_next_prepare_commit(struct ldb_module *module)
{
+ int ret;
FIND_OP_NOERR(module, prepare_commit);
if (module == NULL) {
/* we are allowed to have no prepare commit in
backends */
return LDB_SUCCESS;
}
- return module->ops->prepare_commit(module);
+ ret = module->ops->prepare_commit(module);
+ if (ret == LDB_SUCCESS) {
+ return ret;
+ }
+ if (!ldb_errstring(module->ldb)) {
+ /* Set a default error string, to place the blame somewhere */
+ ldb_asprintf_errstring(module->ldb, "prepare_commit error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
+ }
+ if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_prepare_commit error: %s",
+ ldb_errstring(module->ldb));
+ }
+ return ret;
}
int ldb_next_del_trans(struct ldb_module *module)
{
+ int ret;
FIND_OP(module, del_transaction);
- return module->ops->del_transaction(module);
+ ret = module->ops->del_transaction(module);
+ if (ret == LDB_SUCCESS) {
+ return ret;
+ }
+ if (!ldb_errstring(module->ldb)) {
+ /* Set a default error string, to place the blame somewhere */
+ ldb_asprintf_errstring(module->ldb, "del_trans error in module %s: %s (%d)", module->ops->name, ldb_strerror(ret), ret);
+ }
+ if ((module && module->ldb->flags & LDB_FLG_ENABLE_TRACING)) {
+ ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_next_del_trans error: %s",
+ ldb_errstring(module->ldb));
+ }
+ return ret;
}
struct ldb_handle *ldb_handle_new(TALLOC_CTX *mem_ctx, struct ldb_context *ldb)