package io.mycat.backend.postgresql.packet; import java.nio.ByteBuffer; /*** * 等待查询包 * * @author Coollf * */ // ReadyForQuery (B) // Byte1('Z') // 标识消息类型。在后端为新的查询循环准备好的时候, 总会发送 ReadyForQuery。 // // Int32(5) // 以字节记的消息内容的长度,包括长度本身。 // // Byte1 // 当前后端事务状态指示器。可能的值是空闲状况下的 'I'(不在事务块里);在事务块里是 'T'; 或者在一个失败的事务块里是 // 'E'(在事务块结束之前,任何查询都将被拒绝)。 public class ReadyForQuery extends PostgreSQLPacket { /***** * 消息长度 */ private int length; /*** * 状态 */ TransactionState state; @Override public int getLength() { return length; } @Override public char getMarker() { return PacketMarker.B_ReadyForQuery.getValue(); } public static ReadyForQuery parse(ByteBuffer buffer, int offset) { if (buffer.get(offset) != PacketMarker.B_ReadyForQuery.getValue()) { throw new IllegalArgumentException("this packet not is ReadyForQuery"); } ReadyForQuery readyForQuery = new ReadyForQuery(); readyForQuery.length = buffer.getInt(offset + 1); readyForQuery.state = TransactionState.valueOf((char)buffer.get(offset+1+4)); return readyForQuery; } /*** * 后端事物状态 * * @author Coollf * */ public static enum TransactionState { /*** * 不在事物中 */ NOT_IN('I'), /** * 在事物中 */ IN('T'), /*** * 错误 */ ERR('E'); private char vlaue; public char getVlaue() { return vlaue; } TransactionState(char value) { this.vlaue = value; } public static TransactionState valueOf(char v) { if (v == NOT_IN.getVlaue()) { return NOT_IN; } if (v == IN.getVlaue()) { return IN; } if (v == ERR.getVlaue()) { return TransactionState.ERR; } return null; } } /** * @return the state */ public TransactionState getState() { return state; } /** * @param state the state to set */ public void setState(TransactionState state) { this.state = state; } }