package dqMonitor;

import java.sql.Connection;
//import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Date;
import java.util.LinkedList;



public class DQMeasureList extends LinkedList<DQMeasureElement>
{
    private static final long serialVersionUID = 1L;
    private ResultSet measureResultSet;
    private Statement selectMeasureStatement;
    
    public DQMeasureList(int connectionId, ConnectionList connectionList, String query, LogFile logFile)
    {
        Connection       connection;
//        DatabaseMetaData databaseMetaData;
//        String           databaseProductName = null;
        boolean          measureFound = false;
        DQMeasureElement dqMeasureElement;
        int              dqFactorId;
        Date             sqlDate;
        double           value;


        connection = connectionList.getConnection(connectionId);
//        try 
//        {
//            databaseMetaData = connection.getMetaData();
//            databaseProductName = new String(databaseMetaData.getDatabaseProductName());
//        } 
//        catch (SQLException e) 
//        {
//            logFile.logMessage(e.toString());
//        }
               
        try
        {
            selectMeasureStatement = connection.createStatement();
        }
        catch(SQLException sqle)
        {
            logFile.logMessage("Failed to create statement for query " + query + ".  " + sqle.toString());
        }

        try
        {
            measureResultSet = selectMeasureStatement.executeQuery(query);
            measureFound = true;
        }
        catch(SQLException e)
        {
            logFile.logMessage("Failed to execute query " + query + ".  " + e.toString());
            measureFound = false;
        }
        
        
        while(measureFound)
        {
            try
            {
                measureFound = measureResultSet.next();
            } 
            catch (SQLException e)
            {
                logFile.logMessage("Failed to get next from query " + query + ".  " + e.toString());
            }
            
            if (measureFound)
            {
                try
                {
                    dqFactorId = measureResultSet.getInt("factor_id");
                    sqlDate = measureResultSet.getDate("run_date");
                    value = measureResultSet.getDouble("value");
                    dqMeasureElement = new DQMeasureElement(dqFactorId, sqlDate, value);
                    this.add(dqMeasureElement);
                } 
                catch (SQLException e1)
                {
                    logFile.logMessage("Failed to get values from query " + query + ".  " + e1.toString());
                }
                catch (NullPointerException e2)
                {
                    logFile.logMessage("Null values returned from query " + query + ".  " + e2.toString());
                }
            }
        }
        try 
        {
            selectMeasureStatement.close();
        } 
        catch (SQLException e) 
        {
            logFile.logMessage("Failed to close statement for query " + query + ".  " + e.toString());
        }
    }
}
