blob: 1891e62f75301e4b42c388eb637bac4a6f934c2d [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.message.client;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.mariadb.jdbc.ServerPreparedStatement;
import org.mariadb.jdbc.client.Client;
import org.mariadb.jdbc.client.Context;
import org.mariadb.jdbc.client.socket.Writer;
import org.mariadb.jdbc.export.Prepare;
import org.mariadb.jdbc.message.server.PrepareResultPacket;
/** Client message that can be replayed with parameter */
public interface RedoableWithPrepareClientMessage extends RedoableClientMessage {
/**
* sql command value
*
* @return sql command
*/
String getCommand();
/**
* Server prepare statement caller
*
* @return caller
*/
ServerPreparedStatement prep();
/**
* Default encoder caller
*
* @param writer socket writer
* @param context connection context
* @return number of command sent
* @throws IOException if a socket exception occurs
* @throws SQLException for any other kind of error
*/
default int encode(Writer writer, Context context) throws IOException, SQLException {
return encode(writer, context, null);
}
/**
* encoder method in case of failover, passing new prepared object
*
* @param writer socket writer
* @param context connection context
* @param newPrepareResult new prepare result
* @return number of command sent
* @throws IOException if a socket exception occurs
* @throws SQLException for any other kind of error
*/
int encode(Writer writer, Context context, Prepare newPrepareResult)
throws IOException, SQLException;
/**
* re-encoder method in case of failover, passing new prepared object
*
* @param writer socket writer
* @param context connection context
* @param newPrepareResult new prepare result
* @return number of command sent
* @throws IOException if a socket exception occurs
* @throws SQLException for any other kind of error
*/
@Override
default int reEncode(Writer writer, Context context, Prepare newPrepareResult)
throws IOException, SQLException {
return encode(writer, context, newPrepareResult);
}
/**
* Set prepare result, if pipelining prepare
*
* @param prepareResult prepare results
*/
void setPrepareResult(PrepareResultPacket prepareResult);
/**
* Force re-prepare command
*
* @param client client
* @throws SQLException if any error occurs
*/
default void rePrepare(Client client) throws SQLException {
PreparePacket preparePacket = new PreparePacket(getCommand());
setPrepareResult(
(PrepareResultPacket)
client
.execute(
preparePacket,
prep(),
0,
0L,
ResultSet.CONCUR_READ_ONLY,
ResultSet.TYPE_FORWARD_ONLY,
false,
true)
.get(0));
}
}