From 50d465f5d5051e46ff4b74f68d28db1882bd94e2 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Fri, 30 Apr 2021 18:24:27 +0100 Subject: [PATCH 1/3] cleanup sqlnorm --- .../src/Microsoft.Data.SqlClient.csproj | 5 +- .../netfx/src/Microsoft.Data.SqlClient.csproj | 4 +- .../Data/SqlClient/Server/sqlnorm.cs | 656 ------------------ .../Data/SqlClient/Server/SqlNormalizer.cs} | 86 ++- 4 files changed, 57 insertions(+), 694 deletions(-) delete mode 100644 src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/Server/sqlnorm.cs rename src/Microsoft.Data.SqlClient/{netcore/src/Microsoft/Data/SqlClient/Server/SqlNorm.cs => src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs} (88%) 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/netcore/src/Microsoft/Data/SqlClient/Server/SqlNorm.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs similarity index 88% 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..820595e93d 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,23 +20,23 @@ 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) + if (other is FieldInfoEx otherFieldInfoEx) { - return -1; + return _offset.CompareTo(otherFieldInfoEx._offset); } - return _offset.CompareTo(otherF._offset); + return -1; } } @@ -45,12 +45,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 +69,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.m_isTopLevelUdt = isTopLevelUdt; - // get all the fields FieldInfo[] fields = GetFields(t); _fieldsToNormalize = new FieldInfoEx[fields.Length]; @@ -98,27 +104,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); @@ -129,12 +136,12 @@ private object DeNormalizeInternal(Type t, Stream s) { object result = null; //if nullable and not the top object, read the null marker - if (!_isTopLevelUdt && typeof(INullable).IsAssignableFrom(t)) + if (!_isTopLevelUdt && typeof(System.Data.SqlTypes.INullable).IsAssignableFrom(t)) { byte nullByte = (byte)s.ReadByte(); if (nullByte == 0) { - result = NullInstance; + result = _nullInstance; s.Read(_padBuffer, 0, _padBuffer.Length); return result; } @@ -143,9 +150,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 +170,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 +184,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 +204,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 +268,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 +308,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 +318,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 +534,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); From b9b5eec151833ea81165483c01fd980ce3de1319 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Fri, 30 Apr 2021 22:52:44 +0100 Subject: [PATCH 2/3] fix spelling in resources for netfx --- .../netfx/src/Resources/Strings.Designer.cs | 18 +++++++++--------- .../netfx/src/Resources/Strings.es.resx | 2 +- .../netfx/src/Resources/Strings.fr.resx | 2 +- .../netfx/src/Resources/Strings.it.resx | 2 +- .../netfx/src/Resources/Strings.ja.resx | 2 +- .../netfx/src/Resources/Strings.ko.resx | 2 +- .../netfx/src/Resources/Strings.pt-BR.resx | 2 +- .../netfx/src/Resources/Strings.ru.resx | 2 +- .../netfx/src/Resources/Strings.zh-Hans.resx | 2 +- .../netfx/src/Resources/Strings.zh-Hant.resx | 2 +- 10 files changed, 18 insertions(+), 18 deletions(-) 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}' 的正規器。 From c0563612251b476cb23262ccca993ccd2d8d6bdf Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Wed, 9 Jun 2021 23:47:28 +0100 Subject: [PATCH 3/3] address feedback --- .../Data/SqlClient/Server/SqlNormalizer.cs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs index 820595e93d..e7dd37a955 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/Server/SqlNormalizer.cs @@ -30,14 +30,7 @@ internal FieldInfoEx(FieldInfo fi, int offset, Normalizer normalizer) internal Normalizer Normalizer { get; private set; } // Sort fields by field offsets. - public int CompareTo(object other) - { - if (other is FieldInfoEx otherFieldInfoEx) - { - return _offset.CompareTo(otherFieldInfoEx._offset); - } - return -1; - } + public int CompareTo(object other) => other is FieldInfoEx otherEx ? _offset.CompareTo(otherEx._offset) : -1; } // The most complex normalizer, a udt normalizer @@ -73,7 +66,7 @@ internal BinaryOrderedUdtNormalizer(Type t, bool isTopLevelUdt) // what to do about nested udts _isTopLevelUdt = true; // else - // this.m_isTopLevelUdt = isTopLevelUdt; + // this._isTopLevelUdt = isTopLevelUdt; FieldInfo[] fields = GetFields(t); @@ -136,7 +129,7 @@ private object DeNormalizeInternal(Type t, Stream s) { object result = null; //if nullable and not the top object, read the null marker - if (!_isTopLevelUdt && typeof(System.Data.SqlTypes.INullable).IsAssignableFrom(t)) + if (!_isTopLevelUdt && typeof(INullable).IsAssignableFrom(t)) { byte nullByte = (byte)s.ReadByte(); if (nullByte == 0)