From 15d44a20c460d4387d4d1af188edd786f59f19f2 Mon Sep 17 00:00:00 2001 From: g-coder Date: Fri, 19 Sep 2014 10:12:47 +0400 Subject: [PATCH 1/2] [Mono.Data.Tds] sql_variant tds reading ability --- .../Mono.Data.Tds.Protocol/Tds.cs | 135 ++++++++++++++++++ .../Mono.Data.Tds.Protocol/Tds80.cs | 74 +++++----- .../Mono.Data.Tds.Protocol/TdsComm.cs | 11 ++ 3 files changed, 185 insertions(+), 35 deletions(-) diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs index 6865df9adbed..48079c9cf342 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs @@ -793,6 +793,31 @@ private object GetColumnValue ( } switch (colType) { + case TdsColumnType.Variant: + /* sql variant max size */ + Comm.GetTdsInt (); + byte type = Comm.GetByte (); + byte propbyte = Comm.GetByte (); + TdsColumnType realType = (TdsColumnType)(type & 0xff); + if (realType == TdsColumnType.NVarChar || + realType == TdsColumnType.BigNVarChar || + realType == TdsColumnType.VarChar || + realType == TdsColumnType.BigVarChar) { + byte[] collation = null; + collation = Comm.GetBytes (5, true); + lcid = TdsCollation.LCID (collation); + sortId = TdsCollation.SortId (collation); +#if NET_2_0 + columns[ordinal].LCID = lcid; + columns[ordinal].SortOrder = sortId; +#else + columns[ordinal]["LCID"] = lcid; + columns[ordinal]["SortOrder"] = sortId; +#endif + + } + element = GetColumnValue ((TdsColumnType)type, outParam, ordinal); + break; case TdsColumnType.IntN : if (outParam) comm.Skip (1); @@ -1270,6 +1295,116 @@ TdsColumnType type } } + /* this method check's if len is real and not MAX len + else this method return's real len */ + //private int CheckStringLen(int len) + //{ + // int realLen = len; + // int startIndex = Comm.GetInBufferIndex (); + // while (true) { + // byte nextByte = Comm.GetByte (); + // /* check if end of data rows */ + // if (nextByte == 0xFF) { + // nextByte = Comm.GetByte (); + // if (nextByte == 0x11) { + // realLen = Comm.GetInBufferIndex () - 2; + // Comm.SetInBufferIndex (startIndex); + // break; + // } else { + // Comm.SetInBufferIndex (Comm.GetInBufferIndex () - 1); + // } + // } else if (nextByte == 0xD1) { + // + // } + // } + // return realLen; + //} + + /* this method check's if next bytes contains metadata about data type */ + /*private bool CheckIfNextIsDataType() + { + int startIndex = Comm.GetInBufferIndex (); + bool result = false; + byte nextByte = Comm.GetByte (); + TdsColumnType columnType = (TdsColumnType)nextByte; + switch (columnType) { + case TdsColumnType.Bit: + case TdsColumnType.Char: + case TdsColumnType.DateTime: + case TdsColumnType.DateTime4: + case TdsColumnType.DateTimeN: + case TdsColumnType.Decimal: + case TdsColumnType.Real: + case TdsColumnType.Float8: + case TdsColumnType.FloatN: + case TdsColumnType.Image: + case TdsColumnType.Int1: + case TdsColumnType.Int2: + case TdsColumnType.Int4: + case TdsColumnType.IntN: + case TdsColumnType.Void: + case TdsColumnType.Text: + case TdsColumnType.UniqueIdentifier: + case TdsColumnType.VarBinary: + case TdsColumnType.VarChar: + case TdsColumnType.Money: + case TdsColumnType.NText: + case TdsColumnType.NVarChar: + case TdsColumnType.BitN: + case TdsColumnType.Numeric: + case TdsColumnType.MoneyN: + case TdsColumnType.Money4: + case TdsColumnType.NChar: + case TdsColumnType.BigBinary: + case TdsColumnType.BigVarBinary: + case TdsColumnType.BigVarChar: + case TdsColumnType.BigNVarChar: + case TdsColumnType.BigChar: + case TdsColumnType.SmallMoney: + case TdsColumnType.Variant: + case TdsColumnType.BigInt: + break;*/ + /*Binary = 0x2d, // SYBBINARY + Bit = 0x32, // SYBBIT + Char = 0x2f, // SYBCHAR + DateTime = 0x3d, // SYBDATETIME + DateTime4 = 0x3a, // SYBDATETIME4 + DateTimeN = 0x6f, // SYBDATETIMN + Decimal = 0x6a, // SYBDECIMAL + Real = 0x3b, // SYBREAL + Float8 = 0x3e, // SYBFLT8 + FloatN = 0x6d, // SYBFLTN + Image = 0x22, // SYBIMAGE + Int1 = 0x30, // SYBINT1 + Int2 = 0x34, // SYBINT2 + Int4 = 0x38, // SYBINT4 + IntN = 0x26, // SYBINTN + Void = 0x1f, // SYBVOID + Text = 0x23, // SYBTEXT + UniqueIdentifier = 0x24,// SYBUNIQUE + VarBinary = 0x25, // SYBVARBINARY + VarChar = 0x27, // SYBVARCHAR + Money = 0x3c, // SYBMONEY + NText = 0x63, // SYBNTEXT + NVarChar = 0x67, // SYBNVARCHAR + BitN = 0x68, // SYBBITN + Numeric = 0x6c, // SYBNUMERIC + MoneyN = 0x6e, // SYBMONEYN + Money4 = 0x70, + NChar = 0xef, // XSYBNCHAR + BigBinary = 0xad, // XSYBBINARY + BigVarBinary = 0xa5, // XSYBVARBINARY + BigVarChar = 0xa7, // XSYBVARCHAR + BigNVarChar = 0xe7, // XSYBNVARCHAR + BigChar = 0xaf, // XSYBCHAR + SmallMoney = 0x7a, // SYBMONEY4 + Variant = 0x62, // SYBVARIANT + BigInt = 0x7F // SYBINT8*/ + //} + //Comm.SetInBufferIndex (startIndex); + //return result; + //} + protected object GetStringValue ( #if NET_2_0 TdsColumnType? colType, diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs index 8d26453ecf6d..1cc8633c3b9b 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds80.cs @@ -94,15 +94,22 @@ protected override void ProcessColumnInfo () base.ProcessColumnInfo (); return; } - - // VARADHAN: TDS 8 Debugging - //Console.WriteLine ("Tds80.cs: In ProcessColumnInfo... entry"); int numColumns = Comm.GetTdsShort (); + + int columnSize = 0; + string tableName = null; + byte[] collation = null; + int lcid = 0, sortId = 0; + + byte precision = 0; + byte scale = 0; + //Console.WriteLine ("Column count={0}", numColumns); TDS 8 Debugging for (int i = 0; i < numColumns; i += 1) { byte[] flagData = new byte[4]; - for (int j = 0; j < 4; j += 1) - flagData[j] = Comm.GetByte (); + for (int j = 0; j < 4; j += 1) { + flagData [j] = Comm.GetByte (); + } bool nullable = (flagData[2] & 0x01) > 0; //bool caseSensitive = (flagData[2] & 0x02) > 0; @@ -110,8 +117,11 @@ protected override void ProcessColumnInfo () bool autoIncrement = (flagData[2] & 0x10) > 0; bool isIdentity = (flagData[2] & 0x10) > 0; - TdsColumnType columnType = (TdsColumnType) (Comm.GetByte () & 0xff); - //Console.WriteLine ("Actual ColumnType: {0}", columnType); TDS 8 Debugging + byte nextbyte = Comm.GetByte(); + string columnName = ""; + + TdsColumnType columnType = (TdsColumnType) (nextbyte & 0xff); + //Console.WriteLine ("Actual ColumnType: {0}", columnType); // TDS 8 Debugging if ((byte) columnType == 0xef) columnType = TdsColumnType.NChar; @@ -121,39 +131,33 @@ protected override void ProcessColumnInfo () if (columnType != TdsColumnType.NChar) columnType -= 128; } - - int columnSize; - string tableName = null; - byte[] collation = null; - int lcid = 0, sortId = 0; - + if (IsBlobType (columnType)) { columnSize = Comm.GetTdsInt (); } else if (IsFixedSizeColumn (columnType)) { columnSize = LookupBufferSize (columnType); } else if (IsLargeType (xColumnType)) { columnSize = Comm.GetTdsShort (); - } else { - columnSize = Comm.GetByte () & 0xff; - } - - if (xColumnType == TdsColumnType.BigChar || xColumnType == TdsColumnType.BigNVarChar || - xColumnType == TdsColumnType.BigVarChar || xColumnType == TdsColumnType.NChar || - xColumnType == TdsColumnType.NVarChar || xColumnType == TdsColumnType.Text || - xColumnType == TdsColumnType.NText) { - // Read collation for SqlServer 2000 and beyond - collation = Comm.GetBytes (5, true); - lcid = TdsCollation.LCID (collation); - sortId = TdsCollation.SortId (collation); - } - - if (IsBlobType (columnType)) { - tableName = Comm.GetString (Comm.GetTdsShort ()); - //Console.WriteLine ("Tablename: "+tableName); TDS 8 Debugging - } - - byte precision = 0; - byte scale = 0; + } else if (columnType == TdsColumnType.Variant) { + columnSize = Comm.GetTdsInt (); + } else { + columnSize = Comm.GetByte () & 0xff; + } + + if (xColumnType == TdsColumnType.BigChar || xColumnType == TdsColumnType.BigNVarChar || + xColumnType == TdsColumnType.BigVarChar || xColumnType == TdsColumnType.NChar || + xColumnType == TdsColumnType.NVarChar || xColumnType == TdsColumnType.Text || + xColumnType == TdsColumnType.NText) { + // Read collation for SqlServer 2000 and beyond + collation = Comm.GetBytes (5, true); + lcid = TdsCollation.LCID (collation); + sortId = TdsCollation.SortId (collation); + } + + if (IsBlobType (columnType)) { + tableName = Comm.GetString (Comm.GetTdsShort ()); + //Console.WriteLine ("Tablename: "+tableName); TDS 8 Debugging + } switch (columnType) { case TdsColumnType.NText: @@ -171,7 +175,7 @@ protected override void ProcessColumnInfo () break; } - string columnName = Comm.GetString (Comm.GetByte ()); + columnName = Comm.GetString (Comm.GetByte ()); TdsDataColumn col = new TdsDataColumn (); Columns.Add (col); diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsComm.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsComm.cs index c44f8d51d732..38ab3d782c24 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsComm.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsComm.cs @@ -517,6 +517,17 @@ public bool IsConnected () { return socket != null && socket.Connected && !(socket.Poll (0, SelectMode.SelectRead) && socket.Available == 0); } + + /* this two methods need to read sql variant type from database */ + public int GetInBufferIndex() + { + return inBufferIndex; + } + + public void SetInBufferIndex(int index) + { + inBufferIndex = index; + } public byte GetByte () { From 49313bc848564a201d9f1e8cdf6a3fde6f5c0d01 Mon Sep 17 00:00:00 2001 From: g-coder Date: Fri, 19 Sep 2014 10:18:57 +0400 Subject: [PATCH 2/2] [Mono.Data.Tds] Tds.cs remove 2 methods that don't need --- .../Mono.Data.Tds.Protocol/Tds.cs | 112 +----------------- 1 file changed, 1 insertion(+), 111 deletions(-) diff --git a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs index 48079c9cf342..0ebaf18f09ca 100644 --- a/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs +++ b/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs @@ -1294,117 +1294,7 @@ TdsColumnType type return DBNull.Value; } } - - /* this method check's if len is real and not MAX len - else this method return's real len */ - //private int CheckStringLen(int len) - //{ - // int realLen = len; - // int startIndex = Comm.GetInBufferIndex (); - // while (true) { - // byte nextByte = Comm.GetByte (); - // /* check if end of data rows */ - // if (nextByte == 0xFF) { - // nextByte = Comm.GetByte (); - // if (nextByte == 0x11) { - // realLen = Comm.GetInBufferIndex () - 2; - // Comm.SetInBufferIndex (startIndex); - // break; - // } else { - // Comm.SetInBufferIndex (Comm.GetInBufferIndex () - 1); - // } - // } else if (nextByte == 0xD1) { - // - // } - // } - // return realLen; - //} - - /* this method check's if next bytes contains metadata about data type */ - /*private bool CheckIfNextIsDataType() - { - int startIndex = Comm.GetInBufferIndex (); - bool result = false; - byte nextByte = Comm.GetByte (); - TdsColumnType columnType = (TdsColumnType)nextByte; - switch (columnType) { - case TdsColumnType.Bit: - case TdsColumnType.Char: - case TdsColumnType.DateTime: - case TdsColumnType.DateTime4: - case TdsColumnType.DateTimeN: - case TdsColumnType.Decimal: - case TdsColumnType.Real: - case TdsColumnType.Float8: - case TdsColumnType.FloatN: - case TdsColumnType.Image: - case TdsColumnType.Int1: - case TdsColumnType.Int2: - case TdsColumnType.Int4: - case TdsColumnType.IntN: - case TdsColumnType.Void: - case TdsColumnType.Text: - case TdsColumnType.UniqueIdentifier: - case TdsColumnType.VarBinary: - case TdsColumnType.VarChar: - case TdsColumnType.Money: - case TdsColumnType.NText: - case TdsColumnType.NVarChar: - case TdsColumnType.BitN: - case TdsColumnType.Numeric: - case TdsColumnType.MoneyN: - case TdsColumnType.Money4: - case TdsColumnType.NChar: - case TdsColumnType.BigBinary: - case TdsColumnType.BigVarBinary: - case TdsColumnType.BigVarChar: - case TdsColumnType.BigNVarChar: - case TdsColumnType.BigChar: - case TdsColumnType.SmallMoney: - case TdsColumnType.Variant: - case TdsColumnType.BigInt: - break;*/ - /*Binary = 0x2d, // SYBBINARY - Bit = 0x32, // SYBBIT - Char = 0x2f, // SYBCHAR - DateTime = 0x3d, // SYBDATETIME - DateTime4 = 0x3a, // SYBDATETIME4 - DateTimeN = 0x6f, // SYBDATETIMN - Decimal = 0x6a, // SYBDECIMAL - Real = 0x3b, // SYBREAL - Float8 = 0x3e, // SYBFLT8 - FloatN = 0x6d, // SYBFLTN - Image = 0x22, // SYBIMAGE - Int1 = 0x30, // SYBINT1 - Int2 = 0x34, // SYBINT2 - Int4 = 0x38, // SYBINT4 - IntN = 0x26, // SYBINTN - Void = 0x1f, // SYBVOID - Text = 0x23, // SYBTEXT - UniqueIdentifier = 0x24,// SYBUNIQUE - VarBinary = 0x25, // SYBVARBINARY - VarChar = 0x27, // SYBVARCHAR - Money = 0x3c, // SYBMONEY - NText = 0x63, // SYBNTEXT - NVarChar = 0x67, // SYBNVARCHAR - BitN = 0x68, // SYBBITN - Numeric = 0x6c, // SYBNUMERIC - MoneyN = 0x6e, // SYBMONEYN - Money4 = 0x70, - NChar = 0xef, // XSYBNCHAR - BigBinary = 0xad, // XSYBBINARY - BigVarBinary = 0xa5, // XSYBVARBINARY - BigVarChar = 0xa7, // XSYBVARCHAR - BigNVarChar = 0xe7, // XSYBNVARCHAR - BigChar = 0xaf, // XSYBCHAR - SmallMoney = 0x7a, // SYBMONEY4 - Variant = 0x62, // SYBVARIANT - BigInt = 0x7F // SYBINT8*/ - //} - //Comm.SetInBufferIndex (startIndex); - //return result; - //} - + protected object GetStringValue ( #if NET_2_0 TdsColumnType? colType,