Databázová vrstva: vykonávání příkazů a ukládání a načítání historie.
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 }