// Licensed to the Apache Software Foundation (ASF) under one or more contributor
// license agreements.  See the NOTICE.txt 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.

package org.apache.oodt.commons.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Properties;

/**
	This class is a wrapper for JDBC.

	@author D. Crichton
	@version $Revision: 1.3 $
*/
public class JDBC_DB
{
	Properties serverProps;
	Connection connect;
	String sql_command;
	Statement stmt;
	ResultSet rs;
	ResultSetMetaData rs_meta;
	int affected;
	boolean more_rows;
	boolean keep_connect_open;
	private boolean autoCommitMode = false;
	public final String TO_DATE_FORMAT = "DD-MM-YYYY HH24:MI:SS";

	/******************************************************************
	**
	** JDBC_DB
	**
	** Constructor method will create class instance and load the
	** Oracle DB driver
	**
	*******************************************************************/

	public  JDBC_DB(
			java.util.Properties sys_props) throws SQLException
	{
			String  classname;

			serverProps = sys_props;
			keep_connect_open = true;

	}

	public  JDBC_DB(
			java.util.Properties sys_props,
			Connection srv_connect) throws SQLException
	{
			String  classname;

			serverProps = sys_props;
			connect = srv_connect;

			if (srv_connect == null) {
				keep_connect_open  = false;
			} else {
				keep_connect_open = true;
			}
	}

	public void setAutoCommitMode(boolean autoCommitMode) {
		this.autoCommitMode = autoCommitMode;
	}

	/******************************************************************
	**
	** openConnection
	**
	** Open a connection to the database.
	**
	*******************************************************************/
	public void openConnection() throws SQLException

	{
		openConnection(serverProps.getProperty("org.apache.oodt.commons.util.JDBC_DB.user", "unknown"),
			serverProps.getProperty("org.apache.oodt.commons.util.JDBC_DB.password"),
			serverProps.getProperty("org.apache.oodt.commons.util.JDBC_DB.database"));
	}


	public void openConnection(
		String username,
		String password,
		String database) throws SQLException
	{
		String url, classname;

		if (stmt != null)
			stmt.close();

		if (rs != null)
			rs.close();

		if (keep_connect_open)
			return;

		if (connect != null)
			connect.close();


		rs_meta = null;
		connect = null;
		stmt = null;
		rs = null;

		Properties props = new Properties();
		props.put("user", username);

		if (password != null)
			props.put("password", password);


		classname = serverProps.getProperty("org.apache.oodt.commons.util.JDBC_DB.driver", "oracle.jdbc.driver.OracleDriver");
		try {
			System.err.println("Attempting to load class " + classname);
			Class.forName(classname);
			System.err.println("Loaded " + classname);
		} catch (ClassNotFoundException e) {
			System.err.println("Can't load JDBC driver \"" + classname + "\": " + e.getMessage());
			e.printStackTrace();
		}
		url = serverProps.getProperty("org.apache.oodt.commons.util.JDBC_DB.url", "jdbc:oracle:@");
		try {
			if (database != null) {
				System.err.println("Connecting to url+database combo: " + url + database);
				connect = DriverManager.getConnection(url+database, props);
			} else {
				System.err.println("Connecting to full url: " + url);
				connect = DriverManager.getConnection(url, props);
			}
		} catch (SQLException e) {
			System.err.println("SQL Exception during connection creation: " + e.getMessage());
			e.printStackTrace();
			while (e != null) {
				System.err.println(e.getMessage());
				e = e.getNextException();
			}
		}

		connect.setAutoCommit(autoCommitMode);

	}


	/******************************************************************
	**
	** closeConnection
	**
	** Close a connection to the database.
	**
	*******************************************************************/

	public void closeConnection() {
		try {
			if (rs != null) {
				rs.close();
			}
			if (stmt != null) {
				stmt.close();
			}
			if (keep_connect_open) {
				return;
			}
			if (connect != null) {
				connect.close();
			}
			connect = null;
			rs = null;
			stmt = null;
		} catch (SQLException e) {
			System.err.println("Ignoring database close connection exception");
			//System.err.println("Ignoring exception " + e.getClass().getName() + ": " + e.getMessage());
			//e.printStackTrace();
		}
	}

	/******************************************************************
	**
	** executeSQLCommand
	**
	** Send an SQL command to the DBMS to be executed.
	**
	*******************************************************************/

	public void executeSQLCommand(String cmd) throws SQLException
	{


		/*
		** Get the string, and create the statement
		*/
		sql_command = cmd;

		if (stmt!=null)
			stmt.close();

		if (connect == null) openConnection();
		if (connect == null) {
			keep_connect_open = false;
			openConnection();
		}
		if (connect == null)
			throw new IllegalStateException("Connection is null!!!");
		
		if (connect.isClosed()) {
			connect = null;
			keep_connect_open = false;
			openConnection();
		}
		if (connect == null)
			throw new IllegalStateException("Connection is still null!!!");
		if (connect.isClosed())
			throw new IllegalStateException("Connection got closed!");

		stmt = connect.createStatement();
		affected = stmt.executeUpdate(sql_command);
	}

	/******************************************************************
	**
	** executeQuery
	**
	** Send an SQL query to the DBMS to be executed.
	**
	*******************************************************************/
	public ResultSet executeQuery(String cmd) throws SQLException
	{
		sql_command = cmd;


		if (stmt!=null)
			stmt.close();

		if (connect == null) openConnection();
		if (connect == null) {
			keep_connect_open = false;
			openConnection();
		}
		if (connect == null)
			throw new IllegalStateException("Connection is null!!!");
		
		if (connect.isClosed()) {
			connect = null;
			keep_connect_open = false;
			openConnection();
		}
		if (connect == null)
			throw new IllegalStateException("Connection is still null!!!");
		if (connect.isClosed())
			throw new IllegalStateException("Connection got closed!");


		//long time0 = System.currentTimeMillis();
		stmt = connect.createStatement();
		//long time = System.currentTimeMillis();
		//System.err.println("###### Creating a new statement: " + (time - time0));
		//time0 = time;

		if (rs!=null)
			rs.close();

		rs = stmt.executeQuery(sql_command);
		//time = System.currentTimeMillis();
		//System.err.println("###### Executing the query: " + (time - time0));

		if (rs == null)
		{
			return(null);
		}

		return(rs);


	}

	/******************************************************************
	**
	** getCount
	**
	** Will return a count when user passes sting select count(*) from ...
	**
	*******************************************************************/
	public int getCount(String cmd) throws SQLException
	{
		sql_command = cmd;
		int count;


		if (stmt!=null)
			stmt.close();

		stmt = connect.createStatement();

		if (rs!=null)
			rs.close();

		rs = stmt.executeQuery(sql_command);

		if (rs == null)
		{
			return(0);
		}

		count = 0;

		while (rs.next())
		{
			count = rs.getInt(1);
		}

		stmt.close();
		rs.close();


		return(count);


	}
	/******************************************************************
	**
	** commit
	**
	**
	**
	*******************************************************************/
	public void commit() throws SQLException
	{
		connect.commit();
	}

	/******************************************************************
	**
	** rollback
	**
	**
	**
	*******************************************************************/
	public void rollback()
	{
		try
		{
			if (connect != null)
				connect.rollback();
		}

		catch (SQLException e)
		{

		}
	}

	 protected void finalize() throws Throwable
	{
		try
		{
			if ((connect != null) && (!keep_connect_open))
			{
				connect.close();

			}

			if (rs != null)
			{
				rs.close();
			}

			if (stmt != null)
			{
				stmt.close();
			}

		}
		catch (SQLException e)
		{
		}
	}

	/******************************************************************
	**
	** Convert Date to string in format for
	** Oracle TO_DATE processing - DD-MM-YY HH24:MI:SS
	**
	**
	*******************************************************************/


	public String toDateStr(java.util.Date inDate)
	{

		String outDate;
/*
		outDate = Integer.toString(inDate.getDate()) + "-" +
			   Integer.toString(inDate.getMonth() + 1) + "-" +
			   Integer.toString(inDate.getYear()) + " " +
			   Integer.toString(inDate.getHours()) + ":" +
			   Integer.toString(inDate.getMinutes()) + ":" +
			   Integer.toString(inDate.getSeconds());
		return(outDate);
*/

		SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
		String dateStr = fmt.format(inDate);

		return dateStr;


	}

	public Connection getConnection() throws SQLException
	{
		if (connect == null) openConnection();
		if (connect == null) {
			keep_connect_open = false;
			openConnection();
		}
		if (connect == null)
			throw new IllegalStateException("getConnection can't get a connection pointer");
		return(connect);
	}
}
