Skip to content

Commit 5051b06

Browse files
committed
Fix unpacking of VersionStamps in tuple (when using the boxed API)
1 parent cc3193f commit 5051b06

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

FoundationDB.Client/Layers/Tuples/Encoding/TuplePackers.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,8 @@ public static object DeserializeBoxed(Slice slice)
846846
case TupleTypes.Decimal: return TupleParser.ParseDecimal(slice);
847847
case TupleTypes.Uuid128: return TupleParser.ParseGuid(slice);
848848
case TupleTypes.Uuid64: return TupleParser.ParseUuid64(slice);
849+
case TupleTypes.VersionStamp80: return TupleParser.ParseVersionStamp(slice);
850+
case TupleTypes.VersionStamp96: return TupleParser.ParseVersionStamp(slice);
849851
}
850852
}
851853

FoundationDB.Client/Layers/Tuples/Encoding/TupleParser.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,7 @@ internal static Slice UnescapeByteStringSlow([NotNull] byte[] buffer, int offset
877877
}
878878

879879
/// <summary>Parse a tuple segment containing a byte array</summary>
880+
[Pure]
880881
public static Slice ParseBytes(Slice slice)
881882
{
882883
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Bytes && slice[-1] == 0);
@@ -888,6 +889,7 @@ public static Slice ParseBytes(Slice slice)
888889
}
889890

890891
/// <summary>Parse a tuple segment containing an ASCII string stored as a byte array</summary>
892+
[Pure]
891893
public static string ParseAscii(Slice slice)
892894
{
893895
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Bytes && slice[-1] == 0);
@@ -900,6 +902,7 @@ public static string ParseAscii(Slice slice)
900902
}
901903

902904
/// <summary>Parse a tuple segment containing a unicode string</summary>
905+
[Pure]
903906
public static string ParseUnicode(Slice slice)
904907
{
905908
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Utf8 && slice[-1] == 0);
@@ -911,6 +914,7 @@ public static string ParseUnicode(Slice slice)
911914
}
912915

913916
/// <summary>Parse a tuple segment containing an embedded tuple</summary>
917+
[Pure]
914918
public static ITuple ParseTuple(Slice slice)
915919
{
916920
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.TupleStart && slice[-1] == 0);
@@ -920,6 +924,7 @@ public static ITuple ParseTuple(Slice slice)
920924
}
921925

922926
/// <summary>Parse a tuple segment containing a single precision number (float32)</summary>
927+
[Pure]
923928
public static float ParseSingle(Slice slice)
924929
{
925930
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Single);
@@ -950,6 +955,7 @@ public static float ParseSingle(Slice slice)
950955
}
951956

952957
/// <summary>Parse a tuple segment containing a double precision number (float64)</summary>
958+
[Pure]
953959
public static double ParseDouble(Slice slice)
954960
{
955961
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Double);
@@ -981,6 +987,7 @@ public static double ParseDouble(Slice slice)
981987
}
982988

983989
/// <summary>Parse a tuple segment containing a quadruple precision number (float128)</summary>
990+
[Pure]
984991
public static decimal ParseDecimal(Slice slice)
985992
{
986993
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Decimal);
@@ -994,6 +1001,7 @@ public static decimal ParseDecimal(Slice slice)
9941001
}
9951002

9961003
/// <summary>Parse a tuple segment containing a 128-bit GUID</summary>
1004+
[Pure]
9971005
public static Guid ParseGuid(Slice slice)
9981006
{
9991007
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Uuid128);
@@ -1008,6 +1016,7 @@ public static Guid ParseGuid(Slice slice)
10081016
}
10091017

10101018
/// <summary>Parse a tuple segment containing a 128-bit UUID</summary>
1019+
[Pure]
10111020
public static Uuid128 ParseUuid128(Slice slice)
10121021
{
10131022
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Uuid128);
@@ -1021,6 +1030,7 @@ public static Uuid128 ParseUuid128(Slice slice)
10211030
}
10221031

10231032
/// <summary>Parse a tuple segment containing a 64-bit UUID</summary>
1033+
[Pure]
10241034
public static Uuid64 ParseUuid64(Slice slice)
10251035
{
10261036
Contract.Requires(slice.HasValue && slice[0] == TupleTypes.Uuid64);
@@ -1033,6 +1043,20 @@ public static Uuid64 ParseUuid64(Slice slice)
10331043
return Uuid64.Read(slice.Substring(1, 8));
10341044
}
10351045

1046+
/// <summary>Parse a tuple segment containing an 80-bit or 96-bit VersionStamp</summary>
1047+
[Pure]
1048+
public static VersionStamp ParseVersionStamp(Slice slice)
1049+
{
1050+
Contract.Requires(slice.HasValue && (slice[0] == TupleTypes.VersionStamp80 || slice[0] == TupleTypes.VersionStamp96));
1051+
1052+
if (slice.Count != 11 && slice.Count != 13)
1053+
{
1054+
throw new FormatException("Slice has invalid size for a VersionStamp");
1055+
}
1056+
1057+
return VersionStamp.Parse(slice.Substring(1));
1058+
}
1059+
10361060
#endregion
10371061

10381062
#region Parsing...

0 commit comments

Comments
 (0)