From 6408498e7545c337ed06e32b4084bf509abf7e66 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Wed, 1 Sep 2021 00:22:29 +0200 Subject: [PATCH] WIP: handle integer out of range --- caosdb-proto | 2 +- .../java/org/caosdb/server/datatype/GenericValue.java | 4 ++++ .../java/org/caosdb/server/datatype/IntegerDatatype.java | 7 +++++-- .../caosdb/server/grpc/EntityTransactionServiceImpl.java | 6 +++++- .../java/org/caosdb/server/utils/ServerMessages.java | 9 ++++++++- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/caosdb-proto b/caosdb-proto index 014096e3..75e826bd 160000 --- a/caosdb-proto +++ b/caosdb-proto @@ -1 +1 @@ -Subproject commit 014096e3c9d6d4624dc786f5aaec27f26e01072a +Subproject commit 75e826bd318c39e63d324f71e035f08355ffc51f diff --git a/src/main/java/org/caosdb/server/datatype/GenericValue.java b/src/main/java/org/caosdb/server/datatype/GenericValue.java index 90641b1a..02d735ab 100644 --- a/src/main/java/org/caosdb/server/datatype/GenericValue.java +++ b/src/main/java/org/caosdb/server/datatype/GenericValue.java @@ -58,6 +58,10 @@ public class GenericValue implements SingleValue { this.table = Table.text_data; } + public GenericValue(final long value) { + this((Integer) Math.toIntExact(value)); + } + @Override public void addToElement(final Element e) { if (this.value instanceof String && ((String) this.value).isEmpty()) { diff --git a/src/main/java/org/caosdb/server/datatype/IntegerDatatype.java b/src/main/java/org/caosdb/server/datatype/IntegerDatatype.java index b5ac2d97..0b1116ed 100644 --- a/src/main/java/org/caosdb/server/datatype/IntegerDatatype.java +++ b/src/main/java/org/caosdb/server/datatype/IntegerDatatype.java @@ -32,10 +32,13 @@ public class IntegerDatatype extends AbstractDatatype { public SingleValue parseValue(final Object value) throws Message { try { if (value instanceof GenericValue) { - return new GenericValue(Integer.parseInt(((GenericValue) value).toDatabaseString())); + return new GenericValue(Long.parseLong(((GenericValue) value).toDatabaseString())); } else { - return new GenericValue(Integer.parseInt(value.toString())); + return new GenericValue(Long.parseLong(value.toString())); } + + } catch (final ArithmeticException e) { + throw ServerMessages.INTEGER_OUT_OF_RANGE; } catch (final NumberFormatException e) { throw ServerMessages.CANNOT_PARSE_INT_VALUE; } diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java index ca8f6364..1120a0c9 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -183,6 +183,10 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa return MessageCode.MESSAGE_CODE_ENTITY_DOES_NOT_EXIST; } else if (m.equalsCore(ServerMessages.ENTITY_HAS_NO_PROPERTIES)) { return MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_PROPERTIES; + } else if (m.equalsCore(ServerMessages.INTEGER_OUT_OF_RANGE)) { + return MessageCode.MESSAGE_CODE_INTEGER_VALUE_OUT_OF_RANGE; + } else if (m.equalsCore(ServerMessages.ENTITY_HAS_BEEN_DELETED_SUCCESSFULLY)) { + return MessageCode.MESSAGE_CODE_ENTITY_HAS_BEEN_DELETED_SUCCESSFULLY; } else if (m.getCode() == 0) { return MessageCode.MESSAGE_CODE_UNSPECIFIED; } else { @@ -824,7 +828,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa case DOUBLE_VALUE: return new GenericValue(value.getDoubleValue()); case INTEGER_VALUE: - return new GenericValue(Math.toIntExact(value.getIntegerValue())); + return new GenericValue(Long.toString(value.getIntegerValue())); case SPECIAL_VALUE: return convertSpecial(value.getSpecialValue()); case STRING_VALUE: diff --git a/src/main/java/org/caosdb/server/utils/ServerMessages.java b/src/main/java/org/caosdb/server/utils/ServerMessages.java index 2801218a..cbca0b2d 100644 --- a/src/main/java/org/caosdb/server/utils/ServerMessages.java +++ b/src/main/java/org/caosdb/server/utils/ServerMessages.java @@ -19,6 +19,7 @@ */ package org.caosdb.server.utils; +import org.caosdb.api.entity.v1alpha1.MessageCode; import org.caosdb.server.CaosDBServer; import org.caosdb.server.ServerProperties; import org.caosdb.server.entity.Message; @@ -366,7 +367,7 @@ public class ServerMessages { + " and include the SRID into your report."; } - return new Message(MessageType.Error, 500, description, (body.isEmpty() ? null : body)); + return new Message(MessageType.Error, 500, description, body.isEmpty() ? null : body); } public static final Message REQUIRED_BY_UNQUALIFIED = @@ -434,4 +435,10 @@ public class ServerMessages { public static final Message PROPERTY_WITH_NAME_OVERRIDE = new Message(MessageType.Warning, 0, "This property overrides the name."); + + public static final Message INTEGER_OUT_OF_RANGE = + new Message( + MessageType.Error, + MessageCode.MESSAGE_CODE_INTEGER_VALUE_OUT_OF_RANGE_VALUE, + "The integer value is out of range. This server only supports signed 32 bit integers."); } -- GitLab