001package com.avaje.ebean.config.dbplatform;
002
003import com.avaje.ebean.BackgroundExecutor;
004import com.avaje.ebean.dbmigration.ddlgeneration.platform.Oracle10Ddl;
005
006import javax.sql.DataSource;
007import java.sql.Types;
008
009/**
010 * Oracle10 and greater specific platform.
011 */
012public class OraclePlatform extends DatabasePlatform {
013
014  public OraclePlatform() {
015    super();
016    this.name = "oracle";
017    this.maxTableNameLength = 30;
018    this.maxConstraintNameLength = 30;
019    // OnQueryOnly.CLOSE as a performance optimisation on Oracle
020    this.onQueryOnly = OnQueryOnly.CLOSE;
021    this.dbEncrypt = new OracleDbEncrypt();
022    this.sqlLimiter = new RownumSqlLimiter();
023    this.platformDdl = new Oracle10Ddl(this.dbTypeMap, this.dbIdentity);
024    this.historySupport = new OracleDbHistorySupport();
025
026    // Not using getGeneratedKeys as instead we will
027    // batch load sequences which enables JDBC batch execution
028    dbIdentity.setSupportsGetGeneratedKeys(false);
029    dbIdentity.setIdType(IdType.SEQUENCE);
030    dbIdentity.setSupportsSequence(true);
031
032    this.treatEmptyStringsAsNull = true;
033
034    this.openQuote = "\"";
035    this.closeQuote = "\"";
036
037    booleanDbType = Types.INTEGER;
038    dbTypeMap.put(Types.BOOLEAN, new DbType("number(1) default 0"));
039
040    dbTypeMap.put(Types.INTEGER, new DbType("number", 10));
041    dbTypeMap.put(Types.BIGINT, new DbType("number", 19));
042    dbTypeMap.put(Types.REAL, new DbType("number", 19, 4));
043    dbTypeMap.put(Types.DOUBLE, new DbType("number", 19, 4));
044    dbTypeMap.put(Types.SMALLINT, new DbType("number", 5));
045    dbTypeMap.put(Types.TINYINT, new DbType("number", 3));
046    dbTypeMap.put(Types.DECIMAL, new DbType("number", 38));
047
048    dbTypeMap.put(Types.VARCHAR, new DbType("varchar2", 255));
049
050    dbTypeMap.put(Types.LONGVARBINARY, new DbType("blob"));
051    dbTypeMap.put(Types.LONGVARCHAR, new DbType("clob"));
052    dbTypeMap.put(Types.VARBINARY, new DbType("raw", 255));
053    dbTypeMap.put(Types.BINARY, new DbType("raw", 255));
054
055    dbTypeMap.put(Types.TIME, new DbType("timestamp"));
056  }
057
058  @Override
059  public IdGenerator createSequenceIdGenerator(BackgroundExecutor be, DataSource ds, String seqName, int batchSize) {
060
061    return new OracleSequenceIdGenerator(be, ds, seqName, batchSize);
062  }
063
064  @Override
065  protected String withForUpdate(String sql) {
066    return sql + " for update";
067  }
068}