mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
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 7c5f1583cb
)
This commit is contained in:
parent
ed6a9edb1e
commit
9fe870affa
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user