Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync SqlDataRecord #1024

Merged
merged 4 commits into from
Jun 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;

DavoudEshtehari marked this conversation as resolved.
Show resolved Hide resolved
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