// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@

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

// ===================================================================
// Class:  Utils
//
//  This is a helper class for the other SPJs that: 
//     - gets connection (myConnection)
//     - gets current user executing the SPJ (getCurrentUser)
//     - gets session user if definer rights are used (getSessionUser)
//     - gets current timestamp ( getCurrentTime )
//     - transaction management ops
//        - BEGIN
//        - COMMIT
//        - ROLLBACK
//     - log debug statements (log)
//     - log execeptions (printExceptionStack)
//
// ===================================================================
public class Utils 
{
   static boolean log = false;
   static String logFileName = "udr_tools.log";
   static String logLocation = null;
   static String sqRoot = null;
   static String userName = null;

   Utils () 
   {
     if (!log)
       log = Boolean.getBoolean("debugOn");
     
     if (log) { 
       sqRoot = System.getenv("TRAF_HOME");
       logLocation = sqRoot + "/logs/";
     }
   }

   // Returns a JDBC Connection for use within the SPJ 
   // returns Connection and throws Exception

    public static Connection myConnection() throws SQLException
    {
        Connection conn = null;
        try
        {
           String url = "jdbc:default:connection";
           java.util.Properties props = new java.util.Properties();
           props.setProperty("maxStatements", "0"); // disable JDBC statement caching
           conn = DriverManager.getConnection(url, props);
           log("Returning connection from myConnection " + (conn != null));
        }
        catch (Throwable t)
        {
           log("Error encountered while getting connection " + t.getMessage());
           printExceptionStack(t);
           throw new SQLException(t.getMessage());
        }
        return conn;
    }

    private static String getLogFile(String path) 
    {
       String file=null;

       if (path != null)
        file = path + logFileName;
       else 
        file = logFileName;
       return file;
    }

    // Log a message to a log file.    
    protected static void log(String message)
    {
      if (log)
      {
       try
       {
          String file = getLogFile(logLocation);
          FileWriter fw = new FileWriter(file, true);
          PrintWriter pw = new PrintWriter(fw);
          pw.println("@" + Calendar.getInstance().getTime() + ": " + message);
          pw.close();
          fw.flush();
          fw.close();
       } catch (Exception ex) {}
      }
    }
    
     // Print exception stack.
    protected static void printExceptionStack(Throwable t)
    {
      if (log)
      {
       try
       {
          String file = getLogFile(logLocation);
          FileWriter fw = new FileWriter(file, true);
          PrintWriter pw = new PrintWriter(fw);
          t.printStackTrace(pw);
          pw.close();
          fw.flush();
          fw.close();
        } catch (Exception ex) { }
      }
    }

    public static String getCurrentUser(Connection conn) throws SQLException
    {
        log("In method getCurrentUser");
        try {
          Statement stmt = conn.createStatement();
          log("In method getCurrentUser:gotStatement");
          ResultSet rset = stmt.executeQuery("VALUES(USER)");
          while (rset != null && rset.next())
          {
            userName = rset.getString(1);
          }
          log("In method getCurrentUser:doneExecuteQuery::" + userName);
          rset.close(); stmt.close();
        } catch (SQLException e) {
          log("Error encountered in getCurrentUser " + e.getMessage());
          printExceptionStack(e);
          throw new SQLException(e.getMessage());
        }
        return userName;
    }
    
    public static String getSessionUser(Connection conn) throws SQLException
    {
        log("In method getSessionUser");
        try {
          Statement stmt = conn.createStatement();
          log("In method getSessionUser:gotStatement");
          ResultSet rset = stmt.executeQuery("VALUES(SESSION_USER)");
          while (rset != null && rset.next())
          {
            userName = rset.getString(1);
          }
          log("In method getSessionUser:doneExecuteQuery::" + userName);
          rset.close(); stmt.close();
        } catch (SQLException e) {
          log("Error encountered in getSessionUser " + e.getMessage());
          printExceptionStack(e);
          throw new SQLException(e.getMessage());
        }
        return userName;
    }

    public static String getCurrentTime(Connection conn) throws SQLException
    {
        log("In method getCurrentTime");
        try {
          Statement stmt = conn.createStatement();
          log("In method getCurrentTime:gotStatement");
          ResultSet rset = stmt.executeQuery("VALUES(CURRENT_TIMESTAMP(2))");
          while (rset != null && rset.next())
          {
            userName = rset.getString(1);
          }
          log("In method getCurrentTime:doneExecuteQuery::" + userName);
          rset.close(); stmt.close();
        } catch (SQLException e) {
          log("Error encountered in getCurrentTime " + e.getMessage());
          printExceptionStack(e);
          throw new SQLException(e.getMessage());
        }
        return userName;
    }

    public static void beginTxn(Connection conn) throws SQLException
    {
        log("In method beginTxn");
        try {
          log("In method beginTxn:gotStatement");
          PreparedStatement stmt = conn.prepareStatement("begin work;");
          stmt.executeUpdate();

          log("In method beginTxn:doneExecuteUpdate");
          stmt.close();
        } catch (SQLException e) {
          if (e.getErrorCode() != -8603) {
            log("Error encountered in beginTxn " + e.getMessage());
            printExceptionStack(e);
            throw new SQLException(e.getMessage());
          }
        }
    }

    public static void commitTxn(Connection conn) throws SQLException
    {
        log("In method commitTxn");
        try {
          log("In method commitTxn:gotStatement");
          PreparedStatement stmt = conn.prepareStatement("commit work;");
          stmt.executeUpdate();

          log("In method commitTxn:doneExecuteUpdate");
          stmt.close();
        } catch (SQLException e) {
          if (e.getErrorCode() != -8605) {
            log("Error encountered in commitTxn " + e.getMessage());
            printExceptionStack(e);
            throw new SQLException(e.getMessage());
          }
        }
    }

    public static void rollbackTxn(Connection conn) throws SQLException
    {
        log("In method rollbackTxn");
        try {
          log("In method rollbackTxn:gotStatement");
          PreparedStatement stmt = conn.prepareStatement("rollback work;");
          stmt.executeUpdate();

          log("In method rollbackTxn:doneExecuteUpdate");
          stmt.close();
        } catch (SQLException e) {
          if (e.getErrorCode() != -8609) {
            log("Error encountered in rollbackTxn " + e.getMessage());
            printExceptionStack(e);
            throw new SQLException(e.getMessage());
          }
        }
    }

    InputStream origIn_;
    PrintStream origOut_;
    PrintStream origErr_;
    
    public static void RedirectStdOut(String filename) throws Exception
    {
       InputStream origIn_  = System.in;
       PrintStream origOut_ = System.out;
       PrintStream origErr_ = System.err;
        
       String sqRoot      = System.getenv("TRAF_HOME");
       String stdoutFile  = sqRoot + "/sql/scripts/" + filename;
       PrintStream stdout = null;

       try
       {
          stdout = new PrintStream(new FileOutputStream(stdoutFile));
       }
       catch (Exception e)
       {
          System.out.println("RedirectStdOut: unable to open " + stdoutFile);
          throw new Exception(e.getMessage());
       }
       
       System.setOut(stdout);
    } // RedirectStdOut  

} // class utils

