| // SPDX-License-Identifier: LGPL-2.1-or-later |
| // Copyright (c) 2012-2014 Monty Program Ab |
| // Copyright (c) 2015-2021 MariaDB Corporation Ab |
| |
| package org.mariadb.jdbc.plugin.codec; |
| |
| import java.io.IOException; |
| import java.nio.charset.StandardCharsets; |
| import java.sql.SQLDataException; |
| import java.util.Calendar; |
| import java.util.EnumSet; |
| import org.mariadb.jdbc.client.*; |
| import org.mariadb.jdbc.client.socket.Writer; |
| import org.mariadb.jdbc.plugin.Codec; |
| import org.mariadb.jdbc.util.constants.ServerStatus; |
| |
| /** String codec */ |
| public class StringCodec implements Codec<String> { |
| |
| /** default instance */ |
| public static final StringCodec INSTANCE = new StringCodec(); |
| |
| private static final EnumSet<DataType> COMPATIBLE_TYPES = |
| EnumSet.of( |
| DataType.BIT, |
| DataType.OLDDECIMAL, |
| DataType.TINYINT, |
| DataType.SMALLINT, |
| DataType.INTEGER, |
| DataType.FLOAT, |
| DataType.DOUBLE, |
| DataType.TIMESTAMP, |
| DataType.BIGINT, |
| DataType.MEDIUMINT, |
| DataType.DATE, |
| DataType.TIME, |
| DataType.DATETIME, |
| DataType.YEAR, |
| DataType.NEWDATE, |
| DataType.JSON, |
| DataType.DECIMAL, |
| DataType.ENUM, |
| DataType.SET, |
| DataType.VARCHAR, |
| DataType.VARSTRING, |
| DataType.STRING, |
| DataType.BLOB, |
| DataType.TINYBLOB, |
| DataType.MEDIUMBLOB, |
| DataType.LONGBLOB); |
| |
| public String className() { |
| return String.class.getName(); |
| } |
| |
| public boolean canDecode(ColumnDecoder column, Class<?> type) { |
| return COMPATIBLE_TYPES.contains(column.getType()) && type.isAssignableFrom(String.class); |
| } |
| |
| public boolean canEncode(Object value) { |
| return value instanceof String; |
| } |
| |
| public String decodeText( |
| final ReadableByteBuf buf, final int length, final ColumnDecoder column, final Calendar cal) |
| throws SQLDataException { |
| return column.decodeStringText(buf, length, cal); |
| } |
| |
| public String decodeBinary( |
| final ReadableByteBuf buf, final int length, final ColumnDecoder column, final Calendar cal) |
| throws SQLDataException { |
| return column.decodeStringBinary(buf, length, cal); |
| } |
| |
| public void encodeText(Writer encoder, Context context, Object value, Calendar cal, Long maxLen) |
| throws IOException { |
| encoder.writeByte('\''); |
| encoder.writeStringEscaped( |
| maxLen == null ? value.toString() : value.toString().substring(0, maxLen.intValue()), |
| (context.getServerStatus() & ServerStatus.NO_BACKSLASH_ESCAPES) != 0); |
| encoder.writeByte('\''); |
| } |
| |
| public void encodeBinary(Writer writer, Object value, Calendar cal, Long maxLength) |
| throws IOException { |
| byte[] b = value.toString().getBytes(StandardCharsets.UTF_8); |
| int len = maxLength != null ? Math.min(maxLength.intValue(), b.length) : b.length; |
| writer.writeLength(len); |
| writer.writeBytes(b, 0, len); |
| } |
| |
| public int getBinaryEncodeType() { |
| return DataType.VARSTRING.get(); |
| } |
| } |