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.infra.database.core.metadata.database.datatype;
19  
20  import com.cedarsoftware.util.CaseInsensitiveMap;
21  import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
22  import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
23  
24  import java.sql.DatabaseMetaData;
25  import java.sql.ResultSet;
26  import java.sql.SQLException;
27  import java.util.Map;
28  
29  /**
30   * Data type loader.
31   */
32  public final class DataTypeLoader {
33      
34      /**
35       * Load data type.
36       *
37       * @param databaseMetaData database meta data
38       * @param databaseType database type
39       * @return data type map
40       * @throws SQLException SQL exception
41       */
42      public Map<String, Integer> load(final DatabaseMetaData databaseMetaData, final DatabaseType databaseType) throws SQLException {
43          Map<String, Integer> result = loadStandardDataTypes(databaseMetaData);
44          result.putAll(new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getExtraDataTypes());
45          return result;
46      }
47      
48      private Map<String, Integer> loadStandardDataTypes(final DatabaseMetaData databaseMetaData) throws SQLException {
49          Map<String, Integer> result = new CaseInsensitiveMap<>();
50          try (ResultSet resultSet = databaseMetaData.getTypeInfo()) {
51              while (resultSet.next()) {
52                  result.put(resultSet.getString("TYPE_NAME"), resultSet.getInt("DATA_TYPE"));
53              }
54          }
55          return result;
56      }
57  }