From cf0dfe8ef86d7e87bad51f89340e2ab94c741971 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 20 Dec 2024 10:01:30 +0000 Subject: [PATCH] add more disposal --- .../SQLite/SQLiteJsonCacheManager.cs | 8 ++++-- .../V2/DummySendServerObjectManager.cs | 6 +++-- .../V2/Receive/DeserializeProcess.cs | 5 ++++ .../Serialisation/V2/Receive/ObjectLoader.cs | 3 +++ .../Serialisation/V2/Send/BaseItem.cs | 19 ++++++++++++++ .../Serialisation/V2/Send/SerializeProcess.cs | 22 +++------------- .../V2/SerializeProcessFactory.cs | 25 +++---------------- 7 files changed, 44 insertions(+), 44 deletions(-) create mode 100644 src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs diff --git a/src/Speckle.Sdk/SQLite/SQLiteJsonCacheManager.cs b/src/Speckle.Sdk/SQLite/SQLiteJsonCacheManager.cs index f0bf82e4..fb9c7644 100644 --- a/src/Speckle.Sdk/SQLite/SQLiteJsonCacheManager.cs +++ b/src/Speckle.Sdk/SQLite/SQLiteJsonCacheManager.cs @@ -1,11 +1,13 @@ using System.Text; using Microsoft.Data.Sqlite; using Speckle.InterfaceGenerator; +using Speckle.Sdk.Dependencies; namespace Speckle.Sdk.SQLite; +public partial interface ISqLiteJsonCacheManager : IDisposable; [GenerateAutoInterface] -public sealed class SqLiteJsonCacheManager : ISqLiteJsonCacheManager, IDisposable +public sealed class SqLiteJsonCacheManager : ISqLiteJsonCacheManager { private readonly string _connectionString; private readonly CacheDbCommandPool _pool; @@ -17,6 +19,7 @@ public sealed class SqLiteJsonCacheManager : ISqLiteJsonCacheManager, IDisposabl _pool = new CacheDbCommandPool(_connectionString); } + [AutoInterfaceIgnore] public void Dispose() => _pool.Dispose(); private void Initialize() @@ -135,7 +138,7 @@ public sealed class SqLiteJsonCacheManager : ISqLiteJsonCacheManager, IDisposabl private void CreateBulkInsert(SqliteCommand cmd, IEnumerable<(string id, string json)> items) { - StringBuilder sb = new(); + StringBuilder sb = Pools.StringBuilders.Get(); sb.AppendLine(CacheDbCommands.Commands[(int)CacheOperation.BulkInsertOrIgnore]); int i = 0; foreach (var (id, json) in items) @@ -150,6 +153,7 @@ public sealed class SqLiteJsonCacheManager : ISqLiteJsonCacheManager, IDisposabl #pragma warning disable CA2100 cmd.CommandText = sb.ToString(); #pragma warning restore CA2100 + Pools.StringBuilders.Return(sb); } public bool HasObject(string objectId) => diff --git a/src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs index 827ed34a..626f9516 100644 --- a/src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs +++ b/src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs @@ -5,9 +5,11 @@ using Speckle.Sdk.Transports; namespace Speckle.Sdk.Serialisation.V2; -public class DummySqLiteJsonCacheManager : ISqLiteJsonCacheManager +public sealed class DummySqLiteJsonCacheManager : ISqLiteJsonCacheManager { - public IEnumerable GetAllObjects() => throw new NotImplementedException(); + public void Dispose() { } + + public IReadOnlyCollection GetAllObjects() => throw new NotImplementedException(); public void DeleteObject(string id) => throw new NotImplementedException(); diff --git a/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs index 87aa22a3..14281d18 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs @@ -13,6 +13,7 @@ public record DeserializeProcessOptions( bool SkipInvalidConverts = false ); +public partial interface IDeserializeProcess : IDisposable; [GenerateAutoInterface] public sealed class DeserializeProcess( IProgress? progress, @@ -29,6 +30,10 @@ public sealed class DeserializeProcess( public IReadOnlyDictionary BaseCache => _baseCache; public long Total { get; private set; } + + [AutoInterfaceIgnore] + public void Dispose() => objectLoader.Dispose(); + public async Task Deserialize(string rootId, CancellationToken cancellationToken) { diff --git a/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs b/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs index 7201c4d0..bb885144 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Receive/ObjectLoader.cs @@ -9,6 +9,7 @@ using Speckle.Sdk.Transports; namespace Speckle.Sdk.Serialisation.V2.Receive; +public partial interface IObjectLoader : IDisposable; [GenerateAutoInterface] public sealed class ObjectLoader( ISqLiteJsonCacheManager sqLiteJsonCacheManager, @@ -20,6 +21,8 @@ public sealed class ObjectLoader( private long _checkCache; private long _cached; private DeserializeProcessOptions _options = new(false); + [AutoInterfaceIgnore] + public void Dispose() => sqLiteJsonCacheManager.Dispose(); public async Task<(string, IReadOnlyCollection)> GetAndCache( string rootId, diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs b/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs new file mode 100644 index 00000000..38f2922f --- /dev/null +++ b/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs @@ -0,0 +1,19 @@ +using System.Text; + +namespace Speckle.Sdk.Serialisation.V2.Send; + +public readonly record struct BaseItem(Id Id, Json Json, bool NeedsStorage, Dictionary? Closures) : IHasSize +{ + public int Size { get; } = Encoding.UTF8.GetByteCount(Json.Value); + + public bool Equals(BaseItem? other) + { + if (other is null) + { + return false; + } + return string.Equals(Id.Value, other.Value.Id.Value, StringComparison.OrdinalIgnoreCase); + } + + public override int GetHashCode() => Id.GetHashCode(); +} diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs index 564e47f7..5ed133a8 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs @@ -1,5 +1,4 @@ using System.Collections.Concurrent; -using System.Text; using Speckle.InterfaceGenerator; using Speckle.Sdk.Common; using Speckle.Sdk.Dependencies; @@ -25,24 +24,9 @@ public readonly record struct SerializeProcessResults( IReadOnlyDictionary ConvertedReferences ); -public readonly record struct BaseItem(Id Id, Json Json, bool NeedsStorage, Closures? Closures) : IHasSize -{ - public int Size { get; } = Encoding.UTF8.GetByteCount(Json.Value); - - public bool Equals(BaseItem? other) - { - if (other is null) - { - return false; - } - return string.Equals(Id.Value, other.Value.Id.Value, StringComparison.OrdinalIgnoreCase); - } - - public override int GetHashCode() => Id.GetHashCode(); -} - +public partial interface ISerializeProcess : IDisposable; [GenerateAutoInterface] -public class SerializeProcess( +public sealed class SerializeProcess( IProgress? progress, ISqLiteJsonCacheManager sqLiteJsonCacheManager, IServerObjectManager serverObjectManager, @@ -64,6 +48,8 @@ public class SerializeProcess( private long _uploaded; private long _cached; + [AutoInterfaceIgnore] + public void Dispose() => sqLiteJsonCacheManager.Dispose(); public async Task Serialize(Base root, CancellationToken cancellationToken) { diff --git a/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs b/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs index 119e1a18..68615ec5 100644 --- a/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs +++ b/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs @@ -21,11 +21,6 @@ public interface ISerializeProcessFactory IProgress? progress, DeserializeProcessOptions? options = null ); - - public ISerializeProcess CreateSerializeProcess( - SerializeProcessOptions? options = null, - IProgress? progress = null - ); } public class SerializeProcessFactory( @@ -56,23 +51,6 @@ public class SerializeProcessFactory( ); } - public ISerializeProcess CreateSerializeProcess( - SerializeProcessOptions? options = null, - IProgress? progress = null - ) - { - var sqLiteJsonCacheManager = new DummySqLiteJsonCacheManager(); - var serverObjectManager = new DummySendServerObjectManager(); - return new SerializeProcess( - progress, - sqLiteJsonCacheManager, - serverObjectManager, - baseChildFinder, - objectSerializerFactory, - options - ); - } - public IDeserializeProcess CreateDeserializeProcess( Uri url, string streamId, @@ -84,7 +62,10 @@ public class SerializeProcessFactory( var sqLiteJsonCacheManager = sqLiteJsonCacheManagerFactory.CreateFromStream(streamId); var serverObjectManager = serverObjectManagerFactory.Create(url, streamId, authorizationToken); +#pragma warning disable CA2000 + //owned by process, refactor later var objectLoader = new ObjectLoader(sqLiteJsonCacheManager, serverObjectManager, progress); +#pragma warning restore CA2000 return new DeserializeProcess(progress, objectLoader, objectDeserializerFactory, options); } }