Generátor vytváří souhrny pro období od-do (včetně)
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun Feb 15 00:32:53 2009 +0100 (2009-02-15)
changeset 28dbb434bd4b99
parent 27 f410145eb680
child 29 f8d3d7914d9a
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)
java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/Sprava.java
java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.java
java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.sql.xml
sql/schéma.sql
     1.1 --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/Sprava.java	Sat Feb 14 23:03:13 2009 +0100
     1.2 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/Sprava.java	Sun Feb 15 00:32:53 2009 +0100
     1.3 @@ -18,13 +18,15 @@
     1.4      private static final long serialVersionUID = -9048188038805055786L;
     1.5  
     1.6      public boolean getGenerujSouhrn() {
     1.7 -        Date den = new Date(System.currentTimeMillis());
     1.8 +        Date zacatek = new Date(0);
     1.9 +        Date konec = new Date(System.currentTimeMillis());
    1.10          Collection<Cil> cile = new CilDAO().getCile();
    1.11          for (Cil c : cile) {
    1.12              if (c.getId() == 1) {
    1.13 -                new GeneratorSouhrnuDAO().generujSouhrn(c, den);
    1.14 +                new GeneratorSouhrnuDAO().generujSouhrn(c, zacatek, konec);
    1.15              }
    1.16          }
    1.17 +        System.out.println("Od: " + zacatek + " do: " + konec);
    1.18  
    1.19  
    1.20  
     2.1 --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.java	Sat Feb 14 23:03:13 2009 +0100
     2.2 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.java	Sun Feb 15 00:32:53 2009 +0100
     2.3 @@ -26,10 +26,14 @@
     2.4       * @param cil cíl, pro který generujeme souhrn
     2.5       * @param den den, pro který souhrn generujeme.
     2.6       */
     2.7 -    public void generujSouhrn(Cil cil, Date den) {
     2.8 +    public void generujSouhrn(Cil cil, Date zacatek, Date konec) {
     2.9          Connection dbZdroj = getSpojeni(cil.getDatabaze());
    2.10          Connection dbSouhrn = getSpojeni(null);
    2.11  
    2.12 +        if (konec == null) {
    2.13 +            konec = zacatek;
    2.14 +        }
    2.15 +
    2.16          if (dbZdroj == null || dbSouhrn == null) {
    2.17              /** TODO: Chyba spojení */
    2.18          } else {
    2.19 @@ -37,17 +41,16 @@
    2.20              PreparedStatement psSmazat = null;
    2.21              ResultSet rs = null;
    2.22              try {
    2.23 -                log.log(Level.SEVERE, "AUTOCOMIT: " + dbSouhrn.getAutoCommit());
    2.24 -                dbSouhrn.setAutoCommit(false);
    2.25 -
    2.26                  /** pokud už něco vygenerovaného pro daný den a cíl máme, smažeme to */
    2.27                  psSmazat = dbSouhrn.prepareStatement(getSQL(SQL.SMAZ_SOUHRNY));
    2.28                  psSmazat.setInt(1, cil.getId());
    2.29 -                psSmazat.setDate(2, den);
    2.30 +                psSmazat.setDate(2, zacatek);
    2.31 +                psSmazat.setDate(3, konec);
    2.32                  psSmazat.executeUpdate();
    2.33  
    2.34                  ps = dbZdroj.prepareStatement(cil.getSelekt());
    2.35 -                ps.setDate(1, den);
    2.36 +                ps.setDate(1, zacatek);
    2.37 +                ps.setDate(2, konec);
    2.38                  rs = ps.executeQuery();
    2.39                  PreparedStatement psSouhrn = dbSouhrn.prepareStatement(getSQL(SQL.VLOZ_SOUHRN));
    2.40                  while (rs.next()) {
    2.41 @@ -56,7 +59,7 @@
    2.42                       * ale z výkonnostních důvodů to budeme dělat tady
    2.43                       * (jedno spojení a jeden předpřipravený příkaz).
    2.44                       */
    2.45 -                    psSouhrn.setDate(1, den);
    2.46 +                    psSouhrn.setDate(1, rs.getDate("den"));
    2.47                      psSouhrn.setString(2, rs.getString("ip"));
    2.48                      psSouhrn.setString(3, prelozIP(rs.getString("ip")));
    2.49                      psSouhrn.setInt(4, rs.getInt("pocet"));
    2.50 @@ -75,17 +78,14 @@
    2.51      }
    2.52  
    2.53      /**
    2.54 -     * Vygeneruje denní souhrny pro všechny cíle.
    2.55 -     * @param den den, pro který souhrny generujeme.
    2.56 +     * Vygeneruje denní souhrny pro všechny cíle za dané období.
    2.57 +     * @param zacatek začátek období – včetně
    2.58 +     * @param konec konec období – včetně
    2.59       */
    2.60 -    public void generujSouhrny(Date den) {
    2.61 -        if (den == null) {
    2.62 -            den = SouhrnDAO.getVychoziDen();
    2.63 -        }
    2.64 -
    2.65 +    public void generujSouhrny(Date zacatek, Date konec) {
    2.66          Collection<Cil> cile = new CilDAO().getCile();
    2.67          for (Cil c : cile) {
    2.68 -            generujSouhrn(c, den);
    2.69 +            generujSouhrn(c, zacatek, konec);
    2.70          }
    2.71      }
    2.72  
     3.1 --- a/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.sql.xml	Sat Feb 14 23:03:13 2009 +0100
     3.2 +++ b/java/HrisniciSpameri/src/java/cz/frantovo/hrisniciSpameri/dao/GeneratorSouhrnuDAO.sql.xml	Sun Feb 15 00:32:53 2009 +0100
     3.3 @@ -12,7 +12,8 @@
     3.4          <![CDATA[
     3.5          DELETE FROM souhrn
     3.6          WHERE   cil = ?
     3.7 -                AND den = ?
     3.8 +                AND den >= ?
     3.9 +                AND den <= ?
    3.10          ]]>
    3.11      </entry>
    3.12      <entry key="UKAZKA_SELEKTU">
    3.13 @@ -22,11 +23,13 @@
    3.14          -->
    3.15          <![CDATA[
    3.16          SELECT  hostname AS ip,
    3.17 -                count(*) AS pocet
    3.18 +                count(*) AS pocet,
    3.19 +                date(from_unixtime(timestamp)) AS den
    3.20          FROM    drupal5_watchdog
    3.21          WHERE   type = 'captcha'
    3.22 -                AND date(from_unixtime(timestamp)) = date(?)
    3.23 -        GROUP BY hostname
    3.24 +                AND date(from_unixtime(timestamp)) >= date(?)
    3.25 +                AND date(from_unixtime(timestamp)) <= date(?)
    3.26 +        GROUP BY hostname, date(from_unixtime(timestamp))
    3.27          ]]>
    3.28      </entry>
    3.29  </properties>
    3.30 \ No newline at end of file
     4.1 --- a/sql/schéma.sql	Sat Feb 14 23:03:13 2009 +0100
     4.2 +++ b/sql/schéma.sql	Sun Feb 15 00:32:53 2009 +0100
     4.3 @@ -7,7 +7,7 @@
     4.4    id bigint NOT NULL,
     4.5    nazev character varying NOT NULL,
     4.6    url character varying, -- Odkaz na daný cíl – pokud je to např. webová stránka
     4.7 -  selekt character varying NOT NULL, -- SQL dotaz, kterým získáme ze zdrojové databáze: IP adresu (sloupeček "ip") a počet pokusů (sloupeček "pocet") o spamování pro daný den (parametr dotazu)
     4.8 +  selekt character varying NOT NULL, -- SQL dotaz, kterým získáme ze zdrojové databáze: IP adresu (sloupeček "ip"), počet pokusů (sloupeček "pocet") o spamování a den pokusu (sloupeček "den"). To vše pro období od do (dva parametry dotazu) včetně.
     4.9    databaze character varying NOT NULL, -- Celé JNDI jméno datového zdroje – databáze, na které bude volán selekt.
    4.10    CONSTRAINT cil_pk PRIMARY KEY (id)
    4.11  )
    4.12 @@ -15,7 +15,7 @@
    4.13  ALTER TABLE cil OWNER TO hrisnicispameri;
    4.14  COMMENT ON TABLE cil IS 'Definice cílu (oběti) spamování.';
    4.15  COMMENT ON COLUMN cil.url IS 'Odkaz na daný cíl – pokud je to např. webová stránka';
    4.16 -COMMENT ON COLUMN cil.selekt IS 'SQL dotaz, kterým získáme ze zdrojové databáze: IP adresu (sloupeček "ip") a počet pokusů (sloupeček "pocet") o spamování pro daný den (parametr dotazu)';
    4.17 +COMMENT ON COLUMN cil.selekt IS 'SQL dotaz, kterým získáme ze zdrojové databáze: IP adresu (sloupeček "ip"), počet pokusů (sloupeček "pocet") o spamování a den pokusu (sloupeček "den"). To vše pro období od do (dva parametry dotazu) včetně.';
    4.18  COMMENT ON COLUMN cil.databaze IS 'Celé JNDI jméno datového zdroje – databáze, na které bude volán selekt.';
    4.19  
    4.20