2002-11-19 Tim Coleman <tim@timcoleman.com>
authorTim Coleman <tim@mono-cvs.ximian.com>
Tue, 19 Nov 2002 22:22:51 +0000 (22:22 -0000)
committerTim Coleman <tim@mono-cvs.ximian.com>
Tue, 19 Nov 2002 22:22:51 +0000 (22:22 -0000)
        * Mono.Data.TdsClient.Internal/Tds.cs:
        * Mono.Data.TdsClient.Internal/Tds50.cs:
        * Mono.Data.TdsClient.Internal/TdsPacketSubType.cs:
                More changes to get Sybase queries working
                properly.

svn path=/trunk/mcs/; revision=9090

mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs
mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds50.cs
mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsPacketSubType.cs
mcs/class/Mono.Data.TdsClient/ChangeLog
mcs/class/Mono.Data.TdsClient/Mono.Data.TdsClient.Internal/Tds.cs
mcs/class/Mono.Data.TdsClient/Mono.Data.TdsClient.Internal/Tds50.cs
mcs/class/Mono.Data.TdsClient/Mono.Data.TdsClient.Internal/TdsPacketSubType.cs

index 5e21e518e59d4a0023dee6d4799e1f726a83a65d..e97040c71d6121af7b8f372b0831c5d190675db1 100644 (file)
@@ -53,7 +53,7 @@ namespace Mono.Data.TdsClient.Internal {
                bool isDoneInProc;
 
                ArrayList outputParameters = new ArrayList ();
-               TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
+               protected TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
 
                int recordsAffected = 0;
 
@@ -723,7 +723,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return result;
                }
 
-               private int GetSubPacketLength ()
+               protected int GetSubPacketLength ()
                {
                        return comm.GetTdsShort ();
                }
@@ -793,7 +793,7 @@ namespace Mono.Data.TdsClient.Internal {
                        }
                }
 
-               private TdsPacketRowResult LoadRow ()
+               protected TdsPacketRowResult LoadRow ()
                {
                        TdsPacketRowResult result = new TdsPacketRowResult ();
 
@@ -905,7 +905,7 @@ namespace Mono.Data.TdsClient.Internal {
 
                protected abstract TdsPacketColumnInfoResult ProcessColumnInfo ();
 
-               private TdsPacketColumnNamesResult ProcessColumnNames ()
+               protected TdsPacketColumnNamesResult ProcessColumnNames ()
                {
                        TdsPacketColumnNamesResult result = new TdsPacketColumnNamesResult ();
 
@@ -925,7 +925,7 @@ namespace Mono.Data.TdsClient.Internal {
                }
 
                [MonoTODO ("Make sure counting works right, especially with multiple resultsets.")]
-               private TdsPacketEndTokenResult ProcessEndToken (TdsPacketSubType type)
+               protected TdsPacketEndTokenResult ProcessEndToken (TdsPacketSubType type)
                {
                        byte status = comm.GetByte ();
                        comm.GetByte ();
@@ -951,7 +951,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return result;
                }
 
-               private TdsPacketResult ProcessEnvChange ()
+               protected TdsPacketResult ProcessEnvChange ()
                {
                        int len = GetSubPacketLength ();
                        TdsEnvPacketSubType type = (TdsEnvPacketSubType) comm.GetByte ();
@@ -998,7 +998,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return new TdsPacketResult (TdsPacketSubType.EnvChange);
                }
 
-               private TdsPacketResult ProcessLoginAck ()
+               protected TdsPacketResult ProcessLoginAck ()
                {
                        GetSubPacketLength ();
 
@@ -1041,8 +1041,8 @@ namespace Mono.Data.TdsClient.Internal {
                                TdsInfoMessage (this, e);
                        messages.Clear ();
                }
-               
-               private void ProcessMessage (TdsPacketSubType subType)
+
+               protected void ProcessMessage (TdsPacketSubType subType)
                {
                        GetSubPacketLength ();
 
@@ -1068,18 +1068,16 @@ namespace Mono.Data.TdsClient.Internal {
                        server = comm.GetString (comm.GetByte ());
                        procedure = comm.GetString (comm.GetByte ());
                        lineNumber = comm.GetByte ();
+                       comm.Skip (1);
                        source = String.Empty; // FIXME
 
-                       if (subType != TdsPacketSubType.EED)
-                               comm.Skip (1);
-
                        if (isError)
                                messages.Add (new TdsInternalError (theClass, lineNumber, message, number, procedure, server, source, state));
                        else
                                OnTdsErrorMessage (CreateTdsErrorMessageEvent (theClass, lineNumber, message, number, procedure, server, source, state));
                }
 
-               private TdsPacketOutputParam ProcessOutputParam ()
+               protected TdsPacketOutputParam ProcessOutputParam ()
                {
                        GetSubPacketLength ();
                        comm.GetString (comm.GetByte () & 0xff);
@@ -1092,18 +1090,18 @@ namespace Mono.Data.TdsClient.Internal {
                        return null;
                }
 
-               private TdsPacketResult ProcessProcId ()
+               protected TdsPacketResult ProcessProcId ()
                {
                        comm.Skip (8);
                        return new TdsPacketResult (TdsPacketSubType.ProcId);
                }
 
-               private TdsPacketRetStatResult ProcessReturnStatus ()
+               protected TdsPacketRetStatResult ProcessReturnStatus ()
                {
                        return new TdsPacketRetStatResult (comm.GetTdsInt ());
                }
 
-               protected TdsPacketResult ProcessSubPacket ()
+               protected virtual TdsPacketResult ProcessSubPacket ()
                {
                        TdsPacketResult result = null;
                        moreResults = false;
@@ -1111,59 +1109,60 @@ namespace Mono.Data.TdsClient.Internal {
                        TdsPacketSubType subType = (TdsPacketSubType) comm.GetByte ();
 
                        switch (subType) {
-                       case TdsPacketSubType.EnvChange :
+                       case TdsPacketSubType.EnvChange:
                                result = ProcessEnvChange ();
                                break;
-                       case TdsPacketSubType.Info :
-                       case TdsPacketSubType.EED:
-                       case TdsPacketSubType.Error :
+                       case TdsPacketSubType.Info:  // TDS 4.2/7.0
+                       case TdsPacketSubType.EED:   // TDS 5.0
+                       case TdsPacketSubType.Error: // TDS 4.2/7.0
                                ProcessMessage (subType);
                                break;
-                       case TdsPacketSubType.Param :
+                       case TdsPacketSubType.Param:
                                result = ProcessOutputParam ();
                                break;
-                       case TdsPacketSubType.LoginAck :
+                       case TdsPacketSubType.LoginAck:
                                result = ProcessLoginAck ();
                                break;
                        case TdsPacketSubType.ReturnStatus :
                                result = ProcessReturnStatus ();
                                break;
-                       case TdsPacketSubType.ProcId :
+                       case TdsPacketSubType.ProcId:
                                result = ProcessProcId ();
                                break;
-                       case TdsPacketSubType.Done :
-                       case TdsPacketSubType.DoneProc :
-                       case TdsPacketSubType.DoneInProc :
+                       case TdsPacketSubType.Done:
+                       case TdsPacketSubType.DoneProc:
+                       case TdsPacketSubType.DoneInProc:
                                result = ProcessEndToken (subType);
                                break;
-                       case TdsPacketSubType.ColumnNameToken :
+                       case TdsPacketSubType.ColumnNameToken:
                                result = ProcessProcId ();
                                result = ProcessColumnNames ();
                                break;
-                       case TdsPacketSubType.ColumnInfoToken :
-                       case TdsPacketSubType.ColumnMetadata :
+                       case TdsPacketSubType.ColumnInfoToken: // TDS 4.2
+                       case TdsPacketSubType.ColumnMetadata:  // TDS 7.0
+                       case TdsPacketSubType.RowFormat:       // TDS 5.0
                                result = ProcessColumnInfo ();
                                break;
-                       case TdsPacketSubType.ColumnDetail :
+                       case TdsPacketSubType.ColumnDetail:
                                result = ProcessColumnDetail ();
                                break;
-                       case TdsPacketSubType.Unknown0xA7 :
-                       case TdsPacketSubType.Unknown0xA8 :
+                       case TdsPacketSubType.Unknown0xA7:
+                       case TdsPacketSubType.Unknown0xA8:
                                comm.Skip (comm.GetTdsShort ());
                                result = new TdsPacketUnknown (subType);
                                break;
-                       case TdsPacketSubType.TableName :
+                       case TdsPacketSubType.TableName:
                                result = ProcessTableName ();
                                break;
-                       case TdsPacketSubType.Order :
+                       case TdsPacketSubType.Order:
                                comm.Skip (comm.GetTdsShort ());
                                result = new TdsPacketColumnOrderResult ();
                                break;
-                       case TdsPacketSubType.Control :
+                       case TdsPacketSubType.Control:
                                comm.Skip (comm.GetTdsShort ());
                                result = new TdsPacketControlResult ();
                                break;
-                       case TdsPacketSubType.Row :
+                       case TdsPacketSubType.Row:
                                result = LoadRow ();
                                break;
                        default:
@@ -1173,7 +1172,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return result;
                }
 
-               private TdsPacketTableNameResult ProcessTableName ()
+               protected TdsPacketTableNameResult ProcessTableName ()
                {
                        TdsPacketTableNameResult result = new TdsPacketTableNameResult ();
                        int totalLength = comm.GetTdsShort ();
index 09cc19a62d1affe41d60fe9c4f6e69479ecc7d92..a2e3eb539bc43ecdc633695762d0e81ad534c8c7 100644 (file)
@@ -226,74 +226,61 @@ namespace Mono.Data.TdsClient.Internal {
 
                protected override TdsPacketColumnInfoResult ProcessColumnInfo ()
                {
-                       byte precision;
-                       byte scale;
-                       int totalLength = Comm.GetTdsShort ();
-                       int bytesRead = 0;
-
                        TdsPacketColumnInfoResult result = new TdsPacketColumnInfoResult ();
+                       int totalLength = Comm.GetTdsShort ();  
+                       int count = Comm.GetTdsShort ();
+                       for (int i = 0; i < count; i += 1) {
+                               string columnName = Comm.GetString (Comm.GetByte ());
+                               int status = Comm.GetByte ();
+                               bool hidden = (status & 0x01) > 0;
+                               bool isKey = (status & 0x02) > 0;
+                               bool isRowVersion = (status & 0x04) > 0;
+                               bool isUpdatable = (status & 0x10) > 0;
+                               bool allowDBNull = (status & 0x20) > 0;
+                               bool isIdentity = (status & 0x40) > 0;
 
-                       while (bytesRead < totalLength) {
-                               scale = 0;
-                               precision = 0;
+                               Comm.Skip (4); // User type
 
-                               int bufLength = -1;
-                               //int dispSize = -1;
-                               byte[] flagData = new byte[4];
-                               for (int i = 0; i < 4; i += 1) {
-                                       flagData[i] = Comm.GetByte ();
-                                       bytesRead += 1;
-                               }
-                               bool nullable = (flagData[2] & 0x01) > 0;
-                               bool caseSensitive = (flagData[2] & 0x02) > 0;
-                               bool writable = (flagData[2] & 0x0c) > 0;
-                               bool autoIncrement = (flagData[2] & 0x10) > 0;
+                               byte type = Comm.GetByte ();
+                               bool isBlob = (type == 0x24);
 
-                               string tableName = String.Empty;
-                               TdsColumnType columnType = (TdsColumnType) Comm.GetByte ();
+                               TdsColumnType columnType = (TdsColumnType) type;
+                               int bufLength = 0;
 
-                               bytesRead += 1;
+                               byte precision = 0;
+                               byte scale = 0;
 
                                if (columnType == TdsColumnType.Text || columnType == TdsColumnType.Image) {
-                                       Comm.Skip (4);
-                                       bytesRead += 4;
-
-                                       int tableNameLength = Comm.GetTdsShort ();
-                                       bytesRead += 2;
-                                       tableName = Comm.GetString (tableNameLength);
-                                       bytesRead += tableNameLength;
-                                       bufLength = 2 << 31 - 1;
-                               }
-                               else if (columnType == TdsColumnType.Decimal || columnType == TdsColumnType.Numeric) {
-                                       bufLength = Comm.GetByte ();
-                                       bytesRead += 1;
-                                       precision = Comm.GetByte ();
-                                       bytesRead += 1;
-                                       scale = Comm.GetByte ();
-                                       bytesRead += 1;
+                                       bufLength = Comm.GetTdsInt ();
+                                       Comm.Skip (Comm.GetTdsShort ());
                                }
                                else if (IsFixedSizeColumn (columnType))
                                        bufLength = LookupBufferSize (columnType);
-                               else {
-                                       bufLength = (int) Comm.GetByte () & 0xff;
-                                       bytesRead += 1;
+                               else
+                                       bufLength = Comm.GetTdsShort ();
+
+                               if (columnType == TdsColumnType.Decimal || columnType == TdsColumnType.Numeric) {
+                                       precision = Comm.GetByte ();
+                                       scale = Comm.GetByte ();
                                }
 
+                               Comm.Skip (Comm.GetByte ()); // Locale
+                               if (isBlob)
+                                       Comm.Skip (Comm.GetTdsShort ()); // Class ID
+
                                int index = result.Add (new TdsSchemaInfo ());
                                result[index]["NumericPrecision"] = precision;
                                result[index]["NumericScale"] = scale;
                                result[index]["ColumnSize"] = bufLength;
-                               result[index]["ColumnName"] = ColumnNames[index];
-                               result[index]["BaseTableName"] = tableName;
-                               result[index]["AllowDBNull"] = nullable;
-                               result[index]["IsReadOnly"] = !writable;
+                               result[index]["ColumnName"] = columnName;
+                               result[index]["AllowDBNull"] = allowDBNull;
+                               result[index]["IsReadOnly"] = !isUpdatable;
+                               result[index]["IsIdentity"] = isIdentity;
+                               result[index]["IsRowVersion"] = isRowVersion;
+                               result[index]["IsKey"] = isKey;
+                               result[index]["Hidden"] = hidden;
                                result[index]["ColumnType"] = columnType;
                        }
-
-                       //int skipLength = totalLength - bytesRead;
-                       //if (skipLength != 0)
-                               //throw new TdsException ("skipping");
-
                        return result;
                }
 
index 4f2644b757e35769443d0851ec03f9f492fa1601..d230e2a3063bb8a06ffe7127b1fc2b08f211b157 100644 (file)
@@ -29,6 +29,7 @@ namespace Mono.Data.TdsClient.Internal {
                Order = 0xa9,
                Control = 0xae,
                Row = 0xd1,
-               ColumnMetadata = 0x81
+               ColumnMetadata = 0x81,
+               RowFormat = 0xee
        }
 }
index 7bbdcb59b299c88bcf25e05908fa307da2e13919..f47fbea1f2599a5c79a03ae11d918187d3240995 100644 (file)
@@ -1,3 +1,11 @@
+2002-11-19  Tim Coleman <tim@timcoleman.com>
+       * Mono.Data.TdsClient.Internal/Tds.cs:
+       * Mono.Data.TdsClient.Internal/Tds50.cs:
+       * Mono.Data.TdsClient.Internal/TdsPacketSubType.cs:
+               More changes to get Sybase queries working
+               properly.
+       
+
 2002-11-18  Tim Coleman <tim@timcoleman.com>
        * Mono.Data.TdsClient.Internal/Tds.cs:
        * Mono.Data.TdsClient.Internal/Tds50.cs:
index 5e21e518e59d4a0023dee6d4799e1f726a83a65d..e97040c71d6121af7b8f372b0831c5d190675db1 100644 (file)
@@ -53,7 +53,7 @@ namespace Mono.Data.TdsClient.Internal {
                bool isDoneInProc;
 
                ArrayList outputParameters = new ArrayList ();
-               TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
+               protected TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
 
                int recordsAffected = 0;
 
@@ -723,7 +723,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return result;
                }
 
-               private int GetSubPacketLength ()
+               protected int GetSubPacketLength ()
                {
                        return comm.GetTdsShort ();
                }
@@ -793,7 +793,7 @@ namespace Mono.Data.TdsClient.Internal {
                        }
                }
 
-               private TdsPacketRowResult LoadRow ()
+               protected TdsPacketRowResult LoadRow ()
                {
                        TdsPacketRowResult result = new TdsPacketRowResult ();
 
@@ -905,7 +905,7 @@ namespace Mono.Data.TdsClient.Internal {
 
                protected abstract TdsPacketColumnInfoResult ProcessColumnInfo ();
 
-               private TdsPacketColumnNamesResult ProcessColumnNames ()
+               protected TdsPacketColumnNamesResult ProcessColumnNames ()
                {
                        TdsPacketColumnNamesResult result = new TdsPacketColumnNamesResult ();
 
@@ -925,7 +925,7 @@ namespace Mono.Data.TdsClient.Internal {
                }
 
                [MonoTODO ("Make sure counting works right, especially with multiple resultsets.")]
-               private TdsPacketEndTokenResult ProcessEndToken (TdsPacketSubType type)
+               protected TdsPacketEndTokenResult ProcessEndToken (TdsPacketSubType type)
                {
                        byte status = comm.GetByte ();
                        comm.GetByte ();
@@ -951,7 +951,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return result;
                }
 
-               private TdsPacketResult ProcessEnvChange ()
+               protected TdsPacketResult ProcessEnvChange ()
                {
                        int len = GetSubPacketLength ();
                        TdsEnvPacketSubType type = (TdsEnvPacketSubType) comm.GetByte ();
@@ -998,7 +998,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return new TdsPacketResult (TdsPacketSubType.EnvChange);
                }
 
-               private TdsPacketResult ProcessLoginAck ()
+               protected TdsPacketResult ProcessLoginAck ()
                {
                        GetSubPacketLength ();
 
@@ -1041,8 +1041,8 @@ namespace Mono.Data.TdsClient.Internal {
                                TdsInfoMessage (this, e);
                        messages.Clear ();
                }
-               
-               private void ProcessMessage (TdsPacketSubType subType)
+
+               protected void ProcessMessage (TdsPacketSubType subType)
                {
                        GetSubPacketLength ();
 
@@ -1068,18 +1068,16 @@ namespace Mono.Data.TdsClient.Internal {
                        server = comm.GetString (comm.GetByte ());
                        procedure = comm.GetString (comm.GetByte ());
                        lineNumber = comm.GetByte ();
+                       comm.Skip (1);
                        source = String.Empty; // FIXME
 
-                       if (subType != TdsPacketSubType.EED)
-                               comm.Skip (1);
-
                        if (isError)
                                messages.Add (new TdsInternalError (theClass, lineNumber, message, number, procedure, server, source, state));
                        else
                                OnTdsErrorMessage (CreateTdsErrorMessageEvent (theClass, lineNumber, message, number, procedure, server, source, state));
                }
 
-               private TdsPacketOutputParam ProcessOutputParam ()
+               protected TdsPacketOutputParam ProcessOutputParam ()
                {
                        GetSubPacketLength ();
                        comm.GetString (comm.GetByte () & 0xff);
@@ -1092,18 +1090,18 @@ namespace Mono.Data.TdsClient.Internal {
                        return null;
                }
 
-               private TdsPacketResult ProcessProcId ()
+               protected TdsPacketResult ProcessProcId ()
                {
                        comm.Skip (8);
                        return new TdsPacketResult (TdsPacketSubType.ProcId);
                }
 
-               private TdsPacketRetStatResult ProcessReturnStatus ()
+               protected TdsPacketRetStatResult ProcessReturnStatus ()
                {
                        return new TdsPacketRetStatResult (comm.GetTdsInt ());
                }
 
-               protected TdsPacketResult ProcessSubPacket ()
+               protected virtual TdsPacketResult ProcessSubPacket ()
                {
                        TdsPacketResult result = null;
                        moreResults = false;
@@ -1111,59 +1109,60 @@ namespace Mono.Data.TdsClient.Internal {
                        TdsPacketSubType subType = (TdsPacketSubType) comm.GetByte ();
 
                        switch (subType) {
-                       case TdsPacketSubType.EnvChange :
+                       case TdsPacketSubType.EnvChange:
                                result = ProcessEnvChange ();
                                break;
-                       case TdsPacketSubType.Info :
-                       case TdsPacketSubType.EED:
-                       case TdsPacketSubType.Error :
+                       case TdsPacketSubType.Info:  // TDS 4.2/7.0
+                       case TdsPacketSubType.EED:   // TDS 5.0
+                       case TdsPacketSubType.Error: // TDS 4.2/7.0
                                ProcessMessage (subType);
                                break;
-                       case TdsPacketSubType.Param :
+                       case TdsPacketSubType.Param:
                                result = ProcessOutputParam ();
                                break;
-                       case TdsPacketSubType.LoginAck :
+                       case TdsPacketSubType.LoginAck:
                                result = ProcessLoginAck ();
                                break;
                        case TdsPacketSubType.ReturnStatus :
                                result = ProcessReturnStatus ();
                                break;
-                       case TdsPacketSubType.ProcId :
+                       case TdsPacketSubType.ProcId:
                                result = ProcessProcId ();
                                break;
-                       case TdsPacketSubType.Done :
-                       case TdsPacketSubType.DoneProc :
-                       case TdsPacketSubType.DoneInProc :
+                       case TdsPacketSubType.Done:
+                       case TdsPacketSubType.DoneProc:
+                       case TdsPacketSubType.DoneInProc:
                                result = ProcessEndToken (subType);
                                break;
-                       case TdsPacketSubType.ColumnNameToken :
+                       case TdsPacketSubType.ColumnNameToken:
                                result = ProcessProcId ();
                                result = ProcessColumnNames ();
                                break;
-                       case TdsPacketSubType.ColumnInfoToken :
-                       case TdsPacketSubType.ColumnMetadata :
+                       case TdsPacketSubType.ColumnInfoToken: // TDS 4.2
+                       case TdsPacketSubType.ColumnMetadata:  // TDS 7.0
+                       case TdsPacketSubType.RowFormat:       // TDS 5.0
                                result = ProcessColumnInfo ();
                                break;
-                       case TdsPacketSubType.ColumnDetail :
+                       case TdsPacketSubType.ColumnDetail:
                                result = ProcessColumnDetail ();
                                break;
-                       case TdsPacketSubType.Unknown0xA7 :
-                       case TdsPacketSubType.Unknown0xA8 :
+                       case TdsPacketSubType.Unknown0xA7:
+                       case TdsPacketSubType.Unknown0xA8:
                                comm.Skip (comm.GetTdsShort ());
                                result = new TdsPacketUnknown (subType);
                                break;
-                       case TdsPacketSubType.TableName :
+                       case TdsPacketSubType.TableName:
                                result = ProcessTableName ();
                                break;
-                       case TdsPacketSubType.Order :
+                       case TdsPacketSubType.Order:
                                comm.Skip (comm.GetTdsShort ());
                                result = new TdsPacketColumnOrderResult ();
                                break;
-                       case TdsPacketSubType.Control :
+                       case TdsPacketSubType.Control:
                                comm.Skip (comm.GetTdsShort ());
                                result = new TdsPacketControlResult ();
                                break;
-                       case TdsPacketSubType.Row :
+                       case TdsPacketSubType.Row:
                                result = LoadRow ();
                                break;
                        default:
@@ -1173,7 +1172,7 @@ namespace Mono.Data.TdsClient.Internal {
                        return result;
                }
 
-               private TdsPacketTableNameResult ProcessTableName ()
+               protected TdsPacketTableNameResult ProcessTableName ()
                {
                        TdsPacketTableNameResult result = new TdsPacketTableNameResult ();
                        int totalLength = comm.GetTdsShort ();
index 09cc19a62d1affe41d60fe9c4f6e69479ecc7d92..a2e3eb539bc43ecdc633695762d0e81ad534c8c7 100644 (file)
@@ -226,74 +226,61 @@ namespace Mono.Data.TdsClient.Internal {
 
                protected override TdsPacketColumnInfoResult ProcessColumnInfo ()
                {
-                       byte precision;
-                       byte scale;
-                       int totalLength = Comm.GetTdsShort ();
-                       int bytesRead = 0;
-
                        TdsPacketColumnInfoResult result = new TdsPacketColumnInfoResult ();
+                       int totalLength = Comm.GetTdsShort ();  
+                       int count = Comm.GetTdsShort ();
+                       for (int i = 0; i < count; i += 1) {
+                               string columnName = Comm.GetString (Comm.GetByte ());
+                               int status = Comm.GetByte ();
+                               bool hidden = (status & 0x01) > 0;
+                               bool isKey = (status & 0x02) > 0;
+                               bool isRowVersion = (status & 0x04) > 0;
+                               bool isUpdatable = (status & 0x10) > 0;
+                               bool allowDBNull = (status & 0x20) > 0;
+                               bool isIdentity = (status & 0x40) > 0;
 
-                       while (bytesRead < totalLength) {
-                               scale = 0;
-                               precision = 0;
+                               Comm.Skip (4); // User type
 
-                               int bufLength = -1;
-                               //int dispSize = -1;
-                               byte[] flagData = new byte[4];
-                               for (int i = 0; i < 4; i += 1) {
-                                       flagData[i] = Comm.GetByte ();
-                                       bytesRead += 1;
-                               }
-                               bool nullable = (flagData[2] & 0x01) > 0;
-                               bool caseSensitive = (flagData[2] & 0x02) > 0;
-                               bool writable = (flagData[2] & 0x0c) > 0;
-                               bool autoIncrement = (flagData[2] & 0x10) > 0;
+                               byte type = Comm.GetByte ();
+                               bool isBlob = (type == 0x24);
 
-                               string tableName = String.Empty;
-                               TdsColumnType columnType = (TdsColumnType) Comm.GetByte ();
+                               TdsColumnType columnType = (TdsColumnType) type;
+                               int bufLength = 0;
 
-                               bytesRead += 1;
+                               byte precision = 0;
+                               byte scale = 0;
 
                                if (columnType == TdsColumnType.Text || columnType == TdsColumnType.Image) {
-                                       Comm.Skip (4);
-                                       bytesRead += 4;
-
-                                       int tableNameLength = Comm.GetTdsShort ();
-                                       bytesRead += 2;
-                                       tableName = Comm.GetString (tableNameLength);
-                                       bytesRead += tableNameLength;
-                                       bufLength = 2 << 31 - 1;
-                               }
-                               else if (columnType == TdsColumnType.Decimal || columnType == TdsColumnType.Numeric) {
-                                       bufLength = Comm.GetByte ();
-                                       bytesRead += 1;
-                                       precision = Comm.GetByte ();
-                                       bytesRead += 1;
-                                       scale = Comm.GetByte ();
-                                       bytesRead += 1;
+                                       bufLength = Comm.GetTdsInt ();
+                                       Comm.Skip (Comm.GetTdsShort ());
                                }
                                else if (IsFixedSizeColumn (columnType))
                                        bufLength = LookupBufferSize (columnType);
-                               else {
-                                       bufLength = (int) Comm.GetByte () & 0xff;
-                                       bytesRead += 1;
+                               else
+                                       bufLength = Comm.GetTdsShort ();
+
+                               if (columnType == TdsColumnType.Decimal || columnType == TdsColumnType.Numeric) {
+                                       precision = Comm.GetByte ();
+                                       scale = Comm.GetByte ();
                                }
 
+                               Comm.Skip (Comm.GetByte ()); // Locale
+                               if (isBlob)
+                                       Comm.Skip (Comm.GetTdsShort ()); // Class ID
+
                                int index = result.Add (new TdsSchemaInfo ());
                                result[index]["NumericPrecision"] = precision;
                                result[index]["NumericScale"] = scale;
                                result[index]["ColumnSize"] = bufLength;
-                               result[index]["ColumnName"] = ColumnNames[index];
-                               result[index]["BaseTableName"] = tableName;
-                               result[index]["AllowDBNull"] = nullable;
-                               result[index]["IsReadOnly"] = !writable;
+                               result[index]["ColumnName"] = columnName;
+                               result[index]["AllowDBNull"] = allowDBNull;
+                               result[index]["IsReadOnly"] = !isUpdatable;
+                               result[index]["IsIdentity"] = isIdentity;
+                               result[index]["IsRowVersion"] = isRowVersion;
+                               result[index]["IsKey"] = isKey;
+                               result[index]["Hidden"] = hidden;
                                result[index]["ColumnType"] = columnType;
                        }
-
-                       //int skipLength = totalLength - bytesRead;
-                       //if (skipLength != 0)
-                               //throw new TdsException ("skipping");
-
                        return result;
                }
 
index 4f2644b757e35769443d0851ec03f9f492fa1601..d230e2a3063bb8a06ffe7127b1fc2b08f211b157 100644 (file)
@@ -29,6 +29,7 @@ namespace Mono.Data.TdsClient.Internal {
                Order = 0xa9,
                Control = 0xae,
                Row = 0xd1,
-               ColumnMetadata = 0x81
+               ColumnMetadata = 0x81,
+               RowFormat = 0xee
        }
 }