diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplatesRegistry.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplatesRegistry.java index 642cad034..8abf9def7 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplatesRegistry.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLTemplatesRegistry.java @@ -2,41 +2,55 @@ package com.mysema.query.sql; import java.sql.DatabaseMetaData; import java.sql.SQLException; -import java.util.Map; - -import com.google.common.collect.Maps; /** * */ public class SQLTemplatesRegistry { - private final Map registry = Maps.newHashMap(); + private final SQLTemplates generic = SQLTemplates.DEFAULT; - public SQLTemplatesRegistry() { - registry.put("h2", new H2Templates()); - registry.put("postgresql", new PostgresTemplates()); - registry.put("oracle", new OracleTemplates()); - registry.put("mysql", new MySQLTemplates()); - registry.put("hsql", new HSQLDBTemplates()); - registry.put("firebird", new FirebirdTemplates()); - registry.put("sqlite", new SQLiteTemplates()); - registry.put("apache", new DerbyTemplates()); - // TODO SQLServer - // TODO Teradata - } + private final SQLTemplates cubrid = new CUBRIDTemplates(); + private final SQLTemplates derby = new DerbyTemplates(); + private final SQLTemplates firebird = new FirebirdTemplates(); + private final SQLTemplates h2 = new H2Templates(); + private final SQLTemplates hsqldb = new HSQLDBTemplates(); + private final SQLTemplates mysql = new MySQLTemplates(); + private final SQLTemplates oracle = new OracleTemplates(); + private final SQLTemplates postgres = new PostgresTemplates(); + private final SQLTemplates sqlite = new SQLiteTemplates(); + private final SQLTemplates teradata = new TeradataTemplates(); - public SQLTemplates getTemplates(DatabaseMetaData md) { - try { - String name = md.getDatabaseProductName(); - int separator = name.indexOf(' '); - if (separator > -1) { - name = name.substring(0, separator); + private final SQLTemplates sqlserver = new SQLServerTemplates(); + private final SQLTemplates sqlserver2005 = new SQLServer2005Templates(); + private final SQLTemplates sqlserver2008 = new SQLServer2008Templates(); + private final SQLTemplates sqlserver2012 = new SQLServer2012Templates(); + + public SQLTemplates getTemplates(DatabaseMetaData md) throws SQLException { + String name = md.getDatabaseProductName().toLowerCase(); + if (name.equals("cubrid")) return cubrid; + if (name.equals("apache derby")) return derby; + if (name.startsWith("firebird")) return firebird; + if (name.equals("h2")) return h2; + if (name.equals("hsql")) return hsqldb; + if (name.equals("mysql")) return mysql; + if (name.equals("oracle")) return oracle; + if (name.equals("postgresql")) return postgres; + if (name.equals("sqlite")) return sqlite; + if (name.startsWith("teradata")) return teradata; + + // sqlserver + if (name.equals("microsft sql server")) { + switch (md.getDatabaseMajorVersion()) { + case 12: + case 11: return sqlserver2012; + case 10: return sqlserver2008; + case 9: return sqlserver2005; + default: return sqlserver; } - return registry.get(name.toLowerCase()); - } catch (SQLException ex) { - throw new RuntimeException(ex.getMessage(), ex); } + + return generic; } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/sql/SQLTemplatesRegistryDump.java b/querydsl-sql/src/test/java/com/mysema/query/sql/SQLTemplatesRegistryDump.java new file mode 100644 index 000000000..2744f9510 --- /dev/null +++ b/querydsl-sql/src/test/java/com/mysema/query/sql/SQLTemplatesRegistryDump.java @@ -0,0 +1,43 @@ +package com.mysema.query.sql; + +import java.sql.DatabaseMetaData; +import java.sql.SQLException; + +import com.mysema.query.Connections; + +public class SQLTemplatesRegistryDump { + + public static void main(String[] args) throws SQLException, ClassNotFoundException { + Connections.initCubrid(); + dump(); + Connections.initDerby(); + dump(); + Connections.initFirebird(); + dump(); + Connections.initH2(); + dump(); + Connections.initHSQL(); + dump(); + Connections.initMySQL(); + dump(); + Connections.initOracle(); + dump(); + Connections.initPostgres(); + dump(); + Connections.initSQLite(); + dump(); + Connections.initSQLServer(); + dump(); + /*Connections.initTeradata(); + dump();*/ + } + + private static void dump() throws SQLException { + DatabaseMetaData md = Connections.getConnection().getMetaData(); + System.out.println(md.getDatabaseProductName()); + System.out.println(md.getDatabaseMajorVersion()); + System.out.println(md.getDatabaseMinorVersion()); + System.out.println(); + Connections.close(); + } +}