--- /dev/null
+/*\r
+\r
+ Derby - Class org.apache.derby.impl.drda.SQLTypes\r
+\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to You under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+\r
+ */\r
+\r
+package org.apache.derby.impl.drda;\r
+\r
+import java.sql.Types;\r
+import java.sql.SQLException;\r
+import org.apache.derby.iapi.reference.DRDAConstants;\r
+import org.apache.derby.iapi.reference.JDBC30Translation;\r
+\r
+\r
+\r
+class SQLTypes {\r
+\r
+ // define final statics for the fdoca type codes here!!!\r
+\r
+ // hide the default constructor\r
+ private SQLTypes() {}\r
+\r
+\r
+ /**\r
+ * Map DB2 SQL Type to JDBC Type\r
+ * \r
+ * @param sqlType SQL Type to convert\r
+ * @param length storage length of type\r
+ * @param ccsid ccsid of type\r
+ *\r
+ * @return Corresponding JDBC Type \r
+ */\r
+\r
+ static protected int mapDB2SqlTypeToJdbcType (int sqlType, long length, int ccsid)\r
+ {\r
+ switch (getNonNullableSqlType (sqlType)) { // mask the isNullable bit\r
+ case DRDAConstants.DB2_SQLTYPE_SMALL:\r
+ return java.sql.Types.SMALLINT;\r
+ case DRDAConstants.DB2_SQLTYPE_INTEGER:\r
+ return java.sql.Types.INTEGER;\r
+ case DRDAConstants.DB2_SQLTYPE_BIGINT:\r
+ return java.sql.Types.BIGINT;\r
+ case DRDAConstants.DB2_SQLTYPE_FLOAT:\r
+ if (length == 16) // can map to either NUMERIC or DECIMAL!!! @sxg\r
+ return java.sql.Types.DECIMAL;\r
+ else if (length == 8) // can map to either DOUBLE or FLOAT!!! @sxg\r
+ return java.sql.Types.DOUBLE;\r
+ else if (length == 4)\r
+ return java.sql.Types.REAL;\r
+ else\r
+ return 0;\r
+ //throw new BugCheckException ("Encountered unexpected float length");\r
+ case DRDAConstants.DB2_SQLTYPE_DECIMAL: // can map to either NUMERIC or DECIMAL!!! @sxg\r
+ case DRDAConstants.DB2_SQLTYPE_ZONED: // can map to either NUMERIC or DECIMAL!!! @sxg\r
+ case DRDAConstants.DB2_SQLTYPE_NUMERIC: // can map to either NUMERIC or DECIMAL!!! @sxg\r
+ return java.sql.Types.DECIMAL;\r
+ case DRDAConstants.DB2_SQLTYPE_CHAR: // mixed and single byte\r
+ if (ccsid == 0xffff || ccsid == 0) // we think UW returns 0, and 390 returns 0xffff, doublecheck !!!\r
+ return java.sql.Types.BINARY;\r
+ else\r
+ return java.sql.Types.CHAR;\r
+ case DRDAConstants.DB2_SQLTYPE_CSTR: // SBCS null terminated \r
+ case DRDAConstants.DB2_SQLTYPE_GRAPHIC: // fixed character DBCS\r
+ return java.sql.Types.CHAR;\r
+ // use ccsid to distinguish between BINARY and CHAR, VARBINARY and VARCHAR, LONG... !!! -j/p/s\r
+ case DRDAConstants.DB2_SQLTYPE_VARGRAPH: // variable character DBCS\r
+ case DRDAConstants.DB2_SQLTYPE_VARCHAR: // variable character SBCS/Mixed\r
+ if (ccsid == 0xffff || ccsid == 0) // we think UW returns 0, and 390 returns 0xffff, doublecheck !!!\r
+ return java.sql.Types.VARBINARY;\r
+ else\r
+ return java.sql.Types.VARCHAR;\r
+ case DRDAConstants.DB2_SQLTYPE_LSTR: // pascal string SBCS/Mixed\r
+ return java.sql.Types.VARCHAR;\r
+ case DRDAConstants.DB2_SQLTYPE_LONGRAPH: // long varchar DBCS\r
+ case DRDAConstants.DB2_SQLTYPE_LONG: // long varchar SBCS/Mixed\r
+ if (ccsid == 0xffff || ccsid == 0) // we think UW returns 0, and 390 returns 0xffff, doublecheck !!!\r
+ return java.sql.Types.LONGVARBINARY;\r
+ else\r
+ return java.sql.Types.LONGVARCHAR;\r
+ case DRDAConstants.DB2_SQLTYPE_DATE:\r
+ return java.sql.Types.DATE;\r
+ case DRDAConstants.DB2_SQLTYPE_TIME:\r
+ return java.sql.Types.TIME;\r
+ case DRDAConstants.DB2_SQLTYPE_TIMESTAMP:\r
+ return java.sql.Types.TIMESTAMP;\r
+ case DRDAConstants.DB2_SQLTYPE_CLOB: // large object character SBCS/Mixed\r
+ case DRDAConstants.DB2_SQLTYPE_DBCLOB: // large object character DBCS\r
+ return java.sql.Types.CLOB;\r
+ case DRDAConstants.DB2_SQLTYPE_BLOB: // large object bytes\r
+ case DRDAConstants.DB2_SQLTYPE_BLOB_LOCATOR:\r
+ case DRDAConstants.DB2_SQLTYPE_CLOB_LOCATOR:\r
+ case DRDAConstants.DB2_SQLTYPE_DBCLOB_LOCATOR:\r
+ return java.sql.Types.BLOB;\r
+ default:\r
+ //throw new BugCheckException ("Encountered unexpected type code");\r
+ return 0;\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Map jdbc type to the DB2 DRDA SQL Types expected by jcc.\r
+ *@param jdbctype - jdbc Type to convert\r
+ *@param nullable - whether the type is nullable\r
+ **/\r
+\r
+ \r
+ /** Map JDBC Type to DB2 SqlType\r
+ * @param jdbctype JDBC Type from java.sql.Types\r
+ * @param nullable true if this is a nullable type\r
+ * @param outlen output parameter with type length\r
+ *\r
+ * @return Corresponding DB2 SQL Type (See DRDA Manual FD:OCA Meta \r
+ * Data Summary, page 245)\r
+ * \r
+ * @exception SQLException thrown for unrecognized SQLType\r
+ */\r
+\r
+ static protected int mapJdbcTypeToDB2SqlType (int jdbctype, boolean nullable,\r
+ int[] outlen)\r
+ throws SQLException\r
+ {\r
+ int nullAddVal =0;\r
+\r
+ if (nullable) \r
+ nullAddVal =1; \r
+ \r
+ // Call FdocaConstants just to get the length\r
+ FdocaConstants.mapJdbcTypeToDrdaType(jdbctype,nullable,outlen);\r
+\r
+ switch(jdbctype)\r
+ {\r
+ case JDBC30Translation.BOOLEAN:\r
+ case java.sql.Types.BIT:\r
+ case java.sql.Types.TINYINT:\r
+ case java.sql.Types.SMALLINT:\r
+ return DRDAConstants.DB2_SQLTYPE_SMALL + nullAddVal;\r
+ case java.sql.Types.INTEGER:\r
+ return DRDAConstants.DB2_SQLTYPE_INTEGER + nullAddVal;\r
+ case java.sql.Types.BIGINT:\r
+ return DRDAConstants.DB2_SQLTYPE_BIGINT + nullAddVal;\r
+ case java.sql.Types.DOUBLE:\r
+ case java.sql.Types.REAL:\r
+ return DRDAConstants.DB2_SQLTYPE_FLOAT + nullAddVal;\r
+ case java.sql.Types.DECIMAL:\r
+ case java.sql.Types.NUMERIC:\r
+ return DRDAConstants.DB2_SQLTYPE_DECIMAL + nullAddVal;\r
+ case java.sql.Types.DATE:\r
+ return DRDAConstants.DB2_SQLTYPE_DATE + nullAddVal;\r
+ case java.sql.Types.TIME:\r
+ return DRDAConstants.DB2_SQLTYPE_TIME + nullAddVal;\r
+ case java.sql.Types.TIMESTAMP:\r
+ return DRDAConstants.DB2_SQLTYPE_TIMESTAMP + nullAddVal;\r
+ case java.sql.Types.CHAR:\r
+ return DRDAConstants.DB2_SQLTYPE_CHAR + nullAddVal; // null terminated SBCS/Mixed\r
+ case java.sql.Types.BINARY:\r
+ return DRDAConstants.DB2_SQLTYPE_CHAR + nullAddVal;\r
+\r
+ case java.sql.Types.VARCHAR:\r
+ case java.sql.Types.VARBINARY:\r
+ return DRDAConstants.DB2_SQLTYPE_VARCHAR + nullAddVal; \r
+ case java.sql.Types.LONGVARBINARY:\r
+ return DRDAConstants.DB2_SQLTYPE_LONG + nullAddVal;\r
+ case java.sql.Types.JAVA_OBJECT:\r
+ return DRDAConstants.DB2_SQLTYPE_LONG + nullAddVal;\r
+ case java.sql.Types.BLOB:\r
+ return DRDAConstants.DB2_SQLTYPE_BLOB + nullAddVal;\r
+ case java.sql.Types.CLOB:\r
+ return DRDAConstants.DB2_SQLTYPE_CLOB + nullAddVal;\r
+ case java.sql.Types.LONGVARCHAR:\r
+ return DRDAConstants.DB2_SQLTYPE_LONG + nullAddVal;\r
+ case java.sql.Types.ARRAY:\r
+ case java.sql.Types.DISTINCT:\r
+ case java.sql.Types.NULL:\r
+ case java.sql.Types.OTHER:\r
+ case java.sql.Types.REF:\r
+ case java.sql.Types.STRUCT:\r
+ throw new SQLException("Jdbc type" + jdbctype + "not Supported yet");\r
+ default:\r
+ throw new SQLException ("unrecognized sql type: " + jdbctype);\r
+ //throw new BugCheckException ("Encountered unexpected type code");\r
+\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Translate DB2 SQL Type to the non-nullable type.\r
+ * @param sqlType DB2 SQL Type\r
+ *\r
+ * @return The Non-Nullable DB2 SQL Type.\r
+ */\r
+ protected static int getNonNullableSqlType (int sqlType)\r
+ {\r
+ return sqlType & ~1;\r
+ }\r
+\r
+\r
+}\r