import java.io.*;
import java.sql.*;

public class BlobUpdateTest {

  public static File createTestFile() {
    File file=null;
    try {
      byte[] data=new byte[Byte.MAX_VALUE];
      for (byte i=0;i<data.length;i++)
        data[i]=i;
      file=File.createTempFile("blob_test", ".dat");
      FileOutputStream fileOut=new FileOutputStream(file);
      ObjectOutputStream objOut=new ObjectOutputStream(fileOut);
      objOut.writeObject(data);
      objOut.close();
      fileOut.close();
    }
    catch(IOException e) {
      e.printStackTrace();
    }
    return file;
  }

  public static void updateBLOB(ResultSet rs) {
    try {
      File dataFile=createTestFile();
      FileInputStream fileIn=new FileInputStream(dataFile);
      BufferedInputStream bufIn=new BufferedInputStream(fileIn);
      rs.updateBinaryStream("big_blob",bufIn,dataFile.length()); // <<<<<<<<<<<<<<<<<<<<<< FAIL POINT
      rs.updateRow();
      bufIn.close();
      fileIn.close();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  public static void createTableAndPopulate(Connection con) {
    try {
      Statement stat=con.createStatement();
      stat.execute("DROP TABLE IF EXISTS `test`.`blob_test_table`");
      stat.execute("CREATE TABLE  `test`.`blob_test_table` ("+
                   "`Rec` bigint(20) NOT NULL AUTO_INCREMENT,"+
                   "`Date` datetime DEFAULT NULL,"+
                   "`Set_Test` set('A','B','C') DEFAULT NULL,"+
                   "`Enum_Test` enum('a','b','c') DEFAULT NULL,"+
                   "`Small_Text` varchar(10) DEFAULT NULL,"+
                   "`Text` varchar(120) DEFAULT NULL,"+
                   "`big_blob` longblob,"+
                   "`big_text` longtext,"+
                   "`var_text` varchar(145) DEFAULT NULL,"+
                   "PRIMARY KEY (`Rec`)"+
                   ") ENGINE=InnoDB DEFAULT CHARSET=latin1;");
      stat.executeUpdate("INSERT INTO `test`.`blob_test_table` VALUES()");
      stat.close();
    }
    catch(SQLException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    String url="jdbc:mysql://127.0.0.1"; //the database URL
    String username="root";              //the username
    String password="p@$$4root";         //the password
    try {
      Class.forName("com.mysql.jdbc.Driver");
    }
    catch(ClassNotFoundException e) {
      e.printStackTrace();
    }
    try {
      Connection connection=DriverManager.getConnection(url,username,password);
      createTableAndPopulate(connection);
      String sql="SELECT * FROM `test`.`blob_test_table`";
      Statement stat=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
      stat.execute(sql);
      ResultSet rs=stat.getResultSet();
      rs.first();
      updateBLOB(rs); //FAILS
      rs.close();
      stat.close();
      connection.close();
    }
    catch(SQLException e) {
      e.printStackTrace();
    }
  }
}