View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Null bitmap for MySQL.
26   *
27   * @see <a href="https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_binary_resultset.html#sect_protocol_binary_resultset_row_null_bitmap">NULL-Bitmap</a>
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       * Judge parameter is null or not null.
59       *
60       * @param index column index
61       * @return parameter is null or not null
62       */
63      public boolean isNullParameter(final int index) {
64          return (nullBitmap[getBytePosition(index)] & (1 << getBitPosition(index))) != 0;
65      }
66      
67      /**
68       * Set null bit.
69       *
70       * @param index column index
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  }