All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.drinkjava2.jdialects.GuessDialectUtils Maven / Gradle / Ivy

Go to download

jDialects is a pagination and DDL tool support ~80 databases, run on JDK8 or above

There is a newer version: 5.0.13.jre8
Show newest version
/*
 * jDialects, a tiny SQL dialect tool 
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or .
 */
package com.github.drinkjava2.jdialects;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import javax.sql.DataSource;

/**
 * Guess Dialect Utils
 * 
 * @author Yong Zhu
 * @since 1.0.1
 */
@SuppressWarnings("all")
public class GuessDialectUtils {
	/**
	 * Guess dialect based on given JDBC connection instance, Note: this method
	 * does not close connection
	 * 
	 * @param jdbcConnection
	 *            The connection
	 * @return dialect or null if can not guess out which dialect
	 */
	public static Dialect guessDialect(Connection jdbcConnection) {
		String databaseName;
		int majorVersion;
		int minorVersion;
		try {
			DatabaseMetaData meta = jdbcConnection.getMetaData();
			databaseName = meta.getDatabaseProductName();
			majorVersion = meta.getDatabaseMajorVersion();
			minorVersion = meta.getDatabaseMinorVersion();
		} catch (SQLException e) {
			return (Dialect) DialectException.throwEX(e, e.getMessage());
		}
		return guessDialect(databaseName, majorVersion, minorVersion);
	}

	/**
	 * Guess dialect based on given dataSource
	 * 
	 * @param datasource
	 *            The dataSource
	 * @return dialect or null if can not guess out which dialect
	 */
	public static Dialect guessDialect(DataSource dataSource) {
		Connection con = null;
		try {
			con = dataSource.getConnection();
			return guessDialect(con);
		} catch (SQLException e) {
			return (Dialect) DialectException.throwEX(e, e.getMessage());
		} finally {
			try {
				if (con != null && !con.isClosed()) {
					try {// NOSONAR
						con.close();
					} catch (SQLException e) {
						DialectException.throwEX(e, e.getMessage());
					}
				}
			} catch (SQLException e) {
				DialectException.throwEX(e, e.getMessage());
			}
		}
	}

	/**
	 * Guess Dialect by give databaseName, MajorVersion, MinorVersion
	 * 
	 * @param databaseName
	 *            The database name
	 * @param majorVersion
	 *            The major version, Optional
	 * @param minorVersion
	 *            The minor version, Optional
	 * @return dialect or null if not found
	 */
	public static Dialect guessDialect(String databaseName, Object... majorVersionMinorVersion) {// NOSONAR
		int majorVersion = 0;
		int minorVersion = 0;
		for (int i = 0; i < majorVersionMinorVersion.length; i++) {
			if (i == 0)
				majorVersion = (Integer) majorVersionMinorVersion[i];
			if (i == 1)
				minorVersion = (Integer) majorVersionMinorVersion[i];
		}
		if ("CUBRID".equalsIgnoreCase(databaseName))
			return Dialect.CUBRIDDialect;
		if ("HSQL Database Engine".equals(databaseName))
			return Dialect.HSQLDialect;
		if ("H2".equals(databaseName))
			return Dialect.H2Dialect;
		if ("MySQL".equals(databaseName))
			if (majorVersion >= 5)
				return Dialect.MySQL5InnoDBDialect;
			else
				return Dialect.MySQLInnoDBDialect;
		if ("PostgreSQL".equals(databaseName)) {
			if (majorVersion == 9) {
				if (minorVersion >= 4) {
					return Dialect.PostgreSQL94Dialect;
				} else if (minorVersion >= 2) {
					return Dialect.PostgreSQL92Dialect;
				}
				return Dialect.PostgreSQL9Dialect;
			}
			if (majorVersion == 8 && minorVersion >= 2) {
				return Dialect.PostgreSQL82Dialect;
			}
			return Dialect.PostgreSQL81Dialect;
		}
		if ("EnterpriseDB".equals(databaseName))
			return Dialect.PostgresPlusDialect;
		if ("Apache Derby".equals(databaseName)) {
			if (majorVersion > 10 || (majorVersion == 10 && minorVersion >= 7))
				return Dialect.DerbyTenSevenDialect;
			else if (majorVersion == 10 && minorVersion == 6)
				return Dialect.DerbyTenSixDialect;
			else if (majorVersion == 10 && minorVersion == 5)
				return Dialect.DerbyTenFiveDialect;
			else
				return Dialect.DerbyDialect;
		}
		if ("ingres".equalsIgnoreCase(databaseName)) {
			switch (majorVersion) {
			case 9:
				if (minorVersion > 2)
					return Dialect.Ingres9Dialect;
				else
					return Dialect.IngresDialect;
			case 10:
				return Dialect.Ingres10Dialect;
			default:
			}
			return Dialect.IngresDialect;
		}
		if (databaseName.startsWith("Microsoft SQL Server")) {
			switch (majorVersion) {
			case 8:
				return Dialect.SQLServerDialect;
			case 9:
				return Dialect.SQLServer2005Dialect;
			case 10:
				return Dialect.SQLServer2008Dialect;
			case 11:
			case 12:
			case 13:
				return Dialect.SQLServer2012Dialect;
			default:
				if (majorVersion < 8)
					return Dialect.SQLServerDialect;
				else
					return Dialect.SQLServer2012Dialect;
			}
		}
		if ("Sybase SQL Server".equals(databaseName) || "Adaptive Server Enterprise".equals(databaseName))
			return Dialect.SybaseASE15Dialect;
		if (databaseName.startsWith("Adaptive Server Anywhere"))
			return Dialect.SybaseAnywhereDialect;
		if ("Informix Dynamic Server".equals(databaseName))
			return Dialect.InformixDialect;
		if ("DB2 UDB for AS/400".equals(databaseName))
			return Dialect.DB2400Dialect;
		if (databaseName.startsWith("DB2/"))
			return Dialect.DB2Dialect;
		if ("Oracle".equals(databaseName)) {
			switch (majorVersion) {
			case 12:
				return Dialect.Oracle12cDialect;
			case 11:
			case 10:
				return Dialect.Oracle10gDialect;
			case 9:
				return Dialect.Oracle9iDialect;
			case 8:
				return Dialect.Oracle8iDialect;
			default:
			}
			return Dialect.Oracle8iDialect;
		}
		if ("HDB".equals(databaseName))
			return Dialect.HANAColumnStoreDialect;
		if (databaseName.startsWith("Firebird"))
			return Dialect.FirebirdDialect;
		if (StrUtils.containsIgnoreCase(databaseName, "sqlite"))
			return Dialect.SQLiteDialect;
		return null;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy