com.tesora.dve.db.mysql.portal.MSPComPrepareStmtRequest.java Source code

Java tutorial

Introduction

Here is the source code for com.tesora.dve.db.mysql.portal.MSPComPrepareStmtRequest.java

Source

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