blob: b626c6e27d95dbee64d38ac87f6dc8bcd847a2c4 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Mike Norman - from Proof-of-concept, become production code
// quwang - Aug 9, 2006
package dbws.testing.shadowddlgeneration.oldjpub;
//javase imports
import java.util.Map;
//EclipseLink imports
import dbws.testing.shadowddlgeneration.oldjpub.Util;
/**
* NB - this class does <b>NOT</b> implement the {@link java.util.Map} API
*/
public class Typemap {
public static final int UNSUPPORTED_TYPE = 0;
public static final int BYTE_ARRAY = UNSUPPORTED_TYPE + 1;
public static final int DOUBLE = BYTE_ARRAY + 1;
public static final int FLOAT = DOUBLE + 1;
public static final int INT = FLOAT + 1;
public static final int SHORT = INT + 1;
public static final int BOOLEAN = SHORT + 1;
public static final int OS_BFILE = BOOLEAN + 1;
public static final int OS_BLOB = OS_BFILE + 1;
public static final int OS_CHAR = OS_BLOB + 1;
public static final int OS_CLOB = OS_CHAR + 1;
public static final int OS_DATE = OS_CLOB + 1;
public static final int OS_NUMBER = OS_DATE + 1;
public static final int OS_RAW = OS_NUMBER + 1;
public static final int OS_ROWID = OS_RAW + 1;
public static final int OS_NCHAR = OS_ROWID + 1;
public static final int OS_NCLOB = OS_NCHAR + 1;
public static final int OS_BINARY_FLOAT = OS_NCLOB + 1;
public static final int OS_BINARY_DOUBLE = OS_BINARY_FLOAT + 1;
public static final int OS_TIMESTAMP = OS_BINARY_DOUBLE + 1;
public static final int OS_TIMESTAMPTZ = OS_TIMESTAMP + 1;
public static final int OS_TIMESTAMPLTZ = OS_TIMESTAMPTZ + 1;
public static final int OS_CUSTOMDATUM = OS_TIMESTAMPLTZ + 1;
public static final int OS_NSTRING = OS_CUSTOMDATUM + 1;
public static final int JL_DOUBLE = OS_NSTRING + 1;
public static final int JL_FLOAT = JL_DOUBLE + 1;
public static final int JL_INTEGER = JL_FLOAT + 1;
public static final int JL_SHORT = JL_INTEGER + 1;
public static final int JL_STRING = JL_SHORT + 1;
public static final int JM_BIGDECIMAL = JL_STRING + 1;
public static final int JS_ARRAY = JM_BIGDECIMAL + 1;
public static final int JS_BLOB = JS_ARRAY + 1;
public static final int JS_CLOB = JS_BLOB + 1;
public static final int JS_REF = JS_CLOB + 1;
public static final int JS_RESULTSET = JS_REF + 1;
public static final int JS_SQLDATA = JS_RESULTSET + 1;
public static final int JS_DATE = JS_SQLDATA + 1;
public static final int JS_TIMESTAMP = JS_DATE + 1;
public static final int OCI_BFILELOCATOR = JS_TIMESTAMP + 1;
public static final int OCI_BLOBLOCATOR = OCI_BFILELOCATOR + 1;
public static final int OCI_CLOBLOCATOR = OCI_BLOBLOCATOR + 1;
public static final int OCI_DATE = OCI_CLOBLOCATOR + 1;
public static final int OCI_DATETIME = OCI_DATE + 1;
public static final int OCI_INTERVAL = OCI_DATETIME + 1;
public static final int OCI_NUMBER = OCI_INTERVAL + 1;
public static final int OCI_RAW = OCI_NUMBER + 1;
public static final int OCI_STRING = OCI_RAW + 1;
public static final int C_GENERATEDTYPE = OCI_STRING + 1;
public static final int OCI_TABLE = C_GENERATEDTYPE + 1;
public static final int OCCI_BFILE = OCI_TABLE + 1;
public static final int OCCI_BYTES = OCCI_BFILE + 1;
public static final int OCCI_BLOB = OCCI_BYTES + 1;
public static final int OCCI_CLOB = OCCI_BLOB + 1;
public static final int OCCI_DATE = OCCI_CLOB + 1;
public static final int OCCI_TIMESTAMP = OCCI_DATE + 1;
public static final int OCCI_INTERVALYM = OCCI_TIMESTAMP + 1;
public static final int OCCI_INTERVALDS = OCCI_INTERVALYM + 1;
public static final int OCCI_NUMBER = OCCI_INTERVALDS + 1;
public static final int CPP_STRING = OCCI_NUMBER + 1;
public static final int CPP_WSTRING = CPP_STRING + 1;
public static final int OCCI_COLLECTION = CPP_WSTRING + 1;
public static final int OCCI_REF = OCCI_COLLECTION + 1;
public static final int OCCI_OBJ = OCCI_REF + 1;
public static final int OCCI_COLLECTION_OF_REFS = OCCI_OBJ + 1;
private static final int ORACLE_TYPES_BINARY_DOUBLE = 101;
private static final int ORACLE_TYPES_BINARY_FLOAT = 100;
private static final int ORACLE_TYPES_JAVA_STRUCT = 2008;
private static final int ORACLE_TYPES_OPAQUE = 2007;
private static final int ORACLE_TYPES_TIMESTAMPLTZ = -102;
private static final int ORACLE_TYPES_TIMESTAMPTZ = -101;
static final String[] NAMES = {"<unsupported type>",
"byte[]", "double", "float", "int", "short", "boolean",
"oracle.sql.BFILE", "oracle.sql.BLOB", "oracle.sql.CHAR", "oracle.sql.CLOB", "oracle.sql.DATE",
"oracle.sql.NUMBER", "oracle.sql.RAW", "oracle.sql.ROWID",
"oracle.sql.NCHAR", "oracle.sql.NCLOB",
"oracle.sql.BINARY_FLOAT", "oracle.sql.BINARY_DOUBLE",
"oracle.sql.TIMESTAMP", "oracle.sql.TIMESTAMPTZ", "oracle.sql.TIMESTAMPLTZ",
null, "java.lang.String",
"Double", "Float", "Integer", "Short", "String",
"java.math.BigDecimal",
"java.sql.Array", "java.sql.Blob", "java.sql.Clob", "java.sql.Ref", "java.sql.ResultSet",
null, "java.sql.Date", "java.sql.Timestamp",
"OCIBFileLocator *", "OCIBlobLocator *", "OCIClobLocator *", "OCIDate",
"OCIDateTime *", "OCIInterval *",
"OCINumber", "OCIRaw *", "OCIString *", null, null,
"oracle::occi::Bfile", "oracle::occi::Bytes", "oracle::occi::Blob", "oracle::occi::Clob",
"oracle::occi::Date", "oracle::occi::Timestamp", "oracle::occi::IntervalYM",
"oracle::occi::IntervalDS", "oracle::occi::Number", "OCCI_STD_NAMESPACE::string",
"OCCI_STD_NAMESPACE::wstring", null, null, null, null
};
static final String[] ACCESSOR_METHODS = {null, // "<unsupported type>",
"Bytes", "Double", "Float", "Int", "Short", "Boolean",
"BFILE", "BLOB", "CHAR", "CLOB", "DATE", "NUMBER", "RAW", "ROWID",
"NCHAR", "NCLOB",
"Object", "Object",
"TIMESTAMP", "TIMESTAMPTZ", "TIMESTAMPLTZ",
null, "String",
"Double", "Float", "Int", "Short", "String",
"BigDecimal",
"Array", "Blob", "Clob", "Ref", "Cursor", null, "Date", "Timestamp",
null, // "nullOCIBFileLocator *",
null, // "OCIBlobLocator *",
null, // "OCIClobLocator *",
null, // "OCIDate",
null, // "OCIDateTime *",
null, // "OCIInterval *",
null, // "OCINumber",
null, // "OCIRaw *",
null, // "OCIString *",
null, null,
null, // "oracle::occi::Bfile",
null, // "oracle::occi::Bytes",
null, // "oracle::occi::Blob",
null, // "oracle::occi::Clob",
null, // "oracle::occi::Date",
null, // "oracle::occi::Timestamp",
null, // "oracle::occi::IntervalYM",
null, // "oracle::occi::IntervalDS",
null, // "oracle::occi::Number",
null, // "OCCI_STD_NAMESPACE::string",
null, // "OCCI_STD_NAMESPACE::wstring",
null, null, null, null
};
protected String m_package;
protected Map<String, String> m_field_map = null;
protected int m_mapping;
protected int arrayMap;
protected int bfileMap;
protected int binaryMap;
protected int blobMap;
protected int charMap;
protected int ncharMap;
protected int clobMap;
protected int cursorMap;
protected int dateMap;
protected int timeMap;
protected int timestampMap;
protected int intervalYMMap;
protected int intervalDSMap;
protected int decimalMap;
protected int doubleMap;
protected int floatMap;
protected int integerMap;
protected int longVarBinaryMap;
protected int numericMap;
protected int realMap;
protected int refMap;
protected int rowidMap;
protected int smallintMap;
protected int structMap;
protected int varcharMap;
protected int tableMap;
protected int binaryFloatMap;
protected int binaryDoubleMap;
protected SqlReflector m_reflector;
public Typemap(TypeClass s, SqlReflector reflector) {
if (s != null && (s instanceof JavaType)) {
m_field_map = null;
m_package = s.getNameObject().getDeclPackage();
}
else if (s != null) {
SqlName sn = ((SqlType)s).getSqlName();
m_field_map = ((SqlType)s).getAttributes();
m_package = sn.getDeclPackage();
}
m_reflector = reflector;
mapInit();
}
void mapInit() {
bfileMap = OS_BFILE;
cursorMap = JS_RESULTSET;
rowidMap = OS_ROWID;
}
/**
* Determine the programming language name for a given SQL field.
*/
public String getMemberName(String sqlName, boolean wordBoundary, boolean onlyIfRegistered,
Name name) {
return null;
}
public String getMemberNameAsSuffix(String sqlName) {
return null;
}
public String getMemberName(String sqlName, Name name) {
return getMemberName(sqlName, false, false, name);
}
public String getMemberName(String sqlName) {
return getMemberName(sqlName, false, false, null);
}
public String getMemberName(String sqlName, boolean wordBoundary, boolean onlyIfRegistered) {
return getMemberName(sqlName, wordBoundary, onlyIfRegistered, null);
}
/**
* Determine the programming language type for a given SQL type.
*/
public String writeTypeName(TypeClass type) {
return null;
}
public String writeTypeName(TypeClass type, boolean itfIfPossible) {
return null;
}
/**
*/
public int getMapping() {
return m_mapping;
}
public int getJavaTypecode(int sqlTypecode) {
if (!m_mapInitialized) {
javaMapping();
m_mapInitialized = true;
};
switch (sqlTypecode) {
case OracleTypes.ARRAY:
return arrayMap;
case OracleTypes.BFILE:
return bfileMap;
case OracleTypes.BINARY:
return binaryMap;
case OracleTypes.BLOB:
return blobMap;
case OracleTypes.CHAR:
return charMap;
case OracleTypes.CLOB:
return clobMap;
case OracleTypes.CURSOR:
return cursorMap;
case OracleTypes.DATE:
return dateMap;
case OracleTypes.TIME:
return timeMap;
case OracleTypes.TIMESTAMP:
return timestampMap;
case ORACLE_TYPES_TIMESTAMPTZ:
return (timestampMap == JS_TIMESTAMP) ? timestampMap : OS_TIMESTAMPTZ;
case ORACLE_TYPES_TIMESTAMPLTZ:
return OS_TIMESTAMPLTZ;
case OracleTypes.INTERVALYM:
return intervalYMMap;
case OracleTypes.INTERVALDS:
return intervalDSMap;
case OracleTypes.DECIMAL:
return decimalMap;
case OracleTypes.DOUBLE:
return doubleMap;
case OracleTypes.FLOAT:
return floatMap;
case OracleTypes.INTEGER:
return integerMap;
case OracleTypes.LONGVARBINARY:
return longVarBinaryMap;
case OracleTypes.NUMERIC:
return numericMap;
case ORACLE_TYPES_OPAQUE:
return OS_CUSTOMDATUM;
case ORACLE_TYPES_JAVA_STRUCT:
return structMap;
case OracleTypes.REAL:
return realMap;
case OracleTypes.REF:
return refMap;
case OracleTypes.ROWID:
return rowidMap;
case OracleTypes.SMALLINT:
return smallintMap;
case OracleTypes.STRUCT:
return structMap;
case OracleTypes.VARCHAR:
return varcharMap;
case OracleTypes.TABLE:
return tableMap;
case SqlType.ORACLE_TYPES_NCHAR:
return ncharMap;
case SqlType.ORACLE_TYPES_NCLOB:
return OS_NCLOB;
case SqlType.ORACLE_TYPES_BOOLEAN:
return BOOLEAN;
case OracleTypes.PLSQL_INDEX_TABLE:
return tableMap;
case OracleTypes.PLSQL_NESTED_TABLE:
return tableMap;
case OracleTypes.PLSQL_VARRAY_TABLE:
return tableMap;
case ORACLE_TYPES_BINARY_FLOAT:
return binaryFloatMap;
case ORACLE_TYPES_BINARY_DOUBLE:
return binaryDoubleMap;
default:
return UNSUPPORTED_TYPE;
}
}
protected boolean m_mapInitialized = false;
protected String writePredefinedName(int typecode) {
return NAMES[getJavaTypecode(typecode)];
}
protected void javaMapping() {
bfileMap = OS_BFILE;
cursorMap = JS_RESULTSET;
rowidMap = OS_ROWID;
}
public SqlType getPlsqlTableType(SqlType elemType) {
int typecode = getJavaTypecode(elemType.getTypecode());
switch (typecode) {
case DOUBLE:
return SqlReflector.plsqlTableDouble;
case FLOAT:
return SqlReflector.plsqlTableFloat;
case INT:
return SqlReflector.plsqlTableInt;
case SHORT:
return SqlReflector.plsqlTableShort;
case JL_DOUBLE:
return SqlReflector.plsqlTableJldouble;
case JL_FLOAT:
return SqlReflector.plsqlTableJlfloat;
case JL_INTEGER:
return SqlReflector.plsqlTableJlinteger;
case JL_SHORT:
return SqlReflector.plsqlTableJlshort;
case JM_BIGDECIMAL:
return SqlReflector.plsqlTableJmbigdecimal;
case JL_STRING:
return SqlReflector.plsqlTableString;
default:
return null;
}
}
// Comparable to oracle.sqlj.codegen.engine.CGUnparser#accessorMethod
public String accessorMethod(TypeClass type) {
if ("boolean".equals(writeTypeName(type)) || "Boolean".equals(writeTypeName(type))
|| "java.lang.Boolean".equals(writeTypeName(type))) {
return "Boolean";
}
else if (type instanceof PlsqlIndexTableType) {
return "PlsqlIndexTable";
}
int typecode = getJavaTypecode(type.getTypecode());
String acc = null;
if (typecode != UNSUPPORTED_TYPE) {
acc = ACCESSOR_METHODS[typecode];
}
if (acc != null) {
return acc;
}
String className = writeTypeName(type);
if (className != null) {
if (Util.isWrappedType(className)) {
className = Util.getWrappedType(className);
}
if (className.equals("String")) {
return "String";
}
else if (className.equals("byte")) {
return "Byte";
}
else if (className.equals("char")) {
return "Byte";
}
else if (className.equals("float")) {
return "Float";
}
else if (className.equals("int")) {
return "Int";
}
else if (className.equals("boolean")) {
return "Boolean";
}
else if (className.equals("long")) {
return "Long";
}
else if (className.equals("short")) {
return "Short";
}
else if (className.equals("double")) {
return "Double";
}
}
if (m_reflector.isUserType(type) && m_mapping == 0) {
return "CustomDatum";
}
else if (isOpaque(type)) {
return "ORAData";
}
return "Object";
}
private boolean isOpaque(TypeClass type) {
boolean opaque = false;
if (type instanceof SqlType) {
SqlType sqlType = (SqlType)type;
String name = sqlType.getSqlName().getFullTargetTypeName(Util.SCHEMA_ALWAYS);
if ("SYS.XMLTYPE".equalsIgnoreCase(name)) {
opaque = true;
}
}
return opaque;
}
}