Skip to content

Commit afad7ce

Browse files
committed
Initial work on adding observers to logs.
1 parent e354dd6 commit afad7ce

File tree

9 files changed

+686
-273
lines changed

9 files changed

+686
-273
lines changed

DotJEM.Json.Storage.Test/Adapter/StorageAreaLogTest.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
4+
using System.Reactive.Linq;
35
using System.Text;
46
using System.Threading.Tasks;
57
using DotJEM.Json.Storage.Adapter;
68
using DotJEM.Json.Storage.Adapter.Materialize.ChanceLog;
9+
using DotJEM.Json.Storage.Adapter.Materialize.ChanceLog.ChangeObjects;
710
using DotJEM.Json.Storage.Adapter.Materialize.Log;
11+
using DotJEM.Json.Storage.Adapter.Observeable;
812
using DotJEM.Json.Storage.Configuration;
913
using Newtonsoft.Json.Linq;
1014
using NUnit.Framework;
@@ -128,5 +132,31 @@ public void Get_MixedUpdates_ReturnsAll()
128132
Assert.That(changes.Deleted.Count(), Is.EqualTo(1));
129133

130134
}
135+
136+
[Test]
137+
public void OpenObservable_MixedUpdates_ReturnsAll()
138+
{
139+
IStorageContext context = new SqlServerStorageContext(TestContext.ConnectionString);
140+
IStorageArea area = context.Area("changelogtest");
141+
142+
JObject template = JObject.Parse("{ name: 'Dymmy', count: 10 }");
143+
144+
IStorageAreaLogObserveable observable = area.Log.OpenObservable();
145+
Guid id1 = (Guid)area.Insert("content", template)["$id"];
146+
Guid id2 = (Guid)area.Insert("content", template)["$id"];
147+
Guid id3 = (Guid)area.Insert("content", template)["$id"];
148+
area.Update(id1, template);
149+
area.Delete(id2);
150+
151+
List<IChangeLogRow> list = new List<IChangeLogRow>();
152+
observable.ForEachAsync(row => list.Add(row)).Wait();
153+
154+
155+
Assert.That(list.Count, Is.GreaterThanOrEqualTo(3));
156+
Assert.That(list.OfType<CreateChangeLogRow>().Count(), Is.GreaterThanOrEqualTo(1));
157+
Assert.That(list.OfType<UpdateChangeLogRow>().Count(), Is.GreaterThanOrEqualTo(1));
158+
Assert.That(list.OfType<DeleteChangeLogRow>().Count(), Is.GreaterThanOrEqualTo(1));
159+
160+
}
131161
}
132162
}

DotJEM.Json.Storage.Test/DotJEM.Json.Storage.Test.csproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,24 @@
4949
</Reference>
5050
<Reference Include="System" />
5151
<Reference Include="System.Core" />
52+
<Reference Include="System.Reactive, Version=5.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
53+
<HintPath>..\packages\System.Reactive.5.0.0\lib\net472\System.Reactive.dll</HintPath>
54+
</Reference>
55+
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
56+
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
57+
</Reference>
58+
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
59+
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
60+
</Reference>
5261
<Reference Include="System.Transactions" />
62+
<Reference Include="System.Windows" />
63+
<Reference Include="System.Windows.Forms" />
5364
<Reference Include="System.Xml.Linq" />
5465
<Reference Include="System.Data.DataSetExtensions" />
5566
<Reference Include="Microsoft.CSharp" />
5667
<Reference Include="System.Data" />
5768
<Reference Include="System.Xml" />
69+
<Reference Include="WindowsBase" />
5870
</ItemGroup>
5971
<ItemGroup>
6072
<Compile Include="Adapter\Materialize\ChangeLog\StorageChangesCollection.cs" />
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<runtime>
44
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
55
<dependentAssembly>
6-
<assemblyIdentity name="Moq" publicKeyToken="69f491c39445e920" culture="neutral"/>
7-
<bindingRedirect oldVersion="0.0.0.0-4.2.1502.911" newVersion="4.2.1502.911"/>
6+
<assemblyIdentity name="Moq" publicKeyToken="69f491c39445e920" culture="neutral" />
7+
<bindingRedirect oldVersion="0.0.0.0-4.2.1502.911" newVersion="4.2.1502.911" />
88
</dependentAssembly>
99
</assemblyBinding>
1010
</runtime>
11-
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>
11+
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /></startup></configuration>

DotJEM.Json.Storage.Test/packages.config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@
44
<package id="Moq.AutoMock" version="0.3.2.1" targetFramework="net45" />
55
<package id="Newtonsoft.Json" version="10.0.2" targetFramework="net45" />
66
<package id="NUnit" version="2.6.4" targetFramework="net45" />
7+
<package id="System.Reactive" version="5.0.0" targetFramework="net48" />
8+
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
9+
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
710
</packages>

DotJEM.Json.Storage/Adapter/IStorageArea.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -275,31 +275,30 @@ private IEnumerable<JObject> InternalGet(string commandText, params SqlParameter
275275
EnsureTable();
276276

277277
using SqlConnection connection = context.OpenConnection();
278-
List<JObject> entities = GetEntities(commandText, parameters, connection);
278+
List<JObject> entities = GetEntities(commandText, parameters, connection).ToList();
279279
// Migrate must execute after the get/read operation in order not to affect the "get" SQL operation
280-
entities = MigrateEntities(entities, connection);
280+
entities = MigrateEntities(entities, connection).ToList();
281281
return entities;
282282
}
283283

284-
private List<JObject> GetEntities(string commandText, SqlParameter[] parameters, SqlConnection connection)
284+
private IEnumerable<JObject> GetEntities(string commandText, SqlParameter[] parameters, SqlConnection connection, bool updateOnRead = false)
285285
{
286286
List<JObject> entities = new List<JObject>();
287287
using SqlCommand command = new SqlCommand(commandText, connection);
288288
command.CommandTimeout = context.SqlServerConfiguration.ReadCommandTimeout;
289289
command.Parameters.AddRange(parameters);
290290

291291
//TODO: Dynamically read columns.
292-
using (SqlDataReader dataReader = command.ExecuteReader())
293-
{
292+
using (SqlDataReader dataReader = command.ExecuteReader()) {
294293
entities.AddRange(RunDataReader(dataReader));
295294
}
296295
command.Parameters.Clear();
297296
return entities;
298297
}
299298

300-
private List<JObject> MigrateEntities(IEnumerable<JObject> entities, SqlConnection connection)
299+
private IEnumerable<JObject> MigrateEntities(IEnumerable<JObject> entities, SqlConnection connection)
301300
{
302-
return entities.Select(entity => MigrateAndUpdate(entity, connection)).ToList();
301+
return entities.Select(entity => MigrateAndUpdate(entity, connection));
303302
}
304303

305304
private JObject MigrateAndUpdate(JObject entity, SqlConnection connection)

0 commit comments

Comments
 (0)