Skip to content

Commit b19456e

Browse files
authored
Merge branch 'master-servicetitan' into TrackingNRE
2 parents 324e785 + 27aa6a0 commit b19456e

File tree

133 files changed

+1031
-1254
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

133 files changed

+1031
-1254
lines changed

ChangeLog/7.2.0-Beta-2-dev.txt

+6-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
[main] Upgrade hints change names of constructors' string parameters for better understanding of what suppose to be in them.
1+
[main] Upgrade hints change names of constructors' string parameters for better understanding of what suppose to be in them.
2+
[main] Improved string operations Trim/TrimStart/TrimEnd support
3+
[mysql] SqlDml.NullIf function now correctly translated
4+
[mysql] Improved support for string.PadLeft/PadRight opertaions
5+
[sqlite] Fixed string.Lenght translation
6+
[sqlite] Added support for string.PadLeft/PadRight operations

Directory.Build.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<NoWarn Condition="$(MSBuildProjectName.Contains('Tests')) == 'true'">$(NoWarn);SYSLIB0011</NoWarn>
4343
<!-- Enable Usage of BinaryFormatter in test projects -->
4444
<EnableUnsafeBinaryFormatterSerialization
45-
Condition="('$(TargetFramework)'=='net8.0' OR '$(TargetFramework)'=='net9.0') AND $(MSBuildProjectName.Contains('Tests')) == 'true'">true</EnableUnsafeBinaryFormatterSerialization>
45+
Condition="('$(TargetFramework)'=='net10.0' OR '$(TargetFramework)'=='net9.0') AND $(MSBuildProjectName.Contains('Tests')) == 'true'">true</EnableUnsafeBinaryFormatterSerialization>
4646
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4747
</PropertyGroup>
4848

Directory.Packages.props

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<Project>
22
<PropertyGroup>
3-
<MSExtVersion Condition="'$(TargetFramework)' == 'net9.0'">9.0.0</MSExtVersion>
4-
<MSExtVersion Condition="'$(TargetFramework)' == 'net8.0'">8.0.0</MSExtVersion>
3+
<MSExtVersion Condition="'$(TargetFramework)' == 'net9.0'">9.0.2</MSExtVersion>
4+
<MSExtVersion Condition="'$(TargetFramework)' == 'net10.0'">9.0.2</MSExtVersion>
55
<MSExtVersion2>$(MSExtVersion)</MSExtVersion2>
6-
<MSExtVersion2 Condition="'$(TargetFramework)' == 'net8.0'">8.0.1</MSExtVersion2>
6+
<MSExtVersion2 Condition="'$(TargetFramework)' == 'net10.0'">9.0.2</MSExtVersion2>
77
</PropertyGroup>
88
<ItemGroup Label="Nupkg Versions">
99
<PackageVersion Include="System.CodeDom" Version="$(MSExtVersion)"/>
@@ -15,7 +15,6 @@
1515
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="$(MSExtVersion2)" />
1616
<PackageVersion Include="Microsoft.Extensions.Configuration.Xml" Version="$(MSExtVersion2)" />
1717
<PackageVersion Include="System.Data.SQLite.Core" Version="1.0.119" />
18-
<PackageVersion Include="System.Dynamic.Runtime" Version="4.3.0" />
1918
<PackageVersion Include="System.Spatial" Version="5.8.5" />
2019
<PackageVersion Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
2120
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0" />
@@ -25,10 +24,10 @@
2524
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MSExtVersion2)" />
2625
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
2726
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
28-
<PackageVersion Include="BitFaster.Caching" Version="2.5.2" />
27+
<PackageVersion Include="BitFaster.Caching" Version="2.5.3" />
2928
<PackageVersion Include="FirebirdSql.Data.FirebirdClient" Version="8.5.3" />
3029
<PackageVersion Include="FSharp.Core" Version="4.7.0" />
31-
<PackageVersion Include="Google.Protobuf" Version="3.28.3" />
30+
<PackageVersion Include="Google.Protobuf" Version="3.29.3" />
3231
<PackageVersion Include="log4net" Version="2.0.10" />
3332
<PackageVersion Include="Mono.Cecil" Version="0.11.6" />
3433
<PackageVersion Include="MySql.Data" Version="8.0.31" />

Extensions/Xtensive.Orm.BulkOperations/Internals/Operation.cs

-4
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,7 @@ protected void EnsureTransactionIsStarted()
6868
public QueryTranslationResult GetRequest(IQueryable<T> query) => QueryBuilder.TranslateQuery(query);
6969

7070
public QueryTranslationResult GetRequest(Type type, IQueryable query) =>
71-
#if NET8_0_OR_GREATER
7271
(QueryTranslationResult) WellKnownMembers.TranslateQueryMethod.CachedMakeGenericMethodInvoker(type).Invoke(QueryBuilder, query);
73-
#else
74-
(QueryTranslationResult) WellKnownMembers.TranslateQueryMethod.CachedMakeGenericMethod(type).Invoke(QueryBuilder, new object[] {query});
75-
#endif
7672

7773
public TypeInfo GetTypeInfo(Type entityType) =>
7874
Session.Domain.Model.Hierarchies.SelectMany(a => a.Types).Single(a => a.UnderlyingType == entityType);

MSBuild/DataObjects.Net.targets

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<XtensiveOrmPath Condition="'$(XtensiveOrmPath)'==''">$(MSBuildThisFileDirectory)</XtensiveOrmPath>
1414
<XtensiveOrmPath Condition="!HasTrailingSlash('$(XtensiveOrmPath)')">$(XtensiveOrmPath)\</XtensiveOrmPath>
1515
<XtensiveWeaverFramework>net9.0</XtensiveWeaverFramework>
16-
<XtensiveWeaverFramework Condition="'$(TargetFramework)'=='net8.0'">net8.0</XtensiveWeaverFramework>
16+
<XtensiveWeaverFramework Condition="'$(TargetFramework)'=='net10.0'">net10.0</XtensiveWeaverFramework>
1717
<XtensiveOrmWeaver Condition="'$(XtensiveOrmWeaver)'==''">$(XtensiveOrmPath)tools\weaver\$(XtensiveWeaverFramework)\Xtensive.Orm.Weaver.dll</XtensiveOrmWeaver>
1818
<XtensiveOrmBuildDependsOn>$(XtensiveOrmBuildDependsOn)</XtensiveOrmBuildDependsOn>
1919
</PropertyGroup>

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public override void Visit(SqlFunctionCall node)
160160
return;
161161
case SqlFunctionType.PadLeft:
162162
case SqlFunctionType.PadRight:
163-
SqlHelper.GenericPad(node).AcceptVisitor(this);
163+
SqlHelper.GenericPad(node, true).AcceptVisitor(this);
164164
return;
165165
case SqlFunctionType.Rand:
166166
SqlDml.FunctionCall(translator.TranslateToString(SqlFunctionType.Rand)).AcceptVisitor(this);

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs

-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ public override void Translate(IOutput output, SqlFunctionType type)
9393
case SqlFunctionType.CurrentUser:
9494
_ = output.Append("CURRENT_USER()"); break;
9595
case SqlFunctionType.SessionUser: _ = output.Append("SESSION_USER()"); break;
96-
case SqlFunctionType.NullIf: _ = output.Append("IFNULL"); break;
9796
//datetime/timespan
9897
case SqlFunctionType.DateTimeTruncate: _ = output.Append("DATE"); break;
9998
case SqlFunctionType.CurrentDate: _ = output.Append("CURDATE()"); break;

Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Extractor.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public ExtractionContext(Catalog catalog, Dictionary<string, string> replacement
106106
private const int DefaultDayPrecision = 2;
107107
private const int DefaultFSecondsPrecision = 6;
108108

109-
private readonly object accessGuard = new object();
109+
private readonly Lock accessGuard = new();
110110

111111
private string nonSystemSchemasFilter;
112112

Orm/Xtensive.Orm.SqlServer/Orm.Providers.SqlServer/SqlCompiler.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ protected override SqlProvider VisitFreeText(FreeTextProvider provider)
3535

3636
var index = provider.PrimaryIndex.Resolve(Handlers.Domain.Model);
3737
var table = Mapping[index.ReflectedType];
38-
var columns = provider.Header.Columns.Select(column => column.Name).ToList();
38+
var columns = provider.Header.Columns.Columns.Select(column => column.Name).ToList();
3939

4040
if (provider.TopN == null) {
4141
fromTable = SqlDml.FreeTextTable(table, criteriaBinding.ParameterReference, columns);
@@ -66,7 +66,7 @@ protected override SqlProvider VisitContainsTable(ContainsTableProvider provider
6666

6767
var index = provider.PrimaryIndex.Resolve(Handlers.Domain.Model);
6868
var table = Mapping[index.ReflectedType];
69-
var columns = provider.Header.Columns.Select(column => column.Name).ToList();
69+
var columns = provider.Header.Columns.Columns.Select(column => column.Name).ToList();
7070

7171
var targetColumnNames = provider.TargetColumns.Select(c => c.Name).ToArray();
7272
if (provider.TopN == null) {

Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/ProviderInitializer.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal static class ProviderInitializer
2727
private const string FrameworkName = "Net40";
2828

2929
private static volatile bool IsInitialized;
30-
private static readonly object SyncRoot = new object();
30+
private static readonly Lock SyncRoot = new();
3131

3232
public static void Run(string nativeLibraryCacheFolder)
3333
{

Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Compiler.cs

+38-1
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,11 @@ public override void Visit(SqlFunctionCall node)
151151
var arguments = node.Arguments;
152152
switch (node.FunctionType) {
153153
case SqlFunctionType.CharLength:
154-
(SqlDml.FunctionCall("LENGTH", arguments) / 2).AcceptVisitor(this);
154+
SqlDml.FunctionCall("LENGTH", arguments).AcceptVisitor(this);
155155
return;
156156
case SqlFunctionType.PadLeft:
157157
case SqlFunctionType.PadRight:
158+
Visit(EmulateLpadRpad(arguments, node.FunctionType is SqlFunctionType.PadLeft));
158159
return;
159160
case SqlFunctionType.Concat:
160161
var nod = arguments[0];
@@ -631,6 +632,42 @@ private static SqlDateTimePart ConvertDateTimeOffsetPartToDateTimePart(SqlDateTi
631632
};
632633
}
633634

635+
private static SqlCase EmulateLpadRpad(IReadOnlyList<SqlExpression> arguments, bool isLpad)
636+
{
637+
var operand = arguments[0];
638+
var charcount = arguments[1];
639+
if (charcount is not SqlLiteral<int> intWidth) {
640+
// Since we emulate function with contatination, we need to know total width
641+
// to calculate prefix
642+
throw SqlHelper.NotSupported("PadLeft/PadRight with expressions as total width.");
643+
}
644+
var totalWidth = intWidth.Value;
645+
646+
var padChar = arguments switch {
647+
_ when arguments.Count == 3 && arguments[2] is SqlLiteral<char> charLiteral => charLiteral.Value,
648+
_ when arguments.Count == 2 => ' ',
649+
_ => throw new NotSupportedException()
650+
};
651+
652+
var paddingString = SqlDml.Literal(new string(Enumerable.Repeat(padChar, intWidth.Value).ToArray()));
653+
654+
var padExpression = isLpad
655+
? SqlDml.Substring(
656+
SqlDml.Concat(paddingString, operand),
657+
SqlDml.Literal(-totalWidth - 1),// handles '+1' operation in translation of substring function call
658+
SqlDml.Literal(totalWidth))
659+
: SqlDml.Substring(
660+
SqlDml.Concat(operand, paddingString),
661+
SqlDml.Literal(0), // handles '+1' operation in translation of substring function call
662+
SqlDml.Literal(totalWidth));
663+
664+
var @case = SqlDml.Case();
665+
_ = @case.Add(SqlDml.CharLength(operand) >= charcount, operand);
666+
@case.Else = padExpression;
667+
return @case;
668+
}
669+
670+
634671
// Constructors
635672

636673
/// <param name="driver">The driver.</param>

Orm/Xtensive.Orm.Tests.Core/DotNetFramework/AllocationTest.cs

-26
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,6 @@ private void TestClassAllocation(double speedFactor)
9292
// Warmup
9393
int iterations = 100;
9494
AllocateClass_SlimObject(iterations);
95-
#if !NET8_0_OR_GREATER
96-
AllocateClass_SlimObject_ByFormatterServices(iterations);
97-
#endif
9895
AllocateClass_FinalizableSlimObject(iterations);
9996
AllocateClass_InheritedObject3(iterations);
10097
AllocateClass<SlimObject>(iterations);
@@ -112,10 +109,6 @@ private void TestClassAllocation(double speedFactor)
112109
using (new Measurement("SlimObject", MeasurementOptions.Log, iterations))
113110
AllocateClass_SlimObject(iterations);
114111
TestHelper.CollectGarbage();
115-
#if !NET8_0_OR_GREATER
116-
using (new Measurement("SlimObject (using FormatterServices)", MeasurementOptions.Log, iterations))
117-
AllocateClass_SlimObject_ByFormatterServices(iterations);
118-
#endif
119112
TestHelper.CollectGarbage();
120113
using (new Measurement("FinalizableSlimObject", MeasurementOptions.Log, iterations))
121114
AllocateClass_FinalizableSlimObject(iterations);
@@ -213,25 +206,6 @@ private void AllocateClass_InheritedObject3(int iterationCount)
213206
new InheritedObject3();
214207
}
215208
}
216-
#if !NET8_0_OR_GREATER
217-
218-
private void AllocateClass_SlimObject_ByFormatterServices(int iterationCount)
219-
{
220-
var type = typeof(SlimObject);
221-
for (int i = 0; i<iterationCount; i+=10) {
222-
FormatterServices.GetUninitializedObject(type);
223-
FormatterServices.GetUninitializedObject(type);
224-
FormatterServices.GetUninitializedObject(type);
225-
FormatterServices.GetUninitializedObject(type);
226-
FormatterServices.GetUninitializedObject(type);
227-
FormatterServices.GetUninitializedObject(type);
228-
FormatterServices.GetUninitializedObject(type);
229-
FormatterServices.GetUninitializedObject(type);
230-
FormatterServices.GetUninitializedObject(type);
231-
FormatterServices.GetUninitializedObject(type);
232-
}
233-
}
234-
#endif
235209

236210
private void AllocateClass_FinalizableSlimObject(int iterationCount)
237211
{

Orm/Xtensive.Orm.Tests.Core/DotNetFramework/ThreadingTest.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ private class Target
2626
public int PassCount;
2727
public bool Stop;
2828
public Thread LastAccessor;
29-
public object ObjectLock = new object();
29+
public Lock ObjectLock = new();
3030
public ReaderWriterLockSlim SlimLock = new ReaderWriterLockSlim();
3131

3232
public void ExecuteLock(object argument)
@@ -280,4 +280,4 @@ private static void ThreadedTest(Target target, int passCount, ParameterizedThre
280280
TestHelper.CollectGarbage();
281281
}
282282
}
283-
}
283+
}

Orm/Xtensive.Orm.Tests.Core/Modelling/IndexingModel/Exceptions/ValidationException.cs

-4
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ public ValidationException(string message, string nodePath)
5353
#region Serializing members
5454

5555
/// <inheritdoc/>
56-
#if NET8_0_OR_GREATER
5756
[Obsolete(DiagnosticId = "SYSLIB0051")]
58-
#endif
5957
protected ValidationException(SerializationInfo info, StreamingContext context)
6058
: base(info, context)
6159
{
@@ -64,9 +62,7 @@ protected ValidationException(SerializationInfo info, StreamingContext context)
6462

6563
/// <inheritdoc/>
6664
[SecurityCritical]
67-
#if NET8_0_OR_GREATER
6865
[Obsolete(DiagnosticId = "SYSLIB0051")]
69-
#endif
7066
public override void GetObjectData(SerializationInfo info, StreamingContext context)
7167
{
7268
info.AddValue("NodePath", NodePath);

Orm/Xtensive.Orm.Tests.Framework/StorageProviderInfo.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Xtensive.Orm.Tests
1212
{
1313
public sealed class StorageProviderInfo
1414
{
15-
private static readonly object InstanceLock = new object();
15+
private static readonly Lock InstanceLock = new();
1616
private static StorageProviderInfo InstanceValue;
1717

1818
public static StorageProviderInfo Instance
@@ -113,4 +113,4 @@ private static IStorageTimeZoneProvider GetTimeZoneProvider(StorageProvider prov
113113
}
114114
}
115115
}
116-
}
116+
}

Orm/Xtensive.Orm.Tests.Framework/TestConfiguration.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public sealed class TestConfiguration
1919

2020
private const string DefaultStorage = "default";
2121

22-
private static readonly object InstanceLock = new object();
22+
private static readonly Lock InstanceLock = new();
2323
private static TestConfiguration InstanceValue;
2424

2525
private readonly Dictionary<string, string> configuration;
@@ -103,4 +103,4 @@ private TestConfiguration()
103103
Storage = GetEnvironmentVariable(StorageKey) ?? GetStorageFromFile() ?? DefaultStorage;
104104
}
105105
}
106-
}
106+
}

Orm/Xtensive.Orm.Tests/Issues/Issue0676_NonNullableReferenceBug.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ private sealed class KeyExtension
6161
#region "Null entity" pattern implementation
6262

6363
public const string NullName = "<None>";
64-
private static object @lock = new object();
64+
private static Lock @lock = new();
6565

6666
public static Person Null {
6767
get {
@@ -190,4 +190,4 @@ public void HasNullEntityTest()
190190
}
191191
}
192192
}
193-
}
193+
}

Orm/Xtensive.Orm.Tests/Issues/Issue0839_MultithreadingBug.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class Issue0839_MultithreadingBug : AutoBuildTest
4545
private const int entityCount = 20;
4646
private const int readCount = 20;
4747

48-
private static object exceptionLock = new object();
48+
private static Lock exceptionLock = new();
4949
private static int exceptionCount;
5050
private static Key[] keys = new Key[entityCount];
5151

@@ -136,4 +136,4 @@ currentError is UniqueConstraintViolationException ||
136136
}
137137
}
138138
}
139-
}
139+
}

Orm/Xtensive.Orm.Tests/Issues/IssueJira0187_TypeCastInContain.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@ protected override DomainConfiguration BuildConfiguration()
5555
[Test]
5656
public void ParentsContainsChildWithImplicitCastTest()
5757
{
58-
var parents = GlobalSession.Query.All<Parent>().ToArray();
58+
IReadOnlyList<Parent> parents = GlobalSession.Query.All<Parent>().ToArray();
5959
var result = GlobalSession.Query.All<Child>().Where(child => parents.Contains(child)).ToArray();
6060
}
6161

6262
[Test]
6363
public void ParentsContainsChildWithExplicitCastTest()
6464
{
65-
var parents = GlobalSession.Query.All<Parent>().ToArray();
65+
IReadOnlyList<Parent> parents = GlobalSession.Query.All<Parent>().ToArray();
6666
var result = GlobalSession.Query.All<Child>().Where(child => parents.Contains(child as Parent)).ToArray();
6767
}
6868

@@ -76,7 +76,7 @@ public void ChildInParentsTest()
7676
[Test]
7777
public void ChildContainsParentWithImplicitCast()
7878
{
79-
var children = GlobalSession.Query.All<Child>().ToArray();
79+
IReadOnlyList<Child> children = GlobalSession.Query.All<Child>().ToArray();
8080
var result = GlobalSession.Query.All<Child>().Where(a => children.Contains(a.Parent)).ToArray();
8181
}
8282

@@ -94,4 +94,4 @@ public void ParentInChildrenTest()
9494
var result = GlobalSession.Query.All<Child>().Where(a => a.Parent.In(children)).ToArray();
9595
}
9696
}
97-
}
97+
}

Orm/Xtensive.Orm.Tests/Issues/IssueJira0743_IncludeDoesNotWorkWithSubqueries.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ public void Case21Test()
339339
{
340340
using (var session = Domain.OpenSession())
341341
using (var tx = session.OpenTransaction()) {
342-
var values = new[] { MyEnum.Bar, MyEnum.Foo };
342+
IReadOnlyList<MyEnum> values = [MyEnum.Bar, MyEnum.Foo];
343343
var result = session.Query.All<TestEntity>()
344344
.Select(e => values.Contains(e.List.FirstOrDefault().Link.Value3.Value)).ToArray();
345345

Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTime/ComparisonTest.cs

-7
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ public void EqualsTest()
2424
RunWrongTest<SingleDateTimeEntity>(c => c.MillisecondDateTime==WrongMillisecondDateTime);
2525
RunWrongTest<SingleDateTimeEntity>(c => c.NullableDateTime==WrongDateTime);
2626
RunWrongTest<SingleDateTimeEntity>(c => c.NullableDateTime==null);
27-
#if NET_6_0_OR_GREATER
28-
RunTest<SingleDateTimeEntity>(c => c.DateOnly == FirstDateOnly);
29-
RunTest<SingleDateTimeEntity>(c => c.NullableDateOnly == NullableDateOnly);
30-
#endif
3127
});
3228
}
3329

@@ -38,9 +34,6 @@ public void NotEqualTest()
3834
RunTest<SingleDateTimeEntity>(c=>c.DateTime!=FirstDateTime.AddYears(1));
3935
RunTest<SingleDateTimeEntity>(c => c.MillisecondDateTime!=FirstMillisecondDateTime.AddYears(1));
4036
RunTest<SingleDateTimeEntity>(c=>c.NullableDateTime!=NullableDateTime.AddYears(1));
41-
#if NET_6_0_OR_GREATER
42-
RunTest<SingleDateTimeEntity>(c => c.DateOnly != FirstDateOnly.AddYears(1));
43-
#endif
4437
});
4538
}
4639

0 commit comments

Comments
 (0)