// 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:   REF.java
// Class Version:      45.3

package oracle.sql;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Map;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OraclePreparedStatement;
import oracle.jdbc.OracleResultSet;
import oracle.jdbc.OracleStatement;
import oracle.jdbc.dbaccess.DBError;
import oracle.jdbc.oracore.OracleTypeADT;
import oracle.jdbc.oracore.Util;

// Referenced classes of package oracle.sql:
//            Datum, STRUCT, StructDescriptor, TypeDescriptor

// flag ACC_SUPER is set
public class REF extends Datum
    implements Ref, Serializable, Cloneable
{
    // Constants:          301
    // Interfaces:         3
    // Fields:             5
    // Methods:            21
    // Class Attributes:   1


    static final boolean DEBUG = false;
    static final long serialVersionUID = 0x126f97815bd0f9ffL;
    String m_typename;
    transient StructDescriptor m_descriptor;
    transient OracleConnection m_conn;

    // Decompiling method: <init>  Signature: (Ljava/lang/String;Ljava/sql/Connection;[B)V
    // Max stack: 2, #locals: 4, #params: 4
    // Code length: 34 bytes, Code offset: 3821
    // Line Number Table found: 7 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 34 Range 0 33 Init 0 fixed
    // Parameter  1 added: Name s Type Ljava/lang/String; At 0 34 Range 0 33 Init 0
    // Parameter  2 added: Name connection Type Ljava/sql/Connection; At 0 34 Range 0 33 Init 0
    // Parameter  3 added: Name abyte0 Type [B At 0 34 Range 0 33 Init 0
    // RetValue   4 added: Name <returnValue> Type V At 0 34 Range 0 33 Init 0 fixed
    public REF(String s, Connection connection, byte abyte0[])
        throws SQLException
    {
        super(abyte0);
        if(connection == null || s == null)
        {
            DBError.throwSqlException(68);
        }
        m_typename = s;
        m_descriptor = null;
        _setConnection(connection);
        return;
    }

    // Decompiling method: <init>  Signature: (Loracle/sql/StructDescriptor;Ljava/sql/Connection;[B)V
    // Max stack: 2, #locals: 4, #params: 4
    // Code length: 29 bytes, Code offset: 3927
    // Line Number Table found: 6 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 29 Range 0 28 Init 0 fixed
    // Parameter  1 added: Name structdescriptor Type Loracle/sql/StructDescriptor; At 0 29 Range 0 28 Init 0
    // Parameter  2 added: Name connection Type Ljava/sql/Connection; At 0 29 Range 0 28 Init 0
    // Parameter  3 added: Name abyte0 Type [B At 0 29 Range 0 28 Init 0
    // RetValue   4 added: Name <returnValue> Type V At 0 29 Range 0 28 Init 0 fixed
    public REF(StructDescriptor structdescriptor, Connection connection, byte abyte0[])
        throws SQLException
    {
        super(abyte0);
        if(connection == null || structdescriptor == null)
        {
            DBError.check_error(68);
        }
        m_descriptor = structdescriptor;
        _setConnection(connection);
        return;
    }

    // Decompiling method: _setConnection  Signature: (Ljava/sql/Connection;)V
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 44 bytes, Code offset: 4024
    // Line Number Table found: 5 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 44 Range 0 43 Init 0 fixed
    // Parameter  1 added: Name connection Type Ljava/sql/Connection; At 0 44 Range 0 43 Init 0
    // RetValue   2 added: Name <returnValue> Type V At 0 44 Range 0 43 Init 0 fixed
    private void _setConnection(Connection connection)
    {
        if(connection != null && ((OracleConnection)connection).isLogicalConnection())
        {
            m_conn = (OracleConnection)((OracleConnection)connection)._getPC();
        } else
        {
            m_conn = (OracleConnection)connection;
        }
        return;
    }

    // Decompiling method: clone  Signature: ()Ljava/lang/Object;
    // Max stack: 5, #locals: 2, #params: 1
    // Code length: 33 bytes, Code offset: 4122
    // Exception table: 1 entries
    //           start  0 end 20 handler 20 type SQLException
    // Line Number Table found: 4 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 33 Range 0 32 Init 0 fixed
    // RetValue   2 added: Name <returnValue> Type Ljava/lang/Object; At 0 33 Range 0 32 Init 0 fixed
    // LocalVar   1 added: Name sqlexception Type Ljava/sql/SQLException; At 20 6 Range 20 25 Init 20
    public Object clone()
        throws CloneNotSupportedException
    {
        try
        {
            return new REF(getBaseTypeName(), getConnection(), getBytes());
        }
        catch(SQLException sqlexception)
        {
            throw new CloneNotSupportedException(sqlexception.getMessage());
        }
    }

    // Decompiling method: equals  Signature: (Ljava/lang/Object;)Z
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 41 bytes, Code offset: 4223
    // Exception table: 1 entries
    //           start  0 end 38 handler 38 type Exception
    // Line Number Table found: 8 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 41 Range 0 40 Init 0 fixed
    // Parameter  1 added: Name obj Type Ljava/lang/Object; At 0 41 Range 0 40 Init 0
    // RetValue   2 added: Name <returnValue> Type Z At 0 41 Range 0 40 Init 0 fixed
    public boolean equals(Object obj)
    {
        try
        {
            return (obj instanceof REF) && super.equals(obj) && getBaseTypeName().equals(((REF)obj).getSQLTypeName());
        }
        catch(Exception _ex)
        {
            return false;
        }
    }

    // Decompiling method: getBaseTypeName  Signature: ()Ljava/lang/String;
    // Max stack: 2, #locals: 1, #params: 1
    // Code length: 38 bytes, Code offset: 4338
    // Line Number Table found: 6 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 38 Range 0 37 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Ljava/lang/String; At 0 38 Range 0 37 Init 0 fixed
    public String getBaseTypeName()
        throws SQLException
    {
        if(m_typename == null)
        {
            if(m_descriptor != null)
            {
                m_typename = m_descriptor.getName();
            } else
            {
                DBError.throwSqlException(52);
            }
        }
        return m_typename;
    }

    // Decompiling method: getConnection  Signature: ()Loracle/jdbc/driver/OracleConnection;
    // Max stack: 1, #locals: 1, #params: 1
    // Code length: 16 bytes, Code offset: 4444
    // Exception table: 1 entries
    //           start  0 end 8 handler 8 type ClassCastException
    // Line Number Table found: 5 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 16 Range 0 15 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Loracle/jdbc/driver/OracleConnection; At 0 16 Range 0 15 Init 0 fixed
    public oracle.jdbc.driver.OracleConnection getConnection()
        throws SQLException
    {
        try
        {
            return (oracle.jdbc.driver.OracleConnection)getJavaSqlConnection();
        }
        catch(ClassCastException _ex)
        {
            DBError.throwSqlException(103);
        }
        return null;
    }

    // Decompiling method: getDescriptor  Signature: ()Loracle/sql/StructDescriptor;
    // Max stack: 3, #locals: 1, #params: 1
    // Code length: 27 bytes, Code offset: 4538
    // Line Number Table found: 5 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 27 Range 0 26 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Loracle/sql/StructDescriptor; At 0 27 Range 0 26 Init 0 fixed
    public StructDescriptor getDescriptor()
        throws SQLException
    {
        if(m_descriptor == null)
        {
            m_descriptor = StructDescriptor.createDescriptor(m_typename, getConnection());
        }
        return m_descriptor;
    }

    // Decompiling method: getJavaSqlConnection  Signature: ()Ljava/sql/Connection;
    // Max stack: 1, #locals: 1, #params: 1
    // Code length: 5 bytes, Code offset: 4629
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 5 Range 0 4 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Ljava/sql/Connection; At 0 5 Range 0 4 Init 0 fixed
    public Connection getJavaSqlConnection()
        throws SQLException
    {
        return m_conn;
    }

    // Decompiling method: getSQLTypeName  Signature: ()Ljava/lang/String;
    // Max stack: 1, #locals: 1, #params: 1
    // Code length: 5 bytes, Code offset: 4682
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 5 Range 0 4 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Ljava/lang/String; At 0 5 Range 0 4 Init 0 fixed
    public String getSQLTypeName()
        throws SQLException
    {
        return getBaseTypeName();
    }

    // Decompiling method: getSTRUCT  Signature: ()Loracle/sql/STRUCT;
    // Max stack: 3, #locals: 6, #params: 1
    // Code length: 101 bytes, Code offset: 4735
    // Exception table: 1 entries
    //           start  38 end 65 handler 71 type any
    // Line Number Table found: 16 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 101 Range 0 100 Init 0 fixed
    // RetValue   6 added: Name <returnValue> Type Loracle/sql/STRUCT; At 0 101 Range 0 100 Init 0 fixed
    // LocalVar   1 added: Name oraclepreparedstatement Type Loracle/jdbc/OraclePreparedStatement; At 12 78 Range 12 89 Init 12
    // LocalVar   2 added: Name oracleresultset Type Loracle/jdbc/OracleResultSet; At 37 45 Range 37 81 Init 37
    // LocalVar   3 added: Name struct Type Loracle/sql/STRUCT; At 54 5 Range 54 58 Init 54
    // LocalVar   5 added: Name local Type @ At 79 20 Range 79 98 Init 79
    // LocalVar   2 added: Name obj Type A At 88 1 Range 88 88 Init 88
    // LocalVar   1 added: Name obj1 Type A At 96 1 Range 96 96 Init 96
    // LocalVar   4 added: Name exception Type Ljava.lang.Exception; At 71 7 Range 71 77 Init 71
    // LocalVar   1 name obj1(A) merged out into oraclepreparedstatement(Loracle/jdbc/OraclePreparedStatement;)
    // LocalVar   2 name obj(A) merged out into oracleresultset(Loracle/jdbc/OracleResultSet;)
    public synchronized STRUCT getSTRUCT()
        throws SQLException
    {
        OraclePreparedStatement oraclepreparedstatement = (OraclePreparedStatement)getConnection().prepareStatement("select deref(?) from dual");
        oraclepreparedstatement.setRowPrefetch(1);
        oraclepreparedstatement.setREF(1, this);
        OracleResultSet oracleresultset = (OracleResultSet)oraclepreparedstatement.executeQuery();
        try
        {
            if(oracleresultset.next())
            {
                STRUCT struct = oracleresultset.getSTRUCT(1);
                return struct;
            }
            DBError.throwSqlException(52);
        }
        finally
        {
            oracleresultset.close();
            oracleresultset = null;
            oraclepreparedstatement.close();
            oraclepreparedstatement = null;
        }
        return null;
    }

    // Decompiling method: getValue  Signature: ()Ljava/lang/Object;
    // Max stack: 1, #locals: 2, #params: 1
    // Code length: 18 bytes, Code offset: 4952
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 18 Range 0 17 Init 0 fixed
    // RetValue   2 added: Name <returnValue> Type Ljava/lang/Object; At 0 18 Range 0 17 Init 0 fixed
    // LocalVar   1 added: Name struct Type Loracle/sql/STRUCT; At 4 6 Range 4 9 Init 4
    public Object getValue()
        throws SQLException
    {
        STRUCT struct = getSTRUCT();
        return struct == null ? null : struct.toJdbc();
    }

    // Decompiling method: getValue  Signature: (Ljava/util/Map;)Ljava/lang/Object;
    // Max stack: 2, #locals: 3, #params: 2
    // Code length: 19 bytes, Code offset: 5022
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 19 Range 0 18 Init 0 fixed
    // Parameter  1 added: Name map Type Ljava/util/Map; At 0 19 Range 0 18 Init 0
    // RetValue   3 added: Name <returnValue> Type Ljava/lang/Object; At 0 19 Range 0 18 Init 0 fixed
    // LocalVar   2 added: Name struct Type Loracle/sql/STRUCT; At 4 6 Range 4 9 Init 4
    public Object getValue(Map map)
        throws SQLException
    {
        STRUCT struct = getSTRUCT();
        return struct == null ? null : struct.toJdbc(map);
    }

    // Decompiling method: hashCode  Signature: ()I
    // Max stack: 4, #locals: 4, #params: 1
    // Code length: 144 bytes, Code offset: 5093
    // Line Number Table found: 20 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 144 Range 0 143 Init 0 fixed
    // RetValue   4 added: Name <returnValue> Type I At 0 144 Range 0 143 Init 0 fixed
    // LocalVar   1 added: Name abyte0 Type [B At 4 119 Range 4 122 Init 4
    // LocalVar   2 added: Name flag Type Z At 6 137 Range 6 142 Init 6
    // LocalVar   3 added: Name flag1 Type Z At 17 27 Range 17 43 Init 17
    // LocalVar   3 chged: Name i Oname flag1 Type I At 43 1 Range 17 43 Init 17
    // LocalVar   3 added: Name flag1 Type Z At 61 32 Range 61 92 Init 61
    // LocalVar   3 chged: Name j Oname flag1 Type I At 87 1 Range 61 92 Init 61
    // LocalVar   3 added: Name flag1 Type Z At 111 27 Range 111 137 Init 111
    // LocalVar   3 chged: Name k Oname flag1 Type I At 137 1 Range 111 137 Init 111
    // LocalVar   2 chged: Name l Oname flag Type I At 142 1 Range 6 142 Init 6
    public int hashCode()
    {
        byte abyte0[] = shareBytes();
        int i = 0;
        if((abyte0[2] & 0x5) == 5)
        {
            for(int j = 0; j < 4; j++)
            {
                i *= 256;
                i += abyte0[8 + j] & 0xff;
            }

        } else
        if((abyte0[2] & 0x3) == 3)
        {
            for(int k = 0; k < 4 && k < abyte0.length; k++)
            {
                i *= 256;
                i += abyte0[6 + k] & 0xff;
            }

        } else
        if((abyte0[2] & 0x2) == 2)
        {
            for(int l = 0; l < 4; l++)
            {
                i *= 256;
                i += abyte0[8 + l] & 0xff;
            }

        }
        return i;
    }

    // Decompiling method: isConvertibleTo  Signature: (Ljava/lang/Class;)Z
    // Max stack: 1, #locals: 2, #params: 2
    // Code length: 2 bytes, Code offset: 5351
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 2 Range 0 1 Init 0 fixed
    // Parameter  1 added: Name class1 Type Ljava/lang/Class; At 0 2 Range 0 1 Init 0
    // RetValue   2 added: Name <returnValue> Type Z At 0 2 Range 0 1 Init 0 fixed
    public boolean isConvertibleTo(Class class1)
    {
        return false;
    }

    // Decompiling method: makeJdbcArray  Signature: (I)Ljava/lang/Object;
    // Max stack: 1, #locals: 2, #params: 2
    // Code length: 5 bytes, Code offset: 5391
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 5 Range 0 4 Init 0 fixed
    // Parameter  1 added: Name i Type I At 0 5 Range 0 4 Init 0
    // RetValue   2 added: Name <returnValue> Type Ljava/lang/Object; At 0 5 Range 0 4 Init 0 fixed
    public Object makeJdbcArray(int i)
    {
        return new REF[i];
    }

    // Decompiling method: readObject  Signature: (Ljava/io/ObjectInputStream;)V
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 20 bytes, Code offset: 5434
    // Line Number Table found: 3 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 20 Range 0 19 Init 0 fixed
    // Parameter  1 added: Name objectinputstream Type Ljava/io/ObjectInputStream; At 0 20 Range 0 19 Init 0
    // RetValue   2 added: Name <returnValue> Type V At 0 20 Range 0 19 Init 0 fixed
    private void readObject(ObjectInputStream objectinputstream)
        throws IOException, ClassNotFoundException
    {
        setBytes((byte[])objectinputstream.readObject());
        m_typename = objectinputstream.readUTF();
        return;
    }

    // Decompiling method: setConnection  Signature: (Ljava/sql/Connection;)V
    // Max stack: 2, #locals: 2, #params: 2
    // Code length: 6 bytes, Code offset: 5512
    // Line Number Table found: 2 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 6 Range 0 5 Init 0 fixed
    // Parameter  1 added: Name connection Type Ljava/sql/Connection; At 0 6 Range 0 5 Init 0
    // RetValue   2 added: Name <returnValue> Type V At 0 6 Range 0 5 Init 0 fixed
    public void setConnection(Connection connection)
        throws SQLException
    {
        _setConnection(connection);
        return;
    }

    // Decompiling method: setValue  Signature: (Ljava/lang/Object;)V
    // Max stack: 4, #locals: 9, #params: 2
    // Code length: 209 bytes, Code offset: 5570
    // Exception table: 1 entries
    //           start  68 end 175 handler 181 type any
    // Line Number Table found: 30 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 209 Range 0 208 Init 0 fixed
    // Parameter  1 added: Name obj Type Ljava/lang/Object; At 0 209 Range 0 208 Init 0
    // RetValue   9 added: Name <returnValue> Type V At 0 209 Range 0 208 Init 0 fixed
    // LocalVar   2 added: Name struct Type Loracle/sql/STRUCT; At 8 46 Range 8 53 Init 8
    // LocalVar   3 added: Name abyte0 Type [B At 52 71 Range 52 122 Init 52
    // LocalVar   4 added: Name abyte1 Type [B At 63 51 Range 63 113 Init 63
    // LocalVar   5 added: Name obj1 Type A At 66 132 Range 66 197 Init 66
    // LocalVar   5 chged: Name callablestatement Oname obj1 Type Ljava/sql/CallableStatement; At 77 121 Range 66 197 Init 66
    // LocalVar   8 added: Name flag Type Z At 137 2 Range 137 138 Init 137
    // LocalVar   8 added: Name i Type I At 148 18 Range 148 165 Init 148
    // LocalVar   7 added: Name local Type @ At 189 19 Range 189 207 Init 189
    // LocalVar   5 added: Name obj1 Type A At 204 2 Range 204 205 Init 204
    // LocalVar   6 added: Name exception Type Ljava.lang.Exception; At 181 7 Range 181 187 Init 181
    // LocalVar   5 name obj1(A) merged out into callablestatement(Ljava/sql/CallableStatement;)
    // LocalVar   8 chged: Name j Oname flag Type I At 137 2 Range 137 138 Init 137
    // LocalVar   8 name i(I) merged out into j(I)
    public synchronized void setValue(Object obj)
        throws SQLException
    {
        STRUCT struct = STRUCT.toSTRUCT(obj, getConnection());
        if(struct.getConnection() != getConnection())
        {
            DBError.throwSqlException(77, "Incompatible connection object");
        }
        if(!getBaseTypeName().equals(struct.getSQLTypeName()))
        {
            DBError.throwSqlException(77, "Incompatible type");
        }
        byte abyte0[] = struct.toBytes();
        byte abyte1[] = struct.getDescriptor().getOracleTypeADT().getTOID();
        CallableStatement callablestatement = null;
        try
        {
            callablestatement = getConnection().prepareCall("begin ? := dbms_pickler.update_through_ref (?, ?, ?, ?); end;");
            callablestatement.registerOutParameter(1, 2);
            callablestatement.setBytes(2, shareBytes());
            callablestatement.setInt(3, 0);
            callablestatement.setBytes(4, abyte1);
            callablestatement.setBytes(5, abyte0);
            callablestatement.execute();
            int i = 0;
            if((i = callablestatement.getInt(1)) != 0)
            {
                DBError.throwSqlException(77, "ORA-" + i);
            }
        }
        finally
        {
            if(callablestatement != null)
            {
                callablestatement.close();
            }
            callablestatement = null;
        }
        return;
    }

    // Decompiling method: toJdbc  Signature: ()Ljava/lang/Object;
    // Max stack: 1, #locals: 1, #params: 1
    // Code length: 2 bytes, Code offset: 5951
    // Line Number Table found: 1 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 2 Range 0 1 Init 0 fixed
    // RetValue   1 added: Name <returnValue> Type Ljava/lang/Object; At 0 2 Range 0 1 Init 0 fixed
    public Object toJdbc()
        throws SQLException
    {
        return this;
    }

    // Decompiling method: writeObject  Signature: (Ljava/io/ObjectOutputStream;)V
    // Max stack: 5, #locals: 3, #params: 2
    // Code length: 60 bytes, Code offset: 6001
    // Exception table: 1 entries
    //           start  8 end 16 handler 19 type SQLException
    // Line Number Table found: 9 entries
    // Parameter  0 added: Name this Type Loracle/sql/REF; At 0 60 Range 0 59 Init 0 fixed
    // Parameter  1 added: Name objectoutputstream Type Ljava/io/ObjectOutputStream; At 0 60 Range 0 59 Init 0
    // RetValue   3 added: Name <returnValue> Type V At 0 60 Range 0 59 Init 0 fixed
    // LocalVar   2 added: Name sqlexception Type Ljava/sql/SQLException; At 19 27 Range 19 45 Init 19
    private void writeObject(ObjectOutputStream objectoutputstream)
        throws IOException
    {
        objectoutputstream.writeObject(shareBytes());
        try
        {
            objectoutputstream.writeUTF(getBaseTypeName());
        }
        catch(SQLException sqlexception)
        {
            throw new IOException("SQLException ORA-" + sqlexception.getErrorCode() + " " + sqlexception.getMessage());
        }
        return;
    }
}
