Skip to content

Commit 9b819c4

Browse files
committed
Better (maybe?) check for GUID.
1 parent 9dd26a0 commit 9b819c4

File tree

6 files changed

+79
-19
lines changed

6 files changed

+79
-19
lines changed

src/FirebirdSql.Data.FirebirdClient/Client/Managed/IXdrReader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ interface IXdrReader
5656
long ReadInt64();
5757
ValueTask<long> ReadInt64Async(CancellationToken cancellationToken = default);
5858

59-
Guid ReadGuid();
60-
ValueTask<Guid> ReadGuidAsync(CancellationToken cancellationToken = default);
59+
Guid ReadGuid(int sqlType);
60+
ValueTask<Guid> ReadGuidAsync(int sqlType, CancellationToken cancellationToken = default);
6161

6262
float ReadSingle();
6363
ValueTask<float> ReadSingleAsync(CancellationToken cancellationToken = default);

src/FirebirdSql.Data.FirebirdClient/Client/Managed/IXdrWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ interface IXdrWriter
7676
void Write(DateTime value);
7777
ValueTask WriteAsync(DateTime value, CancellationToken cancellationToken = default);
7878

79-
void Write(Guid value);
80-
ValueTask WriteAsync(Guid value, CancellationToken cancellationToken = default);
79+
void Write(Guid value, int sqlType);
80+
ValueTask WriteAsync(Guid value, int sqlType, CancellationToken cancellationToken = default);
8181

8282
void Write(FbDecFloat value, int size);
8383
ValueTask WriteAsync(FbDecFloat value, int size, CancellationToken cancellationToken = default);

src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,7 +1304,7 @@ protected void WriteRawParameter(IXdrWriter xdr, DbField field)
13041304
break;
13051305

13061306
case DbDataType.Guid:
1307-
xdr.Write(field.DbValue.GetGuid());
1307+
xdr.Write(field.DbValue.GetGuid(), field.SqlType);
13081308
break;
13091309

13101310
case DbDataType.Double:
@@ -1452,7 +1452,7 @@ protected async ValueTask WriteRawParameterAsync(IXdrWriter xdr, DbField field,
14521452
break;
14531453

14541454
case DbDataType.Guid:
1455-
await xdr.WriteAsync(field.DbValue.GetGuid(), cancellationToken).ConfigureAwait(false);
1455+
await xdr.WriteAsync(field.DbValue.GetGuid(), field.SqlType, cancellationToken).ConfigureAwait(false);
14561456
break;
14571457

14581458
case DbDataType.Double:
@@ -1573,7 +1573,7 @@ protected object ReadRawValue(IXdrReader xdr, DbField field)
15731573
return xdr.ReadSingle();
15741574

15751575
case DbDataType.Guid:
1576-
return xdr.ReadGuid();
1576+
return xdr.ReadGuid(field.SqlType);
15771577

15781578
case DbDataType.Double:
15791579
return xdr.ReadDouble();
@@ -1670,7 +1670,7 @@ protected async ValueTask<object> ReadRawValueAsync(IXdrReader xdr, DbField fiel
16701670
return await xdr.ReadSingleAsync(cancellationToken).ConfigureAwait(false);
16711671

16721672
case DbDataType.Guid:
1673-
return await xdr.ReadGuidAsync(cancellationToken).ConfigureAwait(false);
1673+
return await xdr.ReadGuidAsync(field.SqlType, cancellationToken).ConfigureAwait(false);
16741674

16751675
case DbDataType.Double:
16761676
return await xdr.ReadDoubleAsync(cancellationToken).ConfigureAwait(false);

src/FirebirdSql.Data.FirebirdClient/Client/Managed/XdrReaderWriter.cs

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,27 @@ public async ValueTask<long> ReadInt64Async(CancellationToken cancellationToken
184184
return TypeDecoder.DecodeInt64(_smallBuffer);
185185
}
186186

187-
public Guid ReadGuid()
187+
public Guid ReadGuid(int sqlType)
188188
{
189-
return TypeDecoder.DecodeGuid(ReadOpaque(16));
189+
if (sqlType == IscCodes.SQL_VARYING)
190+
{
191+
return TypeDecoder.DecodeGuid(ReadBuffer());
192+
}
193+
else
194+
{
195+
return TypeDecoder.DecodeGuid(ReadOpaque(16));
196+
}
190197
}
191-
public async ValueTask<Guid> ReadGuidAsync(CancellationToken cancellationToken = default)
198+
public async ValueTask<Guid> ReadGuidAsync(int sqlType, CancellationToken cancellationToken = default)
192199
{
193-
return TypeDecoder.DecodeGuid(await ReadOpaqueAsync(16, cancellationToken).ConfigureAwait(false));
200+
if (sqlType == IscCodes.SQL_VARYING)
201+
{
202+
return TypeDecoder.DecodeGuid(await ReadBufferAsync(cancellationToken).ConfigureAwait(false));
203+
}
204+
else
205+
{
206+
return TypeDecoder.DecodeGuid(await ReadOpaqueAsync(16, cancellationToken).ConfigureAwait(false));
207+
}
194208
}
195209

196210
public float ReadSingle()
@@ -719,13 +733,29 @@ public async ValueTask WriteAsync(DateTime value, CancellationToken cancellation
719733
await WriteTimeAsync(TypeHelper.DateTimeTimeToTimeSpan(value), cancellationToken).ConfigureAwait(false);
720734
}
721735

722-
public void Write(Guid value)
736+
public void Write(Guid value, int sqlType)
723737
{
724-
WriteOpaque(TypeEncoder.EncodeGuid(value));
738+
var bytes = TypeEncoder.EncodeGuid(value);
739+
if (sqlType == IscCodes.SQL_VARYING)
740+
{
741+
WriteBuffer(bytes);
742+
}
743+
else
744+
{
745+
WriteOpaque(bytes);
746+
}
725747
}
726-
public ValueTask WriteAsync(Guid value, CancellationToken cancellationToken = default)
748+
public ValueTask WriteAsync(Guid value, int sqlType, CancellationToken cancellationToken = default)
727749
{
728-
return WriteOpaqueAsync(TypeEncoder.EncodeGuid(value), cancellationToken);
750+
var bytes = TypeEncoder.EncodeGuid(value);
751+
if (sqlType == IscCodes.SQL_VARYING)
752+
{
753+
return WriteBufferAsync(bytes, cancellationToken);
754+
}
755+
else
756+
{
757+
return WriteOpaqueAsync(bytes, cancellationToken);
758+
}
729759
}
730760

731761
public void Write(FbDecFloat value, int size)

src/FirebirdSql.Data.FirebirdClient/Common/DbValue.cs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,22 @@ public byte[] GetBytes()
477477
}
478478

479479
case DbDataType.Guid:
480-
return TypeEncoder.EncodeGuid(GetGuid());
480+
{
481+
var bytes = TypeEncoder.EncodeGuid(GetGuid());
482+
byte[] buffer;
483+
if (Field.SqlType == IscCodes.SQL_VARYING)
484+
{
485+
buffer = new byte[bytes.Length + 2];
486+
Buffer.BlockCopy(BitConverter.GetBytes((short)bytes.Length), 0, buffer, 0, 2);
487+
Buffer.BlockCopy(bytes, 0, buffer, 2, bytes.Length);
488+
}
489+
else
490+
{
491+
buffer = new byte[bytes.Length];
492+
Buffer.BlockCopy(bytes, 0, buffer, 0, bytes.Length);
493+
}
494+
return buffer;
495+
}
481496

482497
case DbDataType.Boolean:
483498
return BitConverter.GetBytes(GetBoolean());
@@ -677,7 +692,22 @@ public async ValueTask<byte[]> GetBytesAsync(CancellationToken cancellationToken
677692
}
678693

679694
case DbDataType.Guid:
680-
return TypeEncoder.EncodeGuid(GetGuid());
695+
{
696+
var bytes = TypeEncoder.EncodeGuid(GetGuid());
697+
byte[] buffer;
698+
if (Field.SqlType == IscCodes.SQL_VARYING)
699+
{
700+
buffer = new byte[bytes.Length + 2];
701+
Buffer.BlockCopy(BitConverter.GetBytes((short)bytes.Length), 0, buffer, 0, 2);
702+
Buffer.BlockCopy(bytes, 0, buffer, 2, bytes.Length);
703+
}
704+
else
705+
{
706+
buffer = new byte[bytes.Length];
707+
Buffer.BlockCopy(bytes, 0, buffer, 0, bytes.Length);
708+
}
709+
return buffer;
710+
}
681711

682712
case DbDataType.Boolean:
683713
return BitConverter.GetBytes(GetBoolean());

src/FirebirdSql.Data.FirebirdClient/Common/TypeHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ public static DbDataType GetDbDataTypeFromBlrType(int type, int subType, int sca
625625
public static DbDataType GetDbDataTypeFromSqlType(int type, int subType, int scale, int? length = null, Charset charset = null)
626626
{
627627
// Special case for Guid handling
628-
if (type == IscCodes.SQL_TEXT && length == 16 && (charset?.IsOctetsCharset ?? false))
628+
if ((type == IscCodes.SQL_TEXT || type == IscCodes.SQL_VARYING) && length == 16 && (charset?.IsOctetsCharset ?? false))
629629
{
630630
return DbDataType.Guid;
631631
}

0 commit comments

Comments
 (0)