diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2898/BinaryFormatterCache.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2898/BinaryFormatterCache.cs index c32fcb0ef0c..055df548fcb 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2898/BinaryFormatterCache.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2898/BinaryFormatterCache.cs @@ -23,31 +23,6 @@ namespace NHibernate.Test.NHSpecificTest.NH2898 public partial class BinaryFormatterCache : CacheBase { - public override Task GetAsync(object key, CancellationToken cancellationToken) - { - try - { - var entry = _hashtable[key] as byte[]; - if (entry == null) - return Task.FromResult(null); - - var fmt = new BinaryFormatter - { -#if !NETFX - SurrogateSelector = new SerializationHelper.SurrogateSelector() -#endif - }; - using (var stream = new MemoryStream(entry)) - { - return Task.FromResult(fmt.Deserialize(stream)); - } - } - catch (System.Exception ex) - { - return Task.FromException(ex); - } - } - public override Task PutAsync(object key, object value, CancellationToken cancellationToken) { try diff --git a/src/NHibernate/Criterion/EntityProjection.cs b/src/NHibernate/Criterion/EntityProjection.cs index d6f7ee13c1e..a3298705cd3 100644 --- a/src/NHibernate/Criterion/EntityProjection.cs +++ b/src/NHibernate/Criterion/EntityProjection.cs @@ -1,11 +1,12 @@ -using System; +using System; using System.Collections.Generic; using NHibernate.Engine; -using NHibernate.Loader; using NHibernate.Loader.Criteria; using NHibernate.Persister.Entity; using NHibernate.SqlCommand; using NHibernate.Type; +using NHibernate.Util; + using IQueryable = NHibernate.Persister.Entity.IQueryable; namespace NHibernate.Criterion @@ -204,7 +205,7 @@ private void SetFields(ICriteriaQuery criteriaQuery) subcriteria, Persister.IdentifierPropertyName ?? string.Empty); - ColumnAliasSuffix = BasicLoader.GenerateSuffix(criteriaQuery.GetIndexForAlias()); + ColumnAliasSuffix = StringHelper.GenerateSuffix(criteriaQuery.GetIndexForAlias()); _identifierColumnAliases = Persister.GetIdentifierAliases(ColumnAliasSuffix); diff --git a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs index 8628201c18b..06260f1dad4 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs @@ -485,7 +485,7 @@ internal string GetSuffix(FromElement fromElement) return suffix; } - suffix = _suffixes.Count == 0 ? string.Empty : _suffixes.Count.ToString() + '_'; + suffix = _suffixes.Count == 0 ? string.Empty : StringHelper.GenerateSuffix(_suffixes.Count); _suffixes.Add(fromElement, suffix); return suffix; diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs index 139e851c56c..de7d9ebf4ca 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/FromElementType.cs @@ -532,7 +532,7 @@ private static string GetSuffix(int size, int sequence) private static string GenerateSuffix(int size, int k) { - String suffix = size == 1 ? "" : k.ToString() + '_'; + String suffix = size == 1 ? "" : StringHelper.GenerateSuffix(k); return suffix; } diff --git a/src/NHibernate/Loader/BasicLoader.cs b/src/NHibernate/Loader/BasicLoader.cs index 97c0781da4b..f169afe33bc 100644 --- a/src/NHibernate/Loader/BasicLoader.cs +++ b/src/NHibernate/Loader/BasicLoader.cs @@ -99,7 +99,7 @@ public static string[] GenerateSuffixes(int seed, int length) for (int i = 0; i < length; i++) { - suffixes[i] = GenerateSuffix(i + seed); + suffixes[i] = StringHelper.GenerateSuffix(i + seed); } return suffixes; @@ -107,7 +107,7 @@ public static string[] GenerateSuffixes(int seed, int length) public static string GenerateSuffix(int index) { - return index.ToString() + StringHelper.Underscore; + return StringHelper.GenerateSuffix(index); } } } diff --git a/src/NHibernate/Mapping/Property.cs b/src/NHibernate/Mapping/Property.cs index 1207d10f68a..4a0dd86da05 100644 --- a/src/NHibernate/Mapping/Property.cs +++ b/src/NHibernate/Mapping/Property.cs @@ -66,7 +66,7 @@ public IEnumerable ColumnIterator public string Name { get { return name; } - set { name = value; } + set { name = value == null ? null : string.Intern(value); } } public bool IsComposite @@ -122,7 +122,7 @@ public CascadeStyle CascadeStyle public string Cascade { get { return cascade; } - set { cascade = value; } + set { cascade = value == null ? null : string.Intern(value); } } public bool IsUpdateable @@ -168,7 +168,7 @@ public bool IsOptional public string PropertyAccessorName { get { return propertyAccessorName; } - set { propertyAccessorName = value; } + set { propertyAccessorName = value == null ? null : string.Intern(value); } } public IGetter GetGetter(System.Type clazz) diff --git a/src/NHibernate/Mapping/SimpleValue.cs b/src/NHibernate/Mapping/SimpleValue.cs index 7714f120fd4..0f9f9a7f084 100644 --- a/src/NHibernate/Mapping/SimpleValue.cs +++ b/src/NHibernate/Mapping/SimpleValue.cs @@ -60,7 +60,7 @@ public IDictionary IdentifierGeneratorProperties public string IdentifierGeneratorStrategy { get { return identifierGeneratorStrategy; } - set { identifierGeneratorStrategy = value; } + set { identifierGeneratorStrategy = value == null ? null : string.Intern(value); } } public virtual bool IsComposite @@ -127,7 +127,7 @@ public string TypeName if ((typeName == null && value != null) || (typeName != null && !typeName.Equals(value))) { // the property change - typeName = value; + typeName = value == null ? null : string.Intern(value); type = null; // invalidate type } } @@ -353,7 +353,8 @@ public virtual void SetTypeUsingReflection(string className, string propertyName } try { - typeName = ReflectHelper.ReflectedPropertyClass(className, propertyName, accesorName).AssemblyQualifiedName; + var aqn = ReflectHelper.ReflectedPropertyClass(className, propertyName, accesorName).AssemblyQualifiedName; + typeName = aqn == null ? null : string.Intern(aqn); } catch (HibernateException he) { @@ -372,7 +373,8 @@ public virtual void SetTypeUsingReflection(System.Type propertyOwnerType, string } try { - typeName = ReflectHelper.ReflectedPropertyClass(propertyOwnerType, propertyName, accessorName).AssemblyQualifiedName; + var aqn = ReflectHelper.ReflectedPropertyClass(propertyOwnerType, propertyName, accessorName).AssemblyQualifiedName; + typeName = aqn == null ? null : string.Intern(aqn); } catch (HibernateException he) { diff --git a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs index 205fdb1f212..77729249b62 100644 --- a/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs +++ b/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs @@ -2376,14 +2376,14 @@ protected void InitSubclassPropertyAliasesMap(PersistentClass model) { if (entityMetamodel.HasNonIdentifierPropertyNamedId) { - subclassPropertyAliases[EntityPersister.EntityID + "." + idPropertyNames[i]] = new string[] { idAliases[i] }; - subclassPropertyColumnNames[EntityPersister.EntityID + "." + IdentifierPropertyName + "." + idPropertyNames[i]] = new string[] { idColumnNames[i] }; + subclassPropertyAliases[string.Intern(EntityPersister.EntityID + "." + idPropertyNames[i])] = new string[] { idAliases[i] }; + subclassPropertyColumnNames[string.Intern(EntityPersister.EntityID + "." + IdentifierPropertyName + "." + idPropertyNames[i])] = new string[] { idColumnNames[i] }; } // if (hasIdentifierProperty() && !ENTITY_ID.equals( getIdentifierPropertyName() ) ) { if (HasIdentifierProperty) { - subclassPropertyAliases[IdentifierPropertyName + "." + idPropertyNames[i]] = new string[] { idAliases[i] }; - subclassPropertyColumnNames[IdentifierPropertyName + "." + idPropertyNames[i]] = new string[] { idColumnNames[i] }; + subclassPropertyAliases[string.Intern(IdentifierPropertyName + "." + idPropertyNames[i])] = new string[] { idAliases[i] }; + subclassPropertyColumnNames[string.Intern(IdentifierPropertyName + "." + idPropertyNames[i])] = new string[] { idColumnNames[i] }; } else { diff --git a/src/NHibernate/Persister/Entity/AbstractPropertyMapping.cs b/src/NHibernate/Persister/Entity/AbstractPropertyMapping.cs index c027568bf18..21a47e59d9c 100644 --- a/src/NHibernate/Persister/Entity/AbstractPropertyMapping.cs +++ b/src/NHibernate/Persister/Entity/AbstractPropertyMapping.cs @@ -211,7 +211,7 @@ private static string ExtendPath(string path, string property) if (string.IsNullOrEmpty(path)) return property; - return StringHelper.Qualify(path, property); + return string.Intern(StringHelper.Qualify(path, property)); } public string[] GetColumnNames(string propertyName) diff --git a/src/NHibernate/Tuple/Entity/EntityMetamodel.cs b/src/NHibernate/Tuple/Entity/EntityMetamodel.cs index 2a02711b2bf..c5dc3478f67 100644 --- a/src/NHibernate/Tuple/Entity/EntityMetamodel.cs +++ b/src/NHibernate/Tuple/Entity/EntityMetamodel.cs @@ -449,7 +449,7 @@ private void MapIdentifierPropertyTypes(string path, IType propertyType) for (var i = 0; i < componentType.PropertyNames.Length; i++) { MapIdentifierPropertyTypes( - !string.IsNullOrEmpty(path) ? $"{path}.{componentType.PropertyNames[i]}" : componentType.PropertyNames[i], + !string.IsNullOrEmpty(path) ? string.Intern($"{path}.{componentType.PropertyNames[i]}") : componentType.PropertyNames[i], componentType.Subtypes[i]); } } diff --git a/src/NHibernate/Type/PersistentEnumType.cs b/src/NHibernate/Type/PersistentEnumType.cs index ee2748033b1..d384a471abe 100644 --- a/src/NHibernate/Type/PersistentEnumType.cs +++ b/src/NHibernate/Type/PersistentEnumType.cs @@ -294,7 +294,7 @@ public class EnumType : PersistentEnumType public EnumType() : base(typeof (T)) { System.Type type = GetType(); - typeName = type.FullName + ", " + type.Assembly.GetName().Name; + typeName = string.Intern(type.FullName + ", " + type.Assembly.GetName().Name); } public override string Name diff --git a/src/NHibernate/Util/StringHelper.cs b/src/NHibernate/Util/StringHelper.cs index 7372d79f639..dd29be95bd4 100644 --- a/src/NHibernate/Util/StringHelper.cs +++ b/src/NHibernate/Util/StringHelper.cs @@ -871,5 +871,15 @@ public static bool IsAnyNewLine(this string str, int index, out int newLineLengt newLineLength = 0; return false; } + + public static string GenerateSuffix(int index) + { + return index switch + { + 0 => "0_", + 1 => "1_", + _ => string.Intern(index.ToString() + Underscore) + }; + } } }