package fm.liu.timo.mysql.handler.xa; import java.util.Collection; import org.pmw.tinylog.Logger; import fm.liu.timo.config.ErrorCode; import fm.liu.timo.mysql.packet.ErrorPacket; import fm.liu.timo.net.connection.BackendConnection; import fm.liu.timo.server.session.XATransactionSession; import fm.liu.timo.server.session.XATransactionSession.XAState; /** * @author liuhuanting */ public class XAEndHandler extends XAHandler { private boolean isCommit; public XAEndHandler(XATransactionSession session, Collection<BackendConnection> cons, boolean isCommit) { super(session, cons); this.isCommit = isCommit; } @Override public void ok(byte[] ok, BackendConnection con) { if (decrement()) { if (failed()) { error(); return; } session.setState(XAState.IDLE); if (isCommit) { session.xaPrepare(); } else { session.xaRollback(); } } } @Override public void error(byte[] error, BackendConnection con) { ErrorPacket err = new ErrorPacket(); err.read(error); String message = new String(err.message); Logger.warn("error :{} received from :{} when XA END", con, message); this.setFail(err.errno, message); if (decrement()) { error(); } } private void error() { session.clear(); session.getFront().writeErrMessage(ErrorCode.ER_YES, this.errMsg); recycleResources(); } }