Skip to content

Commit 4a2a40c

Browse files
committed
Added batching support for insert/update/delete statements on PostgreSQL
1 parent f81e6cc commit 4a2a40c

File tree

9 files changed

+456
-8
lines changed

9 files changed

+456
-8
lines changed

src/NHibernate.Test/Ado/BatcherFixture.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ private void FillDb()
5959
{
6060
s.Save(new VerySimple {Id = 1, Name = "Fabio", Weight = 119.5});
6161
s.Save(new VerySimple {Id = 2, Name = "Fiamma", Weight = 9.8});
62+
s.Save(new VerySimple {Id = 3, Name = "Roberto", Weight = 98.8 });
6263
tx.Commit();
6364
}
6465
}
@@ -74,11 +75,14 @@ public void OneRoundTripUpdate()
7475
{
7576
var vs1 = s.Get<VerySimple>(1);
7677
var vs2 = s.Get<VerySimple>(2);
78+
var vs3 = s.Get<VerySimple>(3);
7779
vs1.Weight -= 10;
7880
vs2.Weight -= 1;
81+
vs3.Weight -= 5;
7982
Sfi.Statistics.Clear();
8083
s.Update(vs1);
8184
s.Update(vs2);
85+
s.Update(vs3);
8286
tx.Commit();
8387
}
8488

@@ -154,9 +158,11 @@ public void OneRoundTripDelete()
154158
{
155159
var vs1 = s.Get<VerySimple>(1);
156160
var vs2 = s.Get<VerySimple>(2);
161+
var vs3 = s.Get<VerySimple>(3);
157162
Sfi.Statistics.Clear();
158163
s.Delete(vs1);
159164
s.Delete(vs2);
165+
s.Delete(vs3);
160166
tx.Commit();
161167
}
162168

src/NHibernate.Test/Async/Ado/BatcherFixture.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public async Task OneRoundTripInsertsAsync()
7171
{
7272
await (s.SaveAsync(new VerySimple {Id = 1, Name = "Fabio", Weight = 119.5}, cancellationToken));
7373
await (s.SaveAsync(new VerySimple {Id = 2, Name = "Fiamma", Weight = 9.8}, cancellationToken));
74+
await (s.SaveAsync(new VerySimple {Id = 3, Name = "Roberto", Weight = 98.8 }, cancellationToken));
7475
await (tx.CommitAsync(cancellationToken));
7576
}
7677
}
@@ -86,11 +87,14 @@ public async Task OneRoundTripUpdateAsync()
8687
{
8788
var vs1 = await (s.GetAsync<VerySimple>(1));
8889
var vs2 = await (s.GetAsync<VerySimple>(2));
90+
var vs3 = await (s.GetAsync<VerySimple>(3));
8991
vs1.Weight -= 10;
9092
vs2.Weight -= 1;
93+
vs3.Weight -= 5;
9194
Sfi.Statistics.Clear();
9295
await (s.UpdateAsync(vs1));
9396
await (s.UpdateAsync(vs2));
97+
await (s.UpdateAsync(vs3));
9498
await (tx.CommitAsync());
9599
}
96100

@@ -166,9 +170,11 @@ public async Task OneRoundTripDeleteAsync()
166170
{
167171
var vs1 = await (s.GetAsync<VerySimple>(1));
168172
var vs2 = await (s.GetAsync<VerySimple>(2));
173+
var vs3 = await (s.GetAsync<VerySimple>(3));
169174
Sfi.Statistics.Clear();
170175
await (s.DeleteAsync(vs1));
171176
await (s.DeleteAsync(vs2));
177+
await (s.DeleteAsync(vs3));
172178
await (tx.CommitAsync());
173179
}
174180

src/NHibernate.Test/Async/TypesTest/AbstractDateTimeTypeFixture.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using System.Data.Common;
1515
using System.Linq;
1616
using System.Reflection;
17+
using NHibernate.AdoNet;
1718
using NHibernate.Cfg;
1819
using NHibernate.Driver;
1920
using NHibernate.Engine;
@@ -246,8 +247,16 @@ public virtual async Task SaveUseExpectedSqlTypeAsync()
246247
await (t.CommitAsync());
247248
}
248249

250+
var expected = 3;
251+
// PostgreSQL batcher uses IDriver.GenerateCommand method to create the batching command,
252+
// so the expected result will be doubled as GenerateCommand calls IDriver.GenerateParameter
253+
// for each parameter.
254+
if (Sfi.Settings.BatcherFactory is PostgreSQLClientBatchingBatcherFactory)
255+
{
256+
expected *= 2;
257+
}
249258
// 2 properties + revision
250-
AssertSqlType(driver, 3, true);
259+
AssertSqlType(driver, expected, true);
251260
}
252261

253262
[Test]

src/NHibernate.Test/TypesTest/AbstractDateTimeTypeFixture.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Data.Common;
55
using System.Linq;
66
using System.Reflection;
7+
using NHibernate.AdoNet;
78
using NHibernate.Cfg;
89
using NHibernate.Driver;
910
using NHibernate.Engine;
@@ -277,8 +278,16 @@ public virtual void SaveUseExpectedSqlType()
277278
t.Commit();
278279
}
279280

281+
var expected = 3;
282+
// PostgreSQL batcher uses IDriver.GenerateCommand method to create the batching command,
283+
// so the expected result will be doubled as GenerateCommand calls IDriver.GenerateParameter
284+
// for each parameter.
285+
if (Sfi.Settings.BatcherFactory is PostgreSQLClientBatchingBatcherFactory)
286+
{
287+
expected *= 2;
288+
}
280289
// 2 properties + revision
281-
AssertSqlType(driver, 3, true);
290+
AssertSqlType(driver, expected, true);
282291
}
283292

284293
[Test]

src/NHibernate/AdoNet/AbstractBatcher.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ protected DbCommand CurrentCommand
6767
get { return _batchCommand; }
6868
}
6969

70+
/// <summary>
71+
/// Gets the current <see cref="SqlString"/> that is contained for this Batch
72+
/// </summary>
73+
/// <value>The current <see cref="SqlString"/>.</value>
74+
protected SqlString CurrentCommandSql => _batchCommandSql;
75+
76+
/// <summary>
77+
/// Gets the current <see cref="SqlType"/> parameters that are contained for this Batch
78+
/// </summary>
79+
/// <value>The current <see cref="SqlString"/>.</value>
80+
protected SqlType[] CurrentCommandParameterTypes => _batchCommandParameterTypes;
81+
7082
public DbCommand Generate(CommandType type, SqlString sqlString, SqlType[] parameterTypes)
7183
{
7284
SqlString sql = GetSQL(sqlString);

0 commit comments

Comments
 (0)