import java.sql.*;
import java.util.*;

public class Ex4
{
    Connection mainConnection = null;
    Statement mainStatement = null;
    PreparedStatement SecondStatement = null;
    Statement ThirdStatement = null;
    ResultSet mainResultSet = null;

    public static void main(String args[])
    {
 Ex4 e = new Ex4();
    }

    public Ex4()
    {
        ConnectToDB();
 
 PublishData();
 
 SearchAllTuples();
 ShowAllTuples();
 

        InsertPrepared();

 SearchAllTuples();

 ShowMetaData();

 ShowAllTuples();
 

    }

    public void InsertPrepared()
    {
 try
 {
 
     System.out.println("\n ** Using prepares statement, faster than regular statement  ** " );
     SecondStatement.setString( 1, "Name 1" );
     SecondStatement.setString( 2, "00000000" );
     SecondStatement.setString( 3, "250000" );
     SecondStatement.setString( 4, "My Department" );
     SecondStatement.executeUpdate();
     System.out.println("Prepared: new tuple inserted " );
     SecondStatement.setString( 1, "Name 2" );
     SecondStatement.setString( 2, "111111" );
     SecondStatement.setString( 3, "887700" );
     SecondStatement.setString( 4, "My Department 2" );
     SecondStatement.executeUpdate();
     System.out.println("Prepared: new tuple inserted \n\n " );
 }
 catch( Exception e )
 { System.out.println( " Error 1: " + e.toString() ); }

    }

    public void SearchAllTuples()
    {
 try
 {
     System.out.println(" ** Selecting all tuples in the table **" );
     mainResultSet = mainStatement.executeQuery( "select * from info; " );
 }
 catch( Exception e )
 { System.out.println( " Error : " + e.toString() ); }
    }

    public void ShowMetaData()
    {
 try
 {
     System.out.println("\n ** Obtaining Meta Data ** " );
     ResultSetMetaData meta = mainResultSet.getMetaData();
     for( int col=1; col<=meta.getColumnCount(); col++ )
  System.out.println( "Column: " + meta.getColumnName(col) + "\t, Type: " + meta.getColumnTypeName(col) );
 }
 catch( Exception e )
 { System.out.println( " Error : " + e.toString() ); }

    }

    public void ShowAllTuples()
    {
 try
 {
 
     ResultSetMetaData meta = mainResultSet.getMetaData();

     System.out.println("\n ** Showing all Tuples ** " );
     int tupleCount=1;
      while( mainResultSet.next() )
     {
  System.out.print( "Tuple " + tupleCount++ + " : " );
  for( int col=1; col<=meta.getColumnCount(); col++)
       System.out.print( "\""+mainResultSet.getString( col )+"\"," );
  System.out.println();
     }
        }
 catch( Exception e )
 { System.out.println(" Error : " + e.toString() ); }

 System.out.println();
    }

 
 
    public void ConnectToDB()
    {
 // loading Informix driver
 try
 {
         System.out.print("Looking for Informix's jdbc-odbc driver ... ");
            Class.forName("com.informix.jdbc.IfxDriver");
            System.out.println("loaded.\n");
 
     String URL = "jdbc:informix-sqli://esfahaan.usc.edu:1425";

            Properties p = new Properties();
            p.put("INFORMIXSERVER", "dimlab");
            p.put("database", "temp585");
            p.put("user", "temp585");
            p.put("password", "temp585");
 
            Connection mainConnection = DriverManager.getConnection(URL, p);

     mainStatement = mainConnection.createStatement();
     SecondStatement = mainConnection.prepareStatement( "insert into info values( ?, ?, ?, ? );" );
     ThirdStatement = mainConnection.createStatement(
                                         ResultSet.TYPE_SCROLL_INSENSITIVE,
                                         ResultSet.CONCUR_READ_ONLY);

       }
       catch( Exception e )
       {
     System.out.println( "Error connecting to DB: "+ e.toString() );
     System.exit(-1);
       }
    }

    public void PublishData()
    {
 try
 {
 
     System.out.print( "Deleting previous tuples ..." );
     mainStatement.executeUpdate( "delete from info;" );
     System.out.println( "Deleted." );

     System.out.print( "Inserting Initial Data ..." );
     mainStatement.executeUpdate( "insert into info values ('Clinton, Bill', '9876543210', 400000, 'Ex. White House');" );
     mainStatement.executeUpdate( "insert into info values ('Doll, Bob', '1234567890', 100000, 'House');" );
     mainStatement.executeUpdate( "insert into info values ('Bush, George', '6543210987', 450000, 'White House');" );
     mainStatement.executeUpdate( "insert into info values ('Gore, Al', '3210987654', 200000, 'donno');" );
     mainStatement.executeUpdate( "insert into info values ('Bing, Chandler', '4321056789', 750000, 'Friends');" );
     System.out.println( "Done.\n" );

 }
 catch( Exception e )
 { System.out.println( " Error 2: " + e.toString() ); }
    }
 

}