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 000000000..4d32d697e Binary files /dev/null and b/nitrite-mvstore-adapter/src/test/resources/no2-v4.3.0.db differ diff --git a/nitrite/src/main/java/org/dizitart/no2/collection/NitriteId.java b/nitrite/src/main/java/org/dizitart/no2/collection/NitriteId.java index 1a13b5352..63d6208d0 100644 --- a/nitrite/src/main/java/org/dizitart/no2/collection/NitriteId.java +++ b/nitrite/src/main/java/org/dizitart/no2/collection/NitriteId.java @@ -18,6 +18,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; + import org.dizitart.no2.exceptions.InvalidIdException; import java.io.IOException; @@ -48,18 +49,20 @@ public final class NitriteId implements Comparable, 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()); } }