Skip to content

Commit 90b5814

Browse files
author
Mark
committed
fixed VPack parsing (arrays of specific length)
1 parent 311ba46 commit 90b5814

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

ChangeLog

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ v4.1.10 (2017-02-xx)
66
* added support serializing collections with null elements
77
* added support serializing non-generic classes that extend collections
88
* added support serializing/deserializing byte and Byte
9-
* fixed serialization of additionalFields for objects and maps
109
* added default value "root" for user
10+
* fixed serialization of additionalFields for objects and maps
11+
* fixed VPack parsing (arrays of specific length)
1112

1213
v4.1.9 (2017-02-10)
1314
---------------------------

src/main/java/com/arangodb/velocypack/VPackBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -912,17 +912,17 @@ private VPackBuilder closeArray(final int tos, final List<Integer> in) {
912912
final int offsetSize;
913913
// can be 1, 2, 4 or 8 for the byte width of the offsets,
914914
// the byte length and the number of subvalues:
915-
if ((size - 1 - tos) + (needIndexTable ? n : 0) - (needNrSubs ? 6 : 7) <= 0xff) {
915+
if ((size - tos) + (needIndexTable ? n : 0) - (needNrSubs ? 6 : 7) <= 0xff) {
916916
// We have so far used _pos - tos bytes, including the reserved 8
917917
// bytes for byte length and number of subvalues. In the 1-byte
918918
// number
919919
// case we would win back 6 bytes but would need one byte per
920920
// subvalue
921921
// for the index table
922922
offsetSize = 1;
923-
} else if ((size - 1 - tos) + (needIndexTable ? 2 * n : 0) <= 0xffff) {
923+
} else if ((size - tos) + (needIndexTable ? 2 * n : 0) <= 0xffff) {
924924
offsetSize = 2;
925-
} else if (((size - 1 - tos) / 2) + ((needIndexTable ? 4 * n : 0) / 2) <= Integer.MAX_VALUE/* 0xffffffffu */) {
925+
} else if (((size - tos) / 2) + ((needIndexTable ? 4 * n : 0) / 2) <= Integer.MAX_VALUE/* 0xffffffffu */) {
926926
offsetSize = 4;
927927
} else {
928928
offsetSize = 8;

src/test/java/com/arangodb/velocypack/VPackBuilderTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,4 +953,35 @@ public void objectWithByteSizeOver65536() {
953953
assertThat(vpack.get(foo).get(bar2).getLength(), is(0));
954954
}
955955

956+
@Test
957+
public void nestedArray() {
958+
//@formatter:off
959+
final VPackSlice s = new VPackBuilder()
960+
.add(ValueType.OBJECT)
961+
.add("dddddddddddddd", ValueType.ARRAY)
962+
.add(ValueType.OBJECT)
963+
.add("dddddddddddddd", ValueType.OBJECT)
964+
.add("ddddddd",6)
965+
.close()
966+
.close()
967+
.add(ValueType.OBJECT)
968+
.add("ddddddddddddddddd","dddddddddddddddddddddd")
969+
.close()
970+
.add(ValueType.OBJECT)
971+
.add("ddddddddddddddddddddddddd", ValueType.ARRAY).close()
972+
.add("ddddddddddddddddda","dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
973+
.add("dddddddddddddddddb","")
974+
.add("dddddddddddddddddc",ValueType.ARRAY).close()
975+
.add("ddddddddddddddd",-1)
976+
.close()
977+
.close()
978+
.add("dddddddddd",0)
979+
.close().slice();
980+
//@formatter:on
981+
assertThat(s.isObject(), is(true));
982+
assertThat(s.get("dddddddddddddd").isArray(), is(true));
983+
assertThat(s.get("dddddddddddddd").size(), is(3));
984+
assertThat(s.get("dddddddddddddd").get(2).isObject(), is(true));
985+
}
986+
956987
}

0 commit comments

Comments
 (0)