1 24 package org.riotfamily.revolt.support; 25 26 import java.sql.Connection ; 27 import java.sql.DatabaseMetaData ; 28 import java.sql.SQLException ; 29 import java.util.ArrayList ; 30 import java.util.Iterator ; 31 import java.util.List ; 32 33 import javax.sql.DataSource ; 34 35 import org.riotfamily.revolt.Dialect; 36 import org.riotfamily.revolt.dialect.HsqlDialect; 37 import org.riotfamily.revolt.dialect.MySqlDialect; 38 import org.riotfamily.revolt.dialect.Postgresql8Dialect; 39 import org.riotfamily.revolt.dialect.PostgresqlDialect; 40 import org.springframework.dao.DataAccessException; 41 import org.springframework.jdbc.core.ConnectionCallback; 42 import org.springframework.jdbc.core.JdbcTemplate; 43 44 50 public class DialectResolver { 51 52 private List dialects; 53 54 public DialectResolver() { 55 dialects = new ArrayList (); 56 dialects.add(new PostgresqlDialect()); 57 dialects.add(new Postgresql8Dialect()); 58 dialects.add(new MySqlDialect()); 59 dialects.add(new HsqlDialect()); 60 } 61 62 public Dialect getDialect(DataSource dataSource) 63 throws DatabaseNotSupportedException { 64 65 JdbcTemplate template = new JdbcTemplate(dataSource); 66 return (Dialect) template.execute(new ConnectionCallback() { 67 public Object doInConnection(Connection connection) 68 throws SQLException , DataAccessException { 69 70 DatabaseMetaData metaData = connection.getMetaData(); 71 String productName = metaData.getDatabaseProductName(); 72 int major = metaData.getDatabaseMajorVersion(); 73 int minor = metaData.getDatabaseMinorVersion(); 74 return getDialect(productName, major, minor); 75 } 76 }); 77 } 78 79 protected Dialect getDialect(String productName, int major, int minor) { 80 Iterator it = dialects.iterator(); 81 while (it.hasNext()) { 82 Dialect dialect = (Dialect) it.next(); 83 if (dialect.supports(productName, major, minor)) { 84 return dialect; 85 } 86 } 87 throw new DatabaseNotSupportedException(productName, major, minor); 88 } 89 90 } 91 | Popular Tags |