Databázová vrstva: vykonávání příkazů a ukládání a načítání historie.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Fri May 29 03:44:35 2009 +0200 (2009-05-29)
changeset 169acb74ac7346
parent 15 8632e6037843
child 17 08cd160ec1c6
Databázová vrstva: vykonávání příkazů a ukládání a načítání historie.
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Ajax.java
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.sql.xml
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/PiskovisteDAO.java
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/TipyDAO.java
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.java
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.xml
java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java
     1.1 --- a/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Ajax.java	Fri May 29 02:04:27 2009 +0200
     1.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Ajax.java	Fri May 29 03:44:35 2009 +0200
     1.3 @@ -1,8 +1,7 @@
     1.4  package cz.frantovo.sql.vyuka.ajax;
     1.5  
     1.6 -import cz.frantovo.sql.vyuka.dto.Hlaska;
     1.7 -import cz.frantovo.sql.vyuka.dto.Hlaska.Typ;
     1.8 -import cz.frantovo.sql.vyuka.dto.Tabulka;
     1.9 +import cz.frantovo.sql.vyuka.dao.HistorieDAO;
    1.10 +import cz.frantovo.sql.vyuka.dao.PiskovisteDAO;
    1.11  import cz.frantovo.sql.vyuka.dto.Uzivatel;
    1.12  import cz.frantovo.sql.vyuka.dto.VysledekSQL;
    1.13  
    1.14 @@ -16,24 +15,8 @@
    1.15       * @return Historie SQL příkazů daného uživatele.
    1.16       */
    1.17      public String getHistorie(Uzivatel uzivatel) {
    1.18 -        VysledekSQL v = new VysledekSQL();
    1.19 -        v.getHlasky().add(new Hlaska("Bude vypsána vaše historie", Typ.OK));
    1.20 -        v.getHlasky().add(new Hlaska("idSezení: " + uzivatel.getIdSezeni(), Typ.OK));
    1.21 -        v.getHlasky().add(new Hlaska("Ale ještě to není hotové.", Typ.Varovani));
    1.22 -        v.getHlasky().add(new Hlaska("Což je asi chyba.", Typ.Chyba));
    1.23 -        v.getHlasky().add(new Hlaska("Stejně vám něco <a href=\"http://frantovo.cz/blog/\">doporučíme</a>.", Typ.Tip, false));
    1.24 -
    1.25 -
    1.26 -        Tabulka t = new Tabulka();
    1.27 -        String[] zahlavi = {"Kdy", "SQL příkaz"};
    1.28 -        t.setZahlavi(zahlavi);
    1.29 -        for (int i = 1; i < 4; i++) {
    1.30 -            String[] hodnoty = {"Někdy " + i, "SELECT * FROM tabulka WHERE id = " + i};
    1.31 -            t.getHodnoty().add(hodnoty);
    1.32 -        }
    1.33 -        v.getTabulky().add(t);
    1.34 -
    1.35 -
    1.36 +        HistorieDAO h = new HistorieDAO();
    1.37 +        VysledekSQL v = h.nactiHistorii(uzivatel);
    1.38          return v.getHtml();
    1.39      }
    1.40  
    1.41 @@ -42,27 +25,8 @@
    1.42       * @return Výsledek dotazu – tabulka, hláška nebo chyba.
    1.43       */
    1.44      public String geSQLVysledek(String sql, Uzivatel uzivatel) {
    1.45 -        VysledekSQL v = new VysledekSQL();
    1.46 -        v.getHlasky().add(new Hlaska("Bude vykonán SQL dotaz.", Typ.OK));
    1.47 -        v.getHlasky().add(new Hlaska("idSezení: " + uzivatel.getIdSezeni(), Typ.OK));
    1.48 -        v.getHlasky().add(new Hlaska("SQL: " + sql, Typ.OK));
    1.49 -        v.getHlasky().add(new Hlaska("IP adresa: " + uzivatel.getIpAdresa(), Typ.OK));
    1.50 -        v.getHlasky().add(new Hlaska("IP adresa a SQL dotaz budou uloženy", Typ.Varovani));
    1.51 -        v.getHlasky().add(new Hlaska("Ale ještě to není hotové.", Typ.Varovani));
    1.52 -        v.getHlasky().add(new Hlaska("Což je asi chyba.", Typ.Chyba));
    1.53 -        v.getHlasky().add(new Hlaska("Stejně vám něco <a href=\"http://frantovo.cz/blog/\">doporučíme</a>.", Typ.Tip, false));
    1.54 -
    1.55 -        for (int n = 1; n < 3; n++) {
    1.56 -            Tabulka t = new Tabulka();
    1.57 -            String[] zahlavi = {"Sloupeček 1", "Nějaké číslo"};
    1.58 -            t.setZahlavi(zahlavi);
    1.59 -            for (int i = 1; i < 4; i++) {
    1.60 -                Object[] hodnoty = {"počet " + i, new Integer(i * n)};
    1.61 -                t.getHodnoty().add(hodnoty);
    1.62 -            }
    1.63 -            v.getTabulky().add(t);
    1.64 -        }
    1.65 -
    1.66 +        PiskovisteDAO p = new PiskovisteDAO();
    1.67 +        VysledekSQL v = p.vykonejSQL(sql, uzivatel);
    1.68          return v.getHtml();
    1.69      }
    1.70  }
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java	Fri May 29 03:44:35 2009 +0200
     2.3 @@ -0,0 +1,100 @@
     2.4 +package cz.frantovo.sql.vyuka.dao;
     2.5 +
     2.6 +import cz.frantovo.sql.vyuka.dto.Hlaska;
     2.7 +import cz.frantovo.sql.vyuka.dto.Hlaska.Typ;
     2.8 +import cz.frantovo.sql.vyuka.dto.Tabulka;
     2.9 +import cz.frantovo.sql.vyuka.dto.Uzivatel;
    2.10 +import cz.frantovo.sql.vyuka.dto.VysledekSQL;
    2.11 +import java.sql.Connection;
    2.12 +import java.sql.PreparedStatement;
    2.13 +import java.sql.ResultSet;
    2.14 +import java.sql.Timestamp;
    2.15 +import java.util.logging.Level;
    2.16 +
    2.17 +/**
    2.18 + * Ukládání a načítání uživatelské historie.
    2.19 + * @author fiki
    2.20 + */
    2.21 +public class HistorieDAO extends VyukaSuperDAO {
    2.22 +
    2.23 +    TipyDAO tipy = new TipyDAO();
    2.24 +
    2.25 +    private enum SQL {
    2.26 +
    2.27 +        NACTI,
    2.28 +        ULOZ
    2.29 +    }
    2.30 +
    2.31 +    /**
    2.32 +     * @param sql uživatelský SQL příkaz k uložení
    2.33 +     * @param uzivatel idSezení a IP adresa uživatele
    2.34 +     * @return zda se podařilo historii uložit
    2.35 +     */
    2.36 +    public boolean ulozPrikaz(String sql, Uzivatel uzivatel) {
    2.37 +        Connection db = getSpojeni(DATABAZE.APLIKACE);
    2.38 +        if (db == null) {
    2.39 +            return false;
    2.40 +        } else {
    2.41 +            PreparedStatement ps = null;
    2.42 +            ResultSet rs = null;
    2.43 +            try {
    2.44 +                ps = db.prepareStatement(getSQL(SQL.ULOZ));
    2.45 +                ps.setString(1, sql);
    2.46 +                ps.setString(2, uzivatel.getIdSezeni());
    2.47 +                ps.setString(3, uzivatel.getIpAdresa());
    2.48 +                ps.executeUpdate();
    2.49 +                return true;
    2.50 +            } catch (Exception e) {
    2.51 +                log.log(Level.SEVERE, "Chyba při ukládání historie.", e);
    2.52 +                return false;
    2.53 +            } finally {
    2.54 +                zavri(db, ps, rs);
    2.55 +            }
    2.56 +        }
    2.57 +    }
    2.58 +
    2.59 +    public VysledekSQL nactiHistorii(Uzivatel uzivatel) {
    2.60 +        VysledekSQL v = new VysledekSQL();
    2.61 +
    2.62 +
    2.63 +        Tabulka t = new Tabulka();
    2.64 +        String[] zahlavi = {"Kdy", "SQL příkaz"};
    2.65 +        t.setZahlavi(zahlavi);
    2.66 +
    2.67 +
    2.68 +        Connection db = getSpojeni(DATABAZE.APLIKACE);
    2.69 +        if (db == null) {
    2.70 +            v.getHlasky().add(new Hlaska("Došlo k chybě spojení.", Typ.Chyba));
    2.71 +        } else {
    2.72 +            PreparedStatement ps = null;
    2.73 +            ResultSet rs = null;
    2.74 +            try {
    2.75 +                ps = db.prepareStatement(getSQL(SQL.NACTI));
    2.76 +                ps.setString(1, uzivatel.getIdSezeni());
    2.77 +                rs = ps.executeQuery();
    2.78 +
    2.79 +                while (rs.next()) {
    2.80 +                    Timestamp datum = rs.getTimestamp("datum");
    2.81 +                    String sql = rs.getString("sql");
    2.82 +                    Object[] hodnoty = {datum, sql};
    2.83 +                    t.getHodnoty().add(hodnoty);
    2.84 +                }
    2.85 +
    2.86 +                if (t.getHodnoty().size() < 1) {
    2.87 +                    v.getHlasky().add(new Hlaska("Historie SQL příkazů nenalezena.", Typ.Varovani));
    2.88 +                } else {
    2.89 +                    v.getTabulky().add(t);
    2.90 +                }
    2.91 +
    2.92 +            } catch (Exception e) {
    2.93 +                log.log(Level.SEVERE, "Chyba při ukládání historie.", e);
    2.94 +                v.getHlasky().add(new Hlaska("Došlo k chybě dotazu.", Typ.Chyba));
    2.95 +            } finally {
    2.96 +                zavri(db, ps, rs);
    2.97 +            }
    2.98 +        }
    2.99 +
   2.100 +        v.getHlasky().add(new Hlaska(tipy.getTip(), Typ.Tip, false));
   2.101 +        return v;
   2.102 +    }
   2.103 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.sql.xml	Fri May 29 03:44:35 2009 +0200
     3.3 @@ -0,0 +1,14 @@
     3.4 +<?xml version="1.0" encoding="UTF-8"?>
     3.5 +<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
     3.6 +<properties>
     3.7 +    <entry key="NACTI">
     3.8 +        <![CDATA[
     3.9 +        SELECT * FROM historie WHERE id_sezeni = ?
    3.10 +        ]]>
    3.11 +    </entry>
    3.12 +    <entry key="ULOZ">
    3.13 +        <![CDATA[
    3.14 +        INSERT INTO historie (sql, id_sezeni, ip_adresa) VALUES (?,?,?)
    3.15 +        ]]>
    3.16 +    </entry>
    3.17 +</properties>
    3.18 \ No newline at end of file
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/PiskovisteDAO.java	Fri May 29 03:44:35 2009 +0200
     4.3 @@ -0,0 +1,91 @@
     4.4 +package cz.frantovo.sql.vyuka.dao;
     4.5 +
     4.6 +import cz.frantovo.sql.vyuka.dao.VyukaSuperDAO.DATABAZE;
     4.7 +import cz.frantovo.sql.vyuka.dto.Hlaska;
     4.8 +import cz.frantovo.sql.vyuka.dto.Hlaska.Typ;
     4.9 +import cz.frantovo.sql.vyuka.dto.Tabulka;
    4.10 +import cz.frantovo.sql.vyuka.dto.Uzivatel;
    4.11 +import cz.frantovo.sql.vyuka.dto.VysledekSQL;
    4.12 +import java.sql.Connection;
    4.13 +import java.sql.PreparedStatement;
    4.14 +import java.sql.ResultSet;
    4.15 +import java.sql.SQLException;
    4.16 +import java.util.logging.Level;
    4.17 +
    4.18 +/**
    4.19 + * Pro spouštění uživatelových příkazů.
    4.20 + * @author fiki
    4.21 + */
    4.22 +public class PiskovisteDAO extends VyukaSuperDAO {
    4.23 +
    4.24 +    TipyDAO tipy = new TipyDAO();
    4.25 +    HistorieDAO historie = new HistorieDAO();
    4.26 +
    4.27 +    public VysledekSQL vykonejSQL(String sql, Uzivatel uzivatel) {
    4.28 +        VysledekSQL v = new VysledekSQL();
    4.29 +        if (historie.ulozPrikaz(sql, uzivatel)) {
    4.30 +
    4.31 +
    4.32 +
    4.33 +
    4.34 +
    4.35 +
    4.36 +            Tabulka t = new Tabulka();
    4.37 +
    4.38 +
    4.39 +
    4.40 +            Connection db = getSpojeni(DATABAZE.PISKOVISTE);
    4.41 +            if (db == null) {
    4.42 +                v.getHlasky().add(new Hlaska("Došlo k chybě spojení.", Typ.Chyba));
    4.43 +            } else {
    4.44 +                PreparedStatement ps = null;
    4.45 +                ResultSet rs = null;
    4.46 +                try {
    4.47 +                    ps = db.prepareStatement(sql);
    4.48 +                    rs = ps.executeQuery();
    4.49 +
    4.50 +                    int pocetSloupecku = rs.getMetaData().getColumnCount();
    4.51 +                    String[] zahlavi = new String[pocetSloupecku];
    4.52 +                    t.setZahlavi(zahlavi);
    4.53 +                    for (int i = 0; i < pocetSloupecku; i++) {
    4.54 +                        zahlavi[i] = rs.getMetaData().getColumnName(i + 1);
    4.55 +                    }
    4.56 +
    4.57 +                    while (rs.next()) {
    4.58 +                        Object[] hodnoty = new Object[pocetSloupecku];
    4.59 +                        for (int i = 0; i < pocetSloupecku; i++) {
    4.60 +                            hodnoty[i] = rs.getObject(i + 1);
    4.61 +                        }
    4.62 +                        t.getHodnoty().add(hodnoty);
    4.63 +                    }
    4.64 +
    4.65 +                    if (t.getHodnoty().size() > 0 && pocetSloupecku > 0) {
    4.66 +
    4.67 +                        v.getTabulky().add(t);
    4.68 +                    } else {
    4.69 +                        v.getHlasky().add(new Hlaska("SQL příkaz byl proveden.", Typ.OK));
    4.70 +                    }
    4.71 +
    4.72 +                } catch (SQLException e) {
    4.73 +                    log.log(Level.SEVERE, "SQL chyba při vykonávání uživatelského dotazu.", e);
    4.74 +                    v.getHlasky().add(new Hlaska("Chybné SQL: " + e.getMessage(), Typ.Chyba));
    4.75 +                } catch (Exception e) {
    4.76 +                    log.log(Level.SEVERE, "Chyba při vykonávání uživatelského dotazu.", e);
    4.77 +                    v.getHlasky().add(new Hlaska("Došlo k chybě dotazu.", Typ.Chyba));
    4.78 +                } finally {
    4.79 +                    zavri(db, ps, rs);
    4.80 +                }
    4.81 +            }
    4.82 +
    4.83 +            v.getHlasky().add(new Hlaska(tipy.getTip(), Typ.Tip, false));
    4.84 +
    4.85 +
    4.86 +
    4.87 +
    4.88 +
    4.89 +        } else {
    4.90 +            v.getHlasky().add(new Hlaska("Došlo k chybě historie.", Typ.Chyba));
    4.91 +        }
    4.92 +        return v;
    4.93 +    }
    4.94 +}
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/TipyDAO.java	Fri May 29 03:44:35 2009 +0200
     5.3 @@ -0,0 +1,13 @@
     5.4 +package cz.frantovo.sql.vyuka.dao;
     5.5 +
     5.6 +/**
     5.7 + *
     5.8 + * @author fiki
     5.9 + */
    5.10 +public class TipyDAO extends VyukaSuperDAO {
    5.11 +
    5.12 +    public String getTip() {
    5.13 +        /** TODO: Tipy brát z databáze. */
    5.14 +        return "Stejně vám něco <a href=\"http://frantovo.cz/blog/\">doporučíme</a>.";
    5.15 +    }
    5.16 +}
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.java	Fri May 29 03:44:35 2009 +0200
     6.3 @@ -0,0 +1,57 @@
     6.4 +package cz.frantovo.sql.vyuka.dao;
     6.5 +
     6.6 +import cz.frantovo.superDAO.SuperDAO;
     6.7 +import java.sql.Connection;
     6.8 +import java.sql.SQLException;
     6.9 +import java.util.logging.Level;
    6.10 +import javax.naming.InitialContext;
    6.11 +import javax.naming.NamingException;
    6.12 +import javax.sql.DataSource;
    6.13 +
    6.14 +/**
    6.15 + *
    6.16 + * @author fiki
    6.17 + */
    6.18 +public class VyukaSuperDAO extends SuperDAO {
    6.19 +
    6.20 +    protected InitialContext kontext = null;
    6.21 +
    6.22 +    protected enum DATABAZE {
    6.23 +
    6.24 +        /** Databáze aplikace – historie, nastavení. */
    6.25 +        APLIKACE,
    6.26 +        /** Databáze, na které se spouštějí příkazy uživatelů. */
    6.27 +        PISKOVISTE
    6.28 +    }
    6.29 +
    6.30 +    public VyukaSuperDAO() {
    6.31 +        try {
    6.32 +            kontext = new InitialContext();
    6.33 +        } catch (NamingException ex) {
    6.34 +            log.log(Level.SEVERE, "Chyba při inicializaci kontextu", ex);
    6.35 +        }
    6.36 +    }
    6.37 +
    6.38 +    /**
    6.39 +     * @param databaze Která databáze (aplikace = historie a nastavení | pískoviště = příkazy uživatele)
    6.40 +     * @return Databázové spojení
    6.41 +     */
    6.42 +    protected Connection getSpojeni(DATABAZE databaze) {
    6.43 +        if (databaze == null) {
    6.44 +            databaze = DATABAZE.PISKOVISTE;
    6.45 +        }
    6.46 +        log.log(Level.SEVERE, "DATABAZE:" + String.valueOf(databaze));
    6.47 +        String jndi = orizniJNDI(getVlastnost(databaze, VyukaSuperDAO.class));
    6.48 +        DataSource zdroj = null;
    6.49 +        try {
    6.50 +            zdroj = (DataSource) kontext.lookup(jndi);
    6.51 +            return zdroj.getConnection();
    6.52 +        } catch (NamingException ex) {
    6.53 +            log.log(Level.SEVERE, "getSpojeni: lookup", ex);
    6.54 +            return null;
    6.55 +        } catch (SQLException ex) {
    6.56 +            log.log(Level.SEVERE, "getSpojeni: sql", ex);
    6.57 +            return null;
    6.58 +        }
    6.59 +    }
    6.60 +}
    6.61 \ No newline at end of file
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.xml	Fri May 29 03:44:35 2009 +0200
     7.3 @@ -0,0 +1,6 @@
     7.4 +<?xml version="1.0" encoding="UTF-8"?>
     7.5 +<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
     7.6 +<properties>
     7.7 +    <entry key="APLIKACE">jdbc/sqlVyuka/aplikace</entry>
     7.8 +    <entry key="PISKOVISTE">jdbc/sqlVyuka/piskoviste</entry>
     7.9 +</properties>
    7.10 \ No newline at end of file
     8.1 --- a/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java	Fri May 29 02:04:27 2009 +0200
     8.2 +++ b/java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java	Fri May 29 03:44:35 2009 +0200
     8.3 @@ -70,8 +70,4 @@
     8.4      public Collection<Object[]> getHodnoty() {
     8.5          return hodnoty;
     8.6      }
     8.7 -
     8.8 -    public void setHodnoty(Collection<Object[]> hodnoty) {
     8.9 -        this.hodnoty = hodnoty;
    8.10 -    }
    8.11  }