blob: 8e991d80bb8e4ae70b8fd4075f09bd3bc781477f [file] [log] [blame]
// 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;
import java.io.IOException;
import java.sql.SQLDataException;
import java.sql.SQLException;
import java.util.Calendar;
import org.mariadb.jdbc.client.ColumnDecoder;
import org.mariadb.jdbc.client.Context;
import org.mariadb.jdbc.client.ReadableByteBuf;
import org.mariadb.jdbc.client.socket.Writer;
/**
* Codec interface, to describe how a certain type of data must be encoded / decoded
*
* @param <T> java type supported
*/
public interface Codec<T> {
/**
* Codec native type
*
* @return code native return type
*/
String className();
/**
* If codec can decode this a server datatype to a java class type
*
* @param column server datatype
* @param type java return class
* @return true if codec can decode it
*/
boolean canDecode(ColumnDecoder column, Class<?> type);
/**
* Can Codec encode the java object type
*
* @param value java object type
* @return true if codec can encode java type
*/
boolean canEncode(Object value);
/**
* Decode from a mysql packet text encoded a value to codec java type
*
* @param buffer mysql packet buffer
* @param length encoded value length
* @param column server column metadata
* @param cal calendar
* @return decoded value
* @throws SQLDataException if unexpected error occurs during decoding
*/
T decodeText(
final ReadableByteBuf buffer,
final int length,
final ColumnDecoder column,
final Calendar cal)
throws SQLDataException;
/**
* Decode from a mysql packet binary encoded a value to codec java type
*
* @param buffer mysql packet buffer
* @param length encoded value length
* @param column server column metadata
* @param cal calendar
* @return decoded value
* @throws SQLDataException if unexpected error occurs during decoding
*/
T decodeBinary(
final ReadableByteBuf buffer,
final int length,
final ColumnDecoder column,
final Calendar cal)
throws SQLDataException;
/**
* Text encode value to writer
*
* @param encoder writer
* @param context connection context
* @param value value to encode
* @param cal calendar
* @param length maximum value length
* @throws IOException if any socket error occurs
* @throws SQLException if encoding error occurs
*/
void encodeText(Writer encoder, Context context, Object value, Calendar cal, Long length)
throws IOException, SQLException;
/**
* Binary encode value to writer
*
* @param encoder writer
* @param value value to encode
* @param cal calendar
* @param length maximum value length
* @throws IOException if any socket error occurs
* @throws SQLException if encoding error occurs
*/
void encodeBinary(Writer encoder, Object value, Calendar cal, Long length)
throws IOException, SQLException;
/**
* Indicate if can encode long data
*
* @return true if possible
*/
default boolean canEncodeLongData() {
return false;
}
/**
* binary encoding value to a long data packet
*
* @param encoder writer
* @param value value to encode
* @param length maximum length value
* @throws IOException if any socket error occurs
* @throws SQLException if encoding error occurs
*/
default void encodeLongData(Writer encoder, T value, Long length)
throws IOException, SQLException {
throw new SQLException("Data is not supposed to be send in COM_STMT_LONG_DATA");
}
/**
* binary encoding value to a byte[]
*
* @param value value to encode
* @param length maximum length value
* @return encoded value
* @throws IOException if any socket error occurs
* @throws SQLException if encoding error occurs
*/
default byte[] encodeData(T value, Long length) throws IOException, SQLException {
throw new SQLException("Data is not supposed to be send in COM_STMT_LONG_DATA");
}
/**
* Return server encoding data type
*
* @return server encoding data type
*/
int getBinaryEncodeType();
}