package tableDefinition;

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

public class ColumnList extends LinkedList<ColumnElement>
{

	private static final long serialVersionUID = 1L;
	private ColumnElement columnElement;
	private DatabaseMetaData databaseMetaData;

	public ColumnList
	(
		String databaseProduct, 
		Connection connection, 
		String databaseName, 
		String schemaName,
		String tableName,
		LogFile logFile
	)
	{
		ResultSet tableColumns = null;
		int dataTypeCode;
		String dataTypeName = "";
		
		try 
		{
			databaseMetaData = connection.getMetaData();
		} 
		catch (SQLException e1) 
		{
			e1.printStackTrace();
		}

		try 
		{
			tableColumns = databaseMetaData.getColumns(databaseName, schemaName, tableName, null);
		} 
		catch (SQLException e1) 
		{
			e1.printStackTrace();
		}

		try 
		{
			while(tableColumns.next())
			{
				columnElement = new ColumnElement();
				columnElement.setColumnNumber(tableColumns.getInt("ORDINAL_POSITION"));
				columnElement.setColumnName(tableColumns.getString("COLUMN_NAME"));
				columnElement.setDataLength(tableColumns.getInt("COLUMN_SIZE"));
				columnElement.setPrecisionIsNull(tableColumns.wasNull());
				columnElement.setScale(tableColumns.getInt("DECIMAL_DIGITS"));
				columnElement.setScaleIsNull(tableColumns.wasNull());
				columnElement.setNullable(tableColumns.getString("IS_NULLABLE").equals("YES"));

				dataTypeCode = tableColumns.getInt("DATA_TYPE");

				dataTypeName = JDBCType.valueOf(dataTypeCode).getName();

				columnElement.setDataType(dataTypeName);

				this.add(columnElement);
								
				/* Test for Oracle naked numbers */
				if (dataTypeName.equalsIgnoreCase("NUMBER"))
				{
					logFile.logMessage
					(
						"Column: " +
						columnElement.getColumnName() +
						"  Number data type: " +
						"precision = " +
						columnElement.getDataLength() +
						" scale = " +
						columnElement.getScale()
					);
				}
			}
		} 
		catch (SQLException e1) 
		{
			e1.printStackTrace();
		}

		try 
		{
			tableColumns.close();
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		
		if (this.isEmpty())
		{
			System.out.println("No columns to create table. Check database name, schema name and table name for the specified connection.");
			System.exit(1);
		}
	}
}
