/*
 * 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 repro2
{
  /**
   * 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 PROCEDURE IF EXISTS SPDT";
    String crttab = "CREATE  PROCEDURE SPDT (IN PI INT, IN PDT DATETIME, IN PTS TIMESTAMP)\n BEGIN\n SELECT I, DT, TS3 FROM TDT WHERE PDT = DT;\n END";

    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("");
      // 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("committing");
      con.commit();

      System.out.println("Issuing getProcedureColumns for stored procedure SPDT");
      rst = dmd.getProcedureColumns("db999_lnxx64r6", null, "SPDT", 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 ();
    }
  }
}
