package oracle.forms.fd;

/**-----------------------------------------------*
 * Class to read/write Blob from/to the database  *
 *------------------------------------------------*/

import java.awt.Image;
import java.awt.Toolkit;
import java.sql.*;
import java.io.*;
import oracle.jdbc.*;
import oracle.sql.BLOB;

public class LectureBlob
{
  public BLOB blobImage = null ;  
  public boolean  bLog = true ;
  public String sConn="", sUser="", sPwd="" ;
  public String sTable="", sColumn="", sLookup="" ;
  
   /**---------------------------------------*
     *  read a BLOB column from the database *
     *---------------------------------------*/
  public Image Lecture( String sWhere )
       throws Exception
  {
    // Register the Oracle JDBC driver
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
    Connection conn = null ;
    String     req = "" ;
    byte[]     buffer = null ;
    int        iLength = 0 ;
    Image      img = null ;

    // Connect to the database
     log("Lecture() : Connect to database ["+sConn+"@"+sUser+"/"+sPwd+"]") ;
    try {
      conn = DriverManager.getConnection (sConn, sUser, sPwd);
    } catch (Exception e) {
     log( "error connection database : " + e.toString()) ;
    }

    conn.setAutoCommit (false);

    // Create a Statement
    Statement stmt = conn.createStatement ();

    req  = "select " + sColumn + ", LENGTH(" + sColumn + ") " ;
    req += "from " + sTable + " where " + sWhere ; //+ "=" + iDentifiant ;
    log("Lecture() : execute query="+req) ;
    ResultSet rset = stmt.executeQuery ( req );
    while (rset.next ())
    {
      // Get the lob
      blobImage = ((OracleResultSet)rset).getBLOB (1);
      iLength = rset.getInt(2) ;
    }
    // Close all resources
    rset.close();
    stmt.close();

    log("Lecture() : transform the BLOB length="+iLength) ;
    if( iLength > 0 )
    {
      InputStream instream = blobImage.getBinaryStream();
      // Create temporary buffer for read
      buffer = new byte[iLength];
      int length = 0;
      // Fetch data  
      while ((length = instream.read(buffer)) != -1)
      {
        log("Lecture() : Read " + length + " bytes: ");
      }

      // Close input stream
      instream.close();    
      conn.close(); 
      log("Lecture() : createImage()") ;
      img = Toolkit.getDefaultToolkit().createImage(buffer) ;
    }
    return img ;
    
  }


   /**--------------------------------------------*
     *  write an image to a database BLOB column  *
     *--------------------------------------------*/
  public void Ecriture( String sWhere, FileInputStream fis, int iSize )
       throws Exception
  {
   // Register the Oracle JDBC driver
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
    Connection conn = null ;
    String req = "" ;
    byte[] buffer = null ;
    int iLength = 0 ;

    // Connect to the database
    log("Ecriture() : Connect to database") ;
    try {
      conn = DriverManager.getConnection (sConn, sUser, sPwd);
    } catch (Exception e) {
     log( "Ecriture() : error connecting to the database " + e.toString()) ;
    }

    // Create a Statement
    PreparedStatement   pstmt = null ;

    req  = "UPDATE " + sTable + " set " + sColumn + " = ? where " + sWhere ;
    log("Ecriture() : execute query="+req) ;

    pstmt = conn.prepareStatement(req) ;
    if( blobImage == null ) 
       pstmt.setBinaryStream( 1, fis, iSize );      
    else
       pstmt.setBlob(1, blobImage);
    
    pstmt.execute() ;
    conn.commit();

    // Close all resources
    pstmt.close();
    conn.close(); 
    
  }
  
  public void log( String sMessage )
  {
    if( bLog) System.out.println( sMessage ) ;
  }    

}
