diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
index 9aff73e4e83..abf9104e83f 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
using System.Threading.Tasks;
- [TestFixture]
- public class HiLoForcedTableSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoForcedTableSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public HiLoForcedTableSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.HiLo.hbm.xml" }; }
@@ -54,9 +58,9 @@ public async Task TestNormalBoundaryAsync()
long expectedId = i + 1;
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
@@ -64,9 +68,9 @@ public async Task TestNormalBoundaryAsync()
await (session.SaveAsync(entities[increment]));
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2)); // initialization + clock-over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
await (transaction.CommitAsync());
}
@@ -85,4 +89,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
index f792da88124..9f5f3a4168a 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledForcedTableSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledForcedTableSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public PooledForcedTableSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.Pooled.hbm.xml" }; }
@@ -55,8 +59,8 @@ public async Task TestNormalBoundaryAsync()
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
// NOTE : initialization calls table twice
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
@@ -66,8 +70,8 @@ public async Task TestNormalBoundaryAsync()
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
// initialization (2) + clock over
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment*2 + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment*2 + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
await (transaction.CommitAsync());
}
@@ -86,4 +90,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs
index e7e5c23fad0..a047e3aec35 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/OptimizerTests.cs
@@ -8,8 +8,8 @@
//------------------------------------------------------------------------------
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced
{
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
index cb185e72c6f..4b1606cf330 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
@@ -11,13 +11,18 @@
using System.Collections;
using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
using System.Threading.Tasks;
- [TestFixture]
- public class HiLoSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public HiLoSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.HiLo.hbm.xml" }; }
@@ -51,18 +56,18 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (session.SaveAsync(entities[i]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (session.SaveAsync(entities[increment]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
await (transaction.CommitAsync());
}
@@ -80,4 +85,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
index 7d0d4d11763..1d06ae11d89 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using System.Collections;
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledSequenceTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledSequenceTestAsync : TestCaseWithMultiTenancy
{
+ public PooledSequenceTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.Pooled.hbm.xml" }; }
@@ -51,16 +55,16 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (session.SaveAsync(entities[i]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (session.SaveAsync(entities[increment]));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
await (transaction.CommitAsync());
}
@@ -79,4 +83,4 @@ public async Task TestNormalBoundaryAsync()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs
index 0f9615a2ccd..85fc9520c87 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/SourceMock.cs
@@ -46,4 +46,4 @@ public Task GetNextValueAsync(CancellationToken cancellationToken)
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs
index 962460f90e0..2e53c916aea 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/HiLoTableTest.cs
@@ -10,14 +10,19 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
using System.Threading.Tasks;
- [TestFixture]
- public class HiLoTableTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoTableTestAsync : TestCaseWithMultiTenancy
{
+ public HiLoTableTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.HiLo.hbm.xml" }; }
@@ -50,18 +55,18 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (s.SaveAsync(entities[i]));
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (s.SaveAsync(entities[increment]));
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo((increment * 2) + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1));
await (transaction.CommitAsync());
}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs
index d721443bdd6..af309699513 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledLoTableTest.cs
@@ -10,14 +10,19 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledLoTableTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledLoTableTestAsync : TestCaseWithMultiTenancy
{
+ public PooledLoTableTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.PooledLo.hbm.xml" }; }
@@ -50,16 +55,16 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (s.SaveAsync(entities[i]));
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (s.SaveAsync(entities[increment]));
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
await (transaction.CommitAsync());
}
diff --git a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs
index 00c921da834..15be48dccaa 100644
--- a/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs
+++ b/src/NHibernate.Test/Async/IdGen/Enhanced/Table/PooledTableTest.cs
@@ -8,16 +8,20 @@
//------------------------------------------------------------------------------
-using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
using System.Threading.Tasks;
- [TestFixture]
- public class PooledTableTestAsync : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledTableTestAsync : TestCaseWithMultiTenancy
{
+ public PooledTableTestAsync(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.Pooled.hbm.xml" }; }
@@ -50,16 +54,16 @@ public async Task TestNormalBoundaryAsync()
entities[i] = new Entity("" + (i + 1));
await (s.SaveAsync(entities[i]));
Assert.That(generator.TableAccessCount, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
await (s.SaveAsync(entities[increment]));
Assert.That(generator.TableAccessCount, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
await (transaction.CommitAsync());
}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
index c2ba2b1f589..e8647f3858f 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/HiLoForcedTableSequenceTest.cs
@@ -1,12 +1,16 @@
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
- [TestFixture]
- public class HiLoForcedTableSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoForcedTableSequenceTest : TestCaseWithMultiTenancy
{
+ public HiLoForcedTableSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.HiLo.hbm.xml" }; }
@@ -43,9 +47,9 @@ public void TestNormalBoundary()
long expectedId = i + 1;
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
@@ -53,9 +57,9 @@ public void TestNormalBoundary()
session.Save(entities[increment]);
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2)); // initialization + clock-over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2)); // initialization + clock-over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
transaction.Commit();
}
@@ -74,4 +78,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
index 91839abf07f..39598c9d591 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Forcedtable/PooledForcedTableSequenceTest.cs
@@ -1,12 +1,16 @@
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
-using System.Collections;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Forcedtable
{
- [TestFixture]
- public class PooledForcedTableSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledForcedTableSequenceTest : TestCaseWithMultiTenancy
{
+ public PooledForcedTableSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Forcedtable.Pooled.hbm.xml" }; }
@@ -44,8 +48,8 @@ public void TestNormalBoundary()
Assert.That(entities[i].Id, Is.EqualTo(expectedId));
// NOTE : initialization calls table twice
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
@@ -55,8 +59,8 @@ public void TestNormalBoundary()
Assert.That(entities[optimizer.IncrementSize].Id, Is.EqualTo(optimizer.IncrementSize + 1));
// initialization (2) + clock over
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment*2 + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment*2 + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
transaction.Commit();
}
@@ -75,4 +79,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs b/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs
index 8f0fd01986f..90842a1048e 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/OptimizerTests.cs
@@ -1,5 +1,5 @@
-using NUnit.Framework;
-using NHibernate.Id.Enhanced;
+using NHibernate.Id.Enhanced;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced
{
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
index 3cac164ec72..7cd6161bc02 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Sequence/HiLoSequenceTest.cs
@@ -1,12 +1,17 @@
using System.Collections;
using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
- [TestFixture]
- public class HiLoSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoSequenceTest : TestCaseWithMultiTenancy
{
+ public HiLoSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.HiLo.hbm.xml" }; }
@@ -40,18 +45,18 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
session.Save(entities[i]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
session.Save(entities[increment]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment * 2 + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1));
transaction.Commit();
}
@@ -69,4 +74,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
index 3e73cc21a9d..b18c211b7ba 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Sequence/PooledSequenceTest.cs
@@ -1,12 +1,16 @@
-using System.Collections;
-using NUnit.Framework;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
+using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Sequence
{
- [TestFixture]
- public class PooledSequenceTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledSequenceTest : TestCaseWithMultiTenancy
{
+ public PooledSequenceTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Sequence.Pooled.hbm.xml" }; }
@@ -40,16 +44,16 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
session.Save(entities[i]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
session.Save(entities[increment]);
Assert.That(generator.DatabaseStructure.TimesAccessed, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment * 2 + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
transaction.Commit();
}
@@ -68,4 +72,4 @@ public void TestNormalBoundary()
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs b/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs
index d7fcce2f9ec..3097d3f3814 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/SourceMock.cs
@@ -6,15 +6,20 @@ public partial class SourceMock : IAccessCallback
{
private long _val;
private readonly long _initialValue;
+ private readonly string _tenantId;
private readonly int _increment;
private int _timesCalled;
public SourceMock(long initialValue) : this(initialValue, 1) { }
- public SourceMock(long initialValue, int increment) : this(initialValue, increment, 0) { }
+ public SourceMock(long initialValue, int increment) : this(null, initialValue, increment, 0) { }
- public SourceMock(long initialValue, int increment, int timesCalled)
+ public SourceMock(long initialValue, int increment, int timesCalled): this(null, initialValue, increment, timesCalled)
{
+ }
+ public SourceMock(string tenantId, long initialValue, int increment, int timesCalled)
+ {
+ _tenantId = tenantId;
_increment = increment;
_timesCalled = timesCalled;
@@ -57,6 +62,8 @@ private void InitValue()
_val = _initialValue;
}
+ public string GetTenantIdentifier() => _tenantId;
+
public int TimesCalled
{
get { return _timesCalled; }
@@ -71,4 +78,4 @@ public long CurrentValue
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs
index 878252ce3dd..014788d6570 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Table/HiLoTableTest.cs
@@ -1,12 +1,17 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
- [TestFixture]
- public class HiLoTableTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class HiLoTableTest : TestCaseWithMultiTenancy
{
+ public HiLoTableTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.HiLo.hbm.xml" }; }
@@ -39,18 +44,18 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
s.Save(entities[i]);
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo(increment + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
s.Save(entities[increment]);
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(2));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.HiValue, Is.EqualTo((increment * 2) + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(2));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetHiValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1));
transaction.Commit();
}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs
index bd5245dbe9a..e56c2fed120 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledLoTableTest.cs
@@ -1,12 +1,17 @@
using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
- [TestFixture]
- public class PooledLoTableTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledLoTableTest : TestCaseWithMultiTenancy
{
+ public PooledLoTableTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.PooledLo.hbm.xml" }; }
@@ -39,16 +44,16 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
s.Save(entities[i]);
Assert.That(generator.TableAccessCount, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(1)); // initialization
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(1)); // initialization
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
s.Save(entities[increment]);
Assert.That(generator.TableAccessCount, Is.EqualTo(2));
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1));
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
transaction.Commit();
}
diff --git a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs
index 3a7ca042514..4f357bc6066 100644
--- a/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs
+++ b/src/NHibernate.Test/IdGen/Enhanced/Table/PooledTableTest.cs
@@ -1,12 +1,16 @@
-using System.Collections;
using NHibernate.Id.Enhanced;
+using NHibernate.Test.MultiTenancy;
using NUnit.Framework;
namespace NHibernate.Test.IdGen.Enhanced.Table
{
- [TestFixture]
- public class PooledTableTest : TestCase
+ [TestFixture(null)]
+ [TestFixture("test")]
+ public class PooledTableTest : TestCaseWithMultiTenancy
{
+ public PooledTableTest(string tenantIdentifier) : base(tenantIdentifier)
+ {
+ }
protected override string[] Mappings
{
get { return new[] { "IdGen.Enhanced.Table.Pooled.hbm.xml" }; }
@@ -39,16 +43,16 @@ public void TestNormalBoundary()
entities[i] = new Entity("" + (i + 1));
s.Save(entities[i]);
Assert.That(generator.TableAccessCount, Is.EqualTo(2)); // initialization calls seq twice
- Assert.That(optimizer.LastSourceValue, Is.EqualTo(increment + 1)); // initialization calls seq twice
- Assert.That(optimizer.LastValue, Is.EqualTo(i + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo(increment + 1)); // initialization calls seq twice
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(i + 1));
}
// now force a "clock over"
entities[increment] = new Entity("" + increment);
s.Save(entities[increment]);
Assert.That(generator.TableAccessCount, Is.EqualTo(3)); // initialization (2) + clock over
- Assert.That(optimizer.LastSourceValue, Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
- Assert.That(optimizer.LastValue, Is.EqualTo(increment + 1));
+ Assert.That(optimizer.GetLastSourceValue(TenantIdentifier), Is.EqualTo((increment * 2) + 1)); // initialization (2) + clock over
+ Assert.That(optimizer.GetLastValue(TenantIdentifier), Is.EqualTo(increment + 1));
transaction.Commit();
}
diff --git a/src/NHibernate.Test/MultiTenancy/TestCaseWithMultiTenancy.cs b/src/NHibernate.Test/MultiTenancy/TestCaseWithMultiTenancy.cs
new file mode 100644
index 00000000000..056f3c0ccac
--- /dev/null
+++ b/src/NHibernate.Test/MultiTenancy/TestCaseWithMultiTenancy.cs
@@ -0,0 +1,56 @@
+using System.Data.Common;
+using NHibernate.Cfg;
+using NHibernate.Dialect;
+using NHibernate.Driver;
+using NHibernate.MultiTenancy;
+
+namespace NHibernate.Test.MultiTenancy
+{
+ public abstract class TestCaseWithMultiTenancy : TestCase
+ {
+ protected TestCaseWithMultiTenancy(string tenantIdentifier)
+ {
+ TenantIdentifier = tenantIdentifier;
+ }
+
+ public string TenantIdentifier { get; }
+
+ protected override void Configure(Configuration configuration)
+ {
+ if (TenantIdentifier != null)
+ {
+ configuration.DataBaseIntegration(
+ x =>
+ {
+ x.MultiTenancy = MultiTenancyStrategy.Database;
+ x.MultiTenancyConnectionProvider();
+ });
+ }
+ base.Configure(configuration);
+ }
+
+ protected override DbConnection OpenConnectionForSchemaExport()
+ {
+ return Sfi.Settings.MultiTenancyConnectionProvider
+ .GetConnectionAccess(GetTenantConfig("defaultTenant"), Sfi).GetConnection();
+ }
+
+ private TenantConfiguration GetTenantConfig(string tenantId)
+ {
+ return new TestTenantConfiguration(tenantId, IsSqlServerDialect);
+ }
+
+ protected override ISession OpenSession()
+ {
+ if (TenantIdentifier != null)
+ {
+ return Sfi.WithOptions().Tenant(new TestTenantConfiguration(TenantIdentifier, IsSqlServerDialect)).OpenSession();
+ }
+ return base.OpenSession();
+ }
+
+ //Create extension method for this?
+ private bool IsSqlServerDialect => Sfi.Dialect is MsSql2000Dialect && !(Sfi.ConnectionProvider.Driver is OdbcDriver);
+
+ }
+}
diff --git a/src/NHibernate.Test/TestCase.cs b/src/NHibernate.Test/TestCase.cs
index c58d819ed64..581459294f8 100644
--- a/src/NHibernate.Test/TestCase.cs
+++ b/src/NHibernate.Test/TestCase.cs
@@ -21,6 +21,8 @@
using NHibernate.SqlTypes;
using NHibernate.Util;
using NSubstitute;
+using NHibernate.MultiTenancy;
+using NHibernate.Test.MultiTenancy;
namespace NHibernate.Test
{
diff --git a/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs b/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs
index b52c3e524b5..8fbb5c27826 100644
--- a/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs
+++ b/src/NHibernate/Async/Id/Enhanced/IAccessCallback.cs
@@ -20,4 +20,4 @@ public partial interface IAccessCallback
/// A cancellation token that can be used to cancel the work
Task GetNextValueAsync(CancellationToken cancellationToken);
}
-}
\ No newline at end of file
+}
diff --git a/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs b/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs
index 5ba08f4a31e..84f66d725ce 100644
--- a/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs
+++ b/src/NHibernate/Async/Id/Enhanced/OptimizerFactory.cs
@@ -9,8 +9,8 @@
using System;
+using System.Collections.Concurrent;
using System.Reflection;
-using System.Runtime.CompilerServices;
using NHibernate.Util;
namespace NHibernate.Id.Enhanced
@@ -30,27 +30,29 @@ public override async Task
///
/// The user may specify a max_lo value to determine how often new hi values are
- /// fetched. If sequences are not avaliable, TableHiLoGenerator might be an
+ /// fetched. If sequences are not available, TableHiLoGenerator might be an
/// alternative.
///
///
@@ -43,11 +44,16 @@ public partial class SequenceHiLoGenerator : SequenceGenerator
public const string MaxLo = "max_lo";
private int maxLo;
- private int lo;
- private long hi;
private System.Type returnClass;
+ private TenantStateStore _stateStore;
private readonly AsyncLock _asyncLock = new AsyncLock();
+ private class GenerationState
+ {
+ public long Lo { get; internal set; }
+ public long Hi { get; internal set; }
+ }
+
#region IConfigurable Members
///
@@ -61,8 +67,8 @@ public override void Configure(IType type, IDictionary parms, Di
{
base.Configure(type, parms, dialect);
maxLo = PropertiesHelper.GetInt32(MaxLo, parms, 9);
- lo = maxLo + 1; // so we "clock over" on the first invocation
returnClass = type.ReturnedClass;
+ _stateStore = new TenantStateStore(state => state.Lo = maxLo + 1);// so we "clock over" on the first invocation
}
#endregion
@@ -80,6 +86,8 @@ public override object Generate(ISessionImplementor session, object obj)
{
using (_asyncLock.Lock())
{
+ var generationState = _stateStore.LocateGenerationState(session.GetTenantIdentifier());
+
if (maxLo < 1)
{
//keep the behavior consistent even for boundary usages
@@ -89,15 +97,15 @@ public override object Generate(ISessionImplementor session, object obj)
return IdentifierGeneratorFactory.CreateNumber(val, returnClass);
}
- if (lo > maxLo)
+ if (generationState.Lo > maxLo)
{
long hival = Convert.ToInt64(base.Generate(session, obj));
- lo = (hival == 0) ? 1 : 0;
- hi = hival * (maxLo + 1);
+ generationState.Lo = (hival == 0) ? 1 : 0;
+ generationState.Hi = hival * (maxLo + 1);
if (log.IsDebugEnabled())
log.Debug("new hi value: {0}", hival);
}
- return IdentifierGeneratorFactory.CreateNumber(hi + lo++, returnClass);
+ return IdentifierGeneratorFactory.CreateNumber(generationState.Hi + generationState.Lo++, returnClass);
}
}
diff --git a/src/NHibernate/Id/TableGenerator.cs b/src/NHibernate/Id/TableGenerator.cs
index 09180687efc..3fbd16e4015 100644
--- a/src/NHibernate/Id/TableGenerator.cs
+++ b/src/NHibernate/Id/TableGenerator.cs
@@ -157,7 +157,7 @@ public virtual object Generate(ISessionImplementor session, object obj)
using (_asyncLock.Lock())
{
// This has to be done using a different connection to the containing
- // transaction becase the new hi value must remain valid even if the
+ // transaction because the new hi value must remain valid even if the
// containing transaction rolls back.
return DoWorkInNewTransaction(session);
}
@@ -220,7 +220,7 @@ public override object DoWorkInCurrentTransaction(ISessionImplementor session, D
int rows;
do
{
- //the loop ensure atomicitiy of the
+ //the loop ensures atomicity of the
//select + update even for no transaction
//or read committed isolation level (needed for .net?)
diff --git a/src/NHibernate/Id/TableHiLoGenerator.cs b/src/NHibernate/Id/TableHiLoGenerator.cs
index c64de1d3323..2ab763bf78e 100644
--- a/src/NHibernate/Id/TableHiLoGenerator.cs
+++ b/src/NHibernate/Id/TableHiLoGenerator.cs
@@ -6,6 +6,7 @@
using NHibernate.Type;
using NHibernate.Util;
using System.Collections.Generic;
+using System.Collections.Concurrent;
namespace NHibernate.Id
{
@@ -48,12 +49,17 @@ public partial class TableHiLoGenerator : TableGenerator
///
public const string MaxLo = "max_lo";
- private long hi;
- private long lo;
private long maxLo;
private System.Type returnClass;
+ private TenantStateStore _stateStore;
private readonly AsyncLock _asyncLock = new AsyncLock();
+ private class GenerationState
+ {
+ public long Lo { get; internal set; }
+ public long Hi { get; internal set; }
+ }
+
#region IConfigurable Members
///
@@ -67,8 +73,8 @@ public override void Configure(IType type, IDictionary parms, Di
{
base.Configure(type, parms, dialect);
maxLo = PropertiesHelper.GetInt64(MaxLo, parms, Int16.MaxValue);
- lo = maxLo + 1; // so we "clock over" on the first invocation
returnClass = type.ReturnedClass;
+ _stateStore = new TenantStateStore(state => state.Lo = maxLo + 1);// so we "clock over" on the first invocation
}
#endregion
@@ -85,6 +91,8 @@ public override object Generate(ISessionImplementor session, object obj)
{
using (_asyncLock.Lock())
{
+ var generationState = _stateStore.LocateGenerationState(session.GetTenantIdentifier());
+
if (maxLo < 1)
{
//keep the behavior consistent even for boundary usages
@@ -93,18 +101,61 @@ public override object Generate(ISessionImplementor session, object obj)
val = Convert.ToInt64(base.Generate(session, obj));
return IdentifierGeneratorFactory.CreateNumber(val, returnClass);
}
- if (lo > maxLo)
+ if (generationState.Lo > maxLo)
{
long hival = Convert.ToInt64(base.Generate(session, obj));
- lo = (hival == 0) ? 1 : 0;
- hi = hival * (maxLo + 1);
+ generationState.Lo = (hival == 0) ? 1 : 0;
+ generationState.Hi = hival * (maxLo + 1);
log.Debug("New high value: {0}", hival);
}
- return IdentifierGeneratorFactory.CreateNumber(hi + lo++, returnClass);
+ return IdentifierGeneratorFactory.CreateNumber(generationState.Hi + generationState.Lo++, returnClass);
}
}
#endregion
}
+
+ internal class TenantStateStore where TState : new()
+ {
+ private TState _noTenantState;
+ private Action _initializer;
+ private readonly Lazy> _tenantSpecificState = new Lazy>(() => new ConcurrentDictionary());
+
+ public TenantStateStore(Action initializer)
+ {
+ _initializer = initializer;
+ }
+
+ public TenantStateStore()
+ {
+ }
+
+ internal TState LocateGenerationState(string tenantIdentifier)
+ {
+ if (tenantIdentifier == null)
+ {
+ if (_noTenantState == null)
+ {
+ _noTenantState = CreateNewState();
+ }
+ return _noTenantState;
+ }
+ else
+ {
+ return _tenantSpecificState.Value.GetOrAdd(tenantIdentifier, _ => CreateNewState());
+ }
+ }
+
+ internal TState NoTenantGenerationState => _noTenantState ??
+ throw new HibernateException("Could not locate previous generation state for no-tenant");
+
+
+ private TState CreateNewState()
+ {
+ var state = new TState();
+ _initializer?.Invoke(state);
+ return state;
+ }
+ }
}