1
2
3
4
5
6
7
8
9
10
11
12
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
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
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
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
105
106
107
108 public boolean supportsGetGeneratedKeys(DatabaseMetaData meta) {
109 try {
110
111
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
124
125
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 }