// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) braces deadcode fieldsfirst 
// Source File Name:   SQLUtil.java
// Class Version:      45.3

package oracle.sql;

import java.io.PrintStream;
import java.math.BigDecimal;
import java.sql.SQLData;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Map;
import oracle.jdbc.OracleTypes;
import oracle.jdbc.dbaccess.*;
import oracle.jdbc.driver.OracleConnection;
import oracle.jdbc.driver.OracleLog;
import oracle.jdbc.oracore.*;

// Referenced classes of package oracle.sql:
//            ARRAY, ArrayDescriptor, BFILE, BLOB, 
//            CHAR, CLOB, CharacterSet, CustomDatum, 
//            CustomDatumFactory, DATE, Datum, NUMBER, 
//            OPAQUE, ORAData, ORADataFactory, OpaqueDescriptor, 
//            RAW, REF, ROWID, SQLName, 
//            STRUCT, StructDescriptor, TIMESTAMP, TIMESTAMPLTZ, 
//            TIMESTAMPTZ, TypeDescriptor

// flag ACC_SUPER is set
public class SQLUtil
{
    // Constants:          483
    // Interfaces:         0
    // Fields:             13
    // Methods:            16
    // Class Attributes:   1


    private static final int CLASS_NOT_FOUND = -1;
    private static final int CLASS_STRING = 0;
    private static final int CLASS_BOOLEAN = 1;
    private static final int CLASS_INTEGER = 2;
    private static final int CLASS_LONG = 3;
    private static final int CLASS_FLOAT = 4;
    private static final int CLASS_DOUBLE = 5;
    private static final int CLASS_BIGDECIMAL = 6;
    private static final int CLASS_DATE = 7;
    private static final int CLASS_TIME = 8;
    private static final int CLASS_TIMESTAMP = 9;
    private static final int TOTAL_CLASSES = 10;
    private static Hashtable s_classTbl;

    // Decompiling method: <init>  Signature: ()V
    // Max stack: 1, #locals: 1, #params: 1
    // Code length: 5 bytes, Code offset: 7832
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/SQLUtil; At 0 5 Range 0 4 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type V At 0 5 Range 0 4 Init 0 fixed
    public SQLUtil()
    {
        super();
        return;
    }

    // Decompiling method: JavaToSQL  Signature: (Loracle/jdbc/driver/OracleConnection;Ljava/lang/Object;ILjava/lang/String;)[B
    // Max stack: 4, #locals: 5, #params: 4
    // Code length: 184 bytes, Code offset: 7875
    // Line Number Table found: 31 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 184 Range 0 183 Init 0
    // Parameter  1 added: Name obj Type Ljava/lang/Object; At 0 184 Range 0 183 Init 0
    // Parameter  2 added: Name i Type I At 0 184 Range 0 183 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 184 Range 0 183 Init 0
    // RetValue   5 added: Name <returnValue> Type [B At 0 184 Range 0 183 Init 0 fixed
    // LocalVar   4 added: Name obj1 Type A At 7 165 Range 7 171 Init 7
    // LocalVar   4 chged: Name datum Oname obj1 Type Loracle/sql/Datum; At 20 152 Range 7 171 Init 7
    // LocalVar   4 chged: Name obj1 Oname datum Type Ljava/lang/Object; At 81 91 Range 7 171 Init 7
    public static byte[] JavaToSQL(OracleConnection oracleconnection, Object obj, int i, String s)
        throws SQLException
    {
        if(obj == null)
        {
            return null;
        }
        Object obj1 = null;
        if(obj instanceof Datum)
        {
            obj1 = (Datum)obj;
        } else
        if(obj instanceof ORAData)
        {
            obj1 = ((ORAData)obj).toDatum(oracleconnection);
        } else
        if(obj instanceof CustomDatum)
        {
            obj1 = ((CustomDatum)obj).toDatum(oracleconnection);
        } else
        if(obj instanceof SQLData)
        {
            obj1 = STRUCT.toSTRUCT(obj, oracleconnection);
        }
        if(obj1 != null)
        {
            if(!checkDatumType(((Datum) (obj1)), i, s))
            {
                obj1 = null;
            }
        } else
        {
            obj1 = makeDatum(oracleconnection, obj, i, s);
        }
        if(obj1 != null)
        {
            if(obj1 instanceof STRUCT)
            {
                return ((STRUCT)obj1).toBytes();
            }
            if(obj1 instanceof ARRAY)
            {
                return ((ARRAY)obj1).toBytes();
            }
            if(obj1 instanceof OPAQUE)
            {
                return ((OPAQUE)obj1).toBytes();
            } else
            {
                return ((Datum) (obj1)).shareBytes();
            }
        } else
        {
            DBError.check_error(1, "attempt to convert a Datum to incompatible SQL type");
            return null;
        }
    }

    // Decompiling method: SQLToJava  Signature: (Loracle/jdbc/driver/OracleConnection;Loracle/sql/Datum;Ljava/lang/Class;Ljava/util/Map;)Ljava/lang/Object;
    // Max stack: 6, #locals: 6, #params: 4
    // Code length: 337 bytes, Code offset: 8227
    // Line Number Table found: 47 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 337 Range 0 336 Init 0
    // Parameter  1 added: Name datum Type Loracle/sql/Datum; At 0 337 Range 0 336 Init 0
    // Parameter  2 added: Name class1 Type Ljava/lang/Class; At 0 337 Range 0 336 Init 0
    // Parameter  3 added: Name map Type Ljava/util/Map; At 0 337 Range 0 336 Init 0
    // RetValue   6 added: Name <returnValue> Type Ljava/lang/Object; At 0 337 Range 0 336 Init 0 fixed
    // LocalVar   4 added: Name obj Type A At 1 2 Range 1 2 Init 1
    // LocalVar   4 added: Name obj1 Type Ljava/lang/Object; At 33 303 Range 33 335 Init 33
    // LocalVar   5 added: Name i Type I At 84 4 Range 84 87 Init 84
    // LocalVar   4 chged: Name obj Oname obj Type Ljava/lang/Object; At 1 2 Range 1 2 Init 1
    // LocalVar   4 name obj1(Ljava/lang/Object;) merged out into obj(Ljava/lang/Object;)
    public static Object SQLToJava(OracleConnection oracleconnection, Datum datum, Class class1, Map map)
        throws SQLException
    {
        Object obj = null;
        if(datum instanceof STRUCT)
        {
            if(class1 == null)
            {
                obj = map == null ? datum.toJdbc() : ((STRUCT)datum).toJdbc(map);
            } else
            {
                obj = map == null ? ((STRUCT)datum).toClass(class1) : ((STRUCT)datum).toClass(class1, map);
            }
        } else
        if(class1 == null)
        {
            obj = datum.toJdbc();
        } else
        {
            int i = classNumber(class1);
            switch(i)
            {
            case 0: // '\0'
                obj = datum.stringValue();
                break;

            case 1: // '\001'
                obj = new Boolean(datum.longValue() != 0L);
                break;

            case 2: // '\002'
                obj = new Integer((int)datum.longValue());
                break;

            case 3: // '\003'
                obj = new Long(datum.longValue());
                break;

            case 4: // '\004'
                obj = new Float(datum.bigDecimalValue().floatValue());
                break;

            case 5: // '\005'
                obj = new Double(datum.bigDecimalValue().doubleValue());
                break;

            case 6: // '\006'
                obj = datum.bigDecimalValue();
                break;

            case 7: // '\007'
                obj = datum.dateValue();
                break;

            case 8: // '\b'
                obj = datum.timeValue();
                break;

            case 9: // '\t'
                obj = datum.timestampValue();
                break;

            case -1: 
            default:
                obj = datum.toJdbc();
                if(obj.getClass() != class1 && (!class1.isInterface() || !implementsInterface(obj.getClass(), class1)))
                {
                    DBError.check_error(59, "invalid data conversion");
                }
                break;
            }
        }
        return obj;
    }

    // Decompiling method: SQLToJava  Signature: (Loracle/jdbc/driver/OracleConnection;[BILjava/lang/String;Ljava/lang/Class;Ljava/util/Map;)Ljava/lang/Object;
    // Max stack: 5, #locals: 7, #params: 6
    // Code length: 21 bytes, Code offset: 8796
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 21 Range 0 20 Init 0
    // Parameter  1 added: Name abyte0 Type [B At 0 21 Range 0 20 Init 0
    // Parameter  2 added: Name i Type I At 0 21 Range 0 20 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 21 Range 0 20 Init 0
    // Parameter  4 added: Name class1 Type Ljava/lang/Class; At 0 21 Range 0 20 Init 0
    // Parameter  5 added: Name map Type Ljava/util/Map; At 0 21 Range 0 20 Init 0
    // RetValue   7 added: Name <returnValue> Type Ljava/lang/Object; At 0 21 Range 0 20 Init 0 fixed
    // LocalVar   6 added: Name datum Type Loracle/sql/Datum; At 8 5 Range 8 12 Init 8
    public static Object SQLToJava(OracleConnection oracleconnection, byte abyte0[], int i, String s, Class class1, Map map)
        throws SQLException
    {
        Datum datum = makeDatum(oracleconnection, abyte0, i, s, 0);
        return SQLToJava(oracleconnection, datum, class1, map);
    }

    // Decompiling method: SQLToJava  Signature: (Loracle/jdbc/driver/OracleConnection;[BILjava/lang/String;Loracle/sql/CustomDatumFactory;)Loracle/sql/CustomDatum;
    // Max stack: 5, #locals: 6, #params: 5
    // Code length: 21 bytes, Code offset: 8869
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 21 Range 0 20 Init 0
    // Parameter  1 added: Name abyte0 Type [B At 0 21 Range 0 20 Init 0
    // Parameter  2 added: Name i Type I At 0 21 Range 0 20 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 21 Range 0 20 Init 0
    // Parameter  4 added: Name customdatumfactory Type Loracle/sql/CustomDatumFactory; At 0 21 Range 0 20 Init 0
    // RetValue   6 added: Name <returnValue> Type Loracle/sql/CustomDatum; At 0 21 Range 0 20 Init 0 fixed
    // LocalVar   5 added: Name datum Type Loracle/sql/Datum; At 8 6 Range 8 13 Init 8
    public static CustomDatum SQLToJava(OracleConnection oracleconnection, byte abyte0[], int i, String s, CustomDatumFactory customdatumfactory)
        throws SQLException
    {
        Datum datum = makeDatum(oracleconnection, abyte0, i, s, 0);
        return customdatumfactory.create(datum, i);
    }

    // Decompiling method: SQLToJava  Signature: (Loracle/jdbc/driver/OracleConnection;[BILjava/lang/String;Loracle/sql/ORADataFactory;)Loracle/sql/ORAData;
    // Max stack: 5, #locals: 6, #params: 5
    // Code length: 21 bytes, Code offset: 8942
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 21 Range 0 20 Init 0
    // Parameter  1 added: Name abyte0 Type [B At 0 21 Range 0 20 Init 0
    // Parameter  2 added: Name i Type I At 0 21 Range 0 20 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 21 Range 0 20 Init 0
    // Parameter  4 added: Name oradatafactory Type Loracle/sql/ORADataFactory; At 0 21 Range 0 20 Init 0
    // RetValue   6 added: Name <returnValue> Type Loracle/sql/ORAData; At 0 21 Range 0 20 Init 0 fixed
    // LocalVar   5 added: Name datum Type Loracle/sql/Datum; At 8 6 Range 8 13 Init 8
    public static ORAData SQLToJava(OracleConnection oracleconnection, byte abyte0[], int i, String s, ORADataFactory oradatafactory)
        throws SQLException
    {
        Datum datum = makeDatum(oracleconnection, abyte0, i, s, 0);
        return oradatafactory.create(datum, i);
    }

    // Decompiling method: checkDatumType  Signature: (Loracle/sql/Datum;ILjava/lang/String;)Z
    // Max stack: 2, #locals: 4, #params: 3
    // Code length: 306 bytes, Code offset: 9015
    // Line Number Table found: 25 entries
    // Parameter  0 added: Name datum Type Loracle/sql/Datum; At 0 306 Range 0 305 Init 0
    // Parameter  1 added: Name i Type I At 0 306 Range 0 305 Init 0
    // Parameter  2 added: Name s Type Ljava/lang/String; At 0 306 Range 0 305 Init 0
    // RetValue   4 added: Name <returnValue> Type Z At 0 306 Range 0 305 Init 0 fixed
    // LocalVar   3 added: Name flag Type Z At 261 2 Range 261 262 Init 261
    public static boolean checkDatumType(Datum datum, int i, String s)
        throws SQLException
    {
        switch(i)
        {
        case 1: // '\001'
        case 8: // '\b'
        case 96: // '`'
        case 999: 
            return datum instanceof CHAR;

        case 2: // '\002'
        case 6: // '\006'
            return datum instanceof NUMBER;

        case 23: // '\027'
        case 24: // '\030'
            return datum instanceof RAW;

        case 104: // 'h'
            return datum instanceof ROWID;

        case 12: // '\f'
            return datum instanceof DATE;

        case 180: 
            return datum instanceof TIMESTAMP;

        case 181: 
            return datum instanceof TIMESTAMPTZ;

        case 231: 
            return datum instanceof TIMESTAMPLTZ;

        case 113: // 'q'
            return datum instanceof BLOB;

        case 112: // 'p'
            return datum instanceof CLOB;

        case 114: // 'r'
            return datum instanceof BFILE;

        case 111: // 'o'
            return (datum instanceof REF) && ((REF)datum).getBaseTypeName().equals(s);

        case 109: // 'm'
            if(datum instanceof STRUCT)
            {
                boolean flag = ((STRUCT)datum).isInHierarchyOf(s);
                return flag;
            }
            if(datum instanceof ARRAY)
            {
                return ((ARRAY)datum).getSQLTypeName().equals(s);
            }
            if(datum instanceof OPAQUE)
            {
                return ((OPAQUE)datum).getSQLTypeName().equals(s);
            } else
            {
                return false;
            }

        case 102: // 'f'
        default:
            return false;
        }
    }

    // Decompiling method: classNumber  Signature: (Ljava/lang/Class;)I
    // Max stack: 2, #locals: 3, #params: 1
    // Code length: 24 bytes, Code offset: 9465
    // Line Number Table found: 5 entries
    // Parameter  0 added: Name class1 Type Ljava/lang/Class; At 0 24 Range 0 23 Init 0
    // RetValue   3 added: Name <returnValue> Type I At 0 24 Range 0 23 Init 0 fixed
    // LocalVar   1 added: Name byte0 Type B At 1 22 Range 1 22 Init 1
    // LocalVar   2 added: Name integer Type Ljava/lang/Integer; At 12 6 Range 12 17 Init 12
    // LocalVar   1 chged: Name i Oname byte0 Type I At 21 2 Range 1 22 Init 1
    private static int classNumber(Class class1)
    {
        int i = -1;
        Integer integer = (Integer)s_classTbl.get(class1);
        if(integer != null)
        {
            i = integer.intValue();
        }
        return i;
    }

    // Decompiling method: getTypeDescriptor  Signature: (Ljava/lang/String;Loracle/jdbc/driver/OracleConnection;)Ljava/lang/Object;
    // Max stack: 5, #locals: 7, #params: 2
    // Code length: 181 bytes, Code offset: 9543
    // Line Number Table found: 29 entries
    // Parameter  0 added: Name s Type Ljava/lang/String; At 0 181 Range 0 180 Init 0
    // Parameter  1 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 181 Range 0 180 Init 0
    // RetValue   7 added: Name <returnValue> Type Ljava/lang/Object; At 0 181 Range 0 180 Init 0 fixed
    // LocalVar   2 added: Name obj Type A At 1 1 Range 1 1 Init 1
    // LocalVar   3 added: Name sqlname Type Loracle/sql/SQLName; At 11 142 Range 11 152 Init 11
    // LocalVar   4 added: Name s1 Type Ljava/lang/String; At 16 159 Range 16 174 Init 16
    // LocalVar   2 added: Name obj1 Type Ljava/lang/Object; At 24 156 Range 24 179 Init 24
    // LocalVar   5 added: Name oracletypeadt Type Loracle/jdbc/oracore/OracleTypeADT; At 41 19 Range 41 59 Init 41
    // LocalVar   6 added: Name oraclenamedtype Type Loracle/jdbc/oracore/OracleNamedType; At 63 92 Range 63 154 Init 63
    // LocalVar   2 chged: Name obj Oname obj Type Ljava/lang/Object; At 1 1 Range 1 1 Init 1
    // LocalVar   2 name obj1(Ljava/lang/Object;) merged out into obj(Ljava/lang/Object;)
    public static Object getTypeDescriptor(String s, OracleConnection oracleconnection)
        throws SQLException
    {
        Object obj = null;
        SQLName sqlname = new SQLName(s, oracleconnection);
        String s1 = sqlname.getName();
        obj = oracleconnection.getDescriptor(s1);
        if(obj != null)
        {
            return obj;
        }
        OracleTypeADT oracletypeadt = new OracleTypeADT(s1, oracleconnection);
        oracleconnection.db_access.getOracleTypeADT(oracletypeadt);
        oracletypeadt.init(oracleconnection);
        oracle.jdbc.oracore.OracleNamedType oraclenamedtype = oracletypeadt.cleanup();
        switch(oraclenamedtype.getTypeCode())
        {
        case 2003: 
            obj = new ArrayDescriptor(sqlname, (OracleTypeCOLLECTION)oraclenamedtype, oracleconnection);
            break;

        case 2002: 
        case 2008: 
            obj = new StructDescriptor(sqlname, (OracleTypeADT)oraclenamedtype, oracleconnection);
            break;

        case 2007: 
            obj = new OpaqueDescriptor(sqlname, (OracleTypeOPAQUE)oraclenamedtype, oracleconnection);
            break;

        case 2004: 
        case 2005: 
        case 2006: 
        default:
            DBError.throwSqlException(1, "Uncognized type code");
            break;
        }
        oracleconnection.putDescriptor(s1, obj);
        return obj;
    }

    // Decompiling method: get_internal_type  Signature: (I)I
    // Max stack: 2, #locals: 1, #params: 1
    // Code length: 341 bytes, Code offset: 9884
    // Line Number Table found: 23 entries
    // Parameter  0 added: Name i Type I At 0 341 Range 0 340 Init 0
    // RetValue   1 added: Name <returnValue> Type I At 0 341 Range 0 340 Init 0 fixed
    public static int get_internal_type(int i)
        throws SQLException
    {
        switch(i)
        {
        case -7: 
        case -6: 
        case -5: 
        case 2: // '\002'
        case 3: // '\003'
        case 4: // '\004'
        case 5: // '\005'
        case 6: // '\006'
        case 7: // '\007'
        case 8: // '\b'
            return 6;

        case 999: 
            return 999;

        case 1: // '\001'
            return 96;

        case 12: // '\f'
            return 1;

        case -1: 
            return 8;

        case 91: // '['
        case 92: // '\\'
        case 93: // ']'
            return 12;

        case -100: 
            return 180;

        case -101: 
            return 181;

        case -102: 
            return 231;

        case -3: 
        case -2: 
            return 23;

        case -4: 
            return 24;

        case -8: 
            return 104;

        case 2004: 
            return 113;

        case 2005: 
            return 112;

        case -13: 
            return 114;

        case -10: 
            return 102;

        case 2002: 
        case 2003: 
        case 2007: 
        case 2008: 
            return 109;

        case 2006: 
            return 111;
        }
        DBError.check_error(4, "get_internal_type");
        return 0;
    }

    // Decompiling method: implementsInterface  Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
    // Max stack: 2, #locals: 4, #params: 2
    // Code length: 53 bytes, Code offset: 10361
    // Line Number Table found: 10 entries
    // Parameter  0 added: Name class1 Type Ljava/lang/Class; At 0 53 Range 0 52 Init 0
    // Parameter  1 added: Name class2 Type Ljava/lang/Class; At 0 53 Range 0 52 Init 0
    // RetValue   4 added: Name <returnValue> Type Z At 0 53 Range 0 52 Init 0 fixed
    // LocalVar   2 added: Name aclass Type [Ljava/lang/Class; At 17 23 Range 17 39 Init 17
    // LocalVar   3 added: Name flag Type Z At 19 20 Range 19 38 Init 19
    // LocalVar   3 chged: Name i Oname flag Type I At 38 1 Range 19 38 Init 19
    public static boolean implementsInterface(Class class1, Class class2)
    {
        if(class1 == null)
        {
            return false;
        }
        if(class1 == class2)
        {
            return true;
        }
        Class aclass[] = class1.getInterfaces();
        for(int i = 0; i < aclass.length; i++)
        {
            if(implementsInterface(aclass[i], class2))
            {
                return true;
            }
        }

        return implementsInterface(class1.getSuperclass(), class2);
    }

    // Decompiling method: makeDatum  Signature: (Loracle/jdbc/driver/OracleConnection;Ljava/lang/Object;ILjava/lang/String;)Loracle/sql/Datum;
    // Max stack: 4, #locals: 5, #params: 4
    // Code length: 408 bytes, Code offset: 10488
    // Line Number Table found: 49 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 408 Range 0 407 Init 0
    // Parameter  1 added: Name obj Type Ljava/lang/Object; At 0 408 Range 0 407 Init 0
    // Parameter  2 added: Name i Type I At 0 408 Range 0 407 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 408 Range 0 407 Init 0
    // RetValue   5 added: Name <returnValue> Type Loracle/sql/Datum; At 0 408 Range 0 407 Init 0 fixed
    // LocalVar   4 added: Name obj1 Type A At 1 406 Range 1 406 Init 1
    // LocalVar   4 chged: Name char1 Oname obj1 Type Loracle/sql/CHAR; At 183 224 Range 1 406 Init 1
    // LocalVar   4 chged: Name obj1 Oname char1 Type Ljava/lang/Object; At 196 211 Range 1 406 Init 1
    public static Datum makeDatum(OracleConnection oracleconnection, Object obj, int i, String s)
        throws SQLException
    {
        Object obj1 = null;
        switch(i)
        {
        case 1: // '\001'
        case 8: // '\b'
        case 96: // '`'
        case 999: 
            obj1 = new CHAR(obj, CharacterSet.make(oracleconnection.getJdbcCsId()));
            break;

        case 2: // '\002'
        case 6: // '\006'
            obj1 = new NUMBER(obj);
            break;

        case 23: // '\027'
        case 24: // '\030'
            obj1 = new RAW(obj);
            break;

        case 104: // 'h'
            obj1 = new ROWID((byte[])obj);
            break;

        case 102: // 'f'
            DBError.check_error(1, "need resolution: do we want to handle ResultSet");
            break;

        case 12: // '\f'
            obj1 = new DATE(obj);
            break;

        case 180: 
            if(obj instanceof TIMESTAMP)
            {
                obj1 = (Datum)obj;
            }
            break;

        case 181: 
            if(obj instanceof TIMESTAMPTZ)
            {
                obj1 = (Datum)obj;
            }
            break;

        case 231: 
            if(obj instanceof TIMESTAMPLTZ)
            {
                obj1 = (Datum)obj;
            }
            break;

        case 113: // 'q'
            if(obj instanceof BLOB)
            {
                obj1 = (Datum)obj;
            }
            break;

        case 112: // 'p'
            if(obj instanceof CLOB)
            {
                obj1 = (Datum)obj;
            }
            break;

        case 114: // 'r'
            if(obj instanceof BFILE)
            {
                obj1 = (Datum)obj;
            }
            break;

        case 109: // 'm'
            if((obj instanceof STRUCT) || (obj instanceof ARRAY) || (obj instanceof OPAQUE))
            {
                obj1 = (Datum)obj;
            }
            break;

        case 111: // 'o'
            if(obj instanceof REF)
            {
                obj1 = (Datum)obj;
            }
            break;
        }
        if(obj1 == null)
        {
            DBError.check_error(1, "Unable to construct a Datum from the specified input");
        }
        return ((Datum) (obj1));
    }

    // Decompiling method: makeDatum  Signature: (Loracle/jdbc/driver/OracleConnection;[BILjava/lang/String;I)Loracle/sql/Datum;
    // Max stack: 6, #locals: 7, #params: 5
    // Code length: 527 bytes, Code offset: 11136
    // Line Number Table found: 72 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 527 Range 0 526 Init 0
    // Parameter  1 added: Name abyte0 Type [B At 0 527 Range 0 526 Init 0
    // Parameter  2 added: Name i Type I At 0 527 Range 0 526 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 527 Range 0 526 Init 0
    // Parameter  4 added: Name j Type I At 0 527 Range 0 526 Init 0
    // RetValue   7 added: Name <returnValue> Type Loracle/sql/Datum; At 0 527 Range 0 526 Init 0 fixed
    // LocalVar   5 added: Name obj Type A At 1 525 Range 1 525 Init 1
    // LocalVar   5 chged: Name char1 Oname obj Type Loracle/sql/CHAR; At 198 328 Range 1 525 Init 1
    // LocalVar   5 chged: Name obj Oname char1 Type Ljava/lang/Object; At 251 275 Range 1 525 Init 1
    // LocalVar   6 added: Name typedescriptor Type Loracle/sql/TypeDescriptor; At 392 70 Range 392 461 Init 392
    // LocalVar   6 added: Name obj1 Type Ljava/lang/Object; At 480 16 Range 480 495 Init 480
    public static Datum makeDatum(OracleConnection oracleconnection, byte abyte0[], int i, String s, int j)
        throws SQLException
    {
        Object obj = null;
        switch(i)
        {
        case 96: // '`'
        case 999: 
            if(j != 0 && j < abyte0.length)
            {
                obj = new CHAR(abyte0, 0, j, CharacterSet.make(oracleconnection.getJdbcCsId()));
            } else
            {
                obj = new CHAR(abyte0, CharacterSet.make(oracleconnection.getJdbcCsId()));
            }
            break;

        case 1: // '\001'
        case 8: // '\b'
            obj = new CHAR(abyte0, CharacterSet.make(oracleconnection.getJdbcCsId()));
            break;

        case 2: // '\002'
        case 6: // '\006'
            obj = new NUMBER(abyte0);
            break;

        case 23: // '\027'
        case 24: // '\030'
            obj = new RAW(abyte0);
            break;

        case 104: // 'h'
            obj = new ROWID(abyte0);
            break;

        case 102: // 'f'
            DBError.check_error(1, "need resolution: do we want to handle ResultSet?");
            break;

        case 12: // '\f'
            obj = new DATE(abyte0);
            break;

        case 180: 
            obj = new TIMESTAMP(abyte0);
            break;

        case 181: 
            obj = new TIMESTAMPTZ(abyte0);
            break;

        case 231: 
            obj = new TIMESTAMPLTZ(abyte0);
            break;

        case 113: // 'q'
            obj = new BLOB(oracleconnection, abyte0);
            break;

        case 112: // 'p'
            obj = new CLOB(oracleconnection, abyte0);
            break;

        case 114: // 'r'
            obj = new BFILE(oracleconnection, abyte0);
            break;

        case 109: // 'm'
            TypeDescriptor typedescriptor = TypeDescriptor.getTypeDescriptor(s, oracleconnection, abyte0, 0L);
            if(typedescriptor instanceof StructDescriptor)
            {
                obj = new STRUCT((StructDescriptor)typedescriptor, abyte0, oracleconnection);
                break;
            }
            if(typedescriptor instanceof ArrayDescriptor)
            {
                obj = new ARRAY((ArrayDescriptor)typedescriptor, abyte0, oracleconnection);
                break;
            }
            if(typedescriptor instanceof OpaqueDescriptor)
            {
                obj = new OPAQUE((OpaqueDescriptor)typedescriptor, abyte0, oracleconnection);
            }
            break;

        case 111: // 'o'
            Object obj1 = getTypeDescriptor(s, oracleconnection);
            if(obj1 instanceof StructDescriptor)
            {
                obj = new REF((StructDescriptor)obj1, oracleconnection, abyte0);
            } else
            {
                DBError.check_error(1, "program error: REF points to a non-STRUCT");
            }
            break;

        default:
            DBError.check_error(1, "program error: invalid SQL type code");
            break;
        }
        return ((Datum) (obj));
    }

    // Decompiling method: makeNDatum  Signature: (Loracle/jdbc/driver/OracleConnection;[BILjava/lang/String;SI)Loracle/sql/Datum;
    // Max stack: 6, #locals: 7, #params: 6
    // Code length: 165 bytes, Code offset: 11995
    // Line Number Table found: 21 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 165 Range 0 164 Init 0
    // Parameter  1 added: Name abyte0 Type [B At 0 165 Range 0 164 Init 0
    // Parameter  2 added: Name i Type I At 0 165 Range 0 164 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 165 Range 0 164 Init 0
    // Parameter  4 added: Name word0 Type S At 0 165 Range 0 164 Init 0
    // Parameter  5 added: Name j Type I At 0 165 Range 0 164 Init 0
    // RetValue   7 added: Name <returnValue> Type Loracle/sql/Datum; At 0 165 Range 0 164 Init 0 fixed
    // LocalVar   6 added: Name obj Type A At 1 163 Range 1 163 Init 1
    // LocalVar   6 chged: Name char1 Oname obj Type Loracle/sql/CHAR; At 89 75 Range 1 163 Init 1
    // LocalVar   6 chged: Name obj Oname char1 Type Ljava/lang/Object; At 151 13 Range 1 163 Init 1
    public static Datum makeNDatum(OracleConnection oracleconnection, byte abyte0[], int i, String s, short word0, int j)
        throws SQLException
    {
        Object obj = null;
        switch(i)
        {
        case 96: // '`'
        case 999: 
            if(j != 0 && j < abyte0.length)
            {
                obj = new CHAR(abyte0, 0, j, CharacterSet.make(oracleconnection.conversion.getNCharSet()));
            } else
            {
                obj = new CHAR(abyte0, CharacterSet.make(oracleconnection.conversion.getNCharSet()));
            }
            break;

        case 1: // '\001'
        case 8: // '\b'
            obj = new CHAR(abyte0, CharacterSet.make(oracleconnection.conversion.getNCharSet()));
            break;

        case 112: // 'p'
            obj = new CLOB(oracleconnection, abyte0, word0);
            break;

        default:
            DBError.check_error(1, "program error: invalid SQL type code");
            break;
        }
        return ((Datum) (obj));
    }

    // Decompiling method: makeOracleDatum  Signature: (Loracle/jdbc/driver/OracleConnection;Ljava/lang/Object;ILjava/lang/String;)Loracle/sql/Datum;
    // Max stack: 4, #locals: 4, #params: 4
    // Code length: 11 bytes, Code offset: 12288
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name oracleconnection Type Loracle/jdbc/driver/OracleConnection; At 0 11 Range 0 10 Init 0
    // Parameter  1 added: Name obj Type Ljava/lang/Object; At 0 11 Range 0 10 Init 0
    // Parameter  2 added: Name i Type I At 0 11 Range 0 10 Init 0
    // Parameter  3 added: Name s Type Ljava/lang/String; At 0 11 Range 0 10 Init 0
    // RetValue   4 added: Name <returnValue> Type Loracle/sql/Datum; At 0 11 Range 0 10 Init 0 fixed
    public static Datum makeOracleDatum(OracleConnection oracleconnection, Object obj, int i, String s)
        throws SQLException
    {
        return makeDatum(oracleconnection, obj, get_internal_type(i), s);
    }

    // Decompiling method: <clinit>  Signature: ()V
    // Max stack: 5, #locals: 0, #params: 0
    // Code length: 229 bytes, Code offset: 7417
    // Exception table: 1 entries
    //           start  12 end 216 handler 219 type ClassNotFoundException
    // Line Number Table found: 36 entries
    // RetValue   0 added: Name <returnValue> Type V At 0 229 Range 0 228 Init 0 fixed
    static 
    {
        s_classTbl = new Hashtable(10);
        try
        {
            s_classTbl.put(Class.forName("java.lang.String"), new Integer(0));
            s_classTbl.put(Class.forName("java.lang.Boolean"), new Integer(1));
            s_classTbl.put(Class.forName("java.lang.Integer"), new Integer(2));
            s_classTbl.put(Class.forName("java.lang.Long"), new Integer(3));
            s_classTbl.put(Class.forName("java.lang.Float"), new Integer(4));
            s_classTbl.put(Class.forName("java.lang.Double"), new Integer(5));
            s_classTbl.put(Class.forName("java.math.BigDecimal"), new Integer(6));
            s_classTbl.put(Class.forName("java.sql.Date"), new Integer(7));
            s_classTbl.put(Class.forName("java.sql.Time"), new Integer(8));
            s_classTbl.put(Class.forName("java.sql.Timestamp"), new Integer(9));
        }
        catch(ClassNotFoundException _ex)
        {
            System.out.println("program error: unexpected ClassNotFoundException");
        }
    }
}
