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:
committed by
Gerald (Jerry) Carter
parent
70b52b02a7
commit
63b43dd12f
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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)
|
||||
|
@ -527,5 +527,5 @@ int ldb_msg_sanity_check(const struct ldb_message *msg)
|
||||
}
|
||||
}
|
||||
|
||||
return LDB_ERR_SUCCESS;
|
||||
return LDB_SUCCESS;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
@ -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++;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user