From 868ae511c9b0d610f83acf8f01975e1f5e3c1aa3 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 14 Nov 2012 13:17:54 +0000 Subject: Simplify writing db update functions Add functions to automate setting versions numbers in the db, also decrease chances of error in copying and pasting code, by setting the version number only once when we commence the upgrade. --- src/db/sysdb_upgrade.c | 613 ++++++++++++++++--------------------------------- 1 file changed, 192 insertions(+), 421 deletions(-) (limited to 'src/db/sysdb_upgrade.c') diff --git a/src/db/sysdb_upgrade.c b/src/db/sysdb_upgrade.c index 59171c1e..c4ca64a4 100644 --- a/src/db/sysdb_upgrade.c +++ b/src/db/sysdb_upgrade.c @@ -26,22 +26,99 @@ #include "db/sysdb_private.h" #include "db/sysdb_autofs.h" -static int finish_upgrade(int result, struct ldb_context *ldb, - const char *next_ver, const char **ver) +struct upgrade_ctx { + struct ldb_context *ldb; + const char *new_version; +}; + +static errno_t commence_upgrade(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, + const char *new_ver, struct upgrade_ctx **_ctx) +{ + struct upgrade_ctx *ctx; + int ret; + + DEBUG(SSSDBG_CRIT_FAILURE, ("UPGRADING DB TO VERSION %s\n", new_ver)); + + ctx = talloc(mem_ctx, struct upgrade_ctx); + if (!ctx) { + return ENOMEM; + } + + ctx->ldb = ldb; + ctx->new_version = new_ver; + + ret = ldb_transaction_start(ldb); + if (ret != LDB_SUCCESS) { + ret = EIO; + goto done; + } + + ret = EOK; + +done: + if (ret != EOK) { + talloc_free(ctx); + } else { + *_ctx = ctx; + } + return ret; +} + +static errno_t update_version(struct upgrade_ctx *ctx) +{ + struct ldb_message *msg = NULL; + errno_t ret; + + msg = ldb_msg_new(ctx); + if (!msg) { + ret = ENOMEM; + goto done; + } + msg->dn = ldb_dn_new(msg, ctx->ldb, SYSDB_BASE); + if (!msg->dn) { + ret = ENOMEM; + goto done; + } + + ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + + ret = ldb_msg_add_string(msg, "version", ctx->new_version); + if (ret != LDB_SUCCESS) { + ret = ENOMEM; + goto done; + } + + ret = ldb_modify(ctx->ldb, msg); + if (ret != LDB_SUCCESS) { + ret = sysdb_error_to_errno(ret); + goto done; + } + + ret = EOK; + +done: + talloc_free(msg); + return ret; +} + +static int finish_upgrade(int ret, struct upgrade_ctx **ctx, const char **ver) { - int ret = result; int lret; if (ret == EOK) { - lret = ldb_transaction_commit(ldb); + lret = ldb_transaction_commit((*ctx)->ldb); ret = sysdb_error_to_errno(lret); if (ret == EOK) { - *ver = next_ver; + *ver = (*ctx)->new_version; } } if (ret != EOK) { - lret = ldb_transaction_cancel(ldb); + lret = ldb_transaction_cancel((*ctx)->ldb); if (lret != LDB_SUCCESS) { DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction! [%s]\n", @@ -53,6 +130,7 @@ static int finish_upgrade(int result, struct ldb_context *ldb, } } + talloc_zfree(*ctx); return ret; } @@ -77,11 +155,17 @@ int sysdb_upgrade_01(struct ldb_context *ldb, const char **ver) char *domain; int ret, i, j; TALLOC_CTX *tmp_ctx; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { - ret = ENOMEM; - goto done; + return ENOMEM; + } + + ret = commence_upgrade(tmp_ctx, ldb, SYSDB_VERSION_0_2, &ctx); + if (ret) { + talloc_free(tmp_ctx); + return ret; } basedn = ldb_dn_new(tmp_ctx, ldb, SYSDB_BASE); @@ -98,12 +182,6 @@ int sysdb_upgrade_01(struct ldb_context *ldb, const char **ver) goto done; } - ret = ldb_transaction_start(ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; - } - for (i = 0; i < res->count; i++) { el = ldb_msg_find_element(res->msgs[i], "memberUid"); if (!el) { @@ -172,39 +250,11 @@ int sysdb_upgrade_01(struct ldb_context *ldb, const char **ver) talloc_zfree(msg); } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_2); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, ldb, SYSDB_VERSION_0_2, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -543,18 +593,16 @@ int sysdb_upgrade_03(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_4)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_4, &ctx); + if (ret) { + return ret; } /* Make this database case-sensitive */ @@ -581,39 +629,11 @@ int sysdb_upgrade_03(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_4); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_4, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -623,18 +643,16 @@ int sysdb_upgrade_04(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_5)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_5, &ctx); + if (ret) { + return ret; } /* Add new index */ @@ -684,39 +702,11 @@ int sysdb_upgrade_04(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_5); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_5, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -726,18 +716,16 @@ int sysdb_upgrade_05(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_6)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_6, &ctx); + if (ret) { + return ret; } /* Add new indexes */ @@ -782,39 +770,11 @@ int sysdb_upgrade_05(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_6); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_6, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -824,18 +784,16 @@ int sysdb_upgrade_06(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_7)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_7, &ctx); + if (ret) { + return ret; } /* Add new indexes */ @@ -868,39 +826,11 @@ int sysdb_upgrade_06(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "cn=sysdb"); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_7); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_7, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -910,18 +840,16 @@ int sysdb_upgrade_07(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_8)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_8, &ctx); + if (ret) { + return ret; } /* Add new indexes */ @@ -954,39 +882,11 @@ int sysdb_upgrade_07(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_8); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_8, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -996,18 +896,16 @@ int sysdb_upgrade_08(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_9)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_9, &ctx); + if (ret) { + return ret; } /* Add new indexes */ @@ -1046,39 +944,11 @@ int sysdb_upgrade_08(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_9); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_9, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -1088,18 +958,16 @@ int sysdb_upgrade_09(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_10)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_10, &ctx); + if (ret) { + return ret; } /* Add new indexes */ @@ -1133,40 +1001,11 @@ int sysdb_upgrade_09(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_10); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_10, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -1184,6 +1023,7 @@ int sysdb_upgrade_10(struct sysdb_ctx *sysdb, const char **ver) struct ldb_dn *basedn; const char *filter = "(&(objectClass=user)(!(uidNumber=*))(memberOf=*))"; const char *attrs[] = { "name", "memberof", NULL }; + struct upgrade_ctx *ctx; int i, j; tmp_ctx = talloc_new(NULL); @@ -1191,6 +1031,11 @@ int sysdb_upgrade_10(struct sysdb_ctx *sysdb, const char **ver) return ENOMEM; } + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_11, &ctx); + if (ret) { + return ret; + } + basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_USER_BASE, sysdb->domain->name); if (basedn == NULL) { @@ -1198,14 +1043,6 @@ int sysdb_upgrade_10(struct sysdb_ctx *sysdb, const char **ver) goto done; } - DEBUG(SSSDBG_CRIT_FAILURE, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_11)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; - } - ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_SUBTREE, attrs, "%s", filter); if (ret != LDB_SUCCESS) { @@ -1269,40 +1106,11 @@ int sysdb_upgrade_10(struct sysdb_ctx *sysdb, const char **ver) } } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_11); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } - - ret = EOK; + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_11, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -1312,7 +1120,6 @@ int sysdb_upgrade_11(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; errno_t ret; struct ldb_result *res; - struct ldb_message *msg; struct ldb_message *entry; const char *key; const char *value; @@ -1324,6 +1131,7 @@ int sysdb_upgrade_11(struct sysdb_ctx *sysdb, const char **ver) SYSDB_AUTOFS_ENTRY_VALUE, SYSDB_MEMBEROF, NULL }; + struct upgrade_ctx *ctx; size_t i, j; tmp_ctx = talloc_new(NULL); @@ -1331,6 +1139,11 @@ int sysdb_upgrade_11(struct sysdb_ctx *sysdb, const char **ver) return ENOMEM; } + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_12, &ctx); + if (ret) { + return ret; + } + basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE, AUTOFS_ENTRY_SUBDIR, sysdb->domain->name); if (basedn == NULL) { @@ -1338,15 +1151,6 @@ int sysdb_upgrade_11(struct sysdb_ctx *sysdb, const char **ver) goto done; } - DEBUG(SSSDBG_CRIT_FAILURE, - ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_12)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; - } - ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_SUBTREE, attrs, "(objectClass=%s)", SYSDB_AUTOFS_ENTRY_OC); if (ret != LDB_SUCCESS) { @@ -1403,39 +1207,11 @@ int sysdb_upgrade_11(struct sysdb_ctx *sysdb, const char **ver) } } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_12); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } - - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; - } + /* conversion done, update version number */ + ret = update_version(ctx); - ret = EOK; done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_12, ver); + ret = finish_upgrade(ret, &ctx, ver); talloc_free(tmp_ctx); return ret; } @@ -1445,19 +1221,16 @@ int sysdb_upgrade_12(struct sysdb_ctx *sysdb, const char **ver) TALLOC_CTX *tmp_ctx; int ret; struct ldb_message *msg; + struct upgrade_ctx *ctx; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) { return ENOMEM; } - DEBUG(SSSDBG_CRIT_FAILURE, - ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_13)); - - ret = ldb_transaction_start(sysdb->ldb); - if (ret != LDB_SUCCESS) { - ret = EIO; - goto done; + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_13, &ctx); + if (ret) { + return ret; } /* add new indexes */ @@ -1491,40 +1264,38 @@ int sysdb_upgrade_12(struct sysdb_ctx *sysdb, const char **ver) goto done; } - /* conversion done, upgrade version number */ - msg = ldb_msg_new(tmp_ctx); - if (!msg) { - ret = ENOMEM; - goto done; - } - msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE); - if (!msg->dn) { - ret = ENOMEM; - goto done; - } + /* conversion done, update version number */ + ret = update_version(ctx); - ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } +done: + ret = finish_upgrade(ret, &ctx, ver); + talloc_free(tmp_ctx); + return ret; +} - ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_13); - if (ret != LDB_SUCCESS) { - ret = ENOMEM; - goto done; - } +/* + * Example template for future upgrades. + * Copy and change version numbers as appropriate. + */ +#if 0 - ret = ldb_modify(sysdb->ldb, msg); - if (ret != LDB_SUCCESS) { - ret = sysdb_error_to_errno(ret); - goto done; +int sysdb_upgrade_13(struct sysdb_ctx *sysdb, const char **ver) +{ + struct upgrade_ctx *ctx; + errno_t ret; + + ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_14, &ctx); + if (ret) { + return ret; } - ret = EOK; + /* DO STUFF HERE (use ctx, as the local temporary memory context) */ + + /* conversion done, update version number */ + ret = update_version(ctx); done: - ret = finish_upgrade(ret, sysdb->ldb, SYSDB_VERSION_0_13, ver); - talloc_free(tmp_ctx); + ret = finish_upgrade(ret, &ctx, ver); return ret; } +#endif -- cgit