From 30cac5ed64a73b65c22ff022bb3ae3fc89341e4f Mon Sep 17 00:00:00 2001 From: Christian Himpe Date: Sat, 8 Apr 2023 23:24:45 +0200 Subject: [PATCH 1/2] Prepare for https://github.com/ArcadeData/arcadedb/discussions/1016 --- .../query/sql/function/misc/SQLFunctionDecode.java | 3 +++ .../query/sql/function/misc/SQLFunctionEncode.java | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionDecode.java b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionDecode.java index 6b984c201a..77e3f3c54f 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionDecode.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionDecode.java @@ -50,6 +50,9 @@ public Object execute( final Object iThis, final Identifiable iCurrentRecord, fi if (SQLFunctionEncode.FORMAT_BASE64.equalsIgnoreCase(format)) { return Base64.getDecoder().decode(candidate); + } else if (SQLFunctionEncode.FORMAT_BASE64URL.equalsIgnoreCase(format)) { + final int padding = (candidate.length() % 4 == 2 ? 2 : (candidate.length() % 4 == 3 ? 1 : 0)); + return Base64.getDecoder().decode(candidate.replace('-','+').replace('_','/') + "=".repeat(padding)); } else { throw new CommandSQLParsingException("Unknown format :" + format); } diff --git a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionEncode.java b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionEncode.java index 462f5ae47a..52cfc153f9 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionEncode.java +++ b/engine/src/main/java/com/arcadedb/query/sql/function/misc/SQLFunctionEncode.java @@ -35,8 +35,9 @@ */ public class SQLFunctionEncode extends SQLFunctionAbstract { - public static final String NAME = "encode"; - public static final String FORMAT_BASE64 = "base64"; + public static final String NAME = "encode"; + public static final String FORMAT_BASE64 = "base64"; + public static final String FORMAT_BASE64URL = "base64url"; /** * Get the date at construction to have the same date for all the iteration. @@ -54,6 +55,8 @@ public Object execute(final Object iThis, final Identifiable iCurrentRecord, fin byte[] data = null; if (candidate instanceof byte[]) { data = (byte[]) candidate; + } else if (candidate instanceof String) { + data = ((String) candidate).getBytes(); } else if (candidate instanceof RID) { final Record rec = ((RID) candidate).getRecord(); if (rec instanceof Binary) { @@ -67,6 +70,8 @@ public Object execute(final Object iThis, final Identifiable iCurrentRecord, fin if (FORMAT_BASE64.equalsIgnoreCase(format)) { return Base64.getEncoder().encodeToString(data); + } else if (FORMAT_BASE64URL.equalsIgnoreCase(format)) { + return Base64.getEncoder().withoutPadding().encodeToString(data).replace('+','-').replace('/','_'); } else { throw new CommandSQLParsingException("Unknown format :" + format); } From c51d45eec2a285b5fd7b6855a66a570345c880d5 Mon Sep 17 00:00:00 2001 From: Christian Himpe Date: Sun, 9 Apr 2023 16:55:48 +0200 Subject: [PATCH 2/2] Make asString() convert binary types to content's strings --- .../query/sql/method/misc/SQLMethodAsString.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodAsString.java b/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodAsString.java index 31028aef4f..5f0de55a40 100644 --- a/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodAsString.java +++ b/engine/src/main/java/com/arcadedb/query/sql/method/misc/SQLMethodAsString.java @@ -35,7 +35,12 @@ public SQLMethodAsString() { @Override public Object execute(final Object iThis, final Identifiable iCurrentRecord, final CommandContext iContext, Object ioResult, final Object[] iParams) { - ioResult = ioResult != null ? ioResult.toString() : null; - return ioResult; + if (ioResult == null) { + return null; + } else if (ioResult instanceof byte[]) { + return new String((byte[]) ioResult); + } else { + return ioResult.toString(); + } } }