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.command.query.text;
19
20 import lombok.Getter;
21 import lombok.RequiredArgsConstructor;
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.util.datetime.DateTimeFormatterFactory;
25
26 import java.math.BigDecimal;
27 import java.sql.Timestamp;
28 import java.time.LocalDateTime;
29 import java.util.ArrayList;
30 import java.util.Collection;
31
32
33
34
35
36
37 @RequiredArgsConstructor
38 @Getter
39 public final class MySQLTextResultSetRowPacket extends MySQLPacket {
40
41 private static final int NULL = 0xfb;
42
43 private final Collection<Object> data;
44
45 public MySQLTextResultSetRowPacket(final MySQLPacketPayload payload, final int columnCount) {
46 data = new ArrayList<>(columnCount);
47 for (int i = 0; i < columnCount; i++) {
48 data.add(payload.readStringLenenc());
49 }
50 }
51
52 @Override
53 protected void write(final MySQLPacketPayload payload) {
54 for (Object each : data) {
55 if (null == each) {
56 payload.writeInt1(NULL);
57 continue;
58 }
59 writeDataIntoPayload(payload, each);
60 }
61 }
62
63 private void writeDataIntoPayload(final MySQLPacketPayload payload, final Object data) {
64 if (data instanceof byte[]) {
65 payload.writeBytesLenenc((byte[]) data);
66 } else if (data instanceof Timestamp && 0 == ((Timestamp) data).getNanos()) {
67 payload.writeStringLenenc(data.toString().split("\\.")[0]);
68 } else if (data instanceof BigDecimal) {
69 payload.writeStringLenenc(((BigDecimal) data).toPlainString());
70 } else if (data instanceof Boolean) {
71 payload.writeBytesLenenc((boolean) data ? new byte[]{1} : new byte[]{0});
72 } else if (data instanceof LocalDateTime) {
73 payload.writeStringLenenc(DateTimeFormatterFactory.getStandardFormatter().format((LocalDateTime) data));
74 } else {
75 payload.writeStringLenenc(data.toString());
76 }
77 }
78 }