/* **************************************************************************
 *
 * Copyright (C) 2002-2005 Octet String, Inc. All Rights Reserved.
 *
 * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND
 * TREATIES. USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT
 * TO VERSION 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS
 * AVAILABLE AT HTTP://WWW.OPENLDAP.ORG/LICENSE.HTML OR IN THE FILE "LICENSE"
 * IN THE TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION
 * OF THIS WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP
 * PUBLIC LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM OCTET STRING, INC., 
 * COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY.
 ******************************************************************************/

/*
 * JdbcLdapPreparedStatement.java
 *
 * Created on March 19, 2002, 11:48 PM
 */

package com.octetstring.jdbcLdap.sql;
import java.sql.*;
import java.util.HashMap;

import com.novell.ldap.LDAPMessageQueue;
import com.novell.ldap.LDAPSearchResults;
import com.octetstring.jdbcLdap.jndi.*;
import com.octetstring.jdbcLdap.jndi.UnpackResults;
import com.octetstring.jdbcLdap.sql.statements.*;
import com.octetstring.jdbcLdap.sql.*;
import javax.naming.*;
import java.io.*;
/**
 *Parses and manages a prepared statement to the directory
 *@author Marc Boorshtein, OctetString
 * @version
 */
public class JdbcLdapPreparedStatement extends JdbcLdapStatement implements java.sql.PreparedStatement {
    
    
	
	
    
    
    /** Creates new JdbcLdapPreparedStatement */
    public JdbcLdapPreparedStatement(String sql, JndiLdapConnection con) throws SQLException {
        super(con);
        loadSQL(sql);
        
    }
    
    /**
     *Reloads a sql statement based on a sql store
     *@param store the sql store to re-load
     */
    void loadSQL(SqlStore store) throws SQLException {
        loadSQL(store.getSQL());
    }
    
    /**
     *Used to set the caorrect parameter
     *@param pos Position where to insert plus one
     *@param val Value to insert
     */
    void setVal(int pos, String val) throws SQLException {
        
        
        this.stmt.setValue(pos-1,val);
    }

	
    
	@Deprecated
    public void setUnicodeStream(int param, java.io.InputStream inputStream, int param2) throws java.sql.SQLException {
        char[] c = new char[param2];
        try {
            
            BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
            in.read(c,0,param2);
            
            in.close();
        }
        catch (IOException e) {
            throw new SQLException(e.toString());
        }
        setVal(param,String.valueOf(c));
    }
    
    public void setTime(int param, java.sql.Time time) throws java.sql.SQLException {
        setVal(param,time.toString());
    }
    
    public void setBigDecimal(int param, java.math.BigDecimal bigDecimal) throws java.sql.SQLException {
        setVal(param,bigDecimal.toString());
    }
    
    public boolean execute() throws java.sql.SQLException {
        if (stmt.isUpdate()) {
            executeUpdate();
            return false;
        }
        else {
            executeQuery();
            return true;
        }
    }
    
    public void setURL(int param, java.net.URL uRL) throws java.sql.SQLException {
        setVal(param,uRL.toString());
    }
    
    public void setAsciiStream(int param, java.io.InputStream inputStream, int param2) throws java.sql.SQLException {
        char[] c = new char[param2];
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
            
            in.read(c,0,param2);
            
            in.close();
        }
        catch (IOException e) {
            throw new SQLException(e.toString());
        }
        setVal(param,String.valueOf(c));
    }
    
    public void setByte(int param, byte param1) throws java.sql.SQLException {
        setVal(param,Byte.toString(param1));
    }
    
    public void setDouble(int param, double param1) throws java.sql.SQLException {
        setVal(param,Double.toString(param1));
    }
    
    public void setLong(int param, long param1) throws java.sql.SQLException {
        setVal(param,Long.toString(param1));
    }
    
    public void setDate(int param, java.sql.Date date) throws java.sql.SQLException {
        setVal(param,date.toString());
    }
    
    public void setBinaryStream(int param, java.io.InputStream inputStream, int param2) throws java.sql.SQLException {
        char[] c = new char[param2];
        try {
            
            BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
            in.read(c,0,param2);
            
            in.close();
        }
        catch (IOException e) {
            throw new SQLException(e.toString());
        }
        setVal(param,String.valueOf(c));
    }
    
    public java.sql.ParameterMetaData getParameterMetaData() throws java.sql.SQLException {
        return null;
    }
    
    public void setTime(int param, java.sql.Time time, java.util.Calendar calendar) throws java.sql.SQLException {
        setVal(param,time.toString());
    }
    
    public void setBlob(int param, java.sql.Blob blob) throws java.sql.SQLException {
    }
    
    public java.sql.ResultSet executeQuery() throws java.sql.SQLException {
        if (this.con.isDSML()) {
        	res.unpackJldap((LDAPSearchResults) stmt.executeQuery(),stmt.getRetrieveDN(),this.stmt.getSqlStore().getFrom(),con.getBaseDN(),this.stmt.getSqlStore().getRevFieldMap());
        } else {
        	res.unpackJldap((LDAPMessageQueue) stmt.executeQuery(),stmt.getRetrieveDN(),this.stmt.getSqlStore().getFrom(),con.getBaseDN(),this.stmt.getSqlStore().getRevFieldMap());
        }
    	
        
        this.rs = new LdapResultSet(con,this,res,((JdbcLdapSelect) stmt).getBaseContext());
        return rs;
    }
    
    public void setCharacterStream(int param, java.io.Reader reader, int param2) throws java.sql.SQLException {
        char[] c = new char[param2];
        try {
            
            BufferedReader in = new BufferedReader(reader);
            in.read(c,0,param2);
            
            in.close();
        }
        catch (IOException e) {
            throw new SQLException(e.toString());
        }
        setVal(param,String.valueOf(c));
    }
    
    public java.sql.ResultSetMetaData getMetaData() throws java.sql.SQLException {
        return rs.getMetaData();
    }
    
    public void setTimestamp(int param, java.sql.Timestamp timestamp, java.util.Calendar calendar) throws java.sql.SQLException {
        setVal(param,timestamp.toString());
    }
    
    public void setObject(int param, java.lang.Object obj, int param2, int param3) throws java.sql.SQLException {
        setVal(param,obj.toString());
    }
    
    public void setObject(int param, java.lang.Object obj, int param2) throws java.sql.SQLException {
        setVal(param,obj.toString());
    }
    
    public void setObject(int param, java.lang.Object obj) throws java.sql.SQLException {
        setVal(param,obj.toString());
    }
    
    public void setRef(int param, java.sql.Ref ref) throws java.sql.SQLException {
    }
    
    public void setArray(int param, java.sql.Array array) throws java.sql.SQLException {
    }
    
    public void setTimestamp(int param, java.sql.Timestamp timestamp) throws java.sql.SQLException {
        setVal(param,timestamp.toString());
    }
    
    public void setInt(int param, int param1) throws java.sql.SQLException {
        setVal(param,Integer.toString(param1));
    }
    
    public void setBytes(int param, byte[] values) throws java.sql.SQLException {
        this.setCharacterStream(param,new InputStreamReader(new ByteArrayInputStream(values)),values.length);
    }
    
    public void setShort(int param, short param1) throws java.sql.SQLException {
        setVal(param,Short.toString(param1));
    }
    
    public void setFloat(int param, float param1) throws java.sql.SQLException {
        setVal(param,Float.toString(param1));
    }
    
    public void setBoolean(int param, boolean param1) throws java.sql.SQLException {
        setVal(param,Boolean.toString(param1));
    }
    
    public void setDate(int param, java.sql.Date date, java.util.Calendar calendar) throws java.sql.SQLException {
        setVal(param,date.toString());
    }
    
    public int executeUpdate() throws java.sql.SQLException {
        return ((Integer) stmt.executeUpdate()).intValue();
    }
    
    public void setString(int param, java.lang.String str) throws java.sql.SQLException {
        setVal(param,str);
    }
    
    public void setClob(int param, java.sql.Clob clob) throws java.sql.SQLException {
    }
    
    public void addBatch() throws java.sql.SQLException {
        statements.add(stmt);
        loadSQL(stmt.getSqlStore());
    }
    
    public void clearParameters() throws java.sql.SQLException {
    }
    
    public void setNull(int param, int param1) throws java.sql.SQLException {
        setVal(param,null);
    }
    
    public void setNull(int param, int param1, java.lang.String str) throws java.sql.SQLException {
        setVal(param,null);
    }
    
}