package io.mycat.backend.postgresql.packet; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; //ErrorResponse (B) //Byte1('E') //标识消息是一条错误。 // //Int32 //以字节记的消息内容的长度,包括长度本身。 // //消息体由一个或多个标识出来的字段组成,后面跟着一个字节零作为终止符。 字段可以以任何顺序出现。对于每个字段都有下面的东西: // //Byte1 //一个标识字段类型的代码;如果为零,这就是消息终止符并且不会跟着有字串。 目前定义的字段类型在 Section 43.5 列出。 因为将来可能增加更多的字段类型,所以前端应该不声不响地忽略不认识类型的字段。 // //String //字段值。 public class ErrorResponse extends PostgreSQLPacket { /********* * 解析错误包 * * @param buffer * @param offset * @return * @throws UnsupportedEncodingException * @throws IllegalAccessException */ public static ErrorResponse parse(ByteBuffer buffer, int offset) throws IllegalArgumentException { if ((char) buffer.get(offset) != PacketMarker.B_Error.getValue()) { throw new IllegalArgumentException("this packet not is ErrorResponse"); } ErrorResponse err = new ErrorResponse(); err.length = buffer.getInt(offset + 1); err.mark = buffer.get(offset + 1 + 4); if (err.mark != 0) { byte[] str = new byte[err.length - (4+4)]; for(int i =0;i<str.length;i++){ str[i] = buffer.get(offset + 1 + 4 + 4 +i); } err.errMsg = new String(str,UTF8); } return err; } private int length; private byte mark; private String errMsg; public String getErrMsg() { return errMsg; } @Override public int getLength() { return length; } @Override public char getMarker() { return PostgreSQLPacket.PacketMarker.B_Error.getValue(); } }