| // 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)); |
| } |
| } |