The LocalDatabase class was deleting from the BlocklistHash table based on the volume id of blocks. The deletes for the Blockset and BlocksetEntry tables were using a union query which included the same query the BlocklistHash delete was using. Changed the BlocklistHash delete query to use the union as well to ensure that all three tables would use the same query to delete the necessary rows. This fixes the "Detected non-empty blocksets with no associated blocks!" error. Moved a write call in the DataBlockProcessor to send a volume for upload after setting blockvolume to null. This prevents a null reference exception because otherwise it would be sent to the SpillCollector and it tries to add a block, but the volume has already been closed. Added the ? operator to the RegistryUtility class to prevent a null reference exception while debugging. It was annoying catching it in the debugger. Fixes #4037
51 lines
1.8 KiB
C#
51 lines
1.8 KiB
C#
#region Disclaimer / License
|
|
// Copyright (C) 2019, The Duplicati Team
|
|
// http://www.duplicati.com, info@duplicati.com
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
//
|
|
#endregion
|
|
using Microsoft.Win32;
|
|
|
|
namespace Duplicati.Library.Utility
|
|
{
|
|
public static class RegistryUtility
|
|
{
|
|
public static string GetDataByValueName(string parentKeyName, string name)
|
|
{
|
|
try
|
|
{
|
|
// check currentUser first, if null, then check LocalMachine
|
|
// if a registry item does not exist a null is returned
|
|
var cuParentKey = Registry.CurrentUser.OpenSubKey(parentKeyName, RegistryKeyPermissionCheck.ReadSubTree);
|
|
if (cuParentKey?.GetValue(name) != null)
|
|
{
|
|
return cuParentKey.GetValue(name).ToString();
|
|
}
|
|
|
|
var lmParentKey = Registry.LocalMachine.OpenSubKey(parentKeyName, RegistryKeyPermissionCheck.ReadSubTree);
|
|
return lmParentKey?.GetValue(name).ToString();
|
|
}
|
|
catch
|
|
{
|
|
// NOOP
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
}
|
|
}
|