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.binary.execute;
19
20 import org.apache.shardingsphere.db.protocol.mysql.payload.MySQLPacketPayload;
21
22 import lombok.Getter;
23
24
25
26
27
28
29 public final class MySQLNullBitmap {
30
31 private final int offset;
32
33 @Getter
34 private final int[] nullBitmap;
35
36 public MySQLNullBitmap(final int columnsNumbers, final int offset) {
37 this.offset = offset;
38 nullBitmap = new int[calculateLength(columnsNumbers, offset)];
39 }
40
41 public MySQLNullBitmap(final int columnNumbers, final MySQLPacketPayload payload) {
42 offset = 0;
43 nullBitmap = new int[calculateLength(columnNumbers, 0)];
44 fillBitmap(payload);
45 }
46
47 private void fillBitmap(final MySQLPacketPayload payload) {
48 for (int i = 0; i < nullBitmap.length; i++) {
49 nullBitmap[i] = payload.readInt1();
50 }
51 }
52
53 private int calculateLength(final int columnsNumbers, final int offset) {
54 return (columnsNumbers + offset + 7) / 8;
55 }
56
57
58
59
60
61
62
63 public boolean isNullParameter(final int index) {
64 return (nullBitmap[getBytePosition(index)] & (1 << getBitPosition(index))) != 0;
65 }
66
67
68
69
70
71
72 public void setNullBit(final int index) {
73 nullBitmap[getBytePosition(index)] |= 1 << getBitPosition(index);
74 }
75
76 private int getBytePosition(final int index) {
77 return (index + offset) / 8;
78 }
79
80 private int getBitPosition(final int index) {
81 return (index + offset) % 8;
82 }
83 }