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.constant;
19  
20  import com.google.common.base.Preconditions;
21  import lombok.Getter;
22  import lombok.RequiredArgsConstructor;
23  import org.apache.shardingsphere.db.protocol.binary.BinaryColumnType;
24  
25  import java.sql.Types;
26  import java.util.HashMap;
27  import java.util.Map;
28  
29  /**
30   * Binary column type for MySQL.
31   * 
32   * @see <a href="https://github.com/apache/shardingsphere/issues/4355"></a>
33   */
34  @RequiredArgsConstructor
35  @Getter
36  public enum MySQLBinaryColumnType implements BinaryColumnType {
37      
38      DECIMAL(0x00),
39      
40      TINY(0x01),
41      
42      SHORT(0x02),
43      
44      LONG(0x03),
45      
46      FLOAT(0x04),
47      
48      DOUBLE(0x05),
49      
50      NULL(0x06),
51      
52      TIMESTAMP(0x07),
53      
54      LONGLONG(0x08),
55      
56      INT24(0x09),
57      
58      DATE(0x0a),
59      
60      TIME(0x0b),
61      
62      DATETIME(0x0c),
63      
64      YEAR(0x0d),
65      
66      NEWDATE(0x0e),
67      
68      VARCHAR(0x0f),
69      
70      BIT(0x10),
71      
72      TIMESTAMP2(0x11),
73      
74      DATETIME2(0x12),
75      
76      TIME2(0x13),
77      
78      /**
79       * Do not describe in document, but actual exist.
80       *
81       * @see <a href="https://github.com/apache/shardingsphere/issues/4795"></a>
82       */
83      JSON(0xf5),
84      
85      NEWDECIMAL(0xf6),
86      
87      ENUM(0xf7),
88      
89      SET(0xf8),
90      
91      TINY_BLOB(0xf9),
92      
93      MEDIUM_BLOB(0xfa),
94      
95      LONG_BLOB(0xfb),
96      
97      BLOB(0xfc),
98      
99      VAR_STRING(0xfd),
100     
101     STRING(0xfe),
102     
103     GEOMETRY(0xff);
104     
105     private static final Map<Integer, MySQLBinaryColumnType> JDBC_TYPE_AND_COLUMN_TYPE_MAP = new HashMap<>(values().length, 1F);
106     
107     private static final Map<Integer, MySQLBinaryColumnType> VALUE_AND_COLUMN_TYPE_MAP = new HashMap<>(values().length, 1F);
108     
109     private final int value;
110     
111     static {
112         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.BIT, BIT);
113         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.TINYINT, TINY);
114         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.SMALLINT, SHORT);
115         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.INTEGER, LONG);
116         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.BIGINT, LONGLONG);
117         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.FLOAT, FLOAT);
118         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.REAL, FLOAT);
119         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.DOUBLE, DOUBLE);
120         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.NUMERIC, NEWDECIMAL);
121         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.DECIMAL, NEWDECIMAL);
122         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.CHAR, STRING);
123         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.VARCHAR, VAR_STRING);
124         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.LONGVARCHAR, VAR_STRING);
125         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.DATE, DATE);
126         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.TIME, TIME);
127         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.TIMESTAMP, TIMESTAMP);
128         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.BINARY, STRING);
129         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.VARBINARY, VAR_STRING);
130         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.LONGVARBINARY, VAR_STRING);
131         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.NULL, NULL);
132         JDBC_TYPE_AND_COLUMN_TYPE_MAP.put(Types.BLOB, BLOB);
133         for (MySQLBinaryColumnType each : values()) {
134             VALUE_AND_COLUMN_TYPE_MAP.put(each.value, each);
135         }
136     }
137     
138     /**
139      * Value of JDBC type.
140      *
141      * @param jdbcType JDBC type
142      * @return column type enum
143      */
144     public static MySQLBinaryColumnType valueOfJDBCType(final int jdbcType) {
145         Preconditions.checkArgument(JDBC_TYPE_AND_COLUMN_TYPE_MAP.containsKey(jdbcType), "Can not find JDBC type `%s` in column type", jdbcType);
146         return JDBC_TYPE_AND_COLUMN_TYPE_MAP.get(jdbcType);
147     }
148     
149     /**
150      * Value of.
151      * 
152      * @param value value
153      * @return column type
154      */
155     public static MySQLBinaryColumnType valueOf(final int value) {
156         Preconditions.checkArgument(VALUE_AND_COLUMN_TYPE_MAP.containsKey(value), "Can not find value `%s` in column type", value);
157         return VALUE_AND_COLUMN_TYPE_MAP.get(value);
158     }
159 }