mirror of
https://github.com/samba-team/samba.git
synced 2025-12-14 20:23:54 +03:00
r10299: remove the public (un)lock functions and introduce a transaction based
private ldb API ldb_sqlite3 is already working with this model and ldb_tdb will do as soon as tridge finishes the tdb transaction code. currently the transactions are always implicit and wrap any single ldb API call except searching, the transaction functions are currently not made public on purpose. Simo.
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
0949db8119
commit
1da4ac2cdc
@@ -457,57 +457,6 @@ static char *parsetree_to_sql(struct ldb_module *module,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* obtain a named lock */
|
||||
static int
|
||||
lsqlite3_lock(struct ldb_module * module,
|
||||
const char * lockname)
|
||||
{
|
||||
struct lsqlite3_private * lsqlite3 = module->private_data;
|
||||
|
||||
/* FIXME
|
||||
if (lockname == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (strcmp(lockname, "transaction") == 0) {
|
||||
if (lsqlite3->lock_count == 0) {
|
||||
if (query_norows(lsqlite3, "BEGIN EXCLUSIVE;") != 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
++lsqlite3->lock_count;
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* release a named lock */
|
||||
static int
|
||||
lsqlite3_unlock(struct ldb_module *module,
|
||||
const char *lockname)
|
||||
{
|
||||
struct lsqlite3_private * lsqlite3 = module->private_data;
|
||||
|
||||
/* FIXME
|
||||
if (lockname == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (strcmp(lockname, "transaction") == 0) {
|
||||
if (lsqlite3->lock_count == 1) {
|
||||
if (query_norows(lsqlite3, "COMMIT;") != 0) {
|
||||
query_norows(lsqlite3, "ROLLBACK;");
|
||||
}
|
||||
} else if (lsqlite3->lock_count > 0) {
|
||||
--lsqlite3->lock_count;
|
||||
}
|
||||
} else if (strcmp(lockname, "rollback") == 0) {
|
||||
query_norows(lsqlite3, "ROLLBACK;");
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* query_int()
|
||||
*
|
||||
@@ -685,7 +634,7 @@ static int lsqlite3_safe_rollback(sqlite3 *sqlite)
|
||||
ret = sqlite3_exec(sqlite, "ROLLBACK;", NULL, NULL, &errmsg);
|
||||
if (ret != SQLITE_OK) {
|
||||
if (errmsg) {
|
||||
printf("lsqlite3_safe_rollback: Serious Error: %s\n", errmsg);
|
||||
printf("lsqlite3_safe_rollback: Error: %s\n", errmsg);
|
||||
free(errmsg);
|
||||
}
|
||||
return -1;
|
||||
@@ -1078,7 +1027,6 @@ static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg
|
||||
char *dn, *ndn;
|
||||
char *errmsg;
|
||||
char *query;
|
||||
int rollback = 0;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
@@ -1115,8 +1063,6 @@ static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg
|
||||
if (dn == NULL || ndn == NULL) goto failed;
|
||||
|
||||
query = lsqlite3_tprintf(local_ctx,
|
||||
/* Begin the transaction */
|
||||
"BEGIN EXCLUSIVE; "
|
||||
/* Add new entry */
|
||||
"INSERT OR ABORT INTO ldb_entry "
|
||||
"('dn', 'norm_dn') "
|
||||
@@ -1130,10 +1076,8 @@ static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg
|
||||
printf("lsqlite3_add: exec error: %s\n", errmsg);
|
||||
free(errmsg);
|
||||
}
|
||||
lsqlite3_safe_rollback(lsqlite3->sqlite);
|
||||
goto failed;
|
||||
}
|
||||
rollback = 1;
|
||||
|
||||
eid = lsqlite3_get_eid_ndn(lsqlite3->sqlite, local_ctx, ndn);
|
||||
if (eid == -1) goto failed;
|
||||
@@ -1179,20 +1123,10 @@ static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg
|
||||
}
|
||||
}
|
||||
|
||||
ret = sqlite3_exec(lsqlite3->sqlite, "COMMIT;", NULL, NULL, &errmsg);
|
||||
if (ret != SQLITE_OK) {
|
||||
if (errmsg) {
|
||||
printf("lsqlite3_add: commit error: %s\n", errmsg);
|
||||
free(errmsg);
|
||||
}
|
||||
goto failed;
|
||||
}
|
||||
|
||||
talloc_free(local_ctx);
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
if (rollback) lsqlite3_safe_rollback(lsqlite3->sqlite);
|
||||
talloc_free(local_ctx);
|
||||
return -1;
|
||||
}
|
||||
@@ -1205,7 +1139,6 @@ static int lsqlite3_modify(struct ldb_module *module, const struct ldb_message *
|
||||
struct lsqlite3_private *lsqlite3 = module->private_data;
|
||||
long long eid;
|
||||
char *errmsg;
|
||||
int rollback = 0;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
@@ -1235,16 +1168,6 @@ static int lsqlite3_modify(struct ldb_module *module, const struct ldb_message *
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = sqlite3_exec(lsqlite3->sqlite, "BEGIN EXCLUSIVE;", NULL, NULL, &errmsg);
|
||||
if (ret != SQLITE_OK) {
|
||||
if (errmsg) {
|
||||
printf("lsqlite3_modify: error: %s\n", errmsg);
|
||||
free(errmsg);
|
||||
}
|
||||
goto failed;
|
||||
}
|
||||
rollback = 1;
|
||||
|
||||
eid = lsqlite3_get_eid(module, msg->dn);
|
||||
if (eid == -1) {
|
||||
goto failed;
|
||||
@@ -1376,20 +1299,10 @@ static int lsqlite3_modify(struct ldb_module *module, const struct ldb_message *
|
||||
}
|
||||
}
|
||||
|
||||
ret = sqlite3_exec(lsqlite3->sqlite, "COMMIT;", NULL, NULL, &errmsg);
|
||||
if (ret != SQLITE_OK) {
|
||||
if (errmsg) {
|
||||
printf("lsqlite3_modify: error: %s\n", errmsg);
|
||||
free(errmsg);
|
||||
}
|
||||
goto failed;
|
||||
}
|
||||
|
||||
talloc_free(local_ctx);
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
if (rollback) lsqlite3_safe_rollback(lsqlite3->sqlite);
|
||||
talloc_free(local_ctx);
|
||||
return -1;
|
||||
}
|
||||
@@ -1419,14 +1332,10 @@ static int lsqlite3_delete(struct ldb_module *module, const struct ldb_dn *dn)
|
||||
if (eid == -1) goto failed;
|
||||
|
||||
query = lsqlite3_tprintf(local_ctx,
|
||||
/* Begin the transaction */
|
||||
"BEGIN EXCLUSIVE; "
|
||||
/* Delete entry */
|
||||
"DELETE FROM ldb_entry WHERE eid = %lld; "
|
||||
/* Delete attributes */
|
||||
"DELETE FROM ldb_attribute_values WHERE eid = %lld; "
|
||||
/* Commit */
|
||||
"COMMIT;",
|
||||
"DELETE FROM ldb_attribute_values WHERE eid = %lld; ",
|
||||
eid, eid);
|
||||
if (query == NULL) goto failed;
|
||||
|
||||
@@ -1436,7 +1345,6 @@ static int lsqlite3_delete(struct ldb_module *module, const struct ldb_dn *dn)
|
||||
printf("lsqlite3_delete: error getting eid: %s\n", errmsg);
|
||||
free(errmsg);
|
||||
}
|
||||
lsqlite3_safe_rollback(lsqlite3->sqlite);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
@@ -1500,6 +1408,49 @@ failed:
|
||||
talloc_free(local_ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int lsqlite3_start_trans(struct ldb_module * module)
|
||||
{
|
||||
int ret;
|
||||
char *errmsg;
|
||||
struct lsqlite3_private * lsqlite3 = module->private_data;
|
||||
|
||||
ret = sqlite3_exec(lsqlite3->sqlite, "BEGIN IMMEDIATE;", NULL, NULL, &errmsg);
|
||||
if (ret != SQLITE_OK) {
|
||||
if (errmsg) {
|
||||
printf("lsqlite3_start_trans: error: %s\n", errmsg);
|
||||
free(errmsg);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsqlite3_end_trans(struct ldb_module *module, int status)
|
||||
{
|
||||
int ret;
|
||||
char *errmsg;
|
||||
struct lsqlite3_private *lsqlite3 = module->private_data;
|
||||
|
||||
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;
|
||||
}
|
||||
} else {
|
||||
return lsqlite3_safe_rollback(lsqlite3->sqlite);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* return extended error information */
|
||||
static const char *
|
||||
lsqlite3_errstring(struct ldb_module *module)
|
||||
@@ -1799,16 +1750,16 @@ destructor(void *p)
|
||||
* Table of operations for the sqlite3 backend
|
||||
*/
|
||||
static const struct ldb_module_ops lsqlite3_ops = {
|
||||
.name = "sqlite",
|
||||
.search = lsqlite3_search,
|
||||
.search_bytree = lsqlite3_search_bytree,
|
||||
.add_record = lsqlite3_add,
|
||||
.modify_record = lsqlite3_modify,
|
||||
.delete_record = lsqlite3_delete,
|
||||
.rename_record = lsqlite3_rename,
|
||||
.named_lock = lsqlite3_lock,
|
||||
.named_unlock = lsqlite3_unlock,
|
||||
.errstring = lsqlite3_errstring
|
||||
.name = "sqlite",
|
||||
.search = lsqlite3_search,
|
||||
.search_bytree = lsqlite3_search_bytree,
|
||||
.add_record = lsqlite3_add,
|
||||
.modify_record = lsqlite3_modify,
|
||||
.delete_record = lsqlite3_delete,
|
||||
.rename_record = lsqlite3_rename,
|
||||
.start_transaction = lsqlite3_start_trans,
|
||||
.end_transaction = lsqlite3_end_trans,
|
||||
.errstring = lsqlite3_errstring
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user