Skip to content

Commit 4fb3c2e

Browse files
authored
Merge pull request #161 from anat0li/master
Add support for TDS_ROWFMT
2 parents 5fe3eca + fd29700 commit 4fb3c2e

File tree

3 files changed

+70
-11
lines changed

3 files changed

+70
-11
lines changed

src/AdoNetCore.AseClient/Internal/FormatItem.cs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,30 @@ public static FormatItem CreateForParameter(AseParameter parameter, DbEnvironmen
123123

124124
public static FormatItem ReadForRow(Stream stream, Encoding enc, TokenType srcTokenType)
125125
{
126-
var format = new FormatItem
126+
FormatItem format;
127+
switch (srcTokenType)
127128
{
128-
ColumnLabel = stream.ReadByteLengthPrefixedString(enc),
129-
CatalogName = stream.ReadByteLengthPrefixedString(enc),
130-
SchemaName = stream.ReadByteLengthPrefixedString(enc),
131-
TableName = stream.ReadByteLengthPrefixedString(enc),
132-
ColumnName = stream.ReadByteLengthPrefixedString(enc),
133-
RowStatus = (RowFormatItemStatus)(srcTokenType == TokenType.TDS_ROWFMT
134-
? (uint)stream.ReadByte()
135-
: stream.ReadUInt())
136-
};
137-
129+
case TokenType.TDS_ROWFMT:
130+
format = new FormatItem
131+
{
132+
ColumnName = stream.ReadByteLengthPrefixedString(enc),
133+
RowStatus = (RowFormatItemStatus)stream.ReadByte()
134+
};
135+
break;
136+
case TokenType.TDS_ROWFMT2:
137+
format = new FormatItem
138+
{
139+
ColumnLabel = stream.ReadByteLengthPrefixedString(enc),
140+
CatalogName = stream.ReadByteLengthPrefixedString(enc),
141+
SchemaName = stream.ReadByteLengthPrefixedString(enc),
142+
TableName = stream.ReadByteLengthPrefixedString(enc),
143+
ColumnName = stream.ReadByteLengthPrefixedString(enc),
144+
RowStatus = (RowFormatItemStatus)stream.ReadUInt()
145+
};
146+
break;
147+
default:
148+
throw new ArgumentException($"Unexpected token type: {srcTokenType}.", nameof(srcTokenType));
149+
}
138150
ReadTypeInfo(format, stream, enc);
139151

140152
Logger.Instance?.WriteLine($" <- {format.ColumnName}: {format.DataType} (len: {format.Length}) (ut:{format.UserType}) (status:{format.RowStatus}) (loc:{format.LocaleInfo}) format names available: ColumnLabel [{format.ColumnLabel}], ColumnName [{format.ColumnName}], CatalogName [{format.CatalogName}], ParameterName [{format.ParameterName}], SchemaName [{format.SchemaName}], TableName [{format.TableName}]");

src/AdoNetCore.AseClient/Internal/TokenReader.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public IEnumerable<IToken> Read(TokenReceiveStream stream, DbEnvironment env)
6262
{TokenType.TDS_RETURNSTATUS, ReturnStatusToken.Create },
6363
{TokenType.TDS_DONEINPROC, DoneInProcToken.Create },
6464
{TokenType.TDS_DONEPROC, DoneProcToken.Create },
65+
{TokenType.TDS_ROWFMT, RowFormatToken.Create },
6566
{TokenType.TDS_ROWFMT2, RowFormat2Token.Create },
6667
{TokenType.TDS_CONTROL, ControlToken.Create },
6768
{TokenType.TDS_ROW, RowToken.Create },
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using AdoNetCore.AseClient.Enum;
5+
using AdoNetCore.AseClient.Interface;
6+
using AdoNetCore.AseClient.Internal;
7+
8+
namespace AdoNetCore.AseClient.Token
9+
{
10+
internal class RowFormatToken : IFormatToken
11+
{
12+
public TokenType Type => TokenType.TDS_ROWFMT;
13+
14+
public void Write(Stream stream, DbEnvironment env)
15+
{
16+
throw new NotImplementedException();
17+
}
18+
19+
public void Read(Stream stream, DbEnvironment env, IFormatToken previousFormatToken)
20+
{
21+
Logger.Instance?.WriteLine($"<- {Type}");
22+
var remainingLength = stream.ReadUShort();
23+
using (var ts = new ReadablePartialStream(stream, remainingLength))
24+
{
25+
var formats = new List<FormatItem>();
26+
var columnCount = ts.ReadUShort();
27+
28+
for (var i = 0; i < columnCount; i++)
29+
{
30+
formats.Add(FormatItem.ReadForRow(ts, env.Encoding, Type));
31+
}
32+
33+
Formats = formats.ToArray();
34+
}
35+
}
36+
37+
public static RowFormatToken Create(Stream stream, DbEnvironment env, IFormatToken previous)
38+
{
39+
var t = new RowFormatToken();
40+
t.Read(stream, env, previous);
41+
return t;
42+
}
43+
44+
public FormatItem[] Formats { get; set; }
45+
}
46+
}

0 commit comments

Comments
 (0)