1 16 package org.outerj.daisy.jdbcutil; 17 18 import org.apache.avalon.framework.logger.Logger; 19 20 import javax.sql.DataSource ; 21 import java.sql.Connection ; 22 import java.sql.Statement ; 23 import java.sql.SQLException ; 24 import java.util.Map ; 25 import java.util.HashMap ; 26 import java.lang.reflect.Constructor ; 27 28 public abstract class JdbcHelper { 29 private Logger logger; 30 private static Map jdbcHelpers = new HashMap (); 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 databaseProductName, Logger logger) { 39 Class clazz = (Class ) jdbcHelpers.get(databaseProductName); 40 if (clazz == null) { 41 throw new RuntimeException ("Unsupported database: " + databaseProductName); 42 } 43 44 try { 45 Constructor constructor = clazz.getConstructor(new Class []{Logger.class}); 46 return (JdbcHelper) constructor.newInstance(new Object []{logger}); 47 } catch (Exception e) { 48 throw new RuntimeException ("Error creating JdbcHelper.", e); 49 } 50 } 51 52 public static JdbcHelper getInstance(DataSource dataSource, Logger logger) { 53 String databaseProductName = null; 54 try { 55 Connection conn = dataSource.getConnection(); 56 try { 57 databaseProductName = conn.getMetaData().getDatabaseProductName(); 58 } finally { 59 conn.close(); 60 } 61 } catch (Exception e) { 62 throw new RuntimeException ("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 stmt) { 73 if (stmt == null) 74 return; 75 76 try { 77 stmt.close(); 79 } catch (Exception e) { 80 logger.error("Error closing SQL statement.", e); 81 } 82 } 83 84 public void closeConnection(Connection conn) { 85 if (conn == null) 86 return; 87 88 try { 89 if (!conn.getAutoCommit()) { 90 conn.commit(); conn.setAutoCommit(true); 92 } 93 } catch (Throwable e) { 94 logger.error("Error setting connection to autocommit + committing.", e); 95 } 96 97 try { 98 conn.close(); 99 } catch (Throwable e) { 100 logger.error("Error closing connection.", e); 101 } 102 } 103 104 public void rollback(Connection conn) { 105 try { 106 if (conn != null) 107 conn.rollback(); 108 } catch (Throwable e) { 109 logger.error("Error rolling back transaction.", e); 110 } 111 } 112 113 public abstract void startTransaction(Connection conn) throws SQLException ; 114 115 public abstract String getSharedLockClause(); 116 117 118 public String [] getStringLengthFunction() { 119 return new String [] { "CHAR_LENGTH(", ")" }; 120 } 121 122 public String [] getStringConcatFunction() { 123 return new String [] { "CONCAT(", ")" }; 124 } 125 126 public String getStringLeftFunction() { 127 return "LEFT"; 128 } 129 130 public String getStringRightFunction() { 131 return "RIGHT"; 132 } 133 134 public String getSubstringFunction() { 135 return "SUBSTRING"; 136 } 137 138 public String getLowerCaseFunction() { 139 return "LCASE"; 140 } 141 142 public String getUpperCaseFunction() { 143 return "UCASE"; 144 } 145 146 public String [] getExtractYearFunction() { 147 return new String [] { "EXTRACT(YEAR FROM ", ")"}; 148 } 149 150 151 public String [] getExtractMonthFunction() { 152 return new String [] { "EXTRACT(MONTH FROM ", ")"}; 153 } 154 155 public String [] getDayOfWeekFunction() { 156 return new String [] {"DAYOFWEEK(", ")"}; 157 } 158 159 public String [] getDayOfMonthFunction() { 160 return new String [] {"DAYOFMONTH(", ")"}; 161 } 162 163 public String [] getDayOfYearFunction() { 164 return new String [] {"DAYOFYEAR(", ")"}; 165 } 166 167 168 public String [] getWeekFunction() { 169 return new String [] { "WEEK(", ")" }; 170 } 171 172 static class MySqlJdbcHelper extends JdbcHelper { 173 public MySqlJdbcHelper(Logger logger) { 174 super(logger); 175 } 176 177 public void startTransaction(Connection conn) throws SQLException { 178 conn.setAutoCommit(false); 181 } 182 183 public String getSharedLockClause() { 184 return "lock in share mode"; 185 } 186 187 public String [] getWeekFunction() { 188 return new String [] { "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 conn) throws SQLException { 198 conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); 199 conn.setAutoCommit(false); 200 } 201 202 public String 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 conn) throws SQLException { 213 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); 214 conn.setAutoCommit(false); 215 } 216 217 public String getSharedLockClause() { 218 return "for update"; 219 } 220 } 221 } 222 | Popular Tags |