001/*
002 * ModeShape (http://www.modeshape.org)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *       http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.modeshape.common.database;
017
018import java.sql.DatabaseMetaData;
019import java.sql.SQLException;
020import java.util.Objects;
021
022/**
023 * Utility for interacting with various databases.
024 * 
025 * @author Horia Chiorean (hchiorea@redhat.com)
026 * @since 5.0
027 */
028public class DatabaseUtil {
029
030    private DatabaseUtil() {
031    }
032
033    /**
034     * Determine the type of a database, based on the metadata information from the DB metadata.
035     *
036     * @param metaData a {@link DatabaseMetaData} instance, may not be null
037     * @return a {@link DatabaseType} instance, never null
038     * @throws SQLException if a database access error occurs
039     * or this method is called on a closed connection
040     */
041    public static DatabaseType determineType(DatabaseMetaData metaData) throws SQLException {
042        metaData = Objects.requireNonNull(metaData, "metaData cannot be null");
043        int majorVersion = metaData.getDatabaseMajorVersion();
044        int minorVersion = metaData.getDatabaseMinorVersion();
045        String name = metaData.getDatabaseProductName().toLowerCase();
046        if (name.contains("mysql")) {
047            return new DatabaseType(DatabaseType.Name.MYSQL, majorVersion, minorVersion);
048        } else if (name.contains("postgres")) {
049            return new DatabaseType(DatabaseType.Name.POSTGRES, majorVersion, minorVersion);
050        } else if (name.contains("derby")) {
051            return new DatabaseType(DatabaseType.Name.DERBY, majorVersion, minorVersion);
052        } else if (name.contains("hsql") || name.toLowerCase().contains("hypersonic")) {
053            return new DatabaseType(DatabaseType.Name.HSQL, majorVersion, minorVersion);
054        } else if (name.contains("h2")) {
055            return new DatabaseType(DatabaseType.Name.H2, majorVersion, minorVersion);
056        } else if (name.contains("sqlite")) {
057            return new DatabaseType(DatabaseType.Name.SQLITE, majorVersion, minorVersion);
058        } else if (name.contains("db2")) {
059            return new DatabaseType(DatabaseType.Name.DB2, majorVersion, minorVersion);
060        } else if (name.contains("informix")) {
061            return new DatabaseType(DatabaseType.Name.INFORMIX, majorVersion, minorVersion);
062        } else if (name.contains("interbase")) {
063            return new DatabaseType(DatabaseType.Name.INTERBASE, majorVersion, minorVersion);
064        } else if (name.contains("firebird")) {
065            return new DatabaseType(DatabaseType.Name.FIREBIRD, majorVersion, minorVersion);
066        } else if (name.contains("sqlserver") || name.toLowerCase().contains("microsoft")) {
067            return new DatabaseType(DatabaseType.Name.SQLSERVER, majorVersion, minorVersion);
068        } else if (name.contains("access")) {
069            return new DatabaseType(DatabaseType.Name.ACCESS, majorVersion, minorVersion);
070        } else if (name.contains("oracle")) {
071            return new DatabaseType(DatabaseType.Name.ORACLE, majorVersion, minorVersion);
072        } else if (name.contains("adaptive")) {
073            return new DatabaseType(DatabaseType.Name.SYBASE, majorVersion, minorVersion);
074        } else if (name.contains("cassandra")) {
075            return new DatabaseType(DatabaseType.Name.CASSANDRA, majorVersion, minorVersion);
076        }
077        return DatabaseType.UNKNOWN;
078    }
079}