Skip to content

Commit a225f6b

Browse files
committed
autopopulate timestamp
1 parent 7791eb9 commit a225f6b

File tree

7 files changed

+83
-17
lines changed

7 files changed

+83
-17
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,3 +198,10 @@ var records = tableStore.GetByPartitionKey(1, e=>e.Name == "Jim CEO");
198198
```
199199

200200
In this example we get all records in parition "1" where the name is "Jim CEO".
201+
202+
#### Timestamp
203+
Azure Table Storage entities always have a timestamp. If your POCO has a field named Timestamp, that is a `DateTimeOffset`, `DateTime` or `String`, then this property will automatically be hydrated wit the timestamp provided by Azure Table Storage.
204+
205+
Modifications to the Timestamp property do not get persisited. This is exactly how it works with the Azure Table Storage SDK.
206+
207+
Considerations for taking a similar approach to ETag are being considered.
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
namespace TableStorage.Abstractions.POCO.Tests
1+
using System;
2+
3+
namespace TableStorage.Abstractions.POCO.Tests
24
{
35
public class Employee
46
{
57
public int CompanyId { get; set; }
68
public int Id { get; set; }
79
public string Name { get; set; }
810
public Department Department { get; set; }
11+
public DateTimeOffset Timestamp { get; set; }
912
}
1013
}

src/TableStorage.Abstractions.POCO.Tests/PocoTableStoreTests.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,25 @@ public void insert_record()
5959
Assert.AreEqual(4, tableStore.GetRecordCount());
6060
}
6161

62+
[TestMethod]
63+
public void insert_record_with_timestamp_ignores_user_provided_timestamp_value()
64+
{
65+
var employee = new Employee
66+
{
67+
Name = "Test",
68+
CompanyId = 99445,
69+
Id = 991122,
70+
Department = new Department { Id = 5, Name = "Test" },
71+
Timestamp = new DateTimeOffset(2001, 1, 1, 1, 1, 1, TimeSpan.Zero)
72+
};
73+
tableStore.Insert(employee);
74+
75+
var fromDb = tableStore.GetRecord(99445, 991122);
76+
77+
Assert.AreNotEqual(employee.Timestamp, fromDb.Timestamp);
78+
79+
}
80+
6281

6382
[TestMethod]
6483
public void insert_or_replace_record_inserts_when_record_is_new()
@@ -211,6 +230,13 @@ public void get_record()
211230
Assert.IsNotNull(record);
212231
}
213232

233+
[TestMethod]
234+
public void get_record_populates_timestamp()
235+
{
236+
var record = tableStore.GetRecord("1", "1");
237+
Assert.AreNotEqual(default(DateTimeOffset), record.Timestamp);
238+
}
239+
214240
[TestMethod]
215241
public void get_record_with_no_results()
216242
{
@@ -404,6 +430,16 @@ public void get_records_by_row_key()
404430
Assert.AreEqual(2, records.Count());
405431
}
406432

433+
[TestMethod]
434+
public void get_records_by_row_key_contain_hydrated_timestamp()
435+
{
436+
var records = tableStore.GetByRowKey("1");
437+
foreach (var record in records)
438+
{
439+
Assert.AreNotEqual(default(DateTimeOffset), record.Timestamp);
440+
}
441+
}
442+
407443
[TestMethod]
408444
public void get_records_by_row_key_and_filter()
409445
{
@@ -635,6 +671,26 @@ public void update_record()
635671
Assert.AreEqual("Mr. Jim CEO", record.Name);
636672
}
637673

674+
[TestMethod]
675+
public void update_record_updates_timestamp()
676+
{
677+
var employee = new Employee
678+
{
679+
CompanyId = 1,
680+
Id = 1,
681+
Name = "Mr. Jim CEO",
682+
Department = new Department { Id = 22, Name = "Executive" }
683+
};
684+
tableStore.Update(employee);
685+
var record = tableStore.GetRecord(1, 1);
686+
var timestamp1 = record.Timestamp;
687+
Task.Delay(5).Wait();
688+
tableStore.Update(employee);
689+
record = tableStore.GetRecord(1, 1);
690+
var timestamp2 = record.Timestamp;
691+
Assert.AreNotEqual(timestamp1, timestamp2);
692+
}
693+
638694
[TestMethod]
639695
public void update_record_wildcard_etag()
640696
{

src/TableStorage.Abstractions.POCO.Tests/TableStorage.Abstractions.POCO.Tests.csproj

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@
4040
</PropertyGroup>
4141
<ItemGroup>
4242
<Reference Include="FluentValidation, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7de548da2fbae0f0, processorArchitecture=MSIL">
43-
<HintPath>..\packages\FluentValidation.8.6.1\lib\net45\FluentValidation.dll</HintPath>
43+
<HintPath>..\packages\FluentValidation.8.6.2\lib\net45\FluentValidation.dll</HintPath>
4444
</Reference>
4545
<Reference Include="Microsoft.Azure.Cosmos.Table, Version=1.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
4646
<HintPath>..\packages\Microsoft.Azure.Cosmos.Table.1.0.6\lib\netstandard2.0\Microsoft.Azure.Cosmos.Table.dll</HintPath>
4747
</Reference>
48-
<Reference Include="Microsoft.Azure.DocumentDB.Core, Version=2.9.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
49-
<HintPath>..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\lib\netstandard1.6\Microsoft.Azure.DocumentDB.Core.dll</HintPath>
48+
<Reference Include="Microsoft.Azure.DocumentDB.Core, Version=2.10.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
49+
<HintPath>..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\lib\netstandard1.6\Microsoft.Azure.DocumentDB.Core.dll</HintPath>
5050
</Reference>
5151
<Reference Include="Microsoft.Azure.KeyVault.Core, Version=3.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
5252
<HintPath>..\packages\Microsoft.Azure.KeyVault.Core.3.0.5\lib\net461\Microsoft.Azure.KeyVault.Core.dll</HintPath>
@@ -305,8 +305,8 @@
305305
<Reference Include="TableStorage.Abstractions, Version=3.1.0.0, Culture=neutral, processorArchitecture=MSIL">
306306
<HintPath>..\packages\TableStorage.Abstractions.3.1.0\lib\netstandard2.0\TableStorage.Abstractions.dll</HintPath>
307307
</Reference>
308-
<Reference Include="TableStorage.Abstractions.TableEntityConverters, Version=1.1.8.0, Culture=neutral, processorArchitecture=MSIL">
309-
<HintPath>..\packages\TableStorage.Abstractions.TableEntityConverters.1.1.8\lib\net462\TableStorage.Abstractions.TableEntityConverters.dll</HintPath>
308+
<Reference Include="TableStorage.Abstractions.TableEntityConverters, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
309+
<HintPath>..\packages\TableStorage.Abstractions.TableEntityConverters.1.2.0\lib\net462\TableStorage.Abstractions.TableEntityConverters.dll</HintPath>
310310
</Reference>
311311
<Reference Include="Useful.Extensions, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL">
312312
<HintPath>..\packages\Useful.Extensions.3.0.1\lib\netstandard2.0\Useful.Extensions.dll</HintPath>
@@ -339,9 +339,9 @@
339339
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.props'))" />
340340
<Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets'))" />
341341
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
342-
<Error Condition="!Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets'))" />
342+
<Error Condition="!Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets'))" />
343343
</Target>
344344
<Import Project="..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.0\build\net45\MSTest.TestAdapter.targets')" />
345345
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
346-
<Import Project="..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets" Condition="Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.9.3\build\Microsoft.Azure.DocumentDB.Core.targets')" />
346+
<Import Project="..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets" Condition="Exists('..\packages\Microsoft.Azure.DocumentDB.Core.2.10.0\build\Microsoft.Azure.DocumentDB.Core.targets')" />
347347
</Project>

src/TableStorage.Abstractions.POCO.Tests/app.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@
125125
</dependentAssembly>
126126
<dependentAssembly>
127127
<assemblyIdentity name="Microsoft.Azure.DocumentDB.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
128-
<bindingRedirect oldVersion="0.0.0.0-2.9.3.0" newVersion="2.9.3.0" />
128+
<bindingRedirect oldVersion="0.0.0.0-2.10.0.0" newVersion="2.10.0.0" />
129129
</dependentAssembly>
130130
<dependentAssembly>
131131
<assemblyIdentity name="Microsoft.OData.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />

src/TableStorage.Abstractions.POCO.Tests/packages.config

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id="FluentValidation" version="8.6.1" targetFramework="net462" />
3+
<package id="FluentValidation" version="8.6.2" targetFramework="net462" />
44
<package id="Microsoft.Azure.Cosmos.Table" version="1.0.6" targetFramework="net462" />
5-
<package id="Microsoft.Azure.DocumentDB.Core" version="2.9.3" targetFramework="net462" />
5+
<package id="Microsoft.Azure.DocumentDB.Core" version="2.10.0" targetFramework="net462" />
66
<package id="Microsoft.Azure.KeyVault.Core" version="3.0.5" targetFramework="net462" />
77
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="net462" />
88
<package id="Microsoft.Data.Edm" version="5.8.4" targetFramework="net462" />
@@ -92,6 +92,6 @@
9292
<package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net462" />
9393
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net462" />
9494
<package id="TableStorage.Abstractions" version="3.1.0" targetFramework="net462" />
95-
<package id="TableStorage.Abstractions.TableEntityConverters" version="1.1.8" targetFramework="net462" />
95+
<package id="TableStorage.Abstractions.TableEntityConverters" version="1.2.0" targetFramework="net462" />
9696
<package id="Useful.Extensions" version="3.0.1" targetFramework="net462" />
9797
</packages>

src/TableStorage.Abstractions.POCO/TableStorage.Abstractions.POCO.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5-
<Version>2.3.1</Version>
5+
<Version>2.4</Version>
66
<Authors>Giovanni Galbo</Authors>
77
<Company>Giovanni Galbo</Company>
88
<Description>A repository wrapper for Azure Table Storage that uses POCOs (Plain Old CLR Objects) instead of objects that implemeent ITableEntity.
@@ -19,18 +19,18 @@ The library will convert simple properties to fields in Azure Table Storage. Com
1919
<PackageProjectUrl>https://github.com/giometrix/TableStorage.Abstractions.POCO</PackageProjectUrl>
2020
<RepositoryUrl>https://github.com/giometrix/TableStorage.Abstractions.POCO</RepositoryUrl>
2121
<PackageTags>table-storage azure-table-storage poco table-entities tableentity</PackageTags>
22-
<PackageReleaseNotes>update nuget packages</PackageReleaseNotes>
22+
<PackageReleaseNotes>auto-populate timestamp field</PackageReleaseNotes>
2323
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
2424
<PackageLicenseExpression>MIT</PackageLicenseExpression>
25-
<AssemblyVersion>2.3.1.0</AssemblyVersion>
26-
<FileVersion>2.3.1.0</FileVersion>
25+
<AssemblyVersion>2.4.0.0</AssemblyVersion>
26+
<FileVersion>2.4.0.0</FileVersion>
2727
<PackageIcon>xtensible-x.png</PackageIcon>
2828
<PackageIconUrl />
2929
</PropertyGroup>
3030

3131
<ItemGroup>
3232
<PackageReference Include="TableStorage.Abstractions" Version="3.1.0" />
33-
<PackageReference Include="TableStorage.Abstractions.TableEntityConverters" Version="1.1.8" />
33+
<PackageReference Include="TableStorage.Abstractions.TableEntityConverters" Version="1.2.0" />
3434
</ItemGroup>
3535

3636
<ItemGroup>

0 commit comments

Comments
 (0)