/*
 * Created on 22-Nov-2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package uk.ac.roe.wfau;

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

import net.alanmaxwell.sql.WSASQLRetrieverThread;

import org.apache.log4j.Logger;



/**
 * @author mar
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */


public class QueueRunner implements Runnable{
    static int runNumber=0;
    static int maxCounter=3; //3600;
    static int sleepInt=3;
  
    static Logger  logger = Logger.getLogger("wsa.simple");

    int id;
    private static synchronized int getNextRunnumber(){
        runNumber++;
        return runNumber;
    }
    private static synchronized void decrementRunnumber(){
        runNumber--;
    }
    public QueueRunner (int id) {
        this.id=id;
    }
    public void run() {
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;
        boolean more = true;
        String queryStr=null;
        int qID=0;
        int rowsHTML=WSASQLRetrieverThread.SQLROWS_DEFAULT;
        int rowsTotal=WSASQLRetrieverThread.ROWSWRITTEN_UPPERLIMIT;
        
        logger.info("running "+id);
        int counter=0;
        WSASQLRetrieverThread retrieverThread = null;
        Thread retRunner = null;
        String DBName=null;
        String IPAddress=null;
        String username=null;
        String fmt=null;
        String email=null;
        String dbUser=null;
        int timeout=WSASQLRetrieverThread.MAXTIMEOUT;
        try {
        while (counter < maxCounter && !QueueManager.isQStopped) {
        counter++;
        retrieverThread = null;
        retRunner = null;
        DBName=null;
        IPAddress=null;
        username=null;
        fmt=null;
        email=null;
        dbUser=null;
            logger.info("running "+id+" "+counter);
            String dburl=DatabaseURL.getDatabaseURL("ifa33p","userInterface","queuero","queueropw",true);
            conn=DriverManager.getConnection(dburl);
            stmt=conn.createStatement();
            try {
            rs=stmt.executeQuery("exec userInterface..spGetFromQ");
            if (rs.next()) {
                counter=0; // reset counter
                more=true;
                queryStr=rs.getString("querystr");
                qID=rs.getInt("qID");
                DBName=rs.getString("dbname");
                rowsHTML=rs.getInt("rowsHTML");
                IPAddress=rs.getString("IPAddress");
                username=rs.getString("username");
                fmt=rs.getString("fmt");
                timeout=rs.getInt("timeout");
                email=rs.getString("email");
                dbUser=rs.getString("dbUser");
                
                if (rowsHTML < 0)
                {
                  rowsHTML = 0;
                };
                
            } else {
                more=false;
            }
                conn.close();
                
                if (more) {
                dburl=DatabaseURL.getDatabaseURL("ifa33p",DBName,dbUser,dbUser+"pw",true);
                
                retrieverThread = new WSASQLRetrieverThread(dburl);
                
                retrieverThread.setDatabaseName(DBName);
                
                 retrieverThread.setOutputBaseDIR(
//                    "/home/6df/public_html/"
//    				dirName
                         "/home/mar/scratch/jakarta-tomcat-4.1.30/webapps/ssa/tmp/"
                  );
                  retrieverThread.setOutputBaseURL(
//                    "http://www-wfau.roe.ac.uk/6dFGS/"
//                       tmpWeb
                          "http://tekapo.roe.ac.uk:8080/ssa/tmp/"
                  );
                  retrieverThread.setOutputAppendage(
                    "tmp_sql/"
                  );
                
                logger.info("WSASQL,QLogin,"+username+","+IPAddress);
                logger.info("WSASQL,URL,"+dburl+","+IPAddress);
                logger.info("WSASQL,Query,"+queryStr.replaceAll("\n"," ").replaceAll("\r"," ")+","+IPAddress); 
                retrieverThread.setIPAddress(IPAddress);
                retrieverThread.setUser(username);
                retrieverThread.setSQLQuery(queryStr);
                retrieverThread.showSQL=true;
                retrieverThread.doCancelThread=true;
                retrieverThread.updateWebqueries=true;
                retrieverThread.setQID(qID);
                if (timeout > 0) {
                timeout = Math.min(timeout,WSASQLRetrieverThread.MAXTIMEOUT);
                retrieverThread.timeout=timeout;
                
                }
 
                retrieverThread.setRowsHTML(rowsHTML);
                retrieverThread.setDoRowTotal(true);
                retrieverThread.setOutputFormat(WSAHTMLSchema.getOutputFormat(fmt));
                retrieverThread.setOutputCompression(WSASQLRetrieverThread.COMPRESS_GZIP);
                retrieverThread.setEmailAddress(email);
    			retrieverThread.setMightBeBackground(true);
    			

                retRunner = new Thread(retrieverThread);
                Statement retrieverStmt=retrieverThread.setConnection();
                if (retrieverStmt != null){
                retRunner.start();
                }
                else {
                    logger.info("unable to start retRunner");
                }
                
                
                while (
                        (retRunner.isAlive()) && (retrieverThread.isQueryProcessing())
                      )
                {
    	             
                  try
                  {
                    Thread.sleep(2000);
                  }
                  catch (InterruptedException ie)
                  {
                    // Do nothing when interrupted...
                  }

                }
                retrieverStmt=null;
				retRunner = null;
				String resultsURL=retrieverThread.getResultsURL();
				logger.info(resultsURL);
        	    retrieverThread = null;
                
                
                logger.info("qId "+qID);
                QueueManager.setQIDStatus(qID,0);
                logger.info("setting qID statstu "+0);
                logger.info("qId status is "+QueueManager.getQIDStatus(qID));
                QueueManager.setQIDStatus(qID,1);
                logger.info("setting qID statstu "+1);
                logger.info("qId status is "+QueueManager.getQIDStatus(255));
                logger.info(id+" Query "+queryStr);
                
                }
 
                   
            }
            catch (SQLException se) {
                logger.info(se);
            }
            catch (Exception e) {
                logger.info(e);
            }
            
            
            conn.close();
            if (!more) {
            try {
                logger.info("waiting");
                Thread.sleep(sleepInt*1000);
            }
            catch (InterruptedException ie) {
                logger.info("interuptted");
            }
            }
            
            }   // end of while
        }
        catch (Exception e) {
            logger.info(e+" runner");
        }
        finally {
            if (conn != null) {
                try{    
            conn.close();
                }
                catch (SQLException se ) {       
                }
            }
            QueueManager.removeFromQ(id);
                
            logger.info("decrementing\n");
           // decrementRunnumber();
        }
    }

}
