package tableDefinition;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DatabaseEncoding 
{
	static String encoding;
	
	public DatabaseEncoding(Connection connection, String databaseProduct, String databaseName)
	{	
		Statement statement = null;
		ResultSet resultSet = null;
		
		if (databaseProduct.equals("PostgreSQL"))
		{
			try 
			{
				statement = connection.createStatement();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			} 
			
			try 
			{
				resultSet = statement.executeQuery
				(
					"select " +
					    "pg_encoding_to_char(encoding) as encoding_name " +
					"from pg_database " +
					"where "+
					    "lower(datname) = lower('" + databaseName + "')"
				);
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
			
			try 
			{
				if (resultSet.next())
				{
					encoding = new String(resultSet.getString("encoding_name"));
				}
				else
				{
    				encoding = new String("UNKNOWN");
				}
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
			
			try 
			{
				if (resultSet.next())
				{
					System.out.println("ERROR: More than one encoding specified for database: " + databaseName);
					encoding = new String("UNKNOWN");
				}
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		else if (databaseProduct.contentEquals("Microsoft SQL Server"))
		{
			// SELECT name, collation_name FROM sys.databases;  // gives results like:  Latin1_General_CI_AS [what use is that?]
			try 
			{
				statement = connection.createStatement();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			} 
			
			try 
			{
				resultSet = statement.executeQuery
				(
					"select " +
					    "collation_name as encoding_name " +
					"from " +
					    "sys.databases " +
					"where " +
					    "lower(name) = lower('" + databaseName + "')"
				);
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
			
			try 
			{
				if (resultSet.next())
				{
					encoding = new String(resultSet.getString("encoding_name"));
				}
				else
				{
    				encoding = new String("UNKNOWN");
				}
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
			
			try 
			{
				if (resultSet.next())
				{
					System.out.println("ERROR: More than one encoding specified for database: " + databaseName);
					encoding = new String("UNKNOWN");
				}
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		else
		{
			encoding = new String("UNKNOWN");
		}		
	}

	public static String getEncoding() 
	{
		return encoding;
	}
}
