package com.tesora.dve.db.mysql.portal; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import com.tesora.dve.db.mysql.portal.protocol.MSPComPrepareStmtRequestMessage; import com.tesora.dve.db.mysql.portal.protocol.MSPMessage; import io.netty.channel.ChannelHandlerContext; import java.util.concurrent.ExecutorService; import org.apache.log4j.Logger; import com.tesora.dve.charset.NativeCharSet; import com.tesora.dve.charset.MysqlNativeCharSet; import com.tesora.dve.db.mysql.MysqlPrepareStatementForwarder; import com.tesora.dve.db.mysql.MyPrepStmtConnectionContext; import com.tesora.dve.db.mysql.libmy.MyPreparedStatement; import com.tesora.dve.exceptions.PEException; import com.tesora.dve.server.connectionmanager.SSConnection; import com.tesora.dve.server.connectionmanager.messages.PrepareRequestExecutor; public class MSPComPrepareStmtRequest extends MSPActionBase { private static final Logger logger = Logger.getLogger(MSPComPrepareStmtRequest.class); public final static MSPComPrepareStmtRequest INSTANCE = new MSPComPrepareStmtRequest(); @Override public void execute(ExecutorService clientExecutorService, ChannelHandlerContext ctx, SSConnection ssCon, MSPMessage protocolMessage) throws PEException { MSPComPrepareStmtRequestMessage prepareRequest = castProtocolMessage(MSPComPrepareStmtRequestMessage.class,protocolMessage); byte[] query = prepareRequest.getPrepareBytes(); MyPrepStmtConnectionContext mpscc = ctx.attr(MyPrepStmtConnectionContext.PSTMT_CONTEXT_KEY).get(); if ( mpscc == null ) { mpscc = new MyPrepStmtConnectionContext(ssCon); ctx.attr(MyPrepStmtConnectionContext.PSTMT_CONTEXT_KEY).set(mpscc); } MyPreparedStatement<String> pStmt = new MyPreparedStatement<String>(null); pStmt.setQuery(query); mpscc.addPreparedStatement(pStmt); NativeCharSet clientCharSet = MysqlNativeCharSet.UTF8; MysqlPrepareStatementForwarder resultConsumer = new MysqlPrepareStatementForwarder(ctx, pStmt); try { PrepareRequestExecutor.execute(ssCon, resultConsumer, pStmt.getStmtId(), clientCharSet.getJavaCharset(), query); } catch (PEException e) { if (logger.isDebugEnabled()) logger.warn("Reducing exception for user - original exception: ", e); resultConsumer.sendError(e.rootCause()); } catch (Throwable t) { logger.warn("Reducing exception for user - original exception: ", t); resultConsumer.sendError(new Exception(t)); } } @Override public byte getMysqlMessageType() { return (byte) 0x16; } }