KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > jdbcutil > JdbcHelper


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.jdbcutil;
17
18 import org.apache.avalon.framework.logger.Logger;
19
20 import javax.sql.DataSource JavaDoc;
21 import java.sql.Connection JavaDoc;
22 import java.sql.Statement JavaDoc;
23 import java.sql.SQLException JavaDoc;
24 import java.util.Map JavaDoc;
25 import java.util.HashMap JavaDoc;
26 import java.lang.reflect.Constructor JavaDoc;
27
28 public abstract class JdbcHelper {
29     private Logger logger;
30     private static Map JavaDoc jdbcHelpers = new HashMap JavaDoc();
31
32     static {
33         jdbcHelpers.put("MySQL", MySqlJdbcHelper.class);
34         jdbcHelpers.put("PostgreSQL", PostgresqlJdbcHelper.class);
35         jdbcHelpers.put("Oracle", OracleJdbcHelper.class);
36     }
37
38     public static JdbcHelper getInstance(String JavaDoc databaseProductName, Logger logger) {
39         Class JavaDoc clazz = (Class JavaDoc) jdbcHelpers.get(databaseProductName);
40         if (clazz == null) {
41             throw new RuntimeException JavaDoc("Unsupported database: " + databaseProductName);
42         }
43
44         try {
45             Constructor JavaDoc constructor = clazz.getConstructor(new Class JavaDoc[]{Logger.class});
46             return (JdbcHelper) constructor.newInstance(new Object JavaDoc[]{logger});
47         } catch (Exception JavaDoc e) {
48             throw new RuntimeException JavaDoc("Error creating JdbcHelper.", e);
49         }
50     }
51
52     public static JdbcHelper getInstance(DataSource JavaDoc dataSource, Logger logger) {
53         String JavaDoc databaseProductName = null;
54         try {
55             Connection JavaDoc conn = dataSource.getConnection();
56             try {
57                 databaseProductName = conn.getMetaData().getDatabaseProductName();
58             } finally {
59                 conn.close();
60             }
61         } catch (Exception JavaDoc e) {
62             throw new RuntimeException JavaDoc("Problem determing database product name.", e);
63         }
64         return JdbcHelper.getInstance(databaseProductName, logger);
65     }
66
67
68     private JdbcHelper(Logger logger) {
69         this.logger = logger;
70     }
71
72     public void closeStatement(Statement JavaDoc stmt) {
73         if (stmt == null)
74             return;
75
76         try {
77             // note: calling close on an already closed statement has no effect, so we don't have to worry about that
78
stmt.close();
79         } catch (Exception JavaDoc e) {
80             logger.error("Error closing SQL statement.", e);
81         }
82     }
83
84     public void closeConnection(Connection JavaDoc conn) {
85         if (conn == null)
86             return;
87
88         try {
89             if (!conn.getAutoCommit()) {
90                 conn.commit(); // in case a commit has somewhere been forgotten
91
conn.setAutoCommit(true);
92             }
93         } catch (Throwable JavaDoc e) {
94             logger.error("Error setting connection to autocommit + committing.", e);
95         }
96
97         try {
98             conn.close();
99         } catch (Throwable JavaDoc e) {
100             logger.error("Error closing connection.", e);
101         }
102     }
103
104     public void rollback(Connection JavaDoc conn) {
105         try {
106             if (conn != null)
107                 conn.rollback();
108         } catch (Throwable JavaDoc e) {
109             logger.error("Error rolling back transaction.", e);
110         }
111     }
112
113     public abstract void startTransaction(Connection JavaDoc conn) throws SQLException JavaDoc;
114
115     public abstract String JavaDoc getSharedLockClause();
116
117     /** Returns the name of a SQL function that gets the length of a string (in characters, not in bytes). */
118     public String JavaDoc[] getStringLengthFunction() {
119         return new String JavaDoc[] { "CHAR_LENGTH(", ")" };
120     }
121
122     public String JavaDoc[] getStringConcatFunction() {
123         return new String JavaDoc[] { "CONCAT(", ")" };
124     }
125
126     public String JavaDoc getStringLeftFunction() {
127         return "LEFT";
128     }
129
130     public String JavaDoc getStringRightFunction() {
131         return "RIGHT";
132     }
133
134     public String JavaDoc getSubstringFunction() {
135         return "SUBSTRING";
136     }
137
138     public String JavaDoc getLowerCaseFunction() {
139         return "LCASE";
140     }
141
142     public String JavaDoc getUpperCaseFunction() {
143         return "UCASE";
144     }
145
146     public String JavaDoc[] getExtractYearFunction() {
147         return new String JavaDoc[] { "EXTRACT(YEAR FROM ", ")"};
148     }
149
150     /** 1 = January */
151     public String JavaDoc[] getExtractMonthFunction() {
152         return new String JavaDoc[] { "EXTRACT(MONTH FROM ", ")"};
153     }
154
155     public String JavaDoc[] getDayOfWeekFunction() {
156         return new String JavaDoc[] {"DAYOFWEEK(", ")"};
157     }
158
159     public String JavaDoc[] getDayOfMonthFunction() {
160         return new String JavaDoc[] {"DAYOFMONTH(", ")"};
161     }
162
163     public String JavaDoc[] getDayOfYearFunction() {
164         return new String JavaDoc[] {"DAYOFYEAR(", ")"};
165     }
166
167     /** First week = week with a sunday. */
168     public String JavaDoc[] getWeekFunction() {
169         return new String JavaDoc[] { "WEEK(", ")" };
170     }
171
172     static class MySqlJdbcHelper extends JdbcHelper {
173         public MySqlJdbcHelper(Logger logger) {
174             super(logger);
175         }
176
177         public void startTransaction(Connection JavaDoc conn) throws SQLException JavaDoc {
178             // Note: the default transaction level of MySQL is repeatable read and
179
// offers consistent reads
180
conn.setAutoCommit(false);
181         }
182
183         public String JavaDoc getSharedLockClause() {
184             return "lock in share mode";
185         }
186
187         public String JavaDoc[] getWeekFunction() {
188             return new String JavaDoc[] { "WEEK(", ", 2)" };
189         }
190     }
191
192     static class PostgresqlJdbcHelper extends JdbcHelper {
193         public PostgresqlJdbcHelper(Logger logger) {
194             super(logger);
195         }
196
197         public void startTransaction(Connection JavaDoc conn) throws SQLException JavaDoc {
198             conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
199             conn.setAutoCommit(false);
200         }
201
202         public String JavaDoc getSharedLockClause() {
203             return "for update";
204         }
205     }
206
207     static class OracleJdbcHelper extends JdbcHelper {
208         public OracleJdbcHelper(Logger logger) {
209             super(logger);
210         }
211
212         public void startTransaction(Connection JavaDoc conn) throws SQLException JavaDoc {
213             conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
214             conn.setAutoCommit(false);
215         }
216
217         public String JavaDoc getSharedLockClause() {
218             return "for update";
219         }
220     }
221 }
222
Popular Tags