From 338595e07f4684b3e48ffaef0696b874682fe764 Mon Sep 17 00:00:00 2001 From: Tommy Schmidt Date: Wed, 24 Sep 2025 14:44:03 +0200 Subject: [PATCH] fix(gh-1162): ensure NitriteId serialization is compatible with previous versions --- .gitignore | 1 + .../java/org/dizitart/no2/NitriteTest.java | 29 +++++++++++++++++- .../src/test/resources/no2-v4.3.0.db | Bin 0 -> 16384 bytes .../dizitart/no2/collection/NitriteId.java | 23 +++++++++----- 4 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 nitrite-mvstore-adapter/src/test/resources/no2-v4.3.0.db diff --git a/.gitignore b/.gitignore index 961d8b013..5acd15145 100644 --- a/.gitignore +++ b/.gitignore @@ -452,6 +452,7 @@ test.log /build !no2-old.db !no2-v3.db +!no2-v4.3.0.db .diffblue infer-out secring.gpg diff --git a/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java b/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java index 1a3d26524..a8b272fcf 100644 --- a/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java +++ b/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java @@ -53,6 +53,7 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -622,7 +623,7 @@ public void run() { log.error("Error in thread", e); } } - }; + } Thread t0 = new Thread(new ThreadRunner()); Thread t1 = new Thread(new ThreadRunner()); @@ -682,6 +683,32 @@ public void testReadOnlyMode() { deleteDb(fileName); } + @Test + public void testIssue1162() throws IOException { + + // setup no2-v4.3.0.db as a temp file + var databasePath = Files.createTempFile("temp-no2-v4.3.0", ".db"); + var templateDb = Objects.requireNonNull(NitriteTest.class.getResourceAsStream("/no2-v4.3.0.db")); + Files.copy(templateDb, databasePath, StandardCopyOption.REPLACE_EXISTING); + + var module = MVStoreModule.withConfig() + .filePath(databasePath.toAbsolutePath().toFile()) + .build(); + + var database = Nitrite.builder() + .loadModule(module) + .openOrCreate(); + + try (database) { + var collection = database.getCollection("myCollection"); + assertEquals(1, collection.size()); + + var firstPerson = collection.find().firstOrNull(); + assertNotNull(firstPerson); + assertEquals(1970829645337976832L, firstPerson.getId().getIdValue()); + } + } + @Data @AllArgsConstructor @NoArgsConstructor diff --git a/nitrite-mvstore-adapter/src/test/resources/no2-v4.3.0.db b/nitrite-mvstore-adapter/src/test/resources/no2-v4.3.0.db new file mode 100644 index 0000000000000000000000000000000000000000..4d32d697e1c204437aba4c0e3cc56c4b3d784fce GIT binary patch literal 16384 zcmeHOS%@4(7_OdU?xDDDea-ar1W95-+>MisW_1aPIM#I6>~_-AJ$BdZ zjt3qO8o>vHnt+HP;)6%TM-K!y_@JN!^5TPt@dyfv;F}L3_*eIw$(Y@TXb9BoPW?SK z_5W4%)n9*CeO)tMR5BIEGmo_8oc$;%%912y%*BR#q$p=hhhUdUpI}O?qHGv?rDEt+ z#mrPazlLd1%`6c=usv3+>JVx!62GWwx}xctK8E;2oOK?#y<}<$M(V_-t0;HT}YK087Yj8%O=b67tnouA^J+mn5 zR`rHU_=3{|u?J&+qnLok)03`EeVdYUKs}$7ZMW*BKS`YY9VG)F-R}7dqGdm7Q|wdG z^%T+c9EX?`&LxPmk>W1TY}ANL8I%W7Gu1dkO&@JJjF+(3ptd8HZ1)JUrg5;i7uU6w z*#}b2%3m=g97N;TG)WNb^DW|o&c?1zt8{Ysn^T`{e&|db#df1H$HUfcY(hI{&?sH> zNwDZSR)P79Fj)4`79UtPd?a*j*4yp1ZL1`E$pi(1<-K zxrChtf$CG;LbHuph4{~&Jbvx?%iljAgC5lp5?*=iqbD;IO@v6zN2fC=+OT(ijzKr2 zi14Rq6s>PT+9{IML|K$5S{J}6jv8*|L%X6LhwYkiDOn)?rXOE_^UtS`7NBV}?WR49 zoIkl@6BCT1YpdD?}LYn zJ3E&x|FmBDZqsW=Z@VLo;xlMGAPa0F?8U*68Ss+m)7+w6rH9Z+>tjHXe5j|!uJx%4 ztWVBGCZI{s`VH{Drs22Mqq)^pzp!x~_5I7+b||kJwB^Sr1sxRE*1@)o>+_{!2VT1E z4sgr9i3ro?)`6DT`KLhKPXG@eyR-x!tM|W^$$WA6H?UCxAAZC&DViD#MW{X1r#(3b z3en(bYpro|)^n>c5tu4@PWff-u}{Yt2tLZL*#y)5@VYl%erMOg$0Oa`MRa#m0_d+v z?`@CAQ#7#y3g^C{9r-ob+PCcDibHyhsb}B+=)Icvc6&q- z3xVNW9SPG3@D-kS5ez6wddn{HDY_uGbnYEi8NviwC+oR_F6*jZP_+U@iAKY=D4H}a z$dd|cHm6B?R;wsx7OSe7RV*p57Ak5^!B8ya;DDBEo@G~UGQglwud{%e_+w%v&LZ8w z+wo~0?81cv4|bh9(SY#EgB=fmgKq-eU^ghdtTEnI3OSOmLV(Nb7-zLA)*#+lI4faG zRt&=;RUKBitHrxQE8hJudMW|&u5ZDY{+!1-9_L`g*c0b@oD26}d{GA*D2BvE7q;Cv zH_^M1yjXxUx(m7-HuHMLtiXa!mb03o;w)AqlFccWqR0iKAnADZ0M}a32`AFWlL-Nt zUA`np{~fy$X%!))RbZ!q1d2w0y_&_qsdUJTFk-Ro@EoBZ?|SC=i4Q-}7zI>cW@D9V zaWkOWHzu&?4XF&_zoarod#H>dw#<&byHOcR3Ml<>YanhKz#g2>Z_QZH55{aQgxtZf zZOt>nsGmuh1D*kRCFu24C@mYhR8Wk(mQz*T(DMaVX{O)3B0068aPS$g2Ao>Lg^>pz z*yAm_H|+A@GG1nTp+Oy{XteB;C7b<%spBiF5nZcuaLflsJNqdxyar~E#SNf5L;5cJ ze^Y459)fI$wd4X$Z7_ud&=Zi!{rO z4|}{fEN<>E#l9~?WmorScUj?$;TOFY!lK1a?cJiG>FyV8(_w47*)1+Fv|H@88@9h& z?qAw3XhL341x3h#ce-1y8v%}Vm{ld())1rDML7~mB-BV~k;n=1SVX@Yl1ZXVNhugg z>(Z1YJ-XBik|DJ&NnTc, Serializable { private static final SnowflakeIdGenerator generator = new SnowflakeIdGenerator(); /** The underlying value of the NitriteId. */ - private long idValue; + /* WARNING(gh-1162): naming it idValue breaks java serialization for databases created with earlier version of nitrite + * and marking it transient introduces side effects for @EqualsAndHashCode */ + private long _idValue; private NitriteId() { - this.idValue = generator.getId(); + this._idValue = generator.getId(); } private NitriteId(String value) { - this.idValue = Long.parseLong(value); + this._idValue = Long.parseLong(value); } private NitriteId(long value) { - this.idValue = value; + this._idValue = value; } /** @@ -115,21 +118,25 @@ public static boolean validId(Object value) { } } + public long getIdValue() { + return _idValue; + } + @Override public int compareTo(NitriteId other) { - return Long.compare(idValue, other.idValue); + return Long.compare(_idValue, other._idValue); } @Override public String toString() { - return ID_PREFIX + idValue + ID_SUFFIX; + return ID_PREFIX + _idValue + ID_SUFFIX; } private void writeObject(ObjectOutputStream stream) throws IOException { - stream.writeUTF(Long.toString(idValue)); + stream.writeUTF(Long.toString(_idValue)); } private void readObject(ObjectInputStream stream) throws IOException { - idValue = Long.parseLong(stream.readUTF()); + _idValue = Long.parseLong(stream.readUTF()); } }