From 9fe870affa2b19aeee8f45f05cc1407d448c3bf7 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 29 Apr 2008 17:37:35 +0200 Subject: registry: save writes in init_registry_data() if data does already exist. This is done by first checking if all data (keys and values) exists (using new regdb_key_exists()) and kompletely skipping all writes if it does. Michael (This used to be commit 7c5f1583cb43d473544f161aa9c864e1d78944e5) --- source3/registry/reg_backend_db.c | 55 ++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 12 deletions(-) (limited to 'source3/registry') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index e10cfb520b..81f5edcb7b 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -237,11 +237,44 @@ fail: WERROR init_registry_data(void) { WERROR werr; - TALLOC_CTX *frame = NULL; + TALLOC_CTX *frame = talloc_stackframe(); REGVAL_CTR *values; int i; UNISTR2 data; + /* + * First, check for the existence of the needed keys and values. + * If all do already exist, we can save the writes. + */ + for (i=0; builtin_registry_paths[i] != NULL; i++) { + if (!regdb_key_exists(builtin_registry_paths[i])) { + goto do_init; + } + } + + for (i=0; builtin_registry_values[i].path != NULL; i++) { + values = TALLOC_ZERO_P(frame, REGVAL_CTR); + if (values == NULL) { + werr = WERR_NOMEM; + goto done; + } + + regdb_fetch_values(builtin_registry_values[i].path, values); + if (!regval_ctr_key_exists(values, + builtin_registry_values[i].valuename)) + { + TALLOC_FREE(values); + goto do_init; + } + + TALLOC_FREE(values); + } + + werr = WERR_OK; + goto done; + +do_init: + /* * There are potentially quite a few store operations which are all * indiviually wrapped in tdb transactions. Wrapping them in a single @@ -253,7 +286,8 @@ WERROR init_registry_data(void) if (regdb->transaction_start(regdb) != 0) { DEBUG(0, ("init_registry_data: tdb_transaction_start " "failed\n")); - return WERR_REG_IO_FAILURE; + werr = WERR_REG_IO_FAILURE; + goto done; } /* loop over all of the predefined paths and add each component */ @@ -267,8 +301,6 @@ WERROR init_registry_data(void) /* loop over all of the predefined values and add each component */ - frame = talloc_stackframe(); - for (i=0; builtin_registry_values[i].path != NULL; i++) { values = TALLOC_ZERO_P(frame, REGVAL_CTR); @@ -316,25 +348,24 @@ WERROR init_registry_data(void) TALLOC_FREE(values); } - TALLOC_FREE(frame); - if (regdb->transaction_commit(regdb) != 0) { DEBUG(0, ("init_registry_data: Could not commit " "transaction\n")); - return WERR_REG_IO_FAILURE; + werr = WERR_REG_IO_FAILURE; + } else { + werr = WERR_OK; } - return WERR_OK; - - fail: - - TALLOC_FREE(frame); + goto done; +fail: if (regdb->transaction_cancel(regdb) != 0) { smb_panic("init_registry_data: tdb_transaction_cancel " "failed\n"); } +done: + TALLOC_FREE(frame); return werr; } -- cgit