Skip to content

Commit daddf1a

Browse files
authored
Merge branch 'master' into DmlSessionFilter
2 parents a94329c + 17b8bf5 commit daddf1a

File tree

18 files changed

+186
-47
lines changed

18 files changed

+186
-47
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Linq;
12+
using NUnit.Framework;
13+
using NHibernate.Linq;
14+
15+
namespace NHibernate.Test.NHSpecificTest.NH3069
16+
{
17+
using System.Threading.Tasks;
18+
[TestFixture]
19+
public class FixtureAsync : BugTestCase
20+
{
21+
protected override void OnSetUp()
22+
{
23+
using (var session = OpenSession())
24+
using (var tx = session.BeginTransaction())
25+
{
26+
var entity = new VersionableConcreate { Name = "Some Name" };
27+
session.Save(entity);
28+
29+
tx.Commit();
30+
}
31+
}
32+
33+
protected override void OnTearDown()
34+
{
35+
using (var session = OpenSession())
36+
using (var tx = session.BeginTransaction())
37+
{
38+
session.Delete("from VersionableAbstract");
39+
tx.Commit();
40+
}
41+
}
42+
43+
[Test]
44+
public async Task ShouldLockEntityAsync()
45+
{
46+
using (var session = OpenSession())
47+
using (var tx = session.BeginTransaction())
48+
{
49+
var entity = await (session.Query<VersionableConcreate>().SingleAsync());
50+
await (session.LockAsync(
51+
entity,
52+
LockMode.Force)); //exception is thrown here when incorrect update statement is generated
53+
await (tx.CommitAsync());
54+
}
55+
}
56+
}
57+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3069
2+
{
3+
public abstract class VersionableAbstract
4+
{
5+
public long Id { get; set; }
6+
public int Version { get; set; }
7+
}
8+
9+
public class VersionableConcreate : VersionableAbstract
10+
{
11+
public string Name { get; set; }
12+
}
13+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Linq;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.NHSpecificTest.NH3069
5+
{
6+
[TestFixture]
7+
public class Fixture : BugTestCase
8+
{
9+
protected override void OnSetUp()
10+
{
11+
using (var session = OpenSession())
12+
using (var tx = session.BeginTransaction())
13+
{
14+
var entity = new VersionableConcreate { Name = "Some Name" };
15+
session.Save(entity);
16+
17+
tx.Commit();
18+
}
19+
}
20+
21+
protected override void OnTearDown()
22+
{
23+
using (var session = OpenSession())
24+
using (var tx = session.BeginTransaction())
25+
{
26+
session.Delete("from VersionableAbstract");
27+
tx.Commit();
28+
}
29+
}
30+
31+
[Test]
32+
public void ShouldLockEntity()
33+
{
34+
using (var session = OpenSession())
35+
using (var tx = session.BeginTransaction())
36+
{
37+
var entity = session.Query<VersionableConcreate>().Single();
38+
session.Lock(
39+
entity,
40+
LockMode.Force); //exception is thrown here when incorrect update statement is generated
41+
tx.Commit();
42+
}
43+
}
44+
}
45+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3+
assembly="NHibernate.Test"
4+
namespace="NHibernate.Test.NHSpecificTest.NH3069"
5+
default-lazy="false">
6+
<class name="VersionableAbstract">
7+
<id name="Id" column="`id`" generator="identity"/>
8+
<version name="Version" column="`version`"/>
9+
10+
<joined-subclass name="VersionableConcreate">
11+
<key column="`VersionableAbstract_id`"/>
12+
<property name="Name" column="`name`"/>
13+
</joined-subclass>
14+
</class>
15+
</hibernate-mapping>

src/NHibernate/Criterion/SQLProjection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ public SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteri
4040
//SqlString result = new SqlString(criteriaQuery.GetSQLAlias(criteria));
4141
//result.Replace(sql, "{alias}");
4242
//return result;
43-
return new SqlString(StringHelper.Replace(sql, "{alias}", criteriaQuery.GetSQLAlias(criteria)));
43+
return new SqlString(sql?.Replace("{alias}", criteriaQuery.GetSQLAlias(criteria)));
4444
}
4545

4646
public SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
4747
{
48-
return new SqlString(StringHelper.Replace(groupBy, "{alias}", criteriaQuery.GetSQLAlias(criteria)));
48+
return new SqlString(groupBy?.Replace("{alias}", criteriaQuery.GetSQLAlias(criteria)));
4949
}
5050

5151
public override string ToString()

src/NHibernate/Driver/FirebirdClientDriver.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,19 @@ public override DbCommand GenerateCommand(CommandType type, SqlString sqlString,
9494
var candidates = GetCastCandidates(expWithParams);
9595

9696
var index = 0;
97+
9798
foreach (DbParameter p in command.Parameters)
9899
{
99100
if (candidates.Contains(p.ParameterName))
100-
TypeCastParam(p, command, parameterTypes[index]);
101+
{
102+
var castType = GetFbTypeForParam(parameterTypes[index]);
103+
104+
command.CommandText = Regex.Replace(
105+
command.CommandText,
106+
Regex.Escape(p.ParameterName) + @"\b",
107+
$"cast({p.ParameterName} as {castType})");
108+
}
109+
101110
index++;
102111
}
103112
}
@@ -120,14 +129,6 @@ private static HashSet<string> GetCastCandidates(string statement)
120129
return new HashSet<string>(candidates);
121130
}
122131

123-
private void TypeCastParam(DbParameter param, DbCommand command, SqlType sqlType)
124-
{
125-
var castType = GetFbTypeForParam(sqlType);
126-
command.CommandText = command.CommandText.ReplaceWholeWord(
127-
param.ParameterName,
128-
$"cast({param.ParameterName} as {castType})");
129-
}
130-
131132
private string GetFbTypeForParam(SqlType sqlType)
132133
{
133134
if (sqlType.LengthDefined)

src/NHibernate/Hql/Ast/ANTLR/Util/SyntheticAndFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public virtual void AddDiscriminatorWhereFragment(IRestrictableStatement stateme
174174

175175
// Need to parse off the column qualifiers; this is assuming (which is true as of now)
176176
// that this is only used from update and delete HQL statement parsing
177-
whereFragment = StringHelper.Replace(whereFragment, persister.GenerateFilterConditionAlias(alias) + ".", "");
177+
whereFragment = whereFragment.Replace(persister.GenerateFilterConditionAlias(alias) + ".", "");
178178

179179
// Note: this simply constructs a "raw" SQL_TOKEN representing the
180180
// where fragment and injects this into the tree. This "works";

src/NHibernate/Id/UUIDHexGenerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ public virtual object Generate(ISessionImplementor session, object obj)
6969
{
7070
string guidString = GenerateNewGuid();
7171

72-
if (format != FormatWithDigitsOnly && sep != null)
72+
if (format != FormatWithDigitsOnly && sep != null && guidString != null)
7373
{
74-
return StringHelper.Replace(guidString, "-", sep);
74+
return guidString.Replace("-", sep);
7575
}
7676

7777
return guidString;

src/NHibernate/Impl/AbstractQueryImpl.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using NHibernate.Type;
1111
using NHibernate.Util;
1212
using System.Linq;
13+
using System.Text.RegularExpressions;
1314
using System.Threading;
1415
using System.Threading.Tasks;
1516

@@ -265,7 +266,10 @@ private string ExpandParameterList(string query, string name, TypedValue typedLi
265266

266267
var paramPrefix = isJpaPositionalParam ? StringHelper.SqlParameter : ParserHelper.HqlVariablePrefix;
267268

268-
return StringHelper.Replace(query, paramPrefix + name, string.Join(StringHelper.CommaSpace, aliases), true);
269+
return Regex.Replace(
270+
query,
271+
Regex.Escape(paramPrefix + name) + @"\b",
272+
string.Join(StringHelper.CommaSpace, aliases));
269273
}
270274

271275
#region Parameters

src/NHibernate/Mapping/SimpleAuxiliaryDatabaseObject.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ public override string SqlDropString(Dialect.Dialect dialect, string defaultCata
4545

4646
private static string InjectCatalogAndSchema(string ddlString, string defaultCatalog, string defaultSchema)
4747
{
48-
string rtn = StringHelper.Replace(ddlString, "${catalog}", defaultCatalog);
49-
rtn = StringHelper.Replace(rtn, "${schema}", defaultSchema);
50-
return rtn;
48+
return ddlString?.Replace("${catalog}", defaultCatalog).Replace("${schema}", defaultSchema);
5149
}
5250
}
5351
}

src/NHibernate/Mapping/UniqueKey.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,9 @@ public override string SqlConstraintString(Dialect.Dialect dialect, string const
6262
buf.Append(column.GetQuotedName(dialect));
6363
}
6464

65-
return
66-
!nullable || dialect.SupportsNullInUnique
67-
? StringHelper.Replace(buf.Append(StringHelper.ClosedParen).ToString(), "primary key", "unique")
68-
: null;
65+
return !nullable || dialect.SupportsNullInUnique
66+
? buf.Append(StringHelper.ClosedParen).Replace("primary key", "unique").ToString()
67+
: null;
6968
}
7069

7170
public override string SqlCreateString(Dialect.Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema)

src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -638,19 +638,19 @@ public bool HasCache
638638

639639
public string GetSQLWhereString(string alias)
640640
{
641-
return StringHelper.Replace(sqlWhereStringTemplate, Template.Placeholder, alias);
641+
return sqlWhereStringTemplate?.Replace(Template.Placeholder, alias);
642642
}
643643

644644
public string GetSQLOrderByString(string alias)
645645
{
646-
return HasOrdering ? StringHelper.Replace(sqlOrderByStringTemplate, Template.Placeholder, alias) : string.Empty;
646+
return HasOrdering ? sqlOrderByStringTemplate?.Replace(Template.Placeholder, alias) : string.Empty;
647647
}
648648

649649
public string GetManyToManyOrderByString(string alias)
650650
{
651651
if (IsManyToMany && manyToManyOrderByString != null)
652652
{
653-
return StringHelper.Replace(manyToManyOrderByTemplate, Template.Placeholder, alias);
653+
return manyToManyOrderByTemplate?.Replace(Template.Placeholder, alias);
654654
}
655655
else
656656
{
@@ -1020,7 +1020,7 @@ private static string[] Qualify(string alias, string[] columnNames, string[] for
10201020
{
10211021
if (columnNames[i] == null)
10221022
{
1023-
result[i] = StringHelper.Replace(formulaTemplates[i], Template.Placeholder, alias);
1023+
result[i] = formulaTemplates[i]?.Replace(Template.Placeholder, alias);
10241024
}
10251025
else
10261026
{
@@ -1375,7 +1375,7 @@ public string GetManyToManyFilterFragment(string alias, IDictionary<string, IFil
13751375

13761376
if (manyToManyWhereString != null)
13771377
{
1378-
buffer.Append(" and ").Append(StringHelper.Replace(manyToManyWhereTemplate, Template.Placeholder, alias));
1378+
buffer.Append(" and ").Append(manyToManyWhereTemplate?.Replace(Template.Placeholder, alias));
13791379
}
13801380

13811381
return buffer.ToString();

src/NHibernate/Persister/Entity/AbstractEntityPersister.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,7 @@ public virtual string VersionColumnName
683683
get { return versionColumnName; }
684684
}
685685

686+
[Obsolete("Please use RootTableName instead.")]
686687
protected internal string VersionedTableName
687688
{
688689
get { return GetTableName(0); }
@@ -1540,20 +1541,20 @@ public object[] GetDatabaseSnapshot(object id, ISessionImplementor session)
15401541
/// </summary>
15411542
protected SqlString GenerateSelectVersionString()
15421543
{
1543-
SqlSimpleSelectBuilder builder = new SqlSimpleSelectBuilder(Factory.Dialect, factory)
1544-
.SetTableName(VersionedTableName);
1544+
SqlSimpleSelectBuilder builder = new SqlSimpleSelectBuilder(Factory.Dialect, Factory)
1545+
.SetTableName(RootTableName);
15451546

15461547
if (IsVersioned)
1547-
builder.AddColumn(versionColumnName);
1548+
builder.AddColumn(VersionColumnName);
15481549
else
1549-
builder.AddColumns(rootTableKeyColumnNames);
1550+
builder.AddColumns(RootTableIdentifierColumnNames);
15501551

15511552
if (Factory.Settings.IsCommentsEnabled)
15521553
{
15531554
builder.SetComment("get version " + EntityName);
15541555
}
15551556

1556-
return builder.AddWhereFragment(rootTableKeyColumnNames, IdentifierType, " = ").ToSqlString();
1557+
return builder.AddWhereFragment(RootTableIdentifierColumnNames, IdentifierType, " = ").ToSqlString();
15571558
}
15581559

15591560
protected SqlString GenerateInsertGeneratedValuesSelectString()
@@ -1722,13 +1723,13 @@ public object ForceVersionIncrement(object id, object currentVersion, ISessionIm
17221723
private SqlCommandInfo GenerateVersionIncrementUpdateString()
17231724
{
17241725
SqlUpdateBuilder update = new SqlUpdateBuilder(Factory.Dialect, Factory);
1725-
update.SetTableName(GetTableName(0));
1726+
update.SetTableName(RootTableName);
17261727
if (Factory.Settings.IsCommentsEnabled)
17271728
{
17281729
update.SetComment("forced version increment");
17291730
}
17301731
update.AddColumn(VersionColumnName, VersionType);
1731-
update.SetIdentityColumn(IdentifierColumnNames, IdentifierType);
1732+
update.SetIdentityColumn(RootTableIdentifierColumnNames, IdentifierType);
17321733
update.SetVersionColumn(new string[] { VersionColumnName }, VersionType);
17331734
return update.ToSqlCommandInfo();
17341735
}
@@ -1933,7 +1934,7 @@ public string[] ToColumns(string name, int i)
19331934
{
19341935
if (cols[j] == null)
19351936
{
1936-
result[j] = StringHelper.Replace(templates[j], Template.Placeholder, alias);
1937+
result[j] = templates[j]?.Replace(Template.Placeholder, alias);
19371938
}
19381939
else
19391940
{
@@ -2196,7 +2197,7 @@ private EntityLoader CreateUniqueKeyLoader(IType uniqueKeyType, string[] columns
21962197

21972198
protected string GetSQLWhereString(string alias)
21982199
{
2199-
return StringHelper.Replace(sqlWhereStringTemplate, Template.Placeholder, alias);
2200+
return sqlWhereStringTemplate?.Replace(Template.Placeholder, alias);
22002201
}
22012202

22022203
protected bool HasWhere

src/NHibernate/Persister/Entity/AbstractPropertyMapping.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public virtual string[] ToColumns(string alias, string propertyName)
5555
for (int i = 0; i < columns.Length; i++)
5656
{
5757
if (columns[i] == null)
58-
result[i] = StringHelper.Replace(templates[i], Template.Placeholder, alias);
58+
result[i] = templates[i]?.Replace(Template.Placeholder, alias);
5959
else
6060
result[i] = StringHelper.Qualify(alias, columns[i]);
6161
}
@@ -81,7 +81,7 @@ public virtual string[] ToColumns(string propertyName)
8181
for (int i = 0; i < columns.Length; i++)
8282
{
8383
if (columns[i] == null)
84-
result[i] = StringHelper.Replace(templates[i], Template.Placeholder, string.Empty);
84+
result[i] = templates[i]?.Replace(Template.Placeholder, string.Empty);
8585
else
8686
result[i] = columns[i];
8787
}

src/NHibernate/SqlCommand/InFragment.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ public InFragment SetColumn(string alias, string colName)
3939
? alias + StringHelper.Dot + colName
4040
: colName;
4141

42-
return SetColumn(columnName);
42+
return this;
4343
}
4444

4545
public InFragment SetFormula(string alias, string formulaTemplate)
4646
{
47-
columnName = StringHelper.Replace(formulaTemplate, Template.Placeholder, alias);
48-
return SetColumn(columnName);
47+
columnName = formulaTemplate?.Replace(Template.Placeholder, alias);
48+
return this;
4949
}
5050

5151
public SqlString ToFragmentString()

0 commit comments

Comments
 (0)