View Javadoc

1   /**
2    * Logback: the reliable, generic, fast and flexible logging framework.
3    * Copyright (C) 1999-2011, QOS.ch. All rights reserved.
4    *
5    * This program and the accompanying materials are dual-licensed under
6    * either the terms of the Eclipse Public License v1.0 as published by
7    * the Eclipse Foundation
8    *
9    *   or (per the licensee's choosing)
10   *
11   * under the terms of the GNU Lesser General Public License version 2.1
12   * as published by the Free Software Foundation.
13   */
14  package ch.qos.logback.core.db.dialect;
15  
16  import java.sql.DatabaseMetaData;
17  import java.sql.SQLException;
18  
19  import ch.qos.logback.core.spi.ContextAwareBase;
20  
21  /**
22   * 
23   * @author Ceki Gulcu
24   * 
25   */
26  public class DBUtil extends ContextAwareBase {
27    private static final String POSTGRES_PART = "postgresql";
28    private static final String MYSQL_PART = "mysql";
29    private static final String ORACLE_PART = "oracle";
30    // private static final String MSSQL_PART = "mssqlserver4";
31    private static final String MSSQL_PART = "microsoft";
32    private static final String HSQL_PART = "hsql";
33    private static final String H2_PART = "h2";
34    private static final String SYBASE_SQLANY_PART = "sql anywhere";
35  
36    public static SQLDialectCode discoverSQLDialect(DatabaseMetaData meta) {
37      SQLDialectCode dialectCode = SQLDialectCode.UNKNOWN_DIALECT;
38  
39      try {
40  
41        String dbName = meta.getDatabaseProductName().toLowerCase();
42  
43        if (dbName.indexOf(POSTGRES_PART) != -1) {
44          return SQLDialectCode.POSTGRES_DIALECT;
45        } else if (dbName.indexOf(MYSQL_PART) != -1) {
46          return SQLDialectCode.MYSQL_DIALECT;
47        } else if (dbName.indexOf(ORACLE_PART) != -1) {
48          return SQLDialectCode.ORACLE_DIALECT;
49        } else if (dbName.indexOf(MSSQL_PART) != -1) {
50          return SQLDialectCode.MSSQL_DIALECT;
51        } else if (dbName.indexOf(HSQL_PART) != -1) {
52          return SQLDialectCode.HSQL_DIALECT;
53        } else if (dbName.indexOf(H2_PART) != -1) {
54          return SQLDialectCode.H2_DIALECT;
55        } else if (dbName.indexOf(SYBASE_SQLANY_PART) != -1) {
56          return SQLDialectCode.SYBASE_SQLANYWHERE_DIALECT;
57        } else {
58          return SQLDialectCode.UNKNOWN_DIALECT;
59        }
60      } catch (SQLException sqle) {
61        // we can't do much here
62      }
63  
64      return dialectCode;
65    }
66  
67    public static SQLDialect getDialectFromCode(SQLDialectCode sqlDialectType) {
68      SQLDialect sqlDialect = null;
69  
70      switch (sqlDialectType) {
71      case POSTGRES_DIALECT:
72        sqlDialect = new PostgreSQLDialect();
73        break;
74  
75      case MYSQL_DIALECT:
76        sqlDialect = new MySQLDialect();
77        break;
78      
79      case ORACLE_DIALECT:
80        sqlDialect = new OracleDialect();
81        break;
82      
83      case MSSQL_DIALECT:
84        sqlDialect = new MsSQLDialect();
85        break;
86      
87      case HSQL_DIALECT:
88        sqlDialect = new HSQLDBDialect();
89        break;
90  
91      case H2_DIALECT:
92        sqlDialect = new H2Dialect();
93        break;
94        
95      case SYBASE_SQLANYWHERE_DIALECT:
96        sqlDialect = new SybaseSqlAnywhereDialect();
97        break;
98  
99      }
100     return sqlDialect;
101   }
102 
103   /**
104    * This method handles cases where the
105    * {@link DatabaseMetaData#supportsGetGeneratedKeys} method is missing in the
106    * JDBC driver implementation.
107    */
108   public boolean supportsGetGeneratedKeys(DatabaseMetaData meta) {
109     try {
110       //
111       // invoking JDBC 1.4 method by reflection
112       //
113       return ((Boolean) DatabaseMetaData.class.getMethod(
114           "supportsGetGeneratedKeys", (Class[]) null).invoke(meta,
115           (Object[]) null)).booleanValue();
116     } catch (Throwable e) {
117       addInfo("Could not call supportsGetGeneratedKeys method. This may be recoverable");
118       return false;
119     }
120   }
121 
122   /**
123    * This method handles cases where the
124    * {@link DatabaseMetaData#supportsBatchUpdates} method is missing in the JDBC
125    * driver implementation.
126    */
127   public boolean supportsBatchUpdates(DatabaseMetaData meta) {
128     try {
129       return meta.supportsBatchUpdates();
130     } catch (Throwable e) {
131       addInfo("Missing DatabaseMetaData.supportsBatchUpdates method.");
132       return false;
133     }
134   }
135 }