package tableDefinition;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.ListIterator;
import dataWarehousingTools.LogFile;


public class TableList extends LinkedList<TableElement> 
{
	private static final long serialVersionUID = 1L;

	public TableList
	(
		Connection connection, 
		String databaseProduct, 
		String databaseName, 
		String schemaName, 
		String outputDirectory,
		LogFile logFile
	)
	{
		DatabaseMetaData databaseMetaData = null;
		ResultSet tableNames = null;
		String query;
		Statement statement = null;
		ResultSet rowCount = null;
		String tableName;
		String[] tableTypes = {"TABLE"};
		TableElement tableElement;
		ListIterator<TableElement> iterator;
		
		
		try 
		{
			databaseMetaData = connection.getMetaData();
		} 
		catch (SQLException e) 
		{
			logFile.logMessage(e.toString());
		}	
		
		try 
		{
//			tableNames = databaseMetaData.getTables(null, schema, null, tableTypes);
			tableNames = databaseMetaData.getTables(databaseName, schemaName, null, tableTypes);
		} 
		catch (SQLException e) 
		{
			logFile.logMessage(e.toString());
		}
		
		try 
		{
			while (tableNames.next())
			{
				tableElement = new TableElement
				(
					databaseName,
					"",
					tableNames.getString("TABLE_SCHEM"),    // This is a gratuitous abbreviation of SCHEMA.  I use it because it is in the DatabaseMetadata class (as TABLE_SCHEM)
					tableNames.getString("TABLE_NAME"),
					tableNames.getString("TABLE_TYPE"),		// This is a rubbish name.  What does it mean? I use it because it is in the DatabaseMetadata class (as TABLE_TYPE)
					tableNames.getString("REMARKS")			// This is a rubbish name.  What does it mean? I use it because it is in the DatabaseMetadata class (as REMARKS)
				);
				this.add(tableElement);
			}
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		}

		for (iterator = this.listIterator(); iterator.hasNext();)
		{
			tableElement = (TableElement) iterator.next();
			tableName = new String(tableElement.getTableName());
			if (tableName.contains(" "))
				tableName = new String("\"" + tableName + "\"");
//			query = new String("select count(*) as row_count from " + databaseName + "." + schemaName + "." + tableName);
			query = new String("select count(*) as row_count from " + schemaName + "." + tableName);
			try 
			{
				statement = connection.createStatement();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
			try 
			{
				rowCount = statement.executeQuery(query);
				if (rowCount.next())
					tableElement.setRowCount(rowCount.getInt("row_count"));
			} 
			catch (SQLException e) 
			{
				logFile.logMessage("Failed to select from table " + schemaName + "." + tableName + ".  Probably a permission/ownership issue.");
			}
		}
	}
}