Commit b35e33f0 authored by terrymanu's avatar terrymanu
Browse files

enhance errPacket handle for JDBCBackendHandler

parent db14dbfe
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@

package io.shardingsphere.proxy.backend.common.jdbc;

import com.google.common.base.Optional;
import io.shardingsphere.core.constant.SQLType;
import io.shardingsphere.core.constant.TransactionType;
import io.shardingsphere.core.exception.ShardingException;
@@ -99,7 +100,9 @@ public abstract class JDBCBackendHandler implements BackendHandler {
        } catch (final SQLException ex) {
            return new CommandResponsePackets(new ErrPacket(1, ex));
        } catch (final SystemException | ShardingException ex) {
            return new CommandResponsePackets(new ErrPacket(1, ServerErrorCode.ER_STD_UNKNOWN_EXCEPTION, ex.getMessage()));
            Optional<SQLException> sqlException = findSQLException(ex);
            return sqlException.isPresent()
                    ? new CommandResponsePackets(new ErrPacket(1, sqlException.get())) : new CommandResponsePackets(new ErrPacket(1, ServerErrorCode.ER_STD_UNKNOWN_EXCEPTION, ex.getMessage()));
        }
    }
    
@@ -126,7 +129,7 @@ public abstract class JDBCBackendHandler implements BackendHandler {
        return TransactionType.XA == ruleRegistry.getTransactionType() && SQLType.DDL == sqlType && Status.STATUS_NO_TRANSACTION != AtomikosUserTransaction.getInstance().getStatus();
    }
    
    private CommandResponsePackets merge(final SQLStatement sqlStatement) {
    private CommandResponsePackets merge(final SQLStatement sqlStatement) throws SQLException {
        if (executeResponse instanceof ExecuteUpdateResponse) {
            Collection<DatabasePacket> headPackets = new LinkedList<>();
            for (DatabasePacket each : ((ExecuteUpdateResponse) executeResponse).getPackets()) {
@@ -139,12 +142,8 @@ public abstract class JDBCBackendHandler implements BackendHandler {
        }
        QueryResponsePackets result = ((ExecuteQueryResponse) executeResponse).getQueryResponsePackets();
        currentSequenceId += result.getPackets().size();
        try {
        mergedResult = mergeQuery(sqlStatement);
        return result;
        } catch (final SQLException ex) {
            return new CommandResponsePackets(new ErrPacket(1, ex));
        }
    }
    
    private MergedResult mergeQuery(final SQLStatement sqlStatement) throws SQLException {
@@ -177,6 +176,22 @@ public abstract class JDBCBackendHandler implements BackendHandler {
    
    protected abstract SQLRouteResult doShardingRoute();
    
    private Optional<SQLException> findSQLException(final Exception exception) {
        if (null == exception.getCause()) {
            return Optional.absent();
        }
        if (exception.getCause() instanceof SQLException) {
            return Optional.of((SQLException) exception.getCause());
        }
        if (null == exception.getCause().getCause()) {
            return Optional.absent();
        }
        if (exception.getCause().getCause() instanceof SQLException) {
            return Optional.of((SQLException) exception.getCause());
        }
        return Optional.absent();
    }
    
    @Override
    public final boolean hasMoreResultValue() throws SQLException {
        if (!isMerged || !hasMoreResultValueFlag) {
+15 −24
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import io.shardingsphere.proxy.transport.mysql.packet.command.reponse.QueryRespo
import io.shardingsphere.proxy.transport.mysql.packet.command.text.query.ColumnDefinition41Packet;
import io.shardingsphere.proxy.transport.mysql.packet.command.text.query.FieldCountPacket;
import io.shardingsphere.proxy.transport.mysql.packet.generic.EofPacket;
import io.shardingsphere.proxy.transport.mysql.packet.generic.ErrPacket;
import io.shardingsphere.proxy.transport.mysql.packet.generic.OKPacket;
import io.shardingsphere.proxy.util.ExecutorContext;
import lombok.Getter;
@@ -67,8 +66,7 @@ public abstract class JDBCExecuteEngine implements SQLExecuteEngine {
    
    protected abstract Statement createStatement(Connection connection, String sql, boolean isReturnGeneratedKeys) throws SQLException;
    
    protected ExecuteResponseUnit executeWithMetadata(final Statement statement, final String sql, final boolean isReturnGeneratedKeys) {
        try {
    protected ExecuteResponseUnit executeWithMetadata(final Statement statement, final String sql, final boolean isReturnGeneratedKeys) throws SQLException {
        setFetchSize(statement);
        if (!executeSQL(statement, sql, isReturnGeneratedKeys)) {
            return new ExecuteUpdateResponseUnit(new CommandResponsePackets(new OKPacket(1, statement.getUpdateCount(), isReturnGeneratedKeys ? getGeneratedKey(statement) : 0)));
@@ -79,21 +77,14 @@ public abstract class JDBCExecuteEngine implements SQLExecuteEngine {
            return new ExecuteUpdateResponseUnit(new CommandResponsePackets(new OKPacket(1)));
        }
        return new ExecuteQueryResponseUnit(getHeaderPackets(resultSetMetaData), createQueryResult(resultSet));
        } catch (final SQLException ex) {
            return new ExecuteUpdateResponseUnit(new CommandResponsePackets(new ErrPacket(1, ex)));
        }
    }
    
    protected ExecuteResponseUnit executeWithoutMetadata(final Statement statement, final String sql, final boolean isReturnGeneratedKeys) {
        try {
    protected ExecuteResponseUnit executeWithoutMetadata(final Statement statement, final String sql, final boolean isReturnGeneratedKeys) throws SQLException {
        setFetchSize(statement);
        if (!executeSQL(statement, sql, isReturnGeneratedKeys)) {
            return new ExecuteUpdateResponseUnit(new CommandResponsePackets(new OKPacket(1, statement.getUpdateCount(), isReturnGeneratedKeys ? getGeneratedKey(statement) : 0)));
        }
        return new ExecuteQueryResponseUnit(null, createQueryResult(statement.getResultSet()));
        } catch (final SQLException ex) {
            return new ExecuteUpdateResponseUnit(new CommandResponsePackets(new ErrPacket(1, ex)));
        }
    }
    
    protected abstract void setFetchSize(Statement statement) throws SQLException;