1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-26 01:49:31 +03:00

r10477: expose transactions outside ldb and change the API once more

do not autostart transactions on ldb operations if a transaction is already in place
test transactions on winsdb

all my tests passes so far
tridge please confirm this is ok for you
(This used to be commit c2bb2a36bd)
This commit is contained in:
Simo Sorce
2005-09-24 15:42:15 +00:00
committed by Gerald (Jerry) Carter
parent 70b52b02a7
commit 63b43dd12f
19 changed files with 293 additions and 105 deletions

View File

@ -145,10 +145,16 @@ static int objectguid_start_trans(struct ldb_module *module)
return ldb_next_start_trans(module);
}
static int objectguid_end_trans(struct ldb_module *module, int status)
static int objectguid_end_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "objectguid_end_trans\n");
return ldb_next_end_trans(module, status);
return ldb_next_end_trans(module);
}
static int objectguid_del_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "objectguid_del_trans\n");
return ldb_next_del_trans(module);
}
static int objectguid_destructor(void *module_ctx)
@ -167,7 +173,8 @@ static const struct ldb_module_ops objectguid_ops = {
.delete_record = objectguid_delete_record,
.rename_record = objectguid_rename_record,
.start_transaction = objectguid_start_trans,
.end_transaction = objectguid_end_trans
.end_transaction = objectguid_end_trans,
.del_transaction = objectguid_del_trans
};

View File

@ -581,10 +581,16 @@ static int samldb_start_trans(struct ldb_module *module)
return ldb_next_start_trans(module);
}
static int samldb_end_trans(struct ldb_module *module, int status)
static int samldb_end_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "samldb_end_trans\n");
return ldb_next_end_trans(module, status);
return ldb_next_end_trans(module);
}
static int samldb_del_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "samldb_del_trans\n");
return ldb_next_del_trans(module);
}
static int samldb_destructor(void *module_ctx)
@ -603,7 +609,8 @@ static const struct ldb_module_ops samldb_ops = {
.delete_record = samldb_delete_record,
.rename_record = samldb_rename_record,
.start_transaction = samldb_start_trans,
.end_transaction = samldb_end_trans
.end_transaction = samldb_end_trans,
.del_transaction = samldb_del_trans
};

View File

@ -93,17 +93,17 @@ int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, co
return LDB_ERR_OTHER;
}
if (ret != LDB_ERR_SUCCESS) {
if (ret != LDB_SUCCESS) {
ldb_debug(ldb, LDB_DEBUG_ERROR, "Failed to connect to '%s'\n", url);
return ret;
}
if (ldb_load_modules(ldb, options) != LDB_ERR_SUCCESS) {
if (ldb_load_modules(ldb, options) != LDB_SUCCESS) {
ldb_debug(ldb, LDB_DEBUG_FATAL, "Unable to load modules for '%s'\n", url);
return LDB_ERR_OTHER;
}
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}
static void ldb_reset_err_string(struct ldb_context *ldb)
@ -117,17 +117,45 @@ static void ldb_reset_err_string(struct ldb_context *ldb)
/*
start a transaction
*/
static int ldb_start_trans(struct ldb_context *ldb)
int ldb_transaction_start(struct ldb_context *ldb)
{
return ldb->modules->ops->start_transaction(ldb->modules);
ldb->transaction_active++;
ldb_reset_err_string(ldb);
return ldb->modules->ops->start_transaction(ldb->modules);
}
/*
end a transaction
commit a transaction
*/
static int ldb_end_trans(struct ldb_context *ldb, int status)
int ldb_transaction_commit(struct ldb_context *ldb)
{
return ldb->modules->ops->end_transaction(ldb->modules, status);
if (ldb->transaction_active > 0) {
ldb->transaction_active--;
} else {
return LDB_ERR_OPERATIONS_ERROR;
}
ldb_reset_err_string(ldb);
return ldb->modules->ops->end_transaction(ldb->modules);
}
/*
cancel a transaction
*/
int ldb_transaction_cancel(struct ldb_context *ldb)
{
if (ldb->transaction_active > 0) {
ldb->transaction_active--;
} else {
return LDB_ERR_OPERATIONS_ERROR;
}
ldb_reset_err_string(ldb);
return ldb->modules->ops->del_transaction(ldb->modules);
}
/*
@ -180,13 +208,18 @@ int ldb_add(struct ldb_context *ldb,
ldb_reset_err_string(ldb);
status = ldb_msg_sanity_check(message);
if (status != LDB_ERR_SUCCESS) return status;
if (status != LDB_SUCCESS) return status;
status = ldb_start_trans(ldb);
if (status != LDB_ERR_SUCCESS) return status;
if (! ldb->transaction_active) {
status = ldb_transaction_start(ldb);
if (status != LDB_SUCCESS) return status;
status = ldb->modules->ops->add_record(ldb->modules, message);
return ldb_end_trans(ldb, status);
status = ldb->modules->ops->add_record(ldb->modules, message);
if (status != LDB_SUCCESS) return ldb_transaction_cancel(ldb);
return ldb_transaction_commit(ldb);
}
return ldb->modules->ops->add_record(ldb->modules, message);
}
/*
@ -200,13 +233,18 @@ int ldb_modify(struct ldb_context *ldb,
ldb_reset_err_string(ldb);
status = ldb_msg_sanity_check(message);
if (status != LDB_ERR_SUCCESS) return status;
if (status != LDB_SUCCESS) return status;
status = ldb_start_trans(ldb);
if (status != LDB_ERR_SUCCESS) return status;
if (! ldb->transaction_active) {
status = ldb_transaction_start(ldb);
if (status != LDB_SUCCESS) return status;
status = ldb->modules->ops->modify_record(ldb->modules, message);
return ldb_end_trans(ldb, status);
status = ldb->modules->ops->modify_record(ldb->modules, message);
if (status != LDB_SUCCESS) return ldb_transaction_cancel(ldb);
return ldb_transaction_commit(ldb);
}
return ldb->modules->ops->modify_record(ldb->modules, message);
}
@ -219,11 +257,16 @@ int ldb_delete(struct ldb_context *ldb, const struct ldb_dn *dn)
ldb_reset_err_string(ldb);
status = ldb_start_trans(ldb);
if (status != LDB_ERR_SUCCESS) return status;
if (! ldb->transaction_active) {
status = ldb_transaction_start(ldb);
if (status != LDB_SUCCESS) return status;
status = ldb->modules->ops->delete_record(ldb->modules, dn);
return ldb_end_trans(ldb, status);
status = ldb->modules->ops->delete_record(ldb->modules, dn);
if (status != LDB_SUCCESS) return ldb_transaction_cancel(ldb);
return ldb_transaction_commit(ldb);
}
return ldb->modules->ops->delete_record(ldb->modules, dn);
}
/*
@ -235,13 +278,20 @@ int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct
ldb_reset_err_string(ldb);
status = ldb_start_trans(ldb);
if (status != LDB_ERR_SUCCESS) return status;
if (! ldb->transaction_active) {
status = ldb_transaction_start(ldb);
if (status != LDB_SUCCESS) return status;
status = ldb->modules->ops->rename_record(ldb->modules, olddn, newdn);
return ldb_end_trans(ldb, status);
status = ldb->modules->ops->rename_record(ldb->modules, olddn, newdn);
if (status != LDB_SUCCESS) return ldb_transaction_cancel(ldb);
return ldb_transaction_commit(ldb);
}
return ldb->modules->ops->rename_record(ldb->modules, olddn, newdn);
}
/*
return extended error information
*/
@ -269,7 +319,7 @@ int ldb_set_opaque(struct ldb_context *ldb, const char *name, void *value)
o->name = name;
o->value = value;
ldb->opaque = o;
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}
/*

View File

@ -314,12 +314,20 @@ int ldb_next_start_trans(struct ldb_module *module)
return module->next->ops->start_transaction(module->next);
}
int ldb_next_end_trans(struct ldb_module *module, int status)
int ldb_next_end_trans(struct ldb_module *module)
{
if (!module->next) {
return -1;
}
return module->next->ops->end_transaction(module->next, status);
return module->next->ops->end_transaction(module->next);
}
int ldb_next_del_trans(struct ldb_module *module)
{
if (!module->next) {
return -1;
}
return module->next->ops->del_transaction(module->next);
}
void ldb_set_errstring(struct ldb_module *module, char *err_string)

View File

@ -527,5 +527,5 @@ int ldb_msg_sanity_check(const struct ldb_message *msg)
}
}
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}

View File

@ -308,6 +308,21 @@ int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct
*/
int ldb_delete(struct ldb_context *ldb, const struct ldb_dn *dn);
/*
start a transaction
*/
int ldb_transaction_start(struct ldb_context *ldb);
/*
commit a transaction
*/
int ldb_transaction_commit(struct ldb_context *ldb);
/*
cancel a transaction
*/
int ldb_transaction_cancel(struct ldb_context *ldb);
/*
return extended error information from the last call

View File

@ -40,7 +40,7 @@
* but they are keept here for reference anyway
*/
#define LDB_ERR_SUCCESS 0
#define LDB_SUCCESS 0
#define LDB_ERR_OPERATIONS_ERROR 1
#define LDB_ERR_PROTOCOL_ERROR 2
#define LDB_ERR_TIME_LIMIT_EXCEEDED 3

View File

@ -65,7 +65,8 @@ struct ldb_module_ops {
int (*delete_record)(struct ldb_module *, const struct ldb_dn *);
int (*rename_record)(struct ldb_module *, const struct ldb_dn *, const struct ldb_dn *);
int (*start_transaction)(struct ldb_module *);
int (*end_transaction)(struct ldb_module *, int);
int (*end_transaction)(struct ldb_module *);
int (*del_transaction)(struct ldb_module *);
};
@ -105,6 +106,8 @@ struct ldb_context {
struct ldb_schema schema;
char *err_string;
int transaction_active;
};
/* the modules init function */
@ -137,7 +140,8 @@ int ldb_next_modify_record(struct ldb_module *module, const struct ldb_message *
int ldb_next_delete_record(struct ldb_module *module, const struct ldb_dn *dn);
int ldb_next_rename_record(struct ldb_module *module, const struct ldb_dn *olddn, const struct ldb_dn *newdn);
int ldb_next_start_trans(struct ldb_module *module);
int ldb_next_end_trans(struct ldb_module *module, int status);
int ldb_next_end_trans(struct ldb_module *module);
int ldb_next_del_trans(struct ldb_module *module);
void ldb_set_errstring(struct ldb_module *module, char *err_string);

View File

@ -373,11 +373,18 @@ static int ildb_start_trans(struct ldb_module *module)
return 0;
}
static int ildb_end_trans(struct ldb_module *module, int status)
static int ildb_end_trans(struct ldb_module *module)
{
/* TODO implement a local transaction mechanism here */
return status;
return 0;
}
static int ildb_del_trans(struct ldb_module *module)
{
/* TODO implement a local locking mechanism here */
return 0;
}
static const struct ldb_module_ops ildb_ops = {
@ -389,7 +396,8 @@ static const struct ldb_module_ops ildb_ops = {
.delete_record = ildb_delete,
.rename_record = ildb_rename,
.start_transaction = ildb_start_trans,
.end_transaction = ildb_end_trans
.end_transaction = ildb_end_trans,
.del_transaction = ildb_del_trans
};

View File

@ -462,11 +462,18 @@ static int lldb_start_trans(struct ldb_module *module)
return 0;
}
static int lldb_end_trans(struct ldb_module *module, int status)
static int lldb_end_trans(struct ldb_module *module)
{
/* TODO implement a local transaction mechanism here */
return status;
return 0;
}
static int lldb_del_trans(struct ldb_module *module)
{
/* TODO implement a local transaction mechanism here */
return 0;
}
static const struct ldb_module_ops lldb_ops = {
@ -478,7 +485,8 @@ static const struct ldb_module_ops lldb_ops = {
.delete_record = lldb_delete,
.rename_record = lldb_rename,
.start_transaction = lldb_start_trans,
.end_transaction = lldb_end_trans
.end_transaction = lldb_end_trans,
.del_transaction = lldb_del_trans
};

View File

@ -1065,7 +1065,7 @@ static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg
}
*/
/* Others are implicitly ignored */
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}
/* create linearized and normalized dns */
@ -1155,7 +1155,7 @@ static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg
}
talloc_free(local_ctx);
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
failed:
talloc_free(local_ctx);
@ -1191,7 +1191,7 @@ static int lsqlite3_modify(struct ldb_module *module, const struct ldb_message *
}
/* Others are implicitly ignored */
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}
eid = lsqlite3_get_eid(module, msg->dn);
@ -1346,7 +1346,7 @@ static int lsqlite3_modify(struct ldb_module *module, const struct ldb_message *
}
talloc_free(local_ctx);
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
failed:
talloc_free(local_ctx);
@ -1365,7 +1365,7 @@ static int lsqlite3_delete(struct ldb_module *module, const struct ldb_dn *dn)
/* ignore ltdb specials */
if (ldb_dn_is_special(dn)) {
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}
/* create a local ctx */
@ -1402,7 +1402,7 @@ static int lsqlite3_delete(struct ldb_module *module, const struct ldb_dn *dn)
}
talloc_free(local_ctx);
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
failed:
talloc_free(local_ctx);
@ -1421,7 +1421,7 @@ static int lsqlite3_rename(struct ldb_module *module, const struct ldb_dn *olddn
/* ignore ltdb specials */
if (ldb_dn_is_special(olddn) || ldb_dn_is_special(newdn)) {
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}
/* create a local ctx */
@ -1462,7 +1462,7 @@ static int lsqlite3_rename(struct ldb_module *module, const struct ldb_dn *olddn
/* clean up and exit */
talloc_free(local_ctx);
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
failed:
talloc_free(local_ctx);
@ -1491,32 +1491,45 @@ static int lsqlite3_start_trans(struct ldb_module * module)
return 0;
}
static int lsqlite3_end_trans(struct ldb_module *module, int status)
static int lsqlite3_end_trans(struct ldb_module *module)
{
int ret;
char *errmsg;
struct lsqlite3_private *lsqlite3 = module->private_data;
lsqlite3->trans_count--;
if (lsqlite3->trans_count > 0) {
lsqlite3->trans_count--;
} else return -1;
if (lsqlite3->trans_count == 0) {
if (status == 0) {
ret = sqlite3_exec(lsqlite3->sqlite, "COMMIT;", NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
if (errmsg) {
printf("lsqlite3_end_trans: error: %s\n", errmsg);
free(errmsg);
}
return -1;
ret = sqlite3_exec(lsqlite3->sqlite, "COMMIT;", NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {
if (errmsg) {
printf("lsqlite3_end_trans: error: %s\n", errmsg);
free(errmsg);
}
} else {
return lsqlite3_safe_rollback(lsqlite3->sqlite);
return -1;
}
}
return 0;
}
static int lsqlite3_del_trans(struct ldb_module *module)
{
struct lsqlite3_private *lsqlite3 = module->private_data;
if (lsqlite3->trans_count > 0) {
lsqlite3->trans_count--;
} else return -1;
if (lsqlite3->trans_count == 0) {
return lsqlite3_safe_rollback(lsqlite3->sqlite);
}
return -1;
}
/*
* Static functions
*/
@ -1814,7 +1827,8 @@ static const struct ldb_module_ops lsqlite3_ops = {
.delete_record = lsqlite3_delete,
.rename_record = lsqlite3_rename,
.start_transaction = lsqlite3_start_trans,
.end_transaction = lsqlite3_end_trans
.end_transaction = lsqlite3_end_trans,
.del_transaction = lsqlite3_del_trans
};
/*

View File

@ -193,7 +193,7 @@ static int ltdb_add(struct ldb_module *module, const struct ldb_message *msg)
int ret;
ret = ltdb_check_special_dn(module, msg);
if (ret != LDB_ERR_SUCCESS) {
if (ret != LDB_SUCCESS) {
return ret;
}
@ -203,7 +203,7 @@ static int ltdb_add(struct ldb_module *module, const struct ldb_message *msg)
ret = ltdb_store(module, msg, TDB_INSERT);
if (ret == LDB_ERR_SUCCESS) {
if (ret == LDB_SUCCESS) {
ltdb_modified(module, msg->dn);
}
@ -261,13 +261,13 @@ static int ltdb_delete(struct ldb_module *module, const struct ldb_dn *dn)
}
ret = ltdb_delete_noindex(module, dn);
if (ret != LDB_ERR_SUCCESS) {
if (ret != LDB_SUCCESS) {
goto failed;
}
/* remove any indexed attributes */
ret = ltdb_index_del(module, msg);
if (ret == LDB_ERR_SUCCESS) {
if (ret == LDB_SUCCESS) {
ltdb_modified(module, dn);
} else
ret = LDB_ERR_OTHER;
@ -605,7 +605,7 @@ static int ltdb_modify(struct ldb_module *module, const struct ldb_message *msg)
ret = ltdb_modify_internal(module, msg);
if (ret == LDB_ERR_SUCCESS) {
if (ret == LDB_SUCCESS) {
ltdb_modified(module, msg->dn);
}
@ -646,13 +646,13 @@ static int ltdb_rename(struct ldb_module *module, const struct ldb_dn *olddn, co
}
ret = ltdb_add(module, msg);
if (ret != LDB_ERR_SUCCESS) {
if (ret != LDB_SUCCESS) {
goto failed;
}
ret = ltdb_delete(module, olddn);
error_str = talloc_strdup(module, ldb_errstring(module->ldb));
if (ret != LDB_ERR_SUCCESS) {
if (ret != LDB_SUCCESS) {
ltdb_delete(module, newdn);
}
@ -675,24 +675,29 @@ static int ltdb_start_trans(struct ldb_module *module)
return LDB_ERR_OPERATIONS_ERROR;
}
return LDB_ERR_SUCCESS;
return LDB_SUCCESS;
}
static int ltdb_end_trans(struct ldb_module *module, int status)
static int ltdb_end_trans(struct ldb_module *module)
{
struct ltdb_private *ltdb = module->private_data;
if (status != LDB_ERR_SUCCESS) {
if (tdb_transaction_cancel(ltdb->tdb) != 0) {
return LDB_ERR_OPERATIONS_ERROR;
}
} else {
if (tdb_transaction_commit(ltdb->tdb) != 0) {
return LDB_ERR_OPERATIONS_ERROR;
}
if (tdb_transaction_commit(ltdb->tdb) != 0) {
return LDB_ERR_OPERATIONS_ERROR;
}
return status;
return LDB_SUCCESS;
}
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 LDB_SUCCESS;
}
static const struct ldb_module_ops ltdb_ops = {
@ -704,7 +709,8 @@ static const struct ldb_module_ops ltdb_ops = {
.delete_record = ltdb_delete,
.rename_record = ltdb_rename,
.start_transaction = ltdb_start_trans,
.end_transaction = ltdb_end_trans
.end_transaction = ltdb_end_trans,
.del_transaction = ltdb_del_trans
};

View File

@ -1258,9 +1258,14 @@ static int map_start_trans(struct ldb_module *module)
return ldb_next_start_trans(module);
}
static int map_end_trans(struct ldb_module *module, int status)
static int map_end_trans(struct ldb_module *module)
{
return ldb_next_end_trans(module, status);
return ldb_next_end_trans(module);
}
static int map_del_trans(struct ldb_module *module)
{
return ldb_next_del_trans(module);
}
static const struct ldb_module_ops map_ops = {
@ -1272,7 +1277,8 @@ static const struct ldb_module_ops map_ops = {
.delete_record = map_delete,
.rename_record = map_rename,
.start_transaction = map_start_trans,
.end_transaction = map_end_trans
.end_transaction = map_end_trans,
.del_transaction = map_del_trans
};
static char *map_find_url(struct ldb_context *ldb, const char *name)

View File

@ -220,10 +220,16 @@ static int rdn_start_trans(struct ldb_module *module)
return ldb_next_start_trans(module);
}
static int rdn_end_trans(struct ldb_module *module, int status)
static int rdn_end_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "rdn_end_trans\n");
return ldb_next_end_trans(module, status);
return ldb_next_end_trans(module);
}
static int rdn_del_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "rdn_del_trans\n");
return ldb_next_del_trans(module);
}
static int rdn_name_destructor(void *module_ctx)
@ -242,7 +248,8 @@ static const struct ldb_module_ops rdn_name_ops = {
.delete_record = rdn_name_delete_record,
.rename_record = rdn_name_rename_record,
.start_transaction = rdn_start_trans,
.end_transaction = rdn_end_trans
.end_transaction = rdn_end_trans,
.del_transaction = rdn_del_trans
};

View File

@ -520,8 +520,12 @@ static int schema_start_trans(struct ldb_module *module) {
return ldb_next_start_trans(module);
}
static int schema_end_trans(struct ldb_module *module, int status) {
return ldb_next_end_trans(module, status);
static int schema_end_trans(struct ldb_module *module) {
return ldb_next_end_trans(module);
}
static int schema_del_trans(struct ldb_module *module) {
return ldb_next_del_trans(module);
}
static int schema_destructor(void *module_ctx)
@ -540,7 +544,8 @@ static const struct ldb_module_ops schema_ops = {
.delete_record = schema_delete_record,
.rename_record = schema_rename_record,
.start_transaction = schema_start_trans,
.end_transaction = schema_end_trans
.end_transaction = schema_end_trans,
.del_transaction = schema_del_trans
};
#ifdef HAVE_DLOPEN_DISABLED

View File

@ -80,9 +80,15 @@ static int skel_start_trans(struct ldb_module *module)
}
/* end a transaction */
static int skel_end_trans(struct ldb_module *module, int status)
static int skel_end_trans(struct ldb_module *module)
{
return ldb_next_end_trans(module, status);
return ldb_next_end_trans(module);
}
/* delete a transaction */
static int skel_del_trans(struct ldb_module *module)
{
return ldb_next_del_trans(module);
}
static int skel_destructor(void *module_ctx)
@ -104,6 +110,7 @@ static const struct ldb_module_ops skel_ops = {
.rename_record = skel_rename_record,
.start_transaction = skel_start_trans,
.end_transaction = skel_end_trans,
.del_transaction = skel_del_trans,
};
#ifdef HAVE_DLOPEN_DISABLED

View File

@ -217,10 +217,16 @@ static int timestamps_start_trans(struct ldb_module *module)
return ldb_next_start_trans(module);
}
static int timestamps_end_trans(struct ldb_module *module, int status)
static int timestamps_end_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "timestamps_end_trans\n");
return ldb_next_end_trans(module, status);
return ldb_next_end_trans(module);
}
static int timestamps_del_trans(struct ldb_module *module)
{
ldb_debug(module->ldb, LDB_DEBUG_TRACE, "timestamps_del_trans\n");
return ldb_next_del_trans(module);
}
static int timestamps_destructor(void *module_ctx)
@ -239,7 +245,8 @@ static const struct ldb_module_ops timestamps_ops = {
.delete_record = timestamps_delete_record,
.rename_record = timestamps_rename_record,
.start_transaction = timestamps_start_trans,
.end_transaction = timestamps_end_trans
.end_transaction = timestamps_end_trans,
.del_transaction = timestamps_del_trans
};

View File

@ -75,7 +75,7 @@ static int process_file(struct ldb_context *ldb, FILE *f)
ldif->msg = ldb_msg_canonicalize(ldb, ldif->msg);
ret = ldb_add(ldb, ldif->msg);
if (ret != LDB_ERR_SUCCESS) {
if (ret != LDB_SUCCESS) {
fprintf(stderr, "ERR: \"%s\" on DN %s\n",
ldb_errstring(ldb), ldb_dn_linearize(ldb, ldif->msg->dn));
failures++;

View File

@ -24,6 +24,7 @@
#include "nbt_server/nbt_server.h"
#include "nbt_server/wins/winsdb.h"
#include "lib/ldb/include/ldb.h"
#include "lib/ldb/include/ldb_errors.h"
#include "db_wrap.h"
#include "system/time.h"
@ -75,12 +76,14 @@ static uint64_t winsdb_allocate_version(struct wins_server *winssrv)
/*
remove a version id
*/
static void winsdb_remove_version(struct wins_server *winssrv, uint64_t version)
static BOOL winsdb_remove_version(struct wins_server *winssrv, uint64_t version)
{
if (version == winssrv->min_version) {
winssrv->min_version++;
winsdb_save_version(winssrv);
return winsdb_save_version(winssrv);
}
return True;
}
@ -205,7 +208,12 @@ uint8_t winsdb_add(struct wins_server *winssrv, struct winsdb_record *rec)
struct ldb_context *ldb = winssrv->wins_db;
struct ldb_message *msg;
TALLOC_CTX *tmp_ctx = talloc_new(winssrv);
int ret;
int trans = -1;
int ret = 0;
trans = ldb_transaction_start(ldb);
if (trans != LDB_SUCCESS) goto failed;
rec->version = winsdb_allocate_version(winssrv);
if (rec->version == 0) goto failed;
@ -215,10 +223,14 @@ uint8_t winsdb_add(struct wins_server *winssrv, struct winsdb_record *rec)
ret = ldb_add(ldb, msg);
if (ret != 0) goto failed;
trans = ldb_transaction_commit(ldb);
if (trans != LDB_SUCCESS) goto failed;
talloc_free(tmp_ctx);
return NBT_RCODE_OK;
failed:
if (trans == LDB_SUCCESS) ldb_transaction_cancel(ldb);
talloc_free(tmp_ctx);
return NBT_RCODE_SVR;
}
@ -232,9 +244,13 @@ uint8_t winsdb_modify(struct wins_server *winssrv, struct winsdb_record *rec)
struct ldb_context *ldb = winssrv->wins_db;
struct ldb_message *msg;
TALLOC_CTX *tmp_ctx = talloc_new(winssrv);
int trans;
int ret;
int i;
trans = ldb_transaction_start(ldb);
if (trans != LDB_SUCCESS) goto failed;
rec->version = winsdb_allocate_version(winssrv);
if (rec->version == 0) goto failed;
@ -248,10 +264,14 @@ uint8_t winsdb_modify(struct wins_server *winssrv, struct winsdb_record *rec)
ret = ldb_modify(ldb, msg);
if (ret != 0) goto failed;
trans = ldb_transaction_commit(ldb);
if (trans != LDB_SUCCESS) goto failed;
talloc_free(tmp_ctx);
return NBT_RCODE_OK;
failed:
if (trans == LDB_SUCCESS) ldb_transaction_cancel(ldb);
talloc_free(tmp_ctx);
return NBT_RCODE_SVR;
}
@ -264,10 +284,15 @@ uint8_t winsdb_delete(struct wins_server *winssrv, struct winsdb_record *rec)
{
struct ldb_context *ldb = winssrv->wins_db;
TALLOC_CTX *tmp_ctx = talloc_new(winssrv);
int ret;
const struct ldb_dn *dn;
int trans;
int ret;
winsdb_remove_version(winssrv, rec->version);
trans = ldb_transaction_start(ldb);
if (trans != LDB_SUCCESS) goto failed;
if(!winsdb_remove_version(winssrv, rec->version))
goto failed;
dn = winsdb_dn(tmp_ctx, rec->name);
if (dn == NULL) goto failed;
@ -275,10 +300,14 @@ uint8_t winsdb_delete(struct wins_server *winssrv, struct winsdb_record *rec)
ret = ldb_delete(ldb, dn);
if (ret != 0) goto failed;
trans = ldb_transaction_commit(ldb);
if (trans != LDB_SUCCESS) goto failed;
talloc_free(tmp_ctx);
return NBT_RCODE_OK;
failed:
if (trans == LDB_SUCCESS) ldb_transaction_cancel(ldb);
talloc_free(tmp_ctx);
return NBT_RCODE_SVR;
}