Author: obnox Date: 2007-06-08 21:48:09 +0000 (Fri, 08 Jun 2007) New Revision: 23392
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23392 Log: Merge r19841 from SAMBA_3_0. (Adapted to the later change in r22935.) wrap regdb_store_keys and regdb_store_values in tdb transactions Michael Modified: branches/SAMBA_3_0_26/source/registry/reg_db.c Changeset: Modified: branches/SAMBA_3_0_26/source/registry/reg_db.c =================================================================== --- branches/SAMBA_3_0_26/source/registry/reg_db.c 2007-06-08 19:58:32 UTC (rev 23391) +++ branches/SAMBA_3_0_26/source/registry/reg_db.c 2007-06-08 21:48:09 UTC (rev 23392) @@ -393,15 +393,20 @@ { int num_subkeys, i; pstring path; - REGSUBKEY_CTR *subkeys, *old_subkeys; + REGSUBKEY_CTR *subkeys = NULL, *old_subkeys = NULL; char *oldkeyname; + if ( tdb_transaction_start( tdb_reg ) == -1 ) { + DEBUG(0, ("regdb_store_keys: tdb_transaction_start failed\n")); + return False; + } + /* fetch a list of the old subkeys so we can determine if any were * deleted */ if ( !(old_subkeys = TALLOC_ZERO_P( ctr, REGSUBKEY_CTR )) ) { DEBUG(0,("regdb_store_keys: talloc() failure!\n")); - return False; + goto fail; } regdb_fetch_keys( key, old_subkeys ); @@ -411,7 +416,7 @@ if ( !regdb_store_keys_internal( key, ctr ) ) { DEBUG(0,("regdb_store_keys: Failed to store new subkey list " "for parent [%s]\n", key )); - return False; + goto fail; } /* now delete removed keys */ @@ -419,15 +424,30 @@ num_subkeys = regsubkey_ctr_numkeys( old_subkeys ); for ( i=0; i<num_subkeys; i++ ) { oldkeyname = regsubkey_ctr_specific_key( old_subkeys, i ); - if ( !regsubkey_ctr_key_exists( ctr, oldkeyname ) ) { - pstr_sprintf( path, "%s%c%s", key, '/', oldkeyname ); - normalize_reg_path( path ); - tdb_delete_bystring( tdb_reg, path ); - pstr_sprintf( path, "%s/%s/%s", VALUE_PREFIX, key, - oldkeyname ); - normalize_reg_path( path ); - tdb_delete_bystring( tdb_reg, path ); + + if ( regsubkey_ctr_key_exists( ctr, oldkeyname ) ) { + /* + * It's still around, don't delete + */ + + continue; } + + pstr_sprintf( path, "%s/%s", key, oldkeyname ); + normalize_reg_path( path ); + if (tdb_delete_bystring( tdb_reg, path ) == -1) { + DEBUG(1, ("Deleting %s failed\n", path)); + goto fail; + } + + pstr_sprintf( path, "%s/%s/%s", VALUE_PREFIX, key, + oldkeyname ); + normalize_reg_path( path ); + + /* + * Ignore errors here, we might have no values around + */ + tdb_delete_bystring( tdb_reg, path ); } TALLOC_FREE( old_subkeys ); @@ -436,12 +456,12 @@ num_subkeys = regsubkey_ctr_numkeys( ctr ); for ( i=0; i<num_subkeys; i++ ) { - pstr_sprintf( path, "%s%c%s", key, '/', + pstr_sprintf( path, "%s/%s", key, regsubkey_ctr_specific_key( ctr, i ) ); if ( !(subkeys = TALLOC_ZERO_P( ctr, REGSUBKEY_CTR )) ) { DEBUG(0,("regdb_store_keys: talloc() failure!\n")); - return False; + goto fail; } if ( regdb_fetch_keys( path, subkeys ) == -1 ) { @@ -449,15 +469,29 @@ if ( !regdb_store_keys_internal( path, subkeys ) ) { DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]\n", path )); - TALLOC_FREE( subkeys ); - return False; + goto fail; } } TALLOC_FREE( subkeys ); } - + + if (tdb_transaction_commit( tdb_reg ) == -1) { + DEBUG(0, ("regdb_store_keys: Could not commit transaction\n")); + return False; + } + return True; + + fail: + TALLOC_FREE( old_subkeys ); + TALLOC_FREE( subkeys ); + + if (tdb_transaction_cancel( tdb_reg ) == -1) { + smb_panic("regdb_store_keys: tdb_transaction_cancel failed\n"); + } + + return False; } @@ -647,7 +681,7 @@ pstr_sprintf( keystr, "%s/%s", VALUE_PREFIX, key ); normalize_reg_path( keystr ); - ret = tdb_store_bystring(tdb_reg, keystr, data, TDB_REPLACE); + ret = tdb_trans_store_bystring(tdb_reg, keystr, data, TDB_REPLACE); SAFE_FREE( data.dptr );
