package com.meidusa.amoeba.mysql.handler;
import org.apache.log4j.Logger;
import com.meidusa.amoeba.mysql.net.MysqlClientConnection;
import com.meidusa.amoeba.mysql.net.packet.QueryCommandPacket;
import com.meidusa.amoeba.net.Sessionable;
import com.meidusa.amoeba.net.poolable.ObjectPool;
import com.meidusa.amoeba.parser.statement.Statement;
import com.meidusa.amoeba.route.SqlQueryObject;
public class PrepareQueryCommand {
private final MysqlClientConnection conn;
private final long timeout;
public static Logger logger = Logger.getLogger(PrepareQueryCommand.class);
public PrepareQueryCommand(long timeout, MysqlClientConnection conn) {
this.conn = conn;
this.timeout = timeout;
}
public void execute(ObjectPool[] pools, byte[] message, Statement statement, SqlQueryObject queryObject, QueryCommandPacket command) throws Exception {
/**
* 获取之前prepared过的数据,直接返回给客户端,如果没有则需要往后端mysql发起请求,
* 然后数据以后填充PreparedStatmentInfo,并且给客户端
*/
PreparedStatmentInfo preparedInf = conn.getPreparedStatmentInfo(command.query);
if(preparedInf.getByteBuffer() != null && preparedInf.getByteBuffer().length >0){
conn.postMessage(preparedInf.getByteBuffer());
return;
}
PreparedStatmentMessageHandler handler = new PreparedStatmentMessageHandler(conn,preparedInf,statement, message , new ObjectPool[]{pools[0]}, queryObject, timeout);
if (handler instanceof Sessionable) {
Sessionable session = (Sessionable) handler;
try {
session.startSession();
} catch (Exception e) {
logger.error("start Session error:", e);
session.endSession(false, e);
throw e;
}
}
return;
}
}