Skip to content

Commit

Permalink
Sync SqlDataRecord (#1024)
Browse files Browse the repository at this point in the history
  • Loading branch information
Wraith2 committed Jun 16, 2021
1 parent d28fe21 commit 7e86e4e
Show file tree
Hide file tree
Showing 3 changed files with 202 additions and 201 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<docs>
<members name="SqlDataRecord">
<SqlDataRecord>
<summary>Represents a single row of data and its metadata. This class cannot be inherited.</summary>
<summary>Represents a single row of data and its metadata.</summary>
<remarks>
<format type="text/markdown"><![CDATA[
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@ public class SqlDataRecord : IDataRecord
private FieldNameLookup _fieldNameLookup;
private bool _usesStringStorageForXml;

private static readonly SmiMetaData s_maxNVarCharForXml = new SmiMetaData(SqlDbType.NVarChar, SmiMetaData.UnlimitedMaxLengthIndicator,
SmiMetaData.DefaultNVarChar_NoCollation.Precision,
SmiMetaData.DefaultNVarChar_NoCollation.Scale,
SmiMetaData.DefaultNVarChar.LocaleId,
SmiMetaData.DefaultNVarChar.CompareOptions,
null);
private static readonly SmiMetaData s_maxNVarCharForXml = new SmiMetaData(
SqlDbType.NVarChar,
SmiMetaData.UnlimitedMaxLengthIndicator,
SmiMetaData.DefaultNVarChar_NoCollation.Precision,
SmiMetaData.DefaultNVarChar_NoCollation.Scale,
SmiMetaData.DefaultNVarChar.LocaleId,
SmiMetaData.DefaultNVarChar.CompareOptions,
userDefinedType: null
);

/// <include file='../../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/FieldCount/*' />
public virtual int FieldCount
Expand All @@ -50,7 +53,7 @@ public virtual string GetDataTypeName(int ordinal)
{
EnsureSubclassOverride();
SqlMetaData metaData = GetSqlMetaData(ordinal);
if (SqlDbType.Udt == metaData.SqlDbType)
if (metaData.SqlDbType == SqlDbType.Udt)
{
return metaData.UdtTypeName;
}
Expand All @@ -64,31 +67,23 @@ public virtual string GetDataTypeName(int ordinal)
public virtual Type GetFieldType(int ordinal)
{
EnsureSubclassOverride();
{
SqlMetaData md = GetSqlMetaData(ordinal);
return MetaType.GetMetaTypeFromSqlDbType(md.SqlDbType, false).ClassType;
}
SqlMetaData md = GetSqlMetaData(ordinal);
return MetaType.GetMetaTypeFromSqlDbType(md.SqlDbType, false).ClassType;
}

/// <include file='../../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetValue/*' />
public virtual object GetValue(int ordinal)
{
EnsureSubclassOverride();
SmiMetaData metaData = GetSmiMetaData(ordinal);

return ValueUtilsSmi.GetValue200(
_eventSink,
_recordBuffer,
ordinal,
metaData
);
return ValueUtilsSmi.GetValue200(_eventSink, _recordBuffer, ordinal, metaData);
}

/// <include file='../../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetValues/*' />
public virtual int GetValues(object[] values)
{
EnsureSubclassOverride();
if (null == values)
if (values == null)
{
throw ADP.ArgumentNull(nameof(values));
}
Expand Down Expand Up @@ -158,7 +153,7 @@ public virtual byte GetByte(int ordinal)
public virtual long GetBytes(int ordinal, long fieldOffset, byte[] buffer, int bufferOffset, int length)
{
EnsureSubclassOverride();
return ValueUtilsSmi.GetBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length, true);
return ValueUtilsSmi.GetBytes(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), fieldOffset, buffer, bufferOffset, length, throwOnNull: true);
}

/// <include file='../../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/GetChar/*' />
Expand Down Expand Up @@ -222,7 +217,7 @@ public virtual string GetString(int ordinal)
{
EnsureSubclassOverride();
SmiMetaData colMeta = GetSmiMetaData(ordinal);
if (_usesStringStorageForXml && SqlDbType.Xml == colMeta.SqlDbType)
if (_usesStringStorageForXml && colMeta.SqlDbType == SqlDbType.Xml)
{
return ValueUtilsSmi.GetString(_eventSink, _recordBuffer, ordinal, s_maxNVarCharForXml);
}
Expand Down Expand Up @@ -296,12 +291,11 @@ public virtual object GetSqlValue(int ordinal)
public virtual int GetSqlValues(object[] values)
{
EnsureSubclassOverride();
if (null == values)
if (values == null)
{
throw ADP.ArgumentNull(nameof(values));
}


int copyLength = (values.Length < FieldCount) ? values.Length : FieldCount;
for (int i = 0; i < copyLength; i++)
{
Expand Down Expand Up @@ -428,7 +422,7 @@ public virtual SqlGuid GetSqlGuid(int ordinal)
public virtual int SetValues(params object[] values)
{
EnsureSubclassOverride();
if (null == values)
if (values == null)
{
throw ADP.ArgumentNull(nameof(values));
}
Expand All @@ -443,8 +437,12 @@ public virtual int SetValues(params object[] values)
{
SqlMetaData metaData = GetSqlMetaData(i);
typeCodes[i] = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(
metaData.SqlDbType, false /* isMultiValued */, values[i], metaData.Type);
if (ExtendedClrTypeCode.Invalid == typeCodes[i])
metaData.SqlDbType,
isMultiValued: false,
values[i],
metaData.Type
);
if (typeCodes[i] == ExtendedClrTypeCode.Invalid)
{
throw ADP.InvalidCast();
}
Expand All @@ -454,7 +452,7 @@ public virtual int SetValues(params object[] values)
// the validation loop and here, or if an invalid UDT was sent).
for (int i = 0; i < copyLength; i++)
{
ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, i, GetSmiMetaData(i), values[i], typeCodes[i], 0, 0, null);
ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, i, GetSmiMetaData(i), values[i], typeCodes[i], offset: 0, length: 0, peekAhead: null);
}

return copyLength;
Expand All @@ -466,13 +464,17 @@ public virtual void SetValue(int ordinal, object value)
EnsureSubclassOverride();
SqlMetaData metaData = GetSqlMetaData(ordinal);
ExtendedClrTypeCode typeCode = MetaDataUtilsSmi.DetermineExtendedTypeCodeForUseWithSqlDbType(
metaData.SqlDbType, false /* isMultiValued */, value, metaData.Type);
if (ExtendedClrTypeCode.Invalid == typeCode)
metaData.SqlDbType,
isMultiValued: false,
value,
metaData.Type
);
if (typeCode == ExtendedClrTypeCode.Invalid)
{
throw ADP.InvalidCast();
}

ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value, typeCode, 0, 0, null);
ValueUtilsSmi.SetCompatibleValueV200(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value, typeCode, offset: 0, length: 0, peekAhead: null);
}

/// <include file='../../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetBoolean/*' />
Expand Down Expand Up @@ -550,6 +552,7 @@ public virtual void SetString(int ordinal, string value)
EnsureSubclassOverride();
ValueUtilsSmi.SetString(_eventSink, _recordBuffer, ordinal, GetSmiMetaData(ordinal), value);
}

/// <include file='../../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/SetDecimal/*' />
public virtual void SetDecimal(int ordinal, decimal value)
{
Expand Down Expand Up @@ -709,7 +712,7 @@ public virtual void SetSqlBytes(int ordinal, SqlBytes value)
public SqlDataRecord(params SqlMetaData[] metaData)
{
// Initial consistency check
if (null == metaData)
if (metaData == null)
{
throw ADP.ArgumentNull(nameof(metaData));
}
Expand All @@ -718,7 +721,7 @@ public SqlDataRecord(params SqlMetaData[] metaData)
_columnSmiMetaData = new SmiExtendedMetaData[metaData.Length];
for (int i = 0; i < _columnSmiMetaData.Length; i++)
{
if (null == metaData[i])
if (metaData[i] == null)
{
throw ADP.ArgumentNull($"{nameof(metaData)}[{i}]");
}
Expand All @@ -727,16 +730,15 @@ public SqlDataRecord(params SqlMetaData[] metaData)
}

_eventSink = new SmiEventSink_Default();

_recordBuffer = new MemoryRecordBuffer(_columnSmiMetaData);
_usesStringStorageForXml = true;
_eventSink.ProcessMessagesAndThrow();
}

internal SqlDataRecord(SmiRecordBuffer recordBuffer, params SmiExtendedMetaData[] metaData)
{
Debug.Assert(null != recordBuffer, "invalid attempt to instantiate SqlDataRecord with null SmiRecordBuffer");
Debug.Assert(null != metaData, "invalid attempt to instantiate SqlDataRecord with null SmiExtendedMetaData[]");
Debug.Assert(recordBuffer != null, "invalid attempt to instantiate SqlDataRecord with null SmiRecordBuffer");
Debug.Assert(metaData != null, "invalid attempt to instantiate SqlDataRecord with null SmiExtendedMetaData[]");

_columnMetaData = new SqlMetaData[metaData.Length];
_columnSmiMetaData = new SmiExtendedMetaData[metaData.Length];
Expand All @@ -747,7 +749,6 @@ internal SqlDataRecord(SmiRecordBuffer recordBuffer, params SmiExtendedMetaData[
}

_eventSink = new SmiEventSink_Default();

_recordBuffer = recordBuffer;
_eventSink.ProcessMessagesAndThrow();
}
Expand All @@ -763,7 +764,6 @@ internal SmiRecordBuffer RecordBuffer
}
}


internal SqlMetaData[] InternalGetMetaData()
{
return _columnMetaData;
Expand All @@ -786,15 +786,17 @@ internal void ThrowIfInvalidOrdinal(int ordinal)
throw ADP.IndexOutOfRange(ordinal);
}
}

private void EnsureSubclassOverride()
{
if (null == _recordBuffer)
if (_recordBuffer == null)
{
throw SQL.SubclassMustOverride();
}
}

/// <include file='../../../../../../../../doc/snippets/Microsoft.Data.SqlClient.Server/SqlDataRecord.xml' path='docs/members[@name="SqlDataRecord"]/System.Data.IDataRecord.GetData/*' />
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
IDataReader System.Data.IDataRecord.GetData(int ordinal)
{
throw ADP.NotSupported();
Expand Down
Loading

0 comments on commit 7e86e4e

Please sign in to comment.