Example #1
0
        public static MultiPartTableName?ReadMultiPartTableName(this TdsPackageReader reader)
        {
            // Find out how many parts in the TDS stream
            var nParts = reader.ReadByte();

            if (nParts == 0)
            {
                return(null);
            }

            var mpt = new MultiPartTableName();

            if (nParts == 4)
            {
                mpt.ServerName = reader.ReadString(reader.ReadUInt16());
            }

            if (nParts >= 3)
            {
                mpt.CatalogName = reader.ReadString(reader.ReadUInt16());
            }

            if (nParts >= 2)
            {
                mpt.SchemaName = reader.ReadString(reader.ReadUInt16());
            }

            mpt.TableName = reader.ReadString(reader.ReadUInt16());

            return(mpt);
        }
Example #2
0
 internal static Udt ReadUdtMetadata(this TdsPackageReader reader) =>
 new Udt
 {
     DatabaseName          = reader.ReadString(reader.ReadByte()),
     SchemaName            = reader.ReadString(reader.ReadByte()),
     TypeName              = reader.ReadString(reader.ReadByte()),
     AssemblyQualifiedName = reader.ReadString(reader.ReadUInt16())
 };
Example #3
0
        public static XmlSchema?ReadXmlSchema(this TdsPackageReader reader)
        {
            var schemaPresent = reader.ReadByte();

            if ((schemaPresent & 1) != 0)
            {
                return new XmlSchema
                       {
                           CollectionDatabase     = reader.ReadString(reader.ReadByte()),
                           CollectionOwningSchema = reader.ReadString(reader.ReadByte()),
                           CollectionName         = reader.ReadString(reader.ReadUInt16())
                       }
            }
            ;
            return(null);
        }
Example #4
0
        private static void ReadMetadata(TdsPackageReader reader, ColumnMetadata col)
        {
            // read user type - 4 bytes Yukon, 2 backwards
            reader.ReadUInt32();

            // read the 2 flags and set appropriate flags in structure
            col.Flag1 = reader.ReadByte();
            col.Flag2 = reader.ReadByte();

            var tdsType = col.TdsType = reader.ReadByte();

            var tmp = col.MetaType = TdsMetaType.TdsTypes[tdsType];

            col.IsPlp         = tmp.IsPlp;
            col.IsTextOrImage = tmp.IsTextOrImage;


            var length = ReadTdsTypeLen(reader, tmp.LenBytes);

            if (length == TdsEnums.SQL_USHORTVARMAXLEN && tmp.LenBytes == 2)
            {
                col.IsPlp = true;
            }

            if (tdsType == TdsEnums.SQLUDT)
            {
                reader.ReadUdtMetadata();
            }

            if (tdsType == TdsEnums.SQLXMLTYPE)
            {
                ReadXmlSchema(reader);
            }

            if (tmp.HasPrecision)
            {
                reader.ReadByte();
            }

            if (tmp.HasScale)
            {
                col.Scale = reader.ReadByte();
            }

            if (tmp.HasCollation)
            {
                col.Encoding = GetEncodingFromCollation(reader);
            }

            if (col.TdsType == TdsEnums.SQLTEXT || col.TdsType == TdsEnums.SQLNTEXT || col.TdsType == TdsEnums.SQLIMAGE)
            {
                ReadMultiPartTableName(reader);
            }

            col.Column = reader.ReadString(reader.ReadByte());
        }
Example #5
0
        internal static void EnvCharset(this TdsPackageReader reader)
        {
            var newValue = reader.ReadString(reader.ReadByte());
            var oldValue = reader.ReadString(reader.ReadByte());

            // we copied this behavior directly from luxor - see charset envchange
            // section from sqlctokn.c
            if (newValue == TdsEnums.DEFAULT_ENGLISH_CODE_PAGE_STRING)
            {
                reader.CurrentSession.DefaultCodePage = TdsEnums.DEFAULT_ENGLISH_CODE_PAGE_VALUE;
                reader.CurrentSession.DefaultEncoding = Encoding.GetEncoding(reader.CurrentSession.DefaultCodePage);
                return;
            }

            var stringCodePage = newValue.Substring(TdsEnums.CHARSET_CODE_PAGE_OFFSET);

            reader.CurrentSession.DefaultCodePage = int.Parse(stringCodePage, NumberStyles.Integer, CultureInfo.InvariantCulture);
            reader.CurrentSession.DefaultEncoding = Encoding.GetEncoding(reader.CurrentSession.DefaultCodePage);
        }
Example #6
0
        public static void SqlErrorAndInfo(this TdsPackageReader reader, byte token, int tokenLength)
        {
            var start = reader.GetReadPos();
            var error = new SqlInfoAndError
            {
                Number    = reader.ReadInt32(),
                State     = reader.ReadByte(),
                Class     = reader.ReadByte(),
                Message   = reader.ReadString(reader.ReadUInt16()),
                Server    = reader.ReadString(reader.ReadByte()),
                Procedure = reader.ReadString(reader.ReadByte())
            };
            var current = reader.GetReadPos();

            error.LineNumber = tokenLength - (current - start) > 2 ? reader.ReadInt32() : reader.ReadInt16();
            if (error.Class >= TdsEnums.MIN_ERROR_CLASS)
            {
                throw new Exception(error.Message);
            }
            reader.CurrentSession.Errors.Add(error);
        }
Example #7
0
 public static void EnvPackageSize(this TdsPackageReader tdsPackageReader)
 {
     var newValue   = tdsPackageReader.ReadString(tdsPackageReader.ReadByte());
     var oldValue   = tdsPackageReader.ReadString(tdsPackageReader.ReadByte());
     var packetSize = int.Parse(newValue, NumberStyles.Integer, CultureInfo.InvariantCulture);
 }
        private static MetadataBulkCopy ReadMetadata(TdsPackageReader reader)
        {
            var col = new MetadataBulkCopy();

            // read user type - 4 bytes Yukon, 2 backwards
            reader.ReadUInt32();

            // read the 2 flags and set appropriate flags in structure
            col.Flag1 = reader.ReadByte();
            col.Flag2 = reader.ReadByte();

            var tdsType = reader.ReadByte();

            col.TdsType = tdsType;

            var tmp = col.MetaType = TdsMetaType.TdsTypes[tdsType];

            col.IsPlp         = tmp.IsPlp;
            col.IsTextOrImage = tmp.IsTextOrImage;

            var length = col.Length = reader.ReadTdsTypeLen(tmp.LenBytes);

            if (length == TdsEnums.SQL_USHORTVARMAXLEN && tmp.LenBytes == 2)
            {
                col.IsPlp = true;
            }

            if (tdsType == TdsEnums.SQLUDT)
            {
                reader.ReadUdtMetadata();
            }

            if (tdsType == TdsEnums.SQLXMLTYPE)
            {
                reader.ReadXmlSchema();
            }

            if (tmp.HasPrecision)
            {
                col.Precision = reader.ReadByte();
            }

            if (tmp.HasScale)
            {
                col.Scale = reader.ReadByte();
            }

            if (tmp.HasCollation)
            {
                col.Collation = reader.ReadCollation();
                col.Encoding  = reader.CurrentSession.GetEncodingFromCache(col.Collation.GetCodePage());
            }

            if (col.IsTextOrImage)
            {
                col.PartTableName = reader.ReadMultiPartTableName();
            }

            //bulkcopy typeCorrection
            if (tdsType == TdsEnums.SQLXMLTYPE)
            {
                col.TdsType   = TdsEnums.SQLNVARCHAR;
                col.Length    = TdsEnums.SQL_USHORTVARMAXLEN;
                col.Collation = new SqlCollations();
            }

            if (tdsType == TdsEnums.SQLUDT)
            {
                col.TdsType = TdsEnums.SQLBIGVARBINARY;
                col.Length  = TdsEnums.SQL_USHORTVARMAXLEN;
            }

            col.Column = reader.ReadString(reader.ReadByte());
            return(col);
        }
Example #9
0
 internal static void EnvLanguage(this TdsPackageReader tdsPackageReader)
 {
     var newValue = tdsPackageReader.ReadString(tdsPackageReader.ReadByte());
     var oldValue = tdsPackageReader.ReadString(tdsPackageReader.ReadByte());
 }