From 53c407bd0ae3843e3560aab1f2e3f474298eb9cc Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Mon, 24 Feb 2025 00:22:51 +0900 Subject: [PATCH] Return UUID from ResultSet#getObject() --- .../com/mysql/cj/result/UuidValueFactory.java | 76 ++++++++++++ .../mysql/cj/jdbc/result/ResultSetImpl.java | 9 +- src/test/java/testsuite/simple/UuidTest.java | 117 ++++++++++++++++++ 3 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 src/main/core-impl/java/com/mysql/cj/result/UuidValueFactory.java create mode 100644 src/test/java/testsuite/simple/UuidTest.java diff --git a/src/main/core-impl/java/com/mysql/cj/result/UuidValueFactory.java b/src/main/core-impl/java/com/mysql/cj/result/UuidValueFactory.java new file mode 100644 index 000000000..4ab996883 --- /dev/null +++ b/src/main/core-impl/java/com/mysql/cj/result/UuidValueFactory.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, as published by + * the Free Software Foundation. + * + * This program is designed to work with certain software that is licensed under separate terms, as designated in a particular file or component or in + * included license documentation. The authors of MySQL hereby grant you an additional permission to link the program and your derivative works with the + * separately licensed software that they have either included with the program or referenced in the documentation. + * + * Without limiting anything contained in the foregoing, this file, which is part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.nio.ByteBuffer; +import java.util.UUID; + +import com.mysql.cj.Messages; +import com.mysql.cj.MysqlType; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataConversionException; +import com.mysql.cj.util.StringUtils; + +public class UuidValueFactory extends DefaultValueFactory { + + public UuidValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public UUID createFromBytes(byte[] bytes, int offset, int length, Field f) { + if (f.isBinary()) { + return getUuidFromBytes(bytes); + } + MysqlType mysqlType = f.getMysqlType(); + switch (mysqlType) { + case CHAR: + case VARCHAR: + case TEXT: + case TINYTEXT: + case MEDIUMTEXT: + case LONGTEXT: + String s = StringUtils.toString(bytes, offset, length, f.getEncoding()); + try { + return UUID.fromString(s); + } catch (IllegalArgumentException e) { + throw new DataConversionException(Messages.getString("ResultSet.UnableToConvertString", new Object[] { s, getTargetTypeName() })); + } + default: + break; + } + throw new DataConversionException(Messages.getString("ResultSet.UnsupportedConversion", new Object[] { mysqlType.name(), getTargetTypeName() })); + } + + @Override + public String getTargetTypeName() { + return UUID.class.getName(); + } + + private static UUID getUuidFromBytes(byte[] bytes) { + ByteBuffer bb = ByteBuffer.wrap(bytes); + long high = bb.getLong(); + long low = bb.getLong(); + + return new UUID(high, low); + } + +} diff --git a/src/main/user-impl/java/com/mysql/cj/jdbc/result/ResultSetImpl.java b/src/main/user-impl/java/com/mysql/cj/jdbc/result/ResultSetImpl.java index 5929cbd0e..cb86e68a7 100644 --- a/src/main/user-impl/java/com/mysql/cj/jdbc/result/ResultSetImpl.java +++ b/src/main/user-impl/java/com/mysql/cj/jdbc/result/ResultSetImpl.java @@ -52,6 +52,7 @@ import java.util.Calendar; import java.util.HashSet; import java.util.Set; +import java.util.UUID; import java.util.concurrent.locks.Lock; import com.mysql.cj.Messages; @@ -106,6 +107,7 @@ import com.mysql.cj.result.SqlTimestampValueFactory; import com.mysql.cj.result.StringValueFactory; import com.mysql.cj.result.UtilCalendarValueFactory; +import com.mysql.cj.result.UuidValueFactory; import com.mysql.cj.result.ValueFactory; import com.mysql.cj.result.ZonedDateTimeValueFactory; import com.mysql.cj.util.LogUtils; @@ -192,6 +194,7 @@ public class ResultSetImpl extends NativeResultset implements ResultSetInternalM private ValueFactory doubleValueFactory; private ValueFactory bigDecimalValueFactory; private ValueFactory binaryStreamValueFactory; + private ValueFactory uuidValueFactory; private ValueFactory