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