public void Deflate(Stream destination)
{
// Write user type
TDSUtilities.WriteUInt(destination, UserType);
// Convert flags to value and write them
TDSUtilities.WriteUShort(destination, Flags.ToUShort());
// Write type
destination.WriteByte((byte)DataType);
// Dispatch further writing based on the type
switch (DataType)
{
case TDSDataType.Binary:
case TDSDataType.VarBinary:
case TDSDataType.Char:
case TDSDataType.VarChar:
case TDSDataType.BitN:
case TDSDataType.Guid:
case TDSDataType.IntN:
case TDSDataType.MoneyN:
case TDSDataType.FloatN:
case TDSDataType.DateTimeN:
{
// Byte length
destination.WriteByte((byte)DataTypeSpecific);
break;
}
case TDSDataType.DateN:
{
// No details
break;
}
case TDSDataType.TimeN:
case TDSDataType.DateTime2N:
case TDSDataType.DateTimeOffsetN:
{
// Scale
destination.WriteByte((byte)DataTypeSpecific);
break;
}
case TDSDataType.DecimalN:
case TDSDataType.NumericN:
{
// Cast to type-specific information
TDSDecimalColumnSpecific typeSpecific = DataTypeSpecific as TDSDecimalColumnSpecific;
// Write values
destination.WriteByte(typeSpecific.Length);
destination.WriteByte(typeSpecific.Precision);
destination.WriteByte(typeSpecific.Scale);
break;
}
case TDSDataType.BigBinary:
case TDSDataType.BigVarBinary:
{
// Short length
TDSUtilities.WriteUShort(destination, (ushort)DataTypeSpecific);
break;
}
case TDSDataType.BigChar:
case TDSDataType.BigVarChar:
case TDSDataType.NChar:
case TDSDataType.NVarChar:
{
// Cast to type specific information
TDSShilohVarCharColumnSpecific typedSpecific = DataTypeSpecific as TDSShilohVarCharColumnSpecific;
// Write length
TDSUtilities.WriteUShort(destination, typedSpecific.Length);
// Write collation
TDSUtilities.WriteUInt(destination, typedSpecific.Collation.WCID);
destination.WriteByte(typedSpecific.Collation.SortID);
break;
}
case TDSDataType.Text:
case TDSDataType.NText:
{
// YukonTextType.Len + YukonTextType.tdsCollationInfo + YukonTextType.cParts
// cb = sizeof(LONG) + sizeof(TDSCOLLATION) + sizeof(BYTE);
break;
}
case TDSDataType.Image:
{
// Integer length
TDSUtilities.WriteUInt(destination, (uint)DataTypeSpecific);
break;
}
case TDSDataType.SSVariant:
{
// Data length
TDSUtilities.WriteUInt(destination, (uint)DataTypeSpecific);
break;
}
case TDSDataType.Udt:
{
// hr = GetUDTColFmt(pvOwner, dwTimeout);
break;
}
case TDSDataType.Xml:
{
// cb = sizeof(lpColFmt->YukonXmlType.bSchemaPresent);
break;
}
}
// Check if we need to write table name
if ((DataType == TDSDataType.Text || DataType == TDSDataType.NText || DataType == TDSDataType.Image) && (TableName != null))
{
// Write part count
destination.WriteByte((byte)TableName.Count);
// Write each part
foreach (string part in TableName)
{
// Write table part length
TDSUtilities.WriteUShort(destination, (ushort)(string.IsNullOrEmpty(part) ? 0 : part.Length));
// Write table part
TDSUtilities.WriteString(destination, part);
}
}
// Write column name length
destination.WriteByte((byte)(string.IsNullOrEmpty(Name) ? 0 : Name.Length));
// Write column name
TDSUtilities.WriteString(destination, Name);
}
}