blob: c83ace9eb3d3fc935af0ae28e3942f7bc6e23918 [file] [log] [blame]
/*
* Copyright (c) 2012, 2013, 2015 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
* Erdal Karaca - copied from mysql impl to adapt to oracle db
*/
package org.eclipse.net4j.db.oracle;
import org.eclipse.net4j.db.DBType;
import org.eclipse.net4j.db.DBUtil;
import org.eclipse.net4j.db.IDBConnectionProvider;
import org.eclipse.net4j.db.ddl.IDBField;
import org.eclipse.net4j.spi.db.DBAdapter;
import org.eclipse.net4j.util.security.IUserAware;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import oracle.jdbc.pool.OracleDataSource;
public class OracleAdapter extends DBAdapter
{
public static final String NAME = "oracle"; //$NON-NLS-1$
public static final String VERSION = "11.1.0.7"; //$NON-NLS-1$
public OracleAdapter()
{
super(NAME, VERSION);
}
@Override
public IDBConnectionProvider createConnectionProvider(DataSource dataSource)
{
if (dataSource instanceof OracleDataSource)
{
return DBUtil.createConnectionProvider(dataSource, ((OracleDataSource)dataSource).getUser());
}
return super.createConnectionProvider(dataSource);
}
public String[] getReservedWords()
{
List<String> list = new ArrayList<String>(Arrays.asList(getSQL92ReservedWords()));
list.add("INDEX");
list.add("COMMENT");
list.add("ACCESS");
return list.toArray(new String[list.size()]);
}
@Override
public boolean isTypeIndexable(DBType type)
{
switch (type)
{
case VARCHAR:
return false;
default:
return super.isTypeIndexable(type);
}
}
@Override
protected String getTypeName(IDBField field)
{
DBType type = field.getType();
switch (type)
{
case NUMERIC:
case DECIMAL:
case FLOAT:
case REAL:
case DOUBLE:
case BIGINT:
return "NUMBER";
case TINYINT:
return "NUMBER(5)";
case SMALLINT:
case BOOLEAN:
case BIT:
return "NUMBER(7)";
case INTEGER:
return "NUMBER(12)";
case DATE:
case TIME:
return "DATE";
case CHAR:
case VARCHAR:
return "VARCHAR2(" + field.getPrecision() + " CHAR)";
case LONGVARCHAR:
return "LONG";
case BINARY:
case VARBINARY:
case LONGVARBINARY:
return "LONG RAW";
default:
return super.getTypeName(field);
}
}
@Override
public int getFieldLength(DBType type)
{
if (type == DBType.VARCHAR)
{
return 4000; // Oracle only supports 4000 for VARCHAR
}
return super.getFieldLength(type);
}
@Override
public DBType adaptType(DBType type)
{
if (type == DBType.BOOLEAN)
{
return DBType.SMALLINT;
}
return super.adaptType(type);
}
@Override
public int getMaxTableNameLength()
{
return 30;
}
@Override
public int getMaxFieldNameLength()
{
return 30;
}
@Override
public boolean isTableNotFoundException(SQLException ex)
{
String message = ex.getMessage();
return message != null && message.toLowerCase().contains("ora-00942") && "42000".equals(ex.getSQLState());
}
@Override
public boolean isColumnNotFoundException(SQLException ex)
{
String message = ex.getMessage();
return message != null && message.toLowerCase().contains("ora-00904") && "42000".equals(ex.getSQLState());
}
@Override
public boolean isDuplicateKeyException(SQLException ex)
{
String message = ex.getMessage();
return message != null && message.toLowerCase().contains("ora-00001") && "23000".equals(ex.getSQLState());
}
@Override
protected String sqlModifyField(String tableName, String fieldName, String definition)
{
return "ALTER TABLE " + tableName + " MODIFY " + fieldName + " " + definition;
}
@Override
protected ResultSet readTables(Connection connection, DatabaseMetaData metaData, String schemaName)
throws SQLException
{
if (schemaName == null && connection instanceof IUserAware)
{
schemaName = ((IUserAware)connection).getUserID();
}
return metaData.getTables(null, schemaName, null, new String[] { "TABLE" });
}
@Override
public String convertString(PreparedStatement preparedStatement, int parameterIndex, String value)
{
if (value != null && value.length() == 0)
{
String replacement = getEmptyStringReplacement();
if (replacement != null)
{
value = replacement;
}
}
return super.convertString(preparedStatement, parameterIndex, value);
}
@Override
public String convertString(ResultSet resultSet, int columnIndex, String value)
{
value = super.convertString(resultSet, columnIndex, value);
if (value != null)
{
String replacement = getEmptyStringReplacement();
if (replacement != null && replacement.equals(value))
{
value = "";
}
}
return value;
}
@Override
public String convertString(ResultSet resultSet, String columnLabel, String value)
{
value = super.convertString(resultSet, columnLabel, value);
if (value != null)
{
String replacement = getEmptyStringReplacement();
if (replacement != null && replacement.equals(value))
{
value = null;
}
}
return value;
}
/**
* @since 1.1
*/
protected String getEmptyStringReplacement()
{
return "<empty>";
}
}