bool isDoneInProc;
ArrayList outputParameters = new ArrayList ();
- TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
+ protected TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
int recordsAffected = 0;
return result;
}
- private int GetSubPacketLength ()
+ protected int GetSubPacketLength ()
{
return comm.GetTdsShort ();
}
}
}
- private TdsPacketRowResult LoadRow ()
+ protected TdsPacketRowResult LoadRow ()
{
TdsPacketRowResult result = new TdsPacketRowResult ();
protected abstract TdsPacketColumnInfoResult ProcessColumnInfo ();
- private TdsPacketColumnNamesResult ProcessColumnNames ()
+ protected TdsPacketColumnNamesResult ProcessColumnNames ()
{
TdsPacketColumnNamesResult result = new TdsPacketColumnNamesResult ();
}
[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 ();
return result;
}
- private TdsPacketResult ProcessEnvChange ()
+ protected TdsPacketResult ProcessEnvChange ()
{
int len = GetSubPacketLength ();
TdsEnvPacketSubType type = (TdsEnvPacketSubType) comm.GetByte ();
return new TdsPacketResult (TdsPacketSubType.EnvChange);
}
- private TdsPacketResult ProcessLoginAck ()
+ protected TdsPacketResult ProcessLoginAck ()
{
GetSubPacketLength ();
TdsInfoMessage (this, e);
messages.Clear ();
}
-
- private void ProcessMessage (TdsPacketSubType subType)
+
+ protected void ProcessMessage (TdsPacketSubType subType)
{
GetSubPacketLength ();
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);
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;
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:
return result;
}
- private TdsPacketTableNameResult ProcessTableName ()
+ protected TdsPacketTableNameResult ProcessTableName ()
{
TdsPacketTableNameResult result = new TdsPacketTableNameResult ();
int totalLength = comm.GetTdsShort ();
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;
}
Order = 0xa9,
Control = 0xae,
Row = 0xd1,
- ColumnMetadata = 0x81
+ ColumnMetadata = 0x81,
+ RowFormat = 0xee
}
}
+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:
bool isDoneInProc;
ArrayList outputParameters = new ArrayList ();
- TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
+ protected TdsInternalErrorCollection messages = new TdsInternalErrorCollection ();
int recordsAffected = 0;
return result;
}
- private int GetSubPacketLength ()
+ protected int GetSubPacketLength ()
{
return comm.GetTdsShort ();
}
}
}
- private TdsPacketRowResult LoadRow ()
+ protected TdsPacketRowResult LoadRow ()
{
TdsPacketRowResult result = new TdsPacketRowResult ();
protected abstract TdsPacketColumnInfoResult ProcessColumnInfo ();
- private TdsPacketColumnNamesResult ProcessColumnNames ()
+ protected TdsPacketColumnNamesResult ProcessColumnNames ()
{
TdsPacketColumnNamesResult result = new TdsPacketColumnNamesResult ();
}
[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 ();
return result;
}
- private TdsPacketResult ProcessEnvChange ()
+ protected TdsPacketResult ProcessEnvChange ()
{
int len = GetSubPacketLength ();
TdsEnvPacketSubType type = (TdsEnvPacketSubType) comm.GetByte ();
return new TdsPacketResult (TdsPacketSubType.EnvChange);
}
- private TdsPacketResult ProcessLoginAck ()
+ protected TdsPacketResult ProcessLoginAck ()
{
GetSubPacketLength ();
TdsInfoMessage (this, e);
messages.Clear ();
}
-
- private void ProcessMessage (TdsPacketSubType subType)
+
+ protected void ProcessMessage (TdsPacketSubType subType)
{
GetSubPacketLength ();
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);
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;
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:
return result;
}
- private TdsPacketTableNameResult ProcessTableName ()
+ protected TdsPacketTableNameResult ProcessTableName ()
{
TdsPacketTableNameResult result = new TdsPacketTableNameResult ();
int totalLength = comm.GetTdsShort ();
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;
}
Order = 0xa9,
Control = 0xae,
Row = 0xd1,
- ColumnMetadata = 0x81
+ ColumnMetadata = 0x81,
+ RowFormat = 0xee
}
}