From ed8fa0bc1dd49f6833d6b3adecd4219f5315155e Mon Sep 17 00:00:00 2001 From: hg-ms <53219833+hg-ms@users.noreply.github.com> Date: Fri, 13 Feb 2026 08:50:52 +0100 Subject: [PATCH 1/2] Fix for issue #234 - Extended BinaryHandlerSqlTimestamp to store nanos - added BinaryLegacyTypeHandlerSqlTimestamp --- .../java/sql/BinaryHandlerSqlTimestamp.java | 30 +++++------ .../BinaryLegacyTypeHandlerSqlTimestamp.java | 52 +++++++++++++++++++ .../binary/types/BinaryPersistence.java | 9 ++-- 3 files changed, 72 insertions(+), 19 deletions(-) create mode 100644 persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryHandlerSqlTimestamp.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryHandlerSqlTimestamp.java index 03907932..f23eef73 100644 --- a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryHandlerSqlTimestamp.java +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryHandlerSqlTimestamp.java @@ -48,7 +48,8 @@ public static BinaryHandlerSqlTimestamp New() super( Timestamp.class, CustomFields( - CustomField(long.class, "timestamp") + CustomField(long.class, "date"), + CustomField(int.class, "nanos") ) ); } @@ -59,16 +60,6 @@ public static BinaryHandlerSqlTimestamp New() // methods // //////////// - private static long instanceState(final Timestamp instance) - { - return instance.getTime(); - } - - private static long binaryState(final Binary data) - { - return data.read_long(0); - } - @Override public final void store( final Binary data , @@ -77,22 +68,29 @@ public final void store( final PersistenceStoreHandler handler ) { - data.storeEntityHeader(Long.BYTES, this.typeId(), objectId); + data.storeEntityHeader(Long.BYTES + Integer.BYTES, this.typeId(), objectId); - // the data content of a date is simple the timestamp long, nothing else - data.store_long(instanceState(instance)); + data.store_long(instance.getTime()); + data.store_int(Long.BYTES, instance.getNanos()); } @Override public final Timestamp create(final Binary data, final PersistenceLoadHandler handler) { - return new Timestamp(binaryState(data)); + long date = data.read_long(0); + int nanos = data.read_int(Long.BYTES); + Timestamp ts = new Timestamp(date); + ts.setNanos(nanos); + return ts; } @Override public final void updateState(final Binary data, final Timestamp instance, final PersistenceLoadHandler handler) { - instance.setTime(binaryState(data)); + long date = data.read_long(0); + int nanos = data.read_int(Long.BYTES); + instance.setTime(date); + instance.setNanos(nanos); } } diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java new file mode 100644 index 00000000..95d51778 --- /dev/null +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java @@ -0,0 +1,52 @@ +package org.eclipse.serializer.persistence.binary.java.sql; + +import java.sql.Timestamp; + +import org.eclipse.serializer.persistence.binary.types.Binary; +import org.eclipse.serializer.persistence.binary.types.BinaryLegacyTypeHandler; +import org.eclipse.serializer.persistence.types.PersistenceLoadHandler; +import org.eclipse.serializer.persistence.types.PersistenceReferenceLoader; + +public class BinaryLegacyTypeHandlerSqlTimestamp extends BinaryLegacyTypeHandler.AbstractCustom +{ + /////////////////////////////////////////////////////////////////////////// + // static methods // + /////////////////// + + public static BinaryLegacyTypeHandlerSqlTimestamp New() + { + return new BinaryLegacyTypeHandlerSqlTimestamp(); + } + + + /////////////////////////////////////////////////////////////////////////// + // constructors // + ///////////////// + + public BinaryLegacyTypeHandlerSqlTimestamp() + { + super( + Timestamp.class, + CustomFields( + CustomField(long.class, "timestamp") + )); + } + + @Override + public void iterateLoadableReferences(Binary data, PersistenceReferenceLoader iterator) + { + //no-op + } + + @Override + public Timestamp create(Binary data, PersistenceLoadHandler handler) + { + return new Timestamp(data.read_long(0)); + } + + @Override + public void updateState(Binary data, Timestamp instance, PersistenceLoadHandler handler) + { + instance.setTime(data.read_long(0)); + } +} diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java index c0805ff2..4998b4ce 100644 --- a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java @@ -63,6 +63,7 @@ import org.eclipse.serializer.persistence.binary.java.sql.BinaryHandlerSqlDate; import org.eclipse.serializer.persistence.binary.java.sql.BinaryHandlerSqlTime; import org.eclipse.serializer.persistence.binary.java.sql.BinaryHandlerSqlTimestamp; +import org.eclipse.serializer.persistence.binary.java.sql.BinaryLegacyTypeHandlerSqlTimestamp; import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerLocalDate; import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerMonthDay; import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerPeriod; @@ -180,7 +181,9 @@ public static final PersistenceCustomTypeHandlerRegistry createDefaultCu .registerTypeHandlers(platformDependentHandlers()) .registerTypeHandlers(customHandlers) ; - + + defaultCustomTypeHandlerRegistry.registerLegacyTypeHandler(BinaryLegacyTypeHandlerSqlTimestamp.New()); + return defaultCustomTypeHandlerRegistry; } @@ -265,8 +268,8 @@ static final void initializeNativeTypeId( // non-nonsensical handlers required for confused developers BinaryHandlerSqlDate.New() , - BinaryHandlerSqlTime.New() , - BinaryHandlerSqlTimestamp.New(), + BinaryHandlerSqlTime.New() , + BinaryHandlerSqlTimestamp.New(), BinaryHandlerOptionalInt.New(), BinaryHandlerOptionalLong.New(), From b198db60a4c0ef446193bd9d0bd7ab07f7dae0cf Mon Sep 17 00:00:00 2001 From: hg-ms <53219833+hg-ms@users.noreply.github.com> Date: Wed, 18 Feb 2026 08:28:35 +0100 Subject: [PATCH 2/2] added License header --- .../sql/BinaryLegacyTypeHandlerSqlTimestamp.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java index 95d51778..f62aa885 100644 --- a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/sql/BinaryLegacyTypeHandlerSqlTimestamp.java @@ -1,5 +1,19 @@ package org.eclipse.serializer.persistence.binary.java.sql; +/*- + * #%L + * Eclipse Serializer Persistence Binary + * %% + * Copyright (C) 2023 - 2026 MicroStream Software + * %% + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * #L% + */ + import java.sql.Timestamp; import org.eclipse.serializer.persistence.binary.types.Binary;