Files
duplicati/Duplicati/Library/Main/Backend/BackendManager.ListOperation.cs
T
Kenneth SkovhedeandGitHub d99f74ed94 Rewrite the backend manager. (#5896)
* Rewrite the backend manager.

This creates a new more logic backend manager that handles all backend operations.

For each top-level operation, there is now a single backend manager instance that is passed to sub-commands.

The internals of the backend manager are now rewritten to use async logic instead of threading.

The design uses a single task runner that dispatches operations and honors concurrent settings and limits from one place.

The logic for each operation has been moved into a separate files/classes to make it easier to understand each operation.

This fixes #5804

* Fixed a few issues with not awaiting tasks

* Fixed not creating empty databases

* Fixed an issue with hashes not being recorded on download

* Reworked the download logic to avoid attempting to decrypt the file if it has been modified.

* Review fixes

* Renamed db collector to better reflect the purpose.

* Review fixes
2025-01-28 08:54:50 +01:00

63 lines
2.1 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Duplicati.Library.Interface;
namespace Duplicati.Library.Main.Backend;
#nullable enable
partial class BackendManager
{
/// <summary>
/// Represents a pending LIST operation
/// </summary>
/// <remarks>
/// Creates a new ListOperation
/// </remarks>
/// <param name="context">The execution context</param>
/// <param name="cancelToken">The cancellation token</param>
private class ListOperation(ExecuteContext context, CancellationToken cancelToken)
: PendingOperation<List<IFileEntry>>(context, true, cancelToken)
{
/// <summary>
/// The operation type
/// </summary>
public override BackendActionType Operation => BackendActionType.List;
/// <summary>
/// Executes the operation
/// </summary>
/// <param name="backend">The backend to list</param>
/// <param name="cancelToken">The cancellation token</param>
/// <returns>An awaitable task</returns>
public override Task<List<IFileEntry>> ExecuteAsync(IBackend backend, CancellationToken cancelToken)
{
Context.Statwriter.SendEvent(BackendActionType.List, BackendEventType.Started, null, -1);
var r = backend.List().ToList();
// TODO: Investigate better way to solve this so we do not use memory for large lists
var sb = new StringBuilder();
sb.AppendLine("[");
long count = 0;
foreach (var e in r)
{
if (count != 0)
sb.AppendLine(",");
count++;
sb.Append(System.Text.Json.JsonSerializer.Serialize(e));
}
sb.AppendLine();
sb.Append("]");
Context.Database.LogRemoteOperation("list", "", sb.ToString());
Context.Statwriter.SendEvent(BackendActionType.List, BackendEventType.Completed, null, r.Count);
return Task.FromResult(r);
}
}
}