1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.db.protocol.mysql.packet.generic;
19
20 import com.google.common.base.Preconditions;
21 import lombok.Getter;
22 import org.apache.shardingsphere.db.protocol.mysql.packet.MySQLPacket;
23 import org.apache.shardingsphere.db.protocol.mysql.payload.MySQLPacketPayload;
24 import org.apache.shardingsphere.infra.exception.core.external.sql.vendor.VendorError;
25
26 import java.sql.SQLException;
27
28
29
30
31
32
33 @Getter
34 public final class MySQLErrPacket extends MySQLPacket {
35
36
37
38
39 public static final int HEADER = 0xff;
40
41 private static final String SQL_STATE_MARKER = "#";
42
43 private final int errorCode;
44
45 private final String sqlState;
46
47 private final String errorMessage;
48
49 public MySQLErrPacket(final SQLException exception) {
50 errorCode = exception.getErrorCode();
51 sqlState = exception.getSQLState();
52 errorMessage = exception.getMessage();
53 }
54
55 public MySQLErrPacket(final VendorError vendorError, final Object... errorMessageArgs) {
56 errorCode = vendorError.getVendorCode();
57 sqlState = vendorError.getSqlState().getValue();
58 errorMessage = String.format(vendorError.getReason(), errorMessageArgs);
59 }
60
61 public MySQLErrPacket(final MySQLPacketPayload payload) {
62 Preconditions.checkArgument(HEADER == payload.readInt1(), "Header of MySQL ERR packet must be `0xff`.");
63 errorCode = payload.readInt2();
64 payload.readStringFix(1);
65 sqlState = payload.readStringFix(5);
66 errorMessage = payload.readStringEOF();
67 }
68
69 @Override
70 protected void write(final MySQLPacketPayload payload) {
71 payload.writeInt1(HEADER);
72 payload.writeInt2(errorCode);
73 payload.writeStringFix(SQL_STATE_MARKER);
74 payload.writeStringFix(sqlState);
75 payload.writeStringEOF(errorMessage);
76 }
77 }