package org.hivedb.util.database; import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.MySQLInnoDBDialect; import org.hivedb.UnsupportedDialectException; public class DialectTools { public static final String MYSQL = "MySQL"; public static final String DERBY = "Derby"; public static final String H2 = "H2"; /** * Get the SQL fragment to create an auto-incrementing key sequence for a database dialect. * @param dialect * @return */ public static String getNumericPrimaryKeySequenceModifier(HiveDbDialect dialect) { String statement = ""; if (dialect == HiveDbDialect.MySql) statement = "int not null auto_increment primary key"; else if (dialect == HiveDbDialect.H2) statement = "int not null auto_increment primary key"; else if (dialect == HiveDbDialect.Derby) statement = "int not null generated always as identity primary key"; else throw new UnsupportedDialectException("Unsupported dialect: " + dialect.toString()); return statement; } /** * Boolean types vary from database to database, this method returns the smallest * available type to be used as a boolean. * @param dialect A HiveDbDialect enum * @return */ public static String getBooleanTypeForDialect(HiveDbDialect dialect) { if (dialect.equals(HiveDbDialect.MySql) || dialect.equals(HiveDbDialect.H2)) return "BOOLEAN"; else if (dialect.equals(HiveDbDialect.Derby)) return "INT"; throw new UnsupportedDialectException("No option boolean option configured for " + dialect.name()); } public static String dialectToString(HiveDbDialect dialect) { if(dialect == HiveDbDialect.H2) return H2; else if(dialect == HiveDbDialect.Derby) return DERBY; else if(dialect == HiveDbDialect.MySql) return MYSQL; else throw new UnsupportedDialectException("Unkown database dialect. HiveDB supports MySQL, H2 and Derby."); } public static HiveDbDialect stringToDialect(String dialect) { if(dialect.toLowerCase().equals(H2.toLowerCase())) return HiveDbDialect.H2; else if(dialect.toLowerCase().equals(DERBY.toLowerCase())) return HiveDbDialect.Derby; else if(dialect.toLowerCase().equals(MYSQL.toLowerCase())) return HiveDbDialect.MySql; else throw new UnsupportedDialectException("Unkown database dialect. HiveDB supports MySQL, H2 and Derby."); } public static String getDropDatabase(HiveDbDialect dialect, String name) { switch (dialect) { case H2: return "SHUTDOWN"; case MySql: return String.format("drop database %s", name); default: return String.format("drop database %s", name); } } public static String getDriver(HiveDbDialect dialect) { switch (dialect) { case H2: return "org.h2.Driver"; case MySql: return "com.mysql.jdbc.Driver"; default: throw new RuntimeException("Unsupported Dialect: " + dialect); } } public static String getHiveTestUri(HiveDbDialect dialect) { switch (dialect) { case H2: return "jdbc:h2:mem:testDb;LOCK_MODE=3"; case MySql: return "jdbc:mysql://localhost/?user=test&password=test"; default: throw new RuntimeException("Unsupported Dialect: " + dialect); } } public static Class getHibernateDialect(HiveDbDialect dialect) { return dialect == HiveDbDialect.H2 ? H2Dialect.class : MySQLInnoDBDialect.class; } public static HiveDbDialect getHiveDbDialectForHibernateDialect(Class hibernateDialect) { if(hibernateDialect.isAssignableFrom(H2Dialect.class)) return HiveDbDialect.H2; else if(hibernateDialect.isAssignableFrom(MySQLInnoDBDialect.class)) return HiveDbDialect.MySql; else throw new UnsupportedDialectException("Unkown database dialect. HiveDB supports MySQL and H2."); } }