java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.java
author František Kučera <franta-hg@frantovo.cz>
Sun, 15 Feb 2009 00:32:53 +0100
changeset 28 dbb434bd4b99
parent 23 b22c06c8a55c
child 32 3bc16e43872b
permissions -rw-r--r--
Generátor vytváří souhrny pro období od-do (včetně)
Funguje, ale kvůli překladům IP adres to trvá příliš dlouho.
Bude potřeba nejdříve vytvořit souhrn bez překladů (bude tam null)
a v dalším kole provést překlad IP adres → tím zkrátíme první databázovou transakci
a ušetříme přibližně třetinu času na překlady (pokud každá IP útočila třikrát)
nebo i více, pokud máme více cílů (je dost možné, že IP adresy útočníků budou stejné a nebudeme je muset překládat několikrát)
franta-hg@22
     1
package cz.frantovo.hrisniciSpameri.dao;
franta-hg@22
     2
franta-hg@22
     3
import cz.frantovo.hrisniciSpameri.dto.Cil;
franta-hg@23
     4
import java.net.InetAddress;
franta-hg@22
     5
import java.sql.Connection;
franta-hg@22
     6
import java.sql.Date;
franta-hg@22
     7
import java.sql.PreparedStatement;
franta-hg@22
     8
import java.sql.ResultSet;
franta-hg@22
     9
import java.util.Collection;
franta-hg@22
    10
import java.util.logging.Level;
franta-hg@22
    11
franta-hg@22
    12
/**
franta-hg@22
    13
 *
franta-hg@22
    14
 * @author fiki
franta-hg@22
    15
 */
franta-hg@22
    16
public class GeneratorSouhrnuDAO extends HrisniciSuperDAO {
franta-hg@22
    17
franta-hg@22
    18
    private enum SQL {
franta-hg@22
    19
franta-hg@23
    20
        VLOZ_SOUHRN,
franta-hg@23
    21
        SMAZ_SOUHRNY
franta-hg@22
    22
    }
franta-hg@22
    23
franta-hg@22
    24
    /**
franta-hg@22
    25
     * Vygeneruje souhrn pro daný cíl a datum a uloží ho do databáze
franta-hg@22
    26
     * @param cil cíl, pro který generujeme souhrn
franta-hg@22
    27
     * @param den den, pro který souhrn generujeme.
franta-hg@22
    28
     */
franta-hg@28
    29
    public void generujSouhrn(Cil cil, Date zacatek, Date konec) {
franta-hg@22
    30
        Connection dbZdroj = getSpojeni(cil.getDatabaze());
franta-hg@22
    31
        Connection dbSouhrn = getSpojeni(null);
franta-hg@22
    32
franta-hg@28
    33
        if (konec == null) {
franta-hg@28
    34
            konec = zacatek;
franta-hg@28
    35
        }
franta-hg@28
    36
franta-hg@22
    37
        if (dbZdroj == null || dbSouhrn == null) {
franta-hg@22
    38
            /** TODO: Chyba spojení */
franta-hg@22
    39
        } else {
franta-hg@22
    40
            PreparedStatement ps = null;
franta-hg@23
    41
            PreparedStatement psSmazat = null;
franta-hg@22
    42
            ResultSet rs = null;
franta-hg@22
    43
            try {
franta-hg@23
    44
                /** pokud už něco vygenerovaného pro daný den a cíl máme, smažeme to */
franta-hg@23
    45
                psSmazat = dbSouhrn.prepareStatement(getSQL(SQL.SMAZ_SOUHRNY));
franta-hg@23
    46
                psSmazat.setInt(1, cil.getId());
franta-hg@28
    47
                psSmazat.setDate(2, zacatek);
franta-hg@28
    48
                psSmazat.setDate(3, konec);
franta-hg@23
    49
                psSmazat.executeUpdate();
franta-hg@23
    50
franta-hg@22
    51
                ps = dbZdroj.prepareStatement(cil.getSelekt());
franta-hg@28
    52
                ps.setDate(1, zacatek);
franta-hg@28
    53
                ps.setDate(2, konec);
franta-hg@22
    54
                rs = ps.executeQuery();
franta-hg@22
    55
                PreparedStatement psSouhrn = dbSouhrn.prepareStatement(getSQL(SQL.VLOZ_SOUHRN));
franta-hg@22
    56
                while (rs.next()) {
franta-hg@22
    57
                    /**
franta-hg@22
    58
                     * Souhrn bychom mohli vkládat pomocí SouhrnDAO,
franta-hg@22
    59
                     * ale z výkonnostních důvodů to budeme dělat tady
franta-hg@22
    60
                     * (jedno spojení a jeden předpřipravený příkaz).
franta-hg@22
    61
                     */
franta-hg@28
    62
                    psSouhrn.setDate(1, rs.getDate("den"));
franta-hg@22
    63
                    psSouhrn.setString(2, rs.getString("ip"));
franta-hg@23
    64
                    psSouhrn.setString(3, prelozIP(rs.getString("ip")));
franta-hg@22
    65
                    psSouhrn.setInt(4, rs.getInt("pocet"));
franta-hg@22
    66
                    psSouhrn.setInt(5, cil.getId());
franta-hg@22
    67
                    psSouhrn.executeUpdate();
franta-hg@22
    68
                }
franta-hg@22
    69
                zavri(null, psSouhrn, null);
franta-hg@22
    70
                dbSouhrn.commit();
franta-hg@22
    71
            } catch (Exception e) {
franta-hg@22
    72
                log.log(Level.SEVERE, "Chyba při generování souhrnu.", e);
franta-hg@22
    73
            } finally {
franta-hg@22
    74
                zavri(dbZdroj, ps, rs);
franta-hg@23
    75
                zavri(dbSouhrn, psSmazat, null);
franta-hg@22
    76
            }
franta-hg@22
    77
        }
franta-hg@22
    78
    }
franta-hg@22
    79
franta-hg@22
    80
    /**
franta-hg@28
    81
     * Vygeneruje denní souhrny pro všechny cíle za dané období.
franta-hg@28
    82
     * @param zacatek začátek období – včetně
franta-hg@28
    83
     * @param konec konec období – včetně
franta-hg@22
    84
     */
franta-hg@28
    85
    public void generujSouhrny(Date zacatek, Date konec) {
franta-hg@22
    86
        Collection<Cil> cile = new CilDAO().getCile();
franta-hg@22
    87
        for (Cil c : cile) {
franta-hg@28
    88
            generujSouhrn(c, zacatek, konec);
franta-hg@22
    89
        }
franta-hg@22
    90
    }
franta-hg@23
    91
franta-hg@23
    92
    /**
franta-hg@23
    93
     * Přeloží IP adresu na doménu
franta-hg@23
    94
     * @param ip IP adresa
franta-hg@23
    95
     * @return doména
franta-hg@23
    96
     */
franta-hg@23
    97
    private static String prelozIP(String ip) {
franta-hg@23
    98
        try {
franta-hg@23
    99
            return InetAddress.getByName(ip).getHostName();
franta-hg@23
   100
        } catch (Exception e) {
franta-hg@23
   101
            return "Chyba: nepodařilo se přeložit.";
franta-hg@23
   102
        }
franta-hg@23
   103
    }
franta-hg@22
   104
}