diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
index f4f09ef5ea..c5fa057a37 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj
@@ -133,6 +133,9 @@
Microsoft\Data\SqlClient\Server\SqlMethodAttribute.cs
+
+ Microsoft\Data\SqlClient\Server\SqlNormalizer.cs
+
Microsoft\Data\SqlClient\Server\SqlUserDefinedTypeAttribute.cs
@@ -449,7 +452,7 @@
Microsoft\Data\SqlClient\EnclavePackage.cs
-
+
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj
index 61cc77db4f..4c675f8d8e 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft.Data.SqlClient.csproj
@@ -371,6 +371,9 @@
Microsoft\Data\SqlClient\TdsRecordBufferSetter.cs
+
+ Microsoft\Data\SqlClient\Server\SqlNormalizer.cs
+
Microsoft\Data\SqlClient\Server\SmiRecordBuffer.cs
@@ -544,7 +547,6 @@
-
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/Server/sqlnorm.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/Server/sqlnorm.cs
deleted file mode 100644
index 96573d7010..0000000000
--- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/Server/sqlnorm.cs
+++ /dev/null
@@ -1,656 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-//devnote: perf optimization: consider changing the calls to Array.Reverse to inline unsafe code
-
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-namespace Microsoft.Data.SqlClient.Server
-{
-
- // The class that holds the offset, field, and normalizer for
- // a particular field.
- internal sealed class FieldInfoEx : IComparable
- {
- internal readonly int offset;
- internal readonly FieldInfo fieldInfo;
- internal readonly Normalizer normalizer;
-
- internal FieldInfoEx(FieldInfo fi, int offset, Normalizer normalizer)
- {
- this.fieldInfo = fi;
- this.offset = offset;
- Debug.Assert(normalizer != null, "normalizer argument should not be null!");
- this.normalizer = normalizer;
- }
-
- // Sort fields by field offsets.
- public int CompareTo(object other)
- {
- FieldInfoEx otherF = other as FieldInfoEx;
- if (otherF == null)
- return -1;
- return this.offset.CompareTo(otherF.offset);
- }
- }
-
- // The most complex normalizer, a udt normalizer
- internal sealed class BinaryOrderedUdtNormalizer : Normalizer
- {
- internal readonly FieldInfoEx[] m_fieldsToNormalize;
- private int m_size;
- private byte[] m_PadBuffer;
- internal readonly object NullInstance;
- //a boolean that tells us if a udt is a "top-level" udt,
- //i.e. one that does not require a null byte header.
- private bool m_isTopLevelUdt;
-
- [System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess = true)]
- private FieldInfo[] GetFields(Type t)
- {
- return t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
- }
-
- internal BinaryOrderedUdtNormalizer(Type t, bool isTopLevelUdt)
- {
- this.m_skipNormalize = false;
- if (this.m_skipNormalize)
- {
- //if skipping normalization, dont write the null
- //byte header for IsNull
- this.m_isTopLevelUdt = true;
- }
- //top level udt logic is disabled until we decide
- //what to do about nested udts
- this.m_isTopLevelUdt = true;
- // else
- // this.m_isTopLevelUdt = isTopLevelUdt;
- //get all the fields
-
- FieldInfo[] fields = GetFields(t);
-
- m_fieldsToNormalize = new FieldInfoEx[fields.Length];
-
- int i = 0;
-
- foreach (FieldInfo fi in fields)
- {
- int offset = Marshal.OffsetOf(fi.DeclaringType, fi.Name).ToInt32();
- m_fieldsToNormalize[i++] = new FieldInfoEx(fi, offset, GetNormalizer(fi.FieldType));
- }
-
- //sort by offset
- Array.Sort(m_fieldsToNormalize);
- //if this is not a top-level udt, do setup for null values.
- //null values need to compare less than all other values,
- //so prefix a null byte indicator.
- if (!this.m_isTopLevelUdt)
- {
- //get the null value for this type, special case for sql types, which
- //have a null field
- if (typeof(System.Data.SqlTypes.INullable).IsAssignableFrom(t))
- {
- PropertyInfo pi = t.GetProperty("Null",
- BindingFlags.Public | BindingFlags.Static);
- if (pi == null || pi.PropertyType != t)
- {
- FieldInfo fi = t.GetField("Null", BindingFlags.Public | BindingFlags.Static);
- if (fi == null || fi.FieldType != t)
- throw new Exception("could not find Null field/property in nullable type " + t);
- else
- this.NullInstance = fi.GetValue(null);
- }
- else
- {
- this.NullInstance = pi.GetValue(null, null);
- }
- //create the padding buffer
- this.m_PadBuffer = new byte[this.Size - 1];
- }
- }
- }
-
- internal bool IsNullable
- {
- get
- {
- return this.NullInstance != null;
- }
- }
-
- // Normalize the top-level udt
- internal void NormalizeTopObject(object udt, Stream s)
- {
- Normalize(null, udt, s);
- }
-
- // Denormalize a top-level udt and return it
- internal object DeNormalizeTopObject(Type t, Stream s)
- {
- return DeNormalizeInternal(t, s);
- }
-
- // Prevent inlining so that reflection calls are not moved to caller that may be in a different assembly that may have a different grant set.
- [MethodImpl(MethodImplOptions.NoInlining)]
- private object DeNormalizeInternal(Type t, Stream s)
- {
- object result = null;
- //if nullable and not the top object, read the null marker
- if (!this.m_isTopLevelUdt && typeof(System.Data.SqlTypes.INullable).IsAssignableFrom(t))
- {
- byte nullByte = (byte)s.ReadByte();
- if (nullByte == 0)
- {
- result = this.NullInstance;
- s.Read(m_PadBuffer, 0, m_PadBuffer.Length);
- return result;
- }
- }
- if (result == null)
- result = Activator.CreateInstance(t);
- foreach (FieldInfoEx myField in m_fieldsToNormalize)
- {
- myField.normalizer.DeNormalize(myField.fieldInfo, result, s);
- }
- return result;
- }
-
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- // if (fi != null)
- // Console.WriteLine("normalizing " + fi.FieldType + " pos " + s.Position);
- object inner;
- if (fi == null)
- {
- inner = obj;
- }
- else
- {
- inner = GetValue(fi, obj);
- }
-
- //If nullable and not the top object, write a null indicator
- System.Data.SqlTypes.INullable oNullable = inner as System.Data.SqlTypes.INullable;
- if (oNullable != null && !this.m_isTopLevelUdt)
- {
- if (oNullable.IsNull)
- {
- s.WriteByte(0);
- s.Write(m_PadBuffer, 0, m_PadBuffer.Length);
- return;
- }
- else
- {
- s.WriteByte(1);
- }
- }
-
- foreach (FieldInfoEx myField in m_fieldsToNormalize)
- {
- myField.normalizer.Normalize(myField.fieldInfo, inner, s);
- }
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- SetValue(fi, recvr, DeNormalizeInternal(fi.FieldType, s));
- }
-
- internal override int Size
- {
- get
- {
- if (m_size != 0)
- return m_size;
- if (this.IsNullable && !this.m_isTopLevelUdt)
- m_size = 1;
- foreach (FieldInfoEx myField in m_fieldsToNormalize)
- {
- m_size += myField.normalizer.Size;
- }
- return m_size;
- }
- }
- }
-
- internal abstract class Normalizer
- {
- /*
- protected internal static string GetString(byte[] array)
- {
- StringBuilder sb = new StringBuilder();
- //sb.Append("0x");
- foreach (byte b in array)
- {
- sb.Append(b.ToString("X2", CultureInfo.InvariantCulture));
- }
- return sb.ToString();
- }
- */
-
- protected bool m_skipNormalize;
-
- /*
- internal static bool IsByteOrderedUdt(Type t)
- {
- SqlUserDefinedTypeAttribute a = SerializationHelper.GetUdtAttribute(t);
- return a.IsByteOrdered;
- }
- */
-
- internal static Normalizer GetNormalizer(Type t)
- {
- Normalizer n = null;
- if (t.IsPrimitive)
- {
- if (t == typeof(byte))
- n = new ByteNormalizer();
- else if (t == typeof(sbyte))
- n = new SByteNormalizer();
- else if (t == typeof(bool))
- n = new BooleanNormalizer();
- else if (t == typeof(short))
- n = new ShortNormalizer();
- else if (t == typeof(ushort))
- n = new UShortNormalizer();
- else if (t == typeof(int))
- n = new IntNormalizer();
- else if (t == typeof(uint))
- n = new UIntNormalizer();
- else if (t == typeof(float))
- n = new FloatNormalizer();
- else if (t == typeof(double))
- n = new DoubleNormalizer();
- else if (t == typeof(long))
- n = new LongNormalizer();
- else if (t == typeof(ulong))
- n = new ULongNormalizer();
- }
- else if (t.IsValueType)
- {
- n = new BinaryOrderedUdtNormalizer(t, false);
- }
- if (n == null)
- throw new Exception(StringsHelper.GetString(Strings.Sql_CanotCreateNormalizer, t.FullName));
- n.m_skipNormalize = false;
- return n;
- }
-
- internal abstract void Normalize(FieldInfo fi, object recvr, Stream s);
- internal abstract void DeNormalize(FieldInfo fi, object recvr, Stream s);
-
- protected void FlipAllBits(byte[] b)
- {
- for (int i = 0; i < b.Length; i++)
- b[i] = (byte)~b[i];
- }
-
- [System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess = true)]
- protected object GetValue(FieldInfo fi, object obj)
- {
- return fi.GetValue(obj);
- }
-
- [System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess = true)]
- protected void SetValue(FieldInfo fi, object recvr, object value)
- {
- fi.SetValue(recvr, value);
- }
-
- internal abstract int Size { get; }
- }
-
- internal sealed class BooleanNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- bool b = (bool)GetValue(fi, obj);
- // Console.WriteLine("normalized " + fi.FieldType + " " + fi.GetValue(obj)
- // + " to " + (b?"01":"00") + " pos " + s.Position);
- s.WriteByte((byte)(b ? 1 : 0));
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte b = (byte)s.ReadByte();
- SetValue(fi, recvr, b == 1);
- }
-
- internal override int Size { get { return 1; } }
- }
-
- // I could not find a simple way to convert a sbyte to a byte
- // and vice versa in the framework api. Convert.ToSByte() checks that
- // the value is in range.
- // So, we just do the conversion inline.
- internal sealed class SByteNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- sbyte sb = (sbyte)GetValue(fi, obj);
- byte b;
- unchecked
- {
- b = (byte)sb;
- }
- if (!this.m_skipNormalize)
- b ^= 0x80; //flip the sign bit
- s.WriteByte(b);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte b = (byte)s.ReadByte();
- if (!this.m_skipNormalize)
- b ^= 0x80; //flip the sign bit
- sbyte sb;
- unchecked
- {
- sb = (sbyte)b;
- }
- SetValue(fi, recvr, sb);
- }
-
- internal override int Size { get { return 1; } }
- }
-
- internal sealed class ByteNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- byte b = (byte)GetValue(fi, obj);
- s.WriteByte(b);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte b = (byte)s.ReadByte();
- SetValue(fi, recvr, b);
- }
-
- internal override int Size { get { return 1; } }
- }
-
- internal sealed class ShortNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- byte[] b = BitConverter.GetBytes((short)GetValue(fi, obj));
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- b[0] ^= 0x80;
- }
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new Byte[2];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- b[0] ^= 0x80;
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToInt16(b, 0));
- }
-
- internal override int Size { get { return 2; } }
- }
-
- internal sealed class UShortNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- byte[] b = BitConverter.GetBytes((ushort)GetValue(fi, obj));
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- }
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new Byte[2];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToUInt16(b, 0));
- }
-
- internal override int Size { get { return 2; } }
- }
-
- internal sealed class IntNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- byte[] b = BitConverter.GetBytes((int)GetValue(fi, obj));
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- b[0] ^= 0x80;
- }
- // Console.WriteLine("normalized " + fi.FieldType + " " + fi.GetValue(obj)
- // + " to " + GetString(b) + " pos " + s.Position);
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new Byte[4];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- b[0] ^= 0x80;
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToInt32(b, 0));
- }
-
- internal override int Size { get { return 4; } }
- }
-
- internal sealed class UIntNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- byte[] b = BitConverter.GetBytes((uint)GetValue(fi, obj));
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- }
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new byte[4];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToUInt32(b, 0));
- }
-
- internal override int Size { get { return 4; } }
- }
-
- internal sealed class LongNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- byte[] b = BitConverter.GetBytes((long)GetValue(fi, obj));
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- b[0] ^= 0x80;
- }
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new Byte[8];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- b[0] ^= 0x80;
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToInt64(b, 0));
- }
-
- internal override int Size { get { return 8; } }
- }
-
- internal sealed class ULongNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- byte[] b = BitConverter.GetBytes((ulong)GetValue(fi, obj));
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- }
- // Console.WriteLine("normalized " + fi.FieldType + " " + fi.GetValue(obj)
- // + " to " + GetString(b));
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new Byte[8];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToUInt64(b, 0));
- }
-
- internal override int Size { get { return 8; } }
- }
-
- internal sealed class FloatNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- float f = (float)GetValue(fi, obj);
- byte[] b = BitConverter.GetBytes(f);
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- if ((b[0] & 0x80) == 0)
- {
- // This is a positive number.
- // Flip the highest bit
- b[0] ^= 0x80;
- }
- else
- {
- // This is a negative number.
-
- // If all zeroes, means it was a negative zero.
- // Treat it same as positive zero, so that
- // the normalized key will compare equal.
- if (f < 0)
- FlipAllBits(b);
- }
- }
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new Byte[4];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- if ((b[0] & 0x80) > 0)
- {
- // This is a positive number.
- // Flip the highest bit
- b[0] ^= 0x80;
- }
- else
- {
- // This is a negative number.
- FlipAllBits(b);
- }
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToSingle(b, 0));
- }
-
- internal override int Size { get { return 4; } }
- }
-
- internal sealed class DoubleNormalizer : Normalizer
- {
- internal override void Normalize(FieldInfo fi, object obj, Stream s)
- {
- double d = (double)GetValue(fi, obj);
- byte[] b = BitConverter.GetBytes(d);
- if (!m_skipNormalize)
- {
- Array.Reverse(b);
- if ((b[0] & 0x80) == 0)
- {
- // This is a positive number.
- // Flip the highest bit
- b[0] ^= 0x80;
- }
- else
- {
- // This is a negative number.
- if (d < 0)
- {
- // If all zeroes, means it was a negative zero.
- // Treat it same as positive zero, so that
- // the normalized key will compare equal.
- FlipAllBits(b);
- }
- }
- }
- // Console.WriteLine("normalized " + fi.FieldType + " " + fi.GetValue(obj)
- // + " to " + GetString(b));
- s.Write(b, 0, b.Length);
- }
-
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- byte[] b = new Byte[8];
- s.Read(b, 0, b.Length);
- if (!m_skipNormalize)
- {
- if ((b[0] & 0x80) > 0)
- {
- // This is a positive number.
- // Flip the highest bit
- b[0] ^= 0x80;
- }
- else
- {
- // This is a negative number.
- FlipAllBits(b);
- }
- Array.Reverse(b);
- }
- SetValue(fi, recvr, BitConverter.ToDouble(b, 0));
- }
-
- internal override int Size { get { return 8; } }
- }
-}
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs
index e24b20f639..bf23167d40 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs
@@ -9126,6 +9126,15 @@ internal static string SQL_CannotCreateAuthProvider {
}
}
+ ///
+ /// Looks up a localized string similar to Cannot create normalizer for '{0}'..
+ ///
+ internal static string SQL_CannotCreateNormalizer {
+ get {
+ return ResourceManager.GetString("SQL_CannotCreateNormalizer", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Cannot find an authentication provider for '{0}'..
///
@@ -9171,15 +9180,6 @@ internal static string SQL_CannotModifyPropertyAsyncOperationInProgress {
}
}
- ///
- /// Looks up a localized string similar to Cannot create normalizer for '{0}'..
- ///
- internal static string Sql_CanotCreateNormalizer {
- get {
- return ResourceManager.GetString("Sql_CanotCreateNormalizer", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to Incorrect authentication parameters specified with certificate authentication..
///
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx
index a448f5271f..fc01e8fddc 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx
@@ -3048,7 +3048,7 @@
La subclase no invalidó un método requerido.
-
+
No se puede crear un normalizador para '{0}'.
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx
index b9538f5095..f1feaeb4dd 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx
@@ -3048,7 +3048,7 @@
La sous-classe n'a pas substituée une méthode requise.
-
+
Impossible de créer un normaliseur pour '{0}'.
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.it.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.it.resx
index 500eb618bb..879fedcc94 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.it.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.it.resx
@@ -3048,7 +3048,7 @@
La sottoclasse non ha eseguito l'override di un metodo di richiesta.
-
+
Impossibile creare un normalizzatore per '{0}'.
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ja.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ja.resx
index b24c73bc44..df391365d9 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ja.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ja.resx
@@ -3048,7 +3048,7 @@
サブクラスが、必要なメソッドをオーバーライドしませんでした。
-
+
'{0}' のノーマライザーを作成できません。
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ko.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ko.resx
index 4d630c1f02..9d273c6c79 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ko.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ko.resx
@@ -3048,7 +3048,7 @@
서브클래스에서 필요한 메서드를 재정의하지 않았습니다.
-
+
'{0}'에 대한 노멀라이저를 만들 수 없습니다.
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.pt-BR.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.pt-BR.resx
index 109ae7bec2..b15d546517 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.pt-BR.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.pt-BR.resx
@@ -3048,7 +3048,7 @@
A subclasse não substituiu um método necessário.
-
+
Não é possível criar o normalizador para '{0}'.
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx
index fe96339d2d..5d0fdf79eb 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.ru.resx
@@ -3048,7 +3048,7 @@
Подклассы не переопределяют необходимый метод.
-
+
Не удается создать нормализатор для "{0}".
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hans.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hans.resx
index 38fa7ec36f..61ac9d3945 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hans.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hans.resx
@@ -3048,7 +3048,7 @@
子类未覆盖所需方法。
-
+
无法为“{0}”创建标准化程序。
diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hant.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hant.resx
index 53fecc1fc7..cc14b49bfe 100644
--- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hant.resx
+++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.zh-Hant.resx
@@ -3048,7 +3048,7 @@
子類別並未覆寫所需的方法。
-
+
無法建立 '{0}' 的正規器。
diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SqlNorm.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs
similarity index 89%
rename from src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SqlNorm.cs
rename to src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs
index e0c24c87fb..e7dd37a955 100644
--- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/Server/SqlNorm.cs
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs
@@ -20,24 +20,17 @@ internal sealed class FieldInfoEx : IComparable
internal FieldInfoEx(FieldInfo fi, int offset, Normalizer normalizer)
{
+ _offset = offset;
+ FieldInfo = fi;
Debug.Assert(normalizer != null, "normalizer argument should not be null!");
Normalizer = normalizer;
- FieldInfo = fi;
- _offset = offset;
}
+
internal FieldInfo FieldInfo { get; private set; }
internal Normalizer Normalizer { get; private set; }
// Sort fields by field offsets.
- public int CompareTo(object other)
- {
- FieldInfoEx otherF = other as FieldInfoEx;
- if (otherF == null)
- {
- return -1;
- }
- return _offset.CompareTo(otherF._offset);
- }
+ public int CompareTo(object other) => other is FieldInfoEx otherEx ? _offset.CompareTo(otherEx._offset) : -1;
}
// The most complex normalizer, a udt normalizer
@@ -45,12 +38,15 @@ internal sealed class BinaryOrderedUdtNormalizer : Normalizer
{
private readonly FieldInfoEx[] _fieldsToNormalize;
private int _size;
- private byte[] _padBuffer;
- internal readonly object NullInstance;
+ private readonly byte[] _padBuffer;
+ private readonly object _nullInstance;
//a boolean that tells us if a udt is a "top-level" udt,
//i.e. one that does not require a null byte header.
- private bool _isTopLevelUdt;
+ private readonly bool _isTopLevelUdt;
+#if NETFRAMEWORK
+ [System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess = true)]
+#endif
private FieldInfo[] GetFields(Type t)
{
return t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
@@ -66,9 +62,12 @@ internal BinaryOrderedUdtNormalizer(Type t, bool isTopLevelUdt)
_isTopLevelUdt = true;
}
+ // top level udt logic is disabled until we decide
+ // what to do about nested udts
_isTopLevelUdt = true;
+ // else
+ // this._isTopLevelUdt = isTopLevelUdt;
- // get all the fields
FieldInfo[] fields = GetFields(t);
_fieldsToNormalize = new FieldInfoEx[fields.Length];
@@ -98,27 +97,28 @@ internal BinaryOrderedUdtNormalizer(Type t, bool isTopLevelUdt)
{
FieldInfo fi = t.GetField("Null", BindingFlags.Public | BindingFlags.Static);
if (fi == null || fi.FieldType != t)
+ {
throw new Exception("could not find Null field/property in nullable type " + t);
+ }
else
- NullInstance = fi.GetValue(null);
+ {
+ _nullInstance = fi.GetValue(null);
+ }
}
else
{
- NullInstance = pi.GetValue(null, null);
+ _nullInstance = pi.GetValue(null, null);
}
- //create the padding buffer
+
_padBuffer = new byte[Size - 1];
}
}
}
- internal bool IsNullable => (NullInstance != null);
+ internal bool IsNullable => _nullInstance != null;
// Normalize the top-level udt
- internal void NormalizeTopObject(object udt, Stream s)
- {
- Normalize(null, udt, s);
- }
+ internal void NormalizeTopObject(object udt, Stream s) => Normalize(null, udt, s);
// Denormalize a top-level udt and return it
internal object DeNormalizeTopObject(Type t, Stream s) => DeNormalizeInternal(t, s);
@@ -134,7 +134,7 @@ private object DeNormalizeInternal(Type t, Stream s)
byte nullByte = (byte)s.ReadByte();
if (nullByte == 0)
{
- result = NullInstance;
+ result = _nullInstance;
s.Read(_padBuffer, 0, _padBuffer.Length);
return result;
}
@@ -143,9 +143,9 @@ private object DeNormalizeInternal(Type t, Stream s)
{
result = Activator.CreateInstance(t);
}
- foreach (FieldInfoEx myField in _fieldsToNormalize)
+ foreach (FieldInfoEx field in _fieldsToNormalize)
{
- myField.Normalizer.DeNormalize(myField.FieldInfo, result, s);
+ field.Normalizer.DeNormalize(field.FieldInfo, result, s);
}
return result;
}
@@ -163,9 +163,9 @@ internal override void Normalize(FieldInfo fi, object obj, Stream s)
}
// If nullable and not the top object, write a null indicator
- if (inner is INullable oNullable && !_isTopLevelUdt)
+ if (inner is INullable nullable && !_isTopLevelUdt)
{
- if (oNullable.IsNull)
+ if (nullable.IsNull)
{
s.WriteByte(0);
s.Write(_padBuffer, 0, _padBuffer.Length);
@@ -177,16 +177,13 @@ internal override void Normalize(FieldInfo fi, object obj, Stream s)
}
}
- foreach (FieldInfoEx myField in _fieldsToNormalize)
+ foreach (FieldInfoEx field in _fieldsToNormalize)
{
- myField.Normalizer.Normalize(myField.FieldInfo, inner, s);
+ field.Normalizer.Normalize(field.FieldInfo, inner, s);
}
}
- internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
- {
- SetValue(fi, recvr, DeNormalizeInternal(fi.FieldType, s));
- }
+ internal override void DeNormalize(FieldInfo fi, object recvr, Stream s) => SetValue(fi, recvr, DeNormalizeInternal(fi.FieldType, s));
internal override int Size
{
@@ -200,9 +197,9 @@ internal override int Size
{
_size = 1;
}
- foreach (FieldInfoEx myField in _fieldsToNormalize)
+ foreach (FieldInfoEx field in _fieldsToNormalize)
{
- _size += myField.Normalizer.Size;
+ _size += field.Normalizer.Size;
}
return _size;
}
@@ -264,9 +261,13 @@ protected void FlipAllBits(byte[] b)
b[i] = (byte)~b[i];
}
}
-
+#if NETFRAMEWORK
+ [System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess = true)]
+#endif
protected object GetValue(FieldInfo fi, object obj) => fi.GetValue(obj);
-
+#if NETFRAMEWORK
+ [System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess = true)]
+#endif
protected void SetValue(FieldInfo fi, object recvr, object value) => fi.SetValue(recvr, value);
internal abstract int Size { get; }
@@ -300,7 +301,9 @@ internal override void Normalize(FieldInfo fi, object obj, Stream s)
b = (byte)sb;
}
if (!_skipNormalize)
- b ^= 0x80; // flip the sign bit
+ {
+ b ^= 0x80; //flip the sign bit
+ }
s.WriteByte(b);
}
@@ -308,7 +311,9 @@ internal override void DeNormalize(FieldInfo fi, object recvr, Stream s)
{
byte b = (byte)s.ReadByte();
if (!_skipNormalize)
- b ^= 0x80; // flip the sign bit
+ {
+ b ^= 0x80; //flip the sign bit
+ }
sbyte sb;
unchecked
{
@@ -522,7 +527,9 @@ internal override void Normalize(FieldInfo fi, object obj, Stream s)
// Treat it same as positive zero, so that
// the normalized key will compare equal.
if (f < 0)
+ {
FlipAllBits(b);
+ }
}
}
s.Write(b, 0, b.Length);