org.hibernate.dialect.Database.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.dialect.Database.java

Source

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.dialect;

import org.hibernate.HibernateException;
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;

/**
 * List all supported relational database systems.
 *
 * @author Vlad Mihalcea
 */
public enum Database {

    CACHE {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return Cache71Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    CUBRID {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return CUBRIDDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("CUBRID".equalsIgnoreCase(databaseName)) {
                return latestDialectInstance(this);
            }

            return null;
        }
    },
    DB2 {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return DB2400Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("DB2 UDB for AS/400".equals(databaseName)) {
                return new DB2400Dialect();
            }

            if (databaseName.startsWith("DB2/")) {
                return new DB2Dialect();
            }

            return null;
        }
    },
    DERBY {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return DerbyTenSevenDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("Apache Derby".equals(databaseName)) {
                final int majorVersion = info.getDatabaseMajorVersion();
                final int minorVersion = info.getDatabaseMinorVersion();

                if (majorVersion > 10 || (majorVersion == 10 && minorVersion >= 7)) {
                    return latestDialectInstance(this);
                } else if (majorVersion == 10 && minorVersion == 6) {
                    return new DerbyTenSixDialect();
                } else if (majorVersion == 10 && minorVersion == 5) {
                    return new DerbyTenFiveDialect();
                } else {
                    return new DerbyDialect();
                }
            }

            return null;
        }
    },
    ENTERPRISEDB {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return PostgresPlusDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("EnterpriseDB".equals(databaseName)) {
                return latestDialectInstance(this);
            }

            return null;
        }
    },
    FIREBIRD {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return FirebirdDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if (databaseName.startsWith("Firebird")) {
                return latestDialectInstance(this);
            }

            return null;
        }
    },
    FRONTBASE {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return FrontBaseDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    H2 {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return H2Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("H2".equals(databaseName)) {
                return latestDialectInstance(this);
            }

            return null;
        }
    },
    HANA {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return HANAColumnStoreDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("HDB".equals(databaseName)) {
                // SAP recommends defaulting to column store.
                return latestDialectInstance(this);
            }

            return null;
        }
    },
    HSQL {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return HSQLDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("HSQL Database Engine".equals(databaseName)) {
                return latestDialectInstance(this);
            }

            return null;
        }
    },
    INFORMIX {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return Informix10Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("Informix Dynamic Server".equals(databaseName)) {
                return latestDialectInstance(this);
            }

            return null;
        }
    },
    INGRES {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return Ingres10Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("ingres".equalsIgnoreCase(databaseName)) {
                final int majorVersion = info.getDatabaseMajorVersion();
                final int minorVersion = info.getDatabaseMinorVersion();

                if (majorVersion < 9) {
                    return new IngresDialect();
                } else if (majorVersion == 9) {
                    if (minorVersion > 2) {
                        return new Ingres9Dialect();
                    }
                    return new IngresDialect();
                } else if (majorVersion == 10) {
                    return new Ingres10Dialect();
                }

                return latestDialectInstance(this);
            }

            return null;
        }
    },
    INTERBASE {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return InterbaseDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    MARIADB {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return MariaDB103Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {

            if (info.getDriverName() != null && info.getDriverName().startsWith("MariaDB")) {
                final int majorVersion = info.getDatabaseMajorVersion();
                final int minorVersion = info.getDatabaseMinorVersion();

                if (majorVersion == 10) {
                    if (minorVersion >= 3) {
                        return new MariaDB103Dialect();
                    } else if (minorVersion == 2) {
                        return new MariaDB102Dialect();
                    } else if (minorVersion >= 0) {
                        return new MariaDB10Dialect();
                    }
                    return new MariaDB53Dialect();
                } else if (majorVersion > 5 || (majorVersion == 5 && minorVersion >= 3)) {
                    return new MariaDB53Dialect();
                }
                return new MariaDBDialect();
            }

            return null;
        }
    },
    MAXDB {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return SAPDBDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    MCKOI {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return MckoiDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    MIMERSQL {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return MimerSQLDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    MYSQL {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return MySQL8Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("MySQL".equals(databaseName)) {
                final int majorVersion = info.getDatabaseMajorVersion();
                final int minorVersion = info.getDatabaseMinorVersion();

                if (majorVersion < 5) {
                    return new MySQLDialect();
                } else if (majorVersion == 5) {
                    if (minorVersion < 5) {
                        return new MySQL5Dialect();
                    } else if (minorVersion < 7) {
                        return new MySQL55Dialect();
                    } else {
                        return new MySQL57Dialect();
                    }
                }

                return latestDialectInstance(this);
            }

            return null;
        }
    },
    ORACLE {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return Oracle12cDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("Oracle".equals(databaseName)) {
                final int majorVersion = info.getDatabaseMajorVersion();

                switch (majorVersion) {
                case 12:
                    return new Oracle12cDialect();
                case 11:
                    // fall through
                case 10:
                    return new Oracle10gDialect();
                case 9:
                    return new Oracle9iDialect();
                case 8:
                    return new Oracle8iDialect();
                default:
                    return latestDialectInstance(this);

                }
            }

            return null;
        }
    },
    POINTBASE {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return PointbaseDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    POSTGRESQL {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return PostgreSQL10Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("PostgreSQL".equals(databaseName)) {
                final int majorVersion = info.getDatabaseMajorVersion();
                final int minorVersion = info.getDatabaseMinorVersion();

                if (majorVersion < 8) {
                    return new PostgreSQL81Dialect();
                }

                if (majorVersion == 8) {
                    return minorVersion >= 2 ? new PostgreSQL82Dialect() : new PostgreSQL81Dialect();
                }

                if (majorVersion == 9) {
                    if (minorVersion < 2) {
                        return new PostgreSQL9Dialect();
                    } else if (minorVersion < 4) {
                        return new PostgreSQL92Dialect();
                    } else if (minorVersion < 5) {
                        return new PostgreSQL94Dialect();
                    } else {
                        return new PostgreSQL95Dialect();
                    }
                }

                return latestDialectInstance(this);
            }

            return null;
        }
    },
    PROGRESS {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return ProgressDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    SQLSERVER {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return SQLServer2012Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if (databaseName.startsWith("Microsoft SQL Server")) {
                final int majorVersion = info.getDatabaseMajorVersion();

                switch (majorVersion) {
                case 8: {
                    return new SQLServerDialect();
                }
                case 9: {
                    return new SQLServer2005Dialect();
                }
                case 10: {
                    return new SQLServer2008Dialect();
                }
                case 11:
                case 12:
                case 13: {
                    return new SQLServer2012Dialect();
                }
                default: {
                    if (majorVersion < 8) {
                        return new SQLServerDialect();
                    } else {
                        // assume `majorVersion > 13`
                        return latestDialectInstance(this);
                    }
                }
                }
            }

            return null;
        }
    },
    SYBASE {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return SybaseASE15Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            final String databaseName = info.getDatabaseName();

            if ("Sybase SQL Server".equals(databaseName) || "Adaptive Server Enterprise".equals(databaseName)) {
                return latestDialectInstance(this);
            }

            if (databaseName.startsWith("Adaptive Server Anywhere") || "SQL Anywhere".equals(databaseName)) {
                return new SybaseAnywhereDialect();
            }

            return null;
        }
    },
    TERADATA {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return Teradata14Dialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    },
    TIMESTEN {
        @Override
        public Class<? extends Dialect> latestDialect() {
            return TimesTenDialect.class;
        }

        @Override
        public Dialect resolveDialect(DialectResolutionInfo info) {
            return null;
        }
    };

    public abstract Class<? extends Dialect> latestDialect();

    public abstract Dialect resolveDialect(DialectResolutionInfo info);

    private static Dialect latestDialectInstance(Database database) {
        try {
            return database.latestDialect().newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new HibernateException(e);
        }
    }
}