#!/usr/bin/perl
#
# sw_app-index -- Update values for sw_app indexing
# Copyright 2014 University of Tennessee
# Parts copyright 2006, 2007 Ohio Supercomputer Center
#
# License:  GNU GPL v2; see ../COPYING for details.
# Revision info:
# $HeadURL$
# $Revision$
# $Date$
#
# Usage:  sw_app-index [-h system] [-s dbhost] [-d dbname] [-t dbtable]
#                      [-u dbuser] [-p dbpasswd] [-F|-T]
# -F -- full re-index (off by default, use with caution)
# -T -- syntax check

use strict;
use POSIX;
use DBI;

# functions
sub software_list()
{
  my @list=(
	    "3dcavity",
	    "3dh",
            "3n_bound",
	    "55_x",
	    "a_out",
	    "abaqus",
            "ABCsampler",
	    "abinit",
	    "accorrsf",
	    "aces2",
	    "aces3",
	    "activeharmony",
	    "adcprep",
	    "adda",
	    "adf",
	    "aflow",
	    "afma",
	    "agk",
	    "aims",
	    "airebo",
	    "AliEn",
	    "amber",
            "amdat",
	    "amg2006",
	    "AnalyzePathP",
	    "anolis",
	    "ansys",
	    "anton",
            "AraSim",
	    "armcibench",
	    "arps",
	    "arts",
	    "ash",
	    "astrobear",
            "atat",
	    "athena",
	    "atmc",
	    "ausam",
	    "autodock",
	    "awm",
	    "bam",
	    "beast",
            "beopest",
	    "berkeleygw",
	    "bgw",
	    "bicg_solver",
	    "bigdft",
	    "blat",
	    "bolztran",
	    "boots",
            "bowtie",
	    "brams-opt",
	    "bugget",
	    "cactus",
            "cafemol",
	    "calc1",
	    "calc_group_stats",
	    "cam",
	    "cando",
	    "casino",
	    "castro3d",
	    "cbl",
	    "ccsm",
	    "cctm",
	    "cdns",
	    "cdo",
	    "cdp",
	    "cfd++",
            "cfd_postprocess",
	    "cfl3d",
	    "changa",
	    "charmm",
	    "charles",
	    "chemkin",
	    "chemshell",
	    "chg",
	    "chimera",
	    "chroma",
	    "cilk",
	    "clover_inverter",
	    "cluster",
	    "clustalo",
	    "clustalw",
	    "cm1",
	    "coarsen",
	    "comm-bench",
	    "compaware",
	    "comsol",
	    "condor",
	    "consensus",
	    "convectionimr",
	    "cp2k",
	    "cpmd",
	    "cql3d",
	    "crime",
	    "crystal",
	    "css2sld",
	    "csurfs",
	    "cube",
	    "cudac",
	    "cvm",
	    "da_update_bc",
	    "dalexec",
	    "dam",
	    "darshan",
	    "dasquad",
            "decomp",
	    #"decypher",
	    "delphi",
	    "delta5d",
	    "desmond",
	    "dfdx",
	    "dghbc",
            "dgtd",
	    "dhybrid",
            "dirac-pilot",
	    "dissens",
	    "distuf",
	    "dlmonte",
	    "dlpoly",
	    "dns2d",
	    "dock",
	    "dolt",
	    "doublebeta",
	    "dplasma",
	    "drone",
	    "dtms",
	    "dv72",
	    "dws_mpi",
	    "eddy",
	    "eden",
	    "eigen.x",
	    "elk",
	    "energyplus",
	    "enkf",
	    "ens4dvar",
	    "enzo",
	    "epfem",
	    "episimdemics",
	    "esmf",
	    "esp",
	    "eulacc",
	    "ex_e",
	    "examl",
	    "f-plane",
	    "falkon",
            "fastqc",
	    "fd3d",
	    "fdl3di",
	    "featureComputation",
	    "fedvr",
	    "fidap",
            "firefly",
            "fit_exe",
	    "flash2",
	    "flash4",
	    "flotran",
	    "flowsolver",
	    "flow3d",
	    "fluent",
	    "foam",
	    "force_free",
	    "foxexe",
            "fsc25221",
	    "fsweep",
	    "ftb",
	    "ftes",
	    "gaac",
            "gabe",
	    "gadget",
	    "gamess",
	    "garli",
	    "gaussian",
	    "gc",
	    "gdl",
            "gemc_x",
	    "gen.v4",
	    "geodict",
	    "genlatmu",
	    "geosgcm",
	    "glast",
            "gop2pc",
	    "gpaw",
	    "GreenSolver",
	    "grads",
	    "grib",
	    "grbplot",
	    "grmhd",
	    "gromacs",
	    "gromov",
	    "grouper",
	    "gsi.exe",
	    "gtc",
	    "gvksx",
	    "gyro",
	    "h2mol",
	    "h3d",
	    "hadoop",
	    "hall3d",
	    "halo",
	    "harness",
	    "harris",
	    "hchbm",
	    "hd",
	    "hd_nonuma",
	    "hdfsubdomain",
	    "hf",
	    "hf2",
	    "hfb",
	    "hfodd",
	    "hmc",
	    "hmmer",
	    "homme",
	    "hoomd",
	    "hpcc",
	    "hpl",
	    "hsi",
	    "hsphere",
	    "hwtpost",
	    "hybrid-gsi",
	    "hydro",
	    "hy3s",
            "ice",
	    "idl",
	    "ifs",
	    "imb",
            "imc",
	    "inca",
	    "intestine3d",
	    "ior",
	    "iplmcfd",
	    "isodata",
	    "jaguar",
	    "jet_02",
            "jetxb",
	    "jobgrd",
	    "josephson",
	    "jrmc",
	    "k2r2",
	    "ker_filter_par",
	    "kmeans",
	    "lammps",
	    "lautrec",
	    "les_mpi",
	    "les_spike",
	    "lesmpi",
	    "lfm",
	    "liso",
	    "lkh",
	    "lmf",
            "lobster",
	    "lodn",
	    "lsdyna",
	    "lsms",
            "lsp",
	    "lu_lesh",
	    "m2md",
	    "madness",
	    "maestro",
            "makethemcross",
	    "masa",
	    "mathematica",
	    "matlab",
	    "mcnp",
	    "mcrothers",
	    "mcsim",
	    "mctas",
	    "md_ab21",
	    "md_xx",
	    "mddriver",
	    "mdsim",
            "meamzilla",
	    "measurements",
	    "meep",
	    "meta",
            "metgrid",
	    "mfc",
	    "mhd_1",
	    "mhd3d",
	    "mhdam",
	    "milc",
	    "mitgcmuv",
	    "mkelly",
	    "mkl_mm",
	    "mlane",
	    "mm5",
	    "molaf3di",
	    "molcas",
	    "moldife",
	    "moldive",
	    "molpro",
	    "mothur",
	    "mpcugles",
	    "mpi_dgels",
	    "mpi_dgesv",
	    "mpi_dpos",
	    "mpi_helium",
	    "mpi-multi",
	    "mpiasm",
	    "mpiblast",
	    "mrbayes",
	    "mrobb6dipzz",
	    "mtrsassi",
	    "music",
            "mustem",
	    "mykim9dgt",
	    "myq",
            "mysql",
	    #"nag",
	    "namd",
	    "nb",
	    "ncbi",
	    "ncl",
	    "nek5000",
	    "nektar",
	    "nemd",
	    "nested",
	    "newseriesrun",
	    "nga_cfb",
	    "nicam",
	    "nmm3d",
	    "npb",
	    "npemd",
	    "nplqcd",
            "nonpareil",
	    "nsbsintheat",
	    "nscale",
	    "nsmpicuf",
	    "ntsolve",
	    "nu-segment",
	    "nwchem",
	    "ocore",
	    "octave",
	    "omega",
	    "omen",
	    "omgred",
	    "onepartm",
	    #"openeye",
	    "opt_exe",
	    "optics",
            "orca",
            "os2z",
	    "overlap",
	    "p3dfft",
	    "p3ripple",
	    "p4extract",
	    "padc",
	    "parallelEAM",
	    "parallelqp",
	    #"param",
	    "paratec",
	    "paraview",
	    "parflow",
	    "parody",
	    "parsec",
	    "partadv",
	    "paup",
	    "pbar",
	    "pbohmd",
	    "pcg",
	    "pencil",
	    "perseus",
	    "phasta",
	    "phits",
	    "phonon",
            "phraider",
	    "pic-star",
            "picard",
            "picrun",
	    "pimd",
	    "pkdgrav",
	    "pluto",
	    "pmcl3d",
	    "polarpigs",
	    "polly",
	    "polmc",
	    "pop",
	    "preps",
	    "preqx",
	    "prog_ccm_sph",
	    "prog_hf",
	    "prop_rotation",
	    "propagators",
	    "proto2",
	    "pse",
            "psi4",
	    "psolve",
	    "pstg",
	    "pulsar",
	    "pwscf",
	    "python",
	    "qb",
	    "qchem",
	    "qmc",
	    "qrpacc",
	    "qwalk",
	    "R",
	    "r_out",
	    "radhyd",
	    "raxml",
	    "readall_parallel",
            "real_exe",
	    "reduce",
	    "reflect",
	    "res",
	    "rho_pion_corre",
	    "root",
	    "rosenbrock",
	    "rosetta",
	    "rotbouss",
	    "roth",
	    "rtp",
	    "run_1kmd",
	    "run_all_de_novo",
	    "run_flexible",
	    "run_hyd",
	    "run_im",
	    "run_lprlx",
	    "run_xyzvort",
	    "run1s-5th-NL",
	    "s-param",
	    "s3d",
	    #"sable",
	    "sam_adv_um5",
            "samtools",
	    "sas",
	    "sauron",
	    "scalapack",
            "scattering",
	    "sddt",
	    "seissol",
	    "sfeles",
	    "sgf",
	    "shadowfax",
	    "sickle",
	    "siesta",
	    "sigma",
	    "simfactory",
	    "simpleio",
            "simu_pow",
	    "sleuth",
	    "sms",
	    "sne3d",
	    "SOAPdenovo",
	    "sord",
	    "sovereign",
            "spark",
            "sparkfuse",
            "spce",
	    "spdcp",
	    "srad",
	    "sses",
	    "stagyy",
	    "starcd",
	    "starccm",
	    "stata",
	    "stationaryAccretionShock3D",
	    "sus",
	    "swarthmore",
	    "sweqx",
	    "swh1b",
	    "swift",
	    "tacoma",
	    "tantalus",
	    "tbms",
	    "tdcc2d",
	    "tdse",
	    "terachem",
	    "testpio",
	    "tetradpost",
	    "tfe",
	    "thickdisk",
	    "tmdmpi",
	    "tornado_friction",
	    "track",
	    "translate",
	    "trinityrnaseq",
	    "tristan-mp3d",
	    "tsc",
	    "ttmmdmpi",
	    "turbo",
	    "turbomole",
	    "two_phase",
	    "ukh2d",
	    "upc",
	    "vasp",
	    "velvet",
	    "vbc",
	    "vdac",
	    "vecadd",
	    "vhone",
	    "vida",
            "ViennaRNA",
	    "visit",
	    "vli",
	    "vorpal",
	    "vmd",
            "vnc",
	    "vpic",
	    "walksat",
	    "wave_packet",
            "webmo",
	    "wmc",
	    "wrf",
	    "xgc",
	    "xmfdn",
	    "xplot3d",
	    "xtest",
	    "xvicar3d",
	    "xx",
	    "yt",
	    "zeus",
	    "zk3",
	    "zNtoM"
	   );
  
  return @list;
}

sub software_match_list()
{
  my %pkgmatch;

  # default to "( script LIKE '%pkgname%' OR ( software IS NOT NULL AND software LIKE 'pkgname%' ) )"
  foreach my $pkg ( software_list() )
    {
      $pkgmatch{$pkg}="( script LIKE '%".$pkg."%' OR ( software IS NOT NULL AND software LIKE '%".$pkg."%' ) )";
#      $pkgmatch{$pkg}="( script LIKE '%".$pkg."%' )";
    }

  # exceptions
  # REGEXP match is ***MUCH*** slower than regular LIKE matching
  # in MySQL, so don't use REGEXP unless you really need it.
  $pkgmatch{'3dh'} = "script LIKE '%./3dh%'";
  $pkgmatch{'55_x'} = "script LIKE '%55.x%'";
  $pkgmatch{'aims'} = "( script LIKE '%aims%' AND NOT ( script LIKE '%aims/vasp%' ) )";
  $pkgmatch{'a_out'} = "( script LIKE '%a.out %' OR script LIKE '%a.out\n%' )";
  $pkgmatch{'abinit'} = "( script LIKE '%abinit%' OR script LIKE '%abinis%' OR script LIKE '%abinip%' )";
  $pkgmatch{'aces2'} = "script LIKE '%xaces2%'";
  $pkgmatch{'adda'} = "( script LIKE '%adda%' AND NOT ( script LIKE '%FindRadDat%' ) )";
  $pkgmatch{'adf'} = "( script LIKE '%adf%' AND NOT ( script LIKE '%radfile%' ) AND NOT ( script LIKE '%adfs%' ) )";
  $pkgmatch{'AliEn'} = "( script LIKE '%aliroot%' OR script LIKE '%agent.startup%' )";
  $pkgmatch{'amdat'} = "script LIKE '%/AMDAT %'";
  $pkgmatch{'arts'} = "( script LIKE '%arts%' AND script NOT LIKE '%starts%' )";
  $pkgmatch{'ash'} = "( script LIKE '%ash_1%' OR script LIKE '%ash_2%' OR script LIKE '%ash_fd%' )";
  $pkgmatch{'athena'} = "script LIKE '%/athena %'";
  $pkgmatch{'blat'} = "script LIKE '%blat %'";
  $pkgmatch{'boltztran'} = "(script LIKE '%boltzpar%')";
  $pkgmatch{'boots'} = "( script LIKE '%boots%' AND NOT ( script LIKE '%bootstrap%' ) )";
  $pkgmatch{'cbl'} = "( script LIKE '% cbl%' OR script LIKE '%pcbl%' OR script LIKE '%biolib%' )";
  $pkgmatch{'charles'} = "script like '%charles.exe%'";
  $pkgmatch{'chemshell'} = "script LIKE '%chemsh%'";
  $pkgmatch{'chg'} = "script LIKE '%/chg %'";
  $pkgmatch{'cluster'} = "script LIKE '%/cluster %'";
  $pkgmatch{'crystal'} = "script LIKE '%Pcrystal%'";
  $pkgmatch{'cube'} = "( script LIKE '%/cube %' OR script LIKE '%/intelcube %' )";
  $pkgmatch{'dam'} = "script LIKE '%/dam %'";
  $pkgmatch{'decomp'} = "script LIKE '%/decomp %'";
  $pkgmatch{'decypher'} = "script REGEXP '(decypher|dc_(target|make|blast|phrap)|TimeLogic)'";
  $pkgmatch{'desmond'} = "( script LIKE '%desmond%' AND NOT ( username LIKE '%desmond%' ) )";
  $pkgmatch{'dipole'} = "script LIKE '%.cxx.op%'";
  $pkgmatch{'dissens'} = "script LIKE '%dissens.x%'";
  $pkgmatch{'dns2d'} = "( script LIKE '%DNS2d.x%' OR script LIKE '%DNS2d_%.x%' OR script LIKE '%code2.x%' OR script LIKE '%spcal2d.x%' )";
  $pkgmatch{'dock'} = "( script LIKE '%dock5%' OR script LIKE '%dock6%' OR script LIKE '%sphgen%' OR script LIKE '%mopac%' )";
  $pkgmatch{'esp'} = "script LIKE '%/esp %'";
  $pkgmatch{'ex_e'} = "script LIKE '%ex.e%'";
  $pkgmatch{'fit_exe'} = "script LIKE '%fit.exe%'";
  $pkgmatch{'fluent'} = "( script LIKE '%fluent%' OR ( software IS NOT NULL AND software LIKE '%fluent%' ) )";
  $pkgmatch{'fsweep'} = "( script LIKE '%fsweep.exe%' OR script LIKE '%fsweep2.exe%' )";
  $pkgmatch{'gabe'} = "script LIKE '%./gabe %'";
  $pkgmatch{'gamess'} = "( script LIKE '%gamess%' OR script LIKE '%rungms%' OR script LIKE '%rungmx%' )";
  $pkgmatch{'gaussian'} = "( script LIKE '%g98%' OR script LIKE '%g03%' OR script LIKE '%g09%' )";
  $pkgmatch{'gc'} = "script LIKE '%kland_gc%'";
  $pkgmatch{'gemc_x'} = "script LIKE '%gemc.x%'";
  $pkgmatch{'glast'} = "( script LIKE '%glast%' OR script LIKE '%gp run%' )";
  $pkgmatch{'harness'} = "script LIKE '%test_harness_driver.py%'";
  $pkgmatch{'harris'} = "script LIKE '%harris.cxx.op%'";
  $pkgmatch{'hd'} = "script LIKE '%/HD %'";
  $pkgmatch{'hf'} = "script LIKE '%hf/hf%'";
  $pkgmatch{'hf2'} = "script LIKE '%/hf2%'";
  $pkgmatch{'hmmer'} = "( script LIKE '%hmmer%' OR script LIKE '%hmmp%' )";
  $pkgmatch{'hpl'} = "script LIKE '%xhpl%'";
  $pkgmatch{'hydro'} = "script LIKE '%./hydro %'";
  $pkgmatch{'idl'}="( script LIKE '%module load idl%' OR script LIKE '%module add idl%' OR script LIKE '%\nidl%' OR ( software IS NOT NULL AND software LIKE '%idl%' ) )";
  $pkgmatch{'hsi'} = "( script LIKE '%hsi%' OR script LIKE '%htar%' OR queue='hpss' )";
  $pkgmatch{'ice'} = "script LIKE '%IceModule%'";
  $pkgmatch{'imb'} = "script LIKE '%IMB-%'";
  $pkgmatch{'imc'} = "script LIKE '%/imc.x%'";
  $pkgmatch{'lammps'} = "( script LIKE '%lammps%' OR script LIKE '% lmp_%' OR script LIKE '%/lmp_%' )";
  $pkgmatch{'liso'} = "script LIKE '%/liso %'";
  $pkgmatch{'lsdyna'} = "( script LIKE '%lsdyna%' OR script LIKE '%ls-dyna%' OR script LIKE '%mpp-dyna%' OR script LIKE '%mpp971%' OR ( software IS NOT NULL AND software LIKE '%lsdyna%' ) )";
  $pkgmatch{'lsp'} = "script LIKE '%/lsp.%'";
  $pkgmatch{'madness'} = "( script LIKE '%m-a-d-n-e-s-s%' OR script LIKE '%slda%' )";
  $pkgmatch{'md_xx'} = "script LIKE '%md.xx%'";
  $pkgmatch{'meta'} = "( script LIKE '%anti.meta%' OR script LIKE '%para.meta%' OR script LIKE '%xray.meta%' )";
  $pkgmatch{'mhd_1'} = "( script LIKE '%mhd_1%' OR script LIKE '%mhd_2%' OR script LIKE '%mhd_3%' OR script LIKE '%mhd_4%' OR script LIKE '%rmhd%' OR script LIKE '% mhd %' )";
  $pkgmatch{'mhd_vec'} = "( script LIKE '%mhd_vec%' OR script LIKE '%mhd_pvec%' )";
  $pkgmatch{'mm5'} = "( script LIKE '%mm5%' AND NOT SCRIPT LIKE '%womm5%' )";
  $pkgmatch{'mrbayes'} = "( script LIKE '%mrbayes%' OR script LIKE '%mb-parallel%' )";
  $pkgmatch{'nb'} = "script LIKE '%NB/CODES%'";
  $pkgmatch{'ncbi'} = "( script LIKE '%ncbi%' OR script LIKE '%blastall%' OR script LIKE '%blastpgp%' OR script LIKE '%fastacmd%' OR script LIKE '%formatdb%' OR
 script LIKE '%rpsblast%' OR script LIKE '%seqtest%' )";
  $pkgmatch{'nga_fb'} = "( script LIKE '%nga_fb%' OR script LIKE '%nga_cfb%' )";
  $pkgmatch{'omega'} = "script LIKE '%omega.exe%'";
  $pkgmatch{'openeye'} = "( script LIKE '%babel3%' OR script LIKE '%checkcff%' OR script LIKE '%chunker%' OR script LIKE '%fred2%' OR script LIKE '%fredPA%' OR script LIKE '%ligand_info%' OR script LIKE '%makefraglib%' OR script LIKE '%makerocsdb%' OR script LIKE '%nam2mol%' OR script LIKE '%omega2%' OR script LIKE '%szybki%' )";
  $pkgmatch{'opt_exe'} = "( script LIKE '%opt_exe%' OR script LIKE '%scriptLaunchAll%' )";
  $pkgmatch{'os2z'} = "( script LIKE '%/oS2x_%' OR script LIKE '%/oS2z_%' )";
  $pkgmatch{'paraview'} = "( script LIKE '%paraview%' OR script LIKE '%pvserver%' )";
  $pkgmatch{'pse'} = "( script LIKE '%/PSE\n' OR script LIKE '%/PSE2\n' )";
  $pkgmatch{'psi4'} = "( script LIKE '%/psi4 %' OR script LIKE '%\npsi4%' )";
  $pkgmatch{'pwscf'} = "( script LIKE '%pwscf%' OR script LIKE '%/pw.x %' OR script LIKE '%/ph.x %' )";
  $pkgmatch{'r_out'} = "( script LIKE '%/r.out %' OR script LIKE '%/r.out\n%' )";
  $pkgmatch{'radhyd'} = "( script LIKE '%radhyd%' OR script LIKE '%rhd_hyb%' OR script LIKE '%orion2%' )";
  $pkgmatch{'real_exe'} = "script LIKE '%real.exe%'";
  $pkgmatch{'reduce'} = "( script LIKE '%reduce_1%' OR script LIKE '%reduce_eta%' )";
  $pkgmatch{'reflect'} = "script LIKE '%/reflect\n%'";
  $pkgmatch{'root'} = "script LIKE '%\nroot -q%'";
  $pkgmatch{'rosetta'} = "( script LIKE '%rosetta.%' OR script LIKE '%/rr %' )";
  $pkgmatch{'roth'} = "script LIKE '%/ROTH%'";
  $pkgmatch{'rtp'} = "( script LIKE '%rtp%' AND NOT ( script like '%RestartP%' ) AND NOT ( script LIKE '%addpertpath%' ) )";
  $pkgmatch{'sable'} = "( script LIKE '%sable%' AND script NOT LIKE '%DISABLE%' )";
  $pkgmatch{'sas'} = "( script LIKE '%\nsas%' OR ( software IS NOT NULL AND software LIKE '%sas%' ) OR queue  LIKE '%sas%' )";
  $pkgmatch{'scattering'} = "script LIKE '%/scattering %'";
  $pkgmatch{'simu_pow'} = "( script LIKE '%simu_pow%' OR script LIKE '%simu_thres%' )";
  $pkgmatch{'spark'} = "script LIKE '%spark-submit%'";
  $pkgmatch{'tbms'} = "( script LIKE '%tbms%dvm%' OR script LIKE '%distr%dvm%' OR script LIKE '%jac%dvm%' OR script LIKE '%mt%dvm%' )";
  $pkgmatch{'track'} = "script LIKE '%TRACKdir%'";
  $pkgmatch{'turbo'} = "script LIKE '%pturbo.x%'";
  $pkgmatch{'upc'} = "script LIKE '%upcrun%'";
  $pkgmatch{'vasp'} = "script LIKE '%vasp%'";
  $pkgmatch{'visit'} = "( script LIKE '%visit%' AND script NOT LIKE '%revisit%' )";
  $pkgmatch{'vnc'} = "script LIKE '%vncserver%'";
  $pkgmatch{'vpic'} = "( script LIKE '%npic%' OR script LIKE '%open.cxx.op%' )";
  $pkgmatch{'xtest'} = "script LIKE '%/xtest%'";
  $pkgmatch{'xx'} = "script LIKE '%./xx\n%'";
  $pkgmatch{'zeus'} = "( script LIKE '%/zeus%' OR script LIKE '%/pglobal%' )";
  $pkgmatch{'zNtoM'} = "( script LIKE '%z1to3%' OR script LIKE '%z4to6%' OR script LIKE '%z7to9%' OR script LIKE '%z10to12%' OR script LIKE '%z13to15%' )";

# package matches with dependencies on other package matches
  $pkgmatch{'R'} = "( ( script LIKE '%\nR %' OR script LIKE '%Rscript %' ) AND NOT ( ".$pkgmatch{'gaussian'}." ) AND NOT ( ".$pkgmatch{'adf'}." ) )";
  $pkgmatch{'agk'} = "( script LIKE '%agk%' AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'mhd_1'}." ) )";
  $pkgmatch{'amber'} = "( ( script LIKE '%amber%' OR script LIKE '%sander%' OR script LIKE '%pmemd%' OR script LIKE '%sviol%' OR script LIKE '%SingleJob%' OR script LIKE '%MINJob%' OR script LIKE '%run_md_mpi.csh%' ) AND NOT ( ".$pkgmatch{'cctm'}." ) AND NOT ( ".$pkgmatch{'cvm'}." ) AND NOT ( ".$pkgmatch{'idl'}." ) AND NOT ( ".$pkgmatch{'qmc'}." ) AND NOT ( ".$pkgmatch{'sigma'}." ) AND NOT ( ".$pkgmatch{'tantalus'}." ) AND NOT ( ".$pkgmatch{'tfe'}." ) )";
  $pkgmatch{'arps'} = "( script LIKE '%arps%' AND NOT ( ".$pkgmatch{'adf'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'matlab'}." ) )";
  $pkgmatch{'bugget'} = "( script LIKE '%bugget%' AND NOT ( ".$pkgmatch{'halo'}." ) AND NOT ( ".$pkgmatch{'simpleio'}." ) )";
  $pkgmatch{'cactus'} = "( script LIKE '%cactus%' AND NOT ( ".$pkgmatch{'cdo'}." ) AND NOT ( ".$pkgmatch{'simfactory'}." ) )";
  $pkgmatch{'cam'} = "( script LIKE '%cam%' AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'grads'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) )";
  $pkgmatch{'ccsm'} = "( ( script LIKE '%ccsm%' OR script LIKE '%cpl%csim%clm%pop%cam%' ) AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'mm5'}." ) AND NOT ( ".$pkgmatch{'swift'}." ) )";
  $pkgmatch{'charmm'} = "( script LIKE '%charmm%' AND NOT ( ".$pkgmatch{'chemshell'}." ) )";
  $pkgmatch{'cpmd'} = "( script LIKE '%cpmd%' AND NOT ( ".$pkgmatch{'a_out'}." ) AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'inca'}." ) AND NOT ( ".$pkgmatch{'vasp'}." ) )";
  $pkgmatch{'cvm'} = "( script LIKE '%cvm%' AND NOT ( ".$pkgmatch{'cpmd'}." ) AND NOT ( ".$pkgmatch{'psolve'}." ) )";
  $pkgmatch{'eden'} = "( script LIKE '%eden%' AND NOT ( ".$pkgmatch{'matlab'}." ) )";
  $pkgmatch{'enzo'} = "( script LIKE '%enzo%' AND NOT ( ".$pkgmatch{'rtp'}." ) )";
  $pkgmatch{'f-plane'} = "( script LIKE '%f-plane%' AND NOT ( ".$pkgmatch{'hsi'}." ) )";
  $pkgmatch{'foam'} = "( script LIKE '%foam%' AND NOT ( ".$pkgmatch{'lsdyna'}." ) )";
  $pkgmatch{'gadget'} = "( script LIKE '%gadget%' AND NOT ( ".$pkgmatch{'hsi'}." ) )";
  $pkgmatch{'gdl'} = "( script LIKE '%gdl%' AND NOT ( ".$pkgmatch{'rotbouss'}." ) )";
  $pkgmatch{'grib'} = "( script LIKE '%grib%' AND NOT ( ".$pkgmatch{'cdo'}." ) AND NOT ( ".$pkgmatch{'mm5'}." ) AND NOT ( ".$pkgmatch{'sgf'}." ) AND NOT ( ".$pkgmatch{'sigma'}." ) )";
  $pkgmatch{'gromacs'} = "( ( script LIKE '%gromacs%' OR script LIKE '%grompp%' OR script LIKE '%mdrun%' OR script LIKE '%rgmx%' ) AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'cpmd'}." ) AND NOT ( ".$pkgmatch{'sigma'}." ) AND NOT ( ".$pkgmatch{'tantalus'}." ) )";
  $pkgmatch{'gtc'} = "( ( script LIKE '%gtc%' OR script LIKE '%gts%' ) AND NOT ( ".$pkgmatch{'cctm'}." ) AND NOT ( ".$pkgmatch{'pmcl3d'}." ) )";
  $pkgmatch{'halo'} = "( script LIKE '%halo%' AND NOT ( ".$pkgmatch{'enzo'}." ) AND NOT ( ".$pkgmatch{'gadget'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'simpleio'}." ) AND NOT ( ".$pkgmatch{'yt'}." ) )";
  $pkgmatch{'hfb'} = "( script LIKE '%hfb%' AND NOT ( ".$pkgmatch{'vbc'}." ) )";
  $pkgmatch{'hfodd'} = "( script LIKE '%hfodd%' AND NOT ( ".$pkgmatch{'cdo'}." ) )";
  $pkgmatch{'hmc'} = "( script LIKE '%hmc%' AND NOT ( ".$pkgmatch{'chroma'}." ) AND NOT ( ".$pkgmatch{'gadget'}." ) AND NOT ( ".$pkgmatch{'nplqcd'}." ) AND NOT ( ".$pkgmatch{'tantalus'}." ) AND NOT ( ".$pkgmatch{'terachem'}." ) )";
  $pkgmatch{'hsphere'} = "( script LIKE '%hsphere%' AND NOT ( ".$pkgmatch{'lfm'}." ) )";
  $pkgmatch{'hy3s'} = "( ( script LIKE '%SSA%' OR script LIKE '%HyJCMSS-%' ) AND NOT ( ".$pkgmatch{'arps'}." ) AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'bugget'}." ) AND NOT ( ".$pkgmatch{'cactus'}." ) AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'ccsm'}." ) AND NOT ( ".$pkgmatch{'cdo'}." ) AND NOT ( ".$pkgmatch{'charmm'}." ) AND NOT ( ".$pkgmatch{'energyplus'}." ) AND NOT ( ".$pkgmatch{'enzo'}." ) AND NOT ( ".$pkgmatch{'grmhd'}." ) AND NOT ( ".$pkgmatch{'halo'}." ) AND NOT ( ".$pkgmatch{'hchbm'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'milc'}." ) AND NOT ( ".$pkgmatch{'ncl'}." ) AND NOT ( ".$pkgmatch{'nwchem'}." ) AND NOT ( ".$pkgmatch{'simpleio'}." ) AND NOT ( ".$pkgmatch{'sses'}." )  AND NOT ( ".$pkgmatch{'tfe'}." ) )";
  $pkgmatch{'ifs'} = "( script LIKE '%ifsMASTER%' AND NOT ( ".$pkgmatch{'cdp'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) )";
  $pkgmatch{'inca'} = "( script LIKE '%inca%' AND NOT ( ".$pkgmatch{'vasp'}." ) )";
  $pkgmatch{'ior'} = "( script LIKE '%ior%' AND NOT ( username LIKE '%ior%' ) AND NOT ( script LIKE '%prior%' ) AND NOT ( ".$pkgmatch{'a_out'}." ) AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'lammps'}." ) AND NOT ( ".$pkgmatch{'swift'}." ) )";
  $pkgmatch{'meep'} = "( script LIKE '%meep%' AND NOT ( ".$pkgmatch{'sigma'}." ) )";
  $pkgmatch{'milc'} = "( ( script LIKE '%milc%' OR script LIKE '%su3_%' OR script LIKE '%switch%.csh%' ) AND NOT ( ".$pkgmatch{'nicam'}." ) AND NOT ( ".$pkgmatch{'hmc'}." ) )";
  $pkgmatch{'measurements'} = " ( script LIKE '%measurements%' ) AND NOT ( ".$pkgmatch{'milc'}." )";
  $pkgmatch{'nag'} = "( script LIKE '%nag%' AND NOT ( ".$pkgmatch{'cctm'}." ) AND NOT ( ".$pkgmatch{'mpi_helium'}." ) )";
  $pkgmatch{'namd'} = "( ( script LIKE '%namd%' OR script LIKE '%md.sh%' OR SCRIPT LIKE '%rem_mono_npt4.sh%') AND NOT ( ".$pkgmatch{'a_out'}." ) AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'cactus'}." ) AND NOT ( ".$pkgmatch{'charmm'}." ) AND NOT ( ".$pkgmatch{'cdo'}." ) AND NOT ( ".$pkgmatch{'gromacs'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'hmc'}." ) AND NOT ( ".$pkgmatch{'hy3s'}." ) AND NOT ( ".$pkgmatch{'ior'}." ) )";
  $pkgmatch{'ncl'} = "( script LIKE '%ncl%' AND NOT ( script LIKE '%include%' ) AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'gen.v4'}." ) AND NOT ( ".$pkgmatch{'grmhd'}." ) AND NOT ( ".$pkgmatch{'swift'}." ) )";
  $pkgmatch{'nested'} = "( script LIKE '%nested%' AND NOT ( ".$pkgmatch{'enzo'}." ) AND NOT ( ".$pkgmatch{'grib'}." ) )";
  $pkgmatch{'nicam'} = "( script LIKE '%nicam%' AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'grads'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'hy3s'}." ) )";
  $pkgmatch{'npb'} = "( script LIKE '%npb%' AND NOT ( script LIKE '%npbs.%' ) AND NOT ( script LIKE '%snsnpb%' ) AND NOT ( ".$pkgmatch{'milc'}." ) AND NOT ( ".$pkgmatch{'vorpal'}." ) )";
  $pkgmatch{'omen'} = "( script LIKE '%omen%' AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'GreenSolver'}." ) AND NOT ( ".$pkgmatch{'milc'}." ) )";
  $pkgmatch{'overlap'}="( script LIKE '%overlap_%' AND NOT ( ".$pkgmatch{'grib'}." ) AND NOT ( ".$pkgmatch{'hfb'}." ) AND NOT ( ".$pkgmatch{'nicam'}." ) AND NOT ( ".$pkgmatch{'simfactory'}." ) )";
  $pkgmatch{'paratec'} = "( script LIKE '%paratec%' AND NOT ( ".$pkgmatch{'sigma'}." ) )";
  $pkgmatch{'pcg'} = "( script LIKE '%pcg%' AND script NOT LIKE '%request%' AND NOT ( ".$pkgmatch{'gen.v4'}." ) )";
  $pkgmatch{'pop'} = "( script LIKE '%pop%' AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'ccsm'}." ) AND NOT ( ".$pkgmatch{'cp2k'}." ) AND NOT ( ".$pkgmatch{'charmm'}." ) AND NOT ( ".$pkgmatch{'grib'}." ) AND NOT ( ".$pkgmatch{'gromacs'}." ) AND NOT ( ".$pkgmatch{'hmc'}." ) AND NOT ( ".$pkgmatch{'namd'}." ) AND NOT ( ".$pkgmatch{'nwchem'}." ) AND NOT ( ".$pkgmatch{'run_im'}." ) AND NOT ( ".$pkgmatch{'sses'}." ) )";
  $pkgmatch{'propagators'} = "( script LIKE '%propagators%' AND NOT ( ".$pkgmatch{'milc'}." ) )";
  $pkgmatch{'python'} = "( script LIKE '%python%' AND NOT ( ".$pkgmatch{'hoomd'}." ) )";
  $pkgmatch{'qb'} = "( script LIKE '%qb%' AND NOT ( ".$pkgmatch{'hfb'}." ) AND NOT ( ".$pkgmatch{'milc'}." ) AND NOT ( ".$pkgmatch{'amber'}." ) )";
  $pkgmatch{'qrpacc'}  = "( script LIKE '%qrpacc%' AND NOT ( ".$pkgmatch{'vbc'}." ) )";
  $pkgmatch{'quest'} = "( script LIKE '%quest%' AND script NOT LIKE '%request%' AND NOT ( ".$pkgmatch{'gen.v4'}." ) )";
  $pkgmatch{'radhyd'} = "( script LIKE '%radhyd%' AND NOT ( ".$pkgmatch{'chimera'}." ) )";
  $pkgmatch{'res'} = "( script LIKE '%/res_%' AND NOT ( ".$pkgmatch{'enzo'}." ) AND NOT ( ".$pkgmatch{'grib'}." ) AND NOT ( ".$pkgmatch{'lammps'}." ) )";
  $pkgmatch{'run_im'} = "( script LIKE '%run_im%' AND NOT ( ".$pkgmatch{'aims'}." ) AND NOT ( ".$pkgmatch{'flash4'}." ) AND NOT ( ".$pkgmatch{'ncl'}." ) AND NOT ( ".$pkgmatch{'wrf'}." ) )";
  $pkgmatch{'run_xyzvort'} = "( ( script LIKE '%run_xvort%' OR script LIKE '%run_yvort%' OR script LIKE '%run_zvort%' OR script LIKE '%run_thpert%' OR script LIKE '%run_u%' OR script LIKE '%run_v%' OR script LIKE '%run_w%' OR script LIKE '%run_dBZ%' ) AND NOT ( ".$pkgmatch{'beopest'}." ) AND NOT ( ".$pkgmatch{'lobster'}." ) AND NOT ( ".$pkgmatch{'paraview'}." ) AND NOT ( ".$pkgmatch{'vasp'}." ) AND NOT ( ".$pkgmatch{'vnc'}." ) AND NOT ( ".$pkgmatch{'wrf'}." ) )";
  $pkgmatch{'s3d'} = "( script LIKE '%s3d%' AND NOT ( ".$pkgmatch{'adf'}." ) AND NOT ( ".$pkgmatch{'arps'}." ) AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'cctm'}." ) )";
  $pkgmatch{'sgf'} = "( script LIKE '%sgf%' AND NOT ( ".$pkgmatch{'lsdyna'}." ) AND NOT ( ".$pkgmatch{'sigma'}." ) )";
  $pkgmatch{'sord'} = "( script LIKE '%sord%' AND NOT ( ".$pkgmatch{'namd'}." ) )";
  $pkgmatch{'sses'} = "( script LIKE '%sses%' AND NOT ( script LIKE '%subprocess%' ) AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'arps'}." ) AND NOT ( ".$pkgmatch{'cactus'}." ) AND NOT ( ".$pkgmatch{'cdo'}." ) AND NOT ( ".$pkgmatch{'enzo'}." ) AND NOT ( ".$pkgmatch{'grib'}." ) AND NOT ( ".$pkgmatch{'milc'}." ) AND NOT ( ".$pkgmatch{'namd'}." ) AND NOT ( ".$pkgmatch{'python'}." ) AND NOT ( ".$pkgmatch{'qb'}." ) AND NOT ( ".$pkgmatch{'vasp'}." ) AND NOT ( ".$pkgmatch{'vbc'}." ) )";
  $pkgmatch{'sus'} = "( script LIKE '%sus%' AND NOT ( ".$pkgmatch{'cam'}." ) AND NOT ( ".$pkgmatch{'consensus'}." ) AND NOT ( ".$pkgmatch{'stata'}." ) )";
  $pkgmatch{'tsc'} = "( script LIKE '%tsc%' AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'arps'}." ) AND NOT ( ".$pkgmatch{'cactus'}." ) AND NOT ( ".$pkgmatch{'foam'}." ) AND NOT ( ".$pkgmatch{'simfactory'}." ) AND NOT ( ".$pkgmatch{'swift'}." ) )";
  $pkgmatch{'turbomole'} = "( script LIKE '%turbomole%' AND NOT ( ".$pkgmatch{'chemshell'}." ) )";
  $pkgmatch{'ukh2d'} = "( ( script LIKE '%ukh2d%' OR script LIKE '%ukh.cxx.op%' ) AND NOT ( ".$pkgmatch{'h3d'}." ) )";
  $pkgmatch{'wrf'} = "( script LIKE '%wrf%' AND NOT ( ".$pkgmatch{'arps'}." ) AND NOT ( ".$pkgmatch{'ccsm'}." ) AND NOT ( ".$pkgmatch{'grib'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'hy3s'}." ) AND NOT ( ".$pkgmatch{'milc'}." ) AND NOT ( ".$pkgmatch{'mm5'}." ) AND NOT ( ".$pkgmatch{'sgf'}." ) AND NOT ( ".$pkgmatch{'sigma'}." ) )";
  $pkgmatch{'vmd'} = "( script LIKE '%vmd%' AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'cpmd'}." ) AND NOT ( ".$pkgmatch{'cvm'}." ) AND NOT ( ".$pkgmatch{'gromacs'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'hmc'}." ) AND NOT ( ".$pkgmatch{'namd'}." ) AND NOT ( ".$pkgmatch{'pop'}." ) )";
  $pkgmatch{'xgc'} = "( script LIKE '%xgc%' AND NOT ( ".$pkgmatch{'agk'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) )";
  $pkgmatch{'yt'} = "( script LIKE '%yt%' AND NOT ( ".$pkgmatch{'amber'}." ) AND NOT ( ".$pkgmatch{'cactus'}." ) AND NOT ( ".$pkgmatch{'cdo'}." ) AND NOT ( ".$pkgmatch{'gen.v4'}." ) AND NOT ( ".$pkgmatch{'grib'}." ) AND NOT ( ".$pkgmatch{'grmhd'}." ) AND NOT ( ".$pkgmatch{'hoomd'}." ) AND NOT ( ".$pkgmatch{'hsi'}." ) AND NOT ( ".$pkgmatch{'hy3s'}." ) AND NOT ( ".$pkgmatch{'lammps'}." ) AND NOT ( ".$pkgmatch{'lfm'}." ) AND NOT ( ".$pkgmatch{'matlab'}." ) AND NOT ( ".$pkgmatch{'namd'}." ) AND NOT ( ".$pkgmatch{'nwchem'}." ) AND NOT ( ".$pkgmatch{'pop'}." ) AND NOT ( ".$pkgmatch{'python'}." ) AND NOT ( ".$pkgmatch{'stata'}." ) AND NOT ( ".$pkgmatch{'sses'}." ) AND NOT ( ".$pkgmatch{'sord'}." ) AND NOT ( ".$pkgmatch{'swift'}." ) AND NOT ( ".$pkgmatch{'sus'}." ) AND NOT ( ".$pkgmatch{'vasp'}." ) AND NOT ( ".$pkgmatch{'vorpal'}." ) )";

  return %pkgmatch;
}


#
# Main program starts here
#
my $dbhost="localhost";
my $dbuser="pbsacct";
my $dbpasswd="pbsRroxor";
my $dbname="pbsacct";
my $dbtable="Jobs";
my $hostname='hostname';
my $fullreindex = 0;
my $syntaxcheck = 0;
my $domultimatch = 0;
my $start_date;
my $end_date;
my $minjobs = 1000;
my $mincpuhours = 100000;
my $singlepkg;

while ( $ARGV[0] =~ /^-.*/ )
  {
    if ( $ARGV[0] eq "-d" )
      {
	$dbname=$ARGV[1];
	shift(@ARGV);
      }
    elsif ( $ARGV[0] eq "-h" )
      {
	$hostname=$ARGV[1];
	shift(@ARGV);
      }
    elsif ( $ARGV[0] eq "-p" )
      {
	$dbpasswd=$ARGV[1];
	shift(@ARGV);
      }
    elsif ( $ARGV[0] eq "-s" )
      {
	$dbhost=$ARGV[1];
	shift(@ARGV);
      }
    elsif ( $ARGV[0] eq "-t" )
      {
	$dbtable=$ARGV[1];
	shift(@ARGV);
      }
    elsif ( $ARGV[0] eq "-u" )
      {
	$dbuser=$ARGV[1];
	shift(@ARGV);
      }
     elsif (  $ARGV[0] eq "-C" )
      {
	$mincpuhours = $ARGV[1];
	shift(@ARGV);
      }
    elsif (  $ARGV[0] eq "-E" )
      {
	$end_date = $ARGV[1];
	shift(@ARGV);
      }
    elsif (  $ARGV[0] eq "-F" )
      {
	$fullreindex = 1;
      }
    elsif (  $ARGV[0] eq "-J" )
      {
	$minjobs = $ARGV[1];
	shift(@ARGV);
      }
    elsif (  $ARGV[0] eq "-M" )
      {
	$domultimatch = 1;
      }
    elsif (  $ARGV[0] eq "-P" )
      {
        $singlepkg = $ARGV[1];
        shift(@ARGV);
      }
    elsif (  $ARGV[0] eq "-S" )
      {
	$start_date = $ARGV[1];
	shift(@ARGV);
      }
    elsif (  $ARGV[0] eq "-T" )
      {
	$syntaxcheck = 1;
      }

    shift(@ARGV);
   }

# connect to DB
my $dsn = "DBI:mysql:database=$dbname;host=$dbhost;";
my $dbh = DBI->connect($dsn,$dbuser,$dbpasswd) || die "$0:  unable to connect to DB!\n";

# iterate over sw pkg patterns
my %pkgmatch = software_match_list();
if ( $domultimatch==0 )
  {
    my @pkglist;
    if ( defined($singlepkg) )
      {
        @pkglist = ( $singlepkg );
      }
    else
      {
        @pkglist = software_list();
      }
    for my $pkg ( @pkglist )
      {
	my $sql;
	if ( $syntaxcheck==0 )
	  {
	    $sql = "UPDATE Jobs SET sw_app='".$pkg."'";
	  }
	else
	  {
	    $sql = "SELECT COUNT(jobid) FROM Jobs";
	  }
	$sql .= " WHERE system='".$hostname."' AND script IS NOT NULL AND ( ".$pkgmatch{$pkg}." )";
	if ( $fullreindex==0 )
	  {
	    $sql .= " AND sw_app IS NULL";
	  }
	if ( defined($start_date) )
	  {
	    $sql .= " AND submit_date>='".$start_date."'";
	  }
	if ( defined($end_date) )
	  {
	    $sql .= " AND submit_date<='".$end_date."'";
	  }
	$sql .= ";";
	#print "$sql\n";
	$dbh->do($sql) || die "$sql\n$0:  query for pkg $pkg failed -- ".$dbh::errstr;
      }
  }
else
  {
    # do multi-match analysis
    my %done;
    for my $pkg1 ( software_list() )
      {
	for my $pkg2 ( software_list() )
	  {
	    if ( $pkg1 ne $pkg2 && !defined($done{$pkg1}{$pkg2}) )
	      {
		#print "$pkg1:$pkg2\n";
		my $sql = "SELECT '".$pkg1."' AS pkg1, '".$pkg2."' AS pkg2, COUNT(jobid) AS jobs, SUM(nproc*TIME_TO_SEC(walltime))/3600.0 AS cpuhours FROM Jobs WHERE system='".$hostname."' AND ( ( sw_app='".$pkg1."' AND ( ".$pkgmatch{$pkg2}." ) ) OR ( sw_app='".$pkg2."' AND ( ".$pkgmatch{$pkg1}." )  ) )";
		if ( defined($start_date) )
		  {
		    $sql .= " AND submit_date>='".$start_date."'";
		  }
		if ( defined($end_date) )
		  {
		    $sql .= " AND submit_date<='".$end_date."'";
		  }
		$sql .= ";";
		#print "$sql\n";
		my $sth = $dbh->prepare($sql);
		$sth->execute() || die "Can't execute SQL statement: ", $sth->errstr(), "\n";
		my @row = $sth->fetchrow_array();
		if ( $row[2]>=$minjobs || $row[3]>=$mincpuhours )
		  {
		    print "@row\n";
		  }
		$done{$pkg1}{$pkg2} = 1;
		$done{$pkg2}{$pkg1} = 1;
	      }
	  }
      }
  }

# disconnect from DB
$dbh->disconnect();
