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}