/*
 * It may be freely used, modified, and distributed with no restrictions.
 */
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.io.Reader;

/**
 */
public class repro1
{
  /**
   * Main method.
   * 
   * @param args
   *    no arguments required
   */
  public static void main(String [] args)
  {
    Connection con = null;
    Statement stmt = null;
    ResultSet rst = null;
    DatabaseMetaData dmd = null;
    
    String psw = args[0];
    
    String drptab = "DROP TABLE IF EXISTS TDT";
    String crttab = "CREATE TABLE TDT( I INTEGER, DT DATETIME, TS TIMESTAMP )";
    String instab = "INSERT INTO TDT VALUES (1, '2016-10-27 13:11:11', '2016-10-27 13:11:22')";

    try {

      System.out.println("=========================================================");
      System.out.println("Problem description:                                     ");
      System.out.println("getProcedureColumns returns NULL as PRECISION            ");
      System.out.println("instead of 19 for a DATETIME and TIMESTAMP parameter.    ");
      System.out.println("MySQL getProcedureColumns returns PRECISION=19.          ");
      System.out.println("Both MairaDB and MySQL getColumns return COLUMN_SIZE=19. ");
      System.out.println("=========================================================");
      System.out.println("Part 1(optional). Create base table and verify getColumns");
      
      System.out.println("");
      // Create new instance of JDBC Driver and make connection.
      System.out.println("Registering Driver.");
      Class.forName("org.mariadb.jdbc.Driver");

      String url="jdbc:mariadb://lnxx64r7:3307/db999_lnxx64r6";
      System.out.println("Making a connection to: "+url);
      con = DriverManager.getConnection(url, "R729999D", psw);     
      System.out.println("Connection successful.\n");

      try {
         dmd = con.getMetaData();

         System.out.println("\nMariaDB JDBC driver version: "+ dmd.getDriverVersion());

         System.out.println("\ncon.createStatement()");
         stmt = con.createStatement();

         System.out.println(drptab);
         stmt.executeUpdate(drptab);
         }

      catch (Exception ex)
      {	
        System.out.println("Exception: " + ex);
      }

      System.out.println(crttab);
      stmt.executeUpdate(crttab);

      System.out.println("preparing: "+instab);
      PreparedStatement pstmt = con.prepareStatement(instab);

      System.out.println("executing: "+instab);
      pstmt.executeUpdate();

      System.out.println("committing");
      con.commit();

      System.out.println("Issuing getColumns for table TDT");
      rst = dmd.getColumns(null, null, "TDT", null);
  
      if (rst != null)
      {
//      System.out.println("issuing rst.next()");
//      if (rst.next())
//      { 
          System.out.println("rst.next() returned true");
          dispResultSet (rst);
//      }
//      else
//      { 
//        System.out.println("rst.next() returned false");
//      }
      }
      else
        System.out.println("No records fetched");
    }

    catch (Exception ex)
    {	
      System.out.println("Exception: " + ex);
      ex.printStackTrace();
    }

    finally
    {			
      if (con != null)
      {	
        try
        {	
          // Close the connection
          con.close();				
        }
        catch (SQLException ex)
        {	
          System.out.println("SQLException: " + ex);
        }
      }
    } 
  }

  //-------------------------------------------------------------------
  // dispResultSet
  // Displays all columns and rows in the given result set
  //-------------------------------------------------------------------

  private static void dispResultSet (ResultSet rs)
	throws SQLException
  {
    int i;

    // Get the ResultSetMetaData.  This will be used for
    // the column headings

    ResultSetMetaData rsmd = rs.getMetaData ();

    // Get the number of columns in the result set

    int numCols = rsmd.getColumnCount ();

    // Display column headings

    for (i=1; i<=numCols; i++) {
      if (i > 1) System.out.print(",");
      System.out.print(rsmd.getColumnLabel(i));
    }

    System.out.println("");

    // Display data, fetching until end of the result set

    boolean more = rs.next ();
    while (more) {

      // Loop through each column, getting the
      // column data and displaying

      for (i=1; i<=numCols; i++) {
        if (i > 1) System.out.print(",");
          System.out.print(rs.getString(i));
      }
      System.out.println("");

      // Fetch the next result set row

      more = rs.next ();
    }
  }
}
