package com.meidusa.amoeba.mysql.handler;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.log4j.Logger;
import com.meidusa.amoeba.mysql.net.MysqlClientConnection;
import com.meidusa.amoeba.mysql.net.packet.ConstantPacketBuffer;
import com.meidusa.amoeba.mysql.net.packet.result.MysqlResultSetPacket;
import com.meidusa.amoeba.net.Sessionable;
import com.meidusa.amoeba.net.poolable.ObjectPool;
import com.meidusa.amoeba.parser.statement.SelectStatement;
import com.meidusa.amoeba.parser.statement.ShowStatement;
import com.meidusa.amoeba.parser.statement.Statement;
import com.meidusa.amoeba.route.SqlQueryObject;
import com.meidusa.amoeba.util.StringUtil;
public class QueryCommand {
private final MysqlClientConnection conn;
private final long timeout;
public QueryCommand(long timeout, MysqlClientConnection conn) {
this.conn = conn;
this.timeout = timeout;
}
public static Logger logger = Logger.getLogger(QueryCommand.class);
public void execute(ObjectPool[] pools, byte[] message, Statement statement, SqlQueryObject queryObject) throws Exception {
if (statement != null && statement instanceof SelectStatement && ((SelectStatement)statement).isQueryLastInsertId()) {
MysqlResultSetPacket lastPacketResult = MySqlCommandDispatcher.createLastInsertIdPacket(conn,(SelectStatement)statement,false);
lastPacketResult.wirteToConnection(conn);
return;
}
if(statement instanceof ShowStatement){
if(pools != null && pools.length>1){
pools = new ObjectPool[]{pools[0]};
}
}
if(pools == null || pools.length == 0){
conn.postMessage(ConstantPacketBuffer.STATIC_OK_BUFFER);
return;
}
Sessionable session = new QueryCommandMessageHandler(conn, message, statement, pools, queryObject, timeout);
try {
session.startSession();
} catch (Exception e) {
logger.error("start Session error:", e);
session.endSession(false, e);
throw e;
}
}
}