/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.util.db; import java.sql.Driver; import javax.sql.DataSource; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Oracle10gDialect; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.support.lob.DefaultLobHandler; import org.springframework.jdbc.support.lob.LobHandler; import com.google.common.base.CharMatcher; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.elsql.ElSqlConfig; /** * Database dialect for Oracle databases. * <p> * This contains any Oracle specific SQL and is tested for version 11g express. * <p> * An empty string is treated as null in Oracle. * The {@link #toDatabaseString(String)} and {@link #fromDatabaseString(String)} * methods allow the distinction to be preserved. * They replace an empty string with a single space. * Any string consisting of all spaces is replaced by a string with one additional space. */ public class Oracle11gDbDialect extends DbDialect { /** * Helper can be treated as a singleton. */ public static final Oracle11gDbDialect INSTANCE = new Oracle11gDbDialect(); /** * Matcher for a string that is all spaces. */ private static final CharMatcher ALL_SPACES = CharMatcher.is(' '); /** * Restrictive constructor. */ public Oracle11gDbDialect() { } //------------------------------------------------------------------------- @SuppressWarnings("unchecked") @Override public Class<? extends Driver> getJDBCDriverClass() { try { return (Class<? extends Driver>) Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException ex) { throw new OpenGammaRuntimeException("Could not load the Oracle JDBC driver: " + ex.getMessage()); } // Use the Oracle driver... // return oracle.jdbc.driver.OracleDriver.class; } @Override public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(DataSource dataSource) { return new OracleNamedParameterJdbcTemplate(dataSource); } @Override public JdbcTemplate getJdbcTemplate(DataSource dataSource) { return new OracleJdbcTemplate(dataSource); } @Override protected Dialect createHibernateDialect() { return new Oracle10gDialect(); } @Override protected ElSqlConfig createElSqlConfig() { return ElSqlConfig.ORACLE; } //------------------------------------------------------------------------- @Override public String toDatabaseString(String str) { if (str == null) { return null; } else if (str.isEmpty()) { return " "; } else if (str.charAt(0) != ' ') { return str; } else if (ALL_SPACES.matchesAllOf(str)) { return str + ' '; } else { return str; } } @Override public String fromDatabaseString(String str) { if (str == null) { return null; } else if (str.length() > 0 && ALL_SPACES.matchesAllOf(str)) { return str.substring(1); } else { return str; } } //------------------------------------------------------------------------- @Override public String sqlNextSequenceValueSelect(final String sequenceName) { return "SELECT " + sequenceName + ".nextval FROM DUAL"; } @Override public String sqlSelectNow() { return "SELECT CURRENT_TIMESTAMP FROM DUAL"; } //------------------------------------------------------------------------- @Override public LobHandler getLobHandler() { DefaultLobHandler handler = new DefaultLobHandler(); handler.setWrapAsLob(false); return handler; } }