Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Ajax.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Ajax.java	(revision 13:96e711f3ef48)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/ajax/Ajax.java	(revision 16:9acb74ac7346)
@@ -1,7 +1,6 @@
 package cz.frantovo.sql.vyuka.ajax;
 
-import cz.frantovo.sql.vyuka.dto.Hlaska;
-import cz.frantovo.sql.vyuka.dto.Hlaska.Typ;
-import cz.frantovo.sql.vyuka.dto.Tabulka;
+import cz.frantovo.sql.vyuka.dao.HistorieDAO;
+import cz.frantovo.sql.vyuka.dao.PiskovisteDAO;
 import cz.frantovo.sql.vyuka.dto.Uzivatel;
 import cz.frantovo.sql.vyuka.dto.VysledekSQL;
@@ -17,22 +16,6 @@
      */
     public String getHistorie(Uzivatel uzivatel) {
-        VysledekSQL v = new VysledekSQL();
-        v.getHlasky().add(new Hlaska("Bude vypsána vaše historie", Typ.OK));
-        v.getHlasky().add(new Hlaska("idSezení: " + uzivatel.getIdSezeni(), Typ.OK));
-        v.getHlasky().add(new Hlaska("Ale ještě to není hotové.", Typ.Varovani));
-        v.getHlasky().add(new Hlaska("Což je asi chyba.", Typ.Chyba));
-        v.getHlasky().add(new Hlaska("Stejně vám něco <a href=\"http://frantovo.cz/blog/\">doporučíme</a>.", Typ.Tip, false));
-
-
-        Tabulka t = new Tabulka();
-        String[] zahlavi = {"Kdy", "SQL příkaz"};
-        t.setZahlavi(zahlavi);
-        for (int i = 1; i < 4; i++) {
-            String[] hodnoty = {"Někdy " + i, "SELECT * FROM tabulka WHERE id = " + i};
-            t.getHodnoty().add(hodnoty);
-        }
-        v.getTabulky().add(t);
-
-
+        HistorieDAO h = new HistorieDAO();
+        VysledekSQL v = h.nactiHistorii(uzivatel);
         return v.getHtml();
     }
@@ -43,25 +26,6 @@
      */
     public String geSQLVysledek(String sql, Uzivatel uzivatel) {
-        VysledekSQL v = new VysledekSQL();
-        v.getHlasky().add(new Hlaska("Bude vykonán SQL dotaz.", Typ.OK));
-        v.getHlasky().add(new Hlaska("idSezení: " + uzivatel.getIdSezeni(), Typ.OK));
-        v.getHlasky().add(new Hlaska("SQL: " + sql, Typ.OK));
-        v.getHlasky().add(new Hlaska("IP adresa: " + uzivatel.getIpAdresa(), Typ.OK));
-        v.getHlasky().add(new Hlaska("IP adresa a SQL dotaz budou uloženy", Typ.Varovani));
-        v.getHlasky().add(new Hlaska("Ale ještě to není hotové.", Typ.Varovani));
-        v.getHlasky().add(new Hlaska("Což je asi chyba.", Typ.Chyba));
-        v.getHlasky().add(new Hlaska("Stejně vám něco <a href=\"http://frantovo.cz/blog/\">doporučíme</a>.", Typ.Tip, false));
-
-        for (int n = 1; n < 3; n++) {
-            Tabulka t = new Tabulka();
-            String[] zahlavi = {"Sloupeček 1", "Nějaké číslo"};
-            t.setZahlavi(zahlavi);
-            for (int i = 1; i < 4; i++) {
-                Object[] hodnoty = {"počet " + i, new Integer(i * n)};
-                t.getHodnoty().add(hodnoty);
-            }
-            v.getTabulky().add(t);
-        }
-
+        PiskovisteDAO p = new PiskovisteDAO();
+        VysledekSQL v = p.vykonejSQL(sql, uzivatel);
         return v.getHtml();
     }
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.java	(revision 16:9acb74ac7346)
@@ -0,0 +1,100 @@
+package cz.frantovo.sql.vyuka.dao;
+
+import cz.frantovo.sql.vyuka.dto.Hlaska;
+import cz.frantovo.sql.vyuka.dto.Hlaska.Typ;
+import cz.frantovo.sql.vyuka.dto.Tabulka;
+import cz.frantovo.sql.vyuka.dto.Uzivatel;
+import cz.frantovo.sql.vyuka.dto.VysledekSQL;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Timestamp;
+import java.util.logging.Level;
+
+/**
+ * Ukládání a načítání uživatelské historie.
+ * @author fiki
+ */
+public class HistorieDAO extends VyukaSuperDAO {
+
+    TipyDAO tipy = new TipyDAO();
+
+    private enum SQL {
+
+        NACTI,
+        ULOZ
+    }
+
+    /**
+     * @param sql uživatelský SQL příkaz k uložení
+     * @param uzivatel idSezení a IP adresa uživatele
+     * @return zda se podařilo historii uložit
+     */
+    public boolean ulozPrikaz(String sql, Uzivatel uzivatel) {
+        Connection db = getSpojeni(DATABAZE.APLIKACE);
+        if (db == null) {
+            return false;
+        } else {
+            PreparedStatement ps = null;
+            ResultSet rs = null;
+            try {
+                ps = db.prepareStatement(getSQL(SQL.ULOZ));
+                ps.setString(1, sql);
+                ps.setString(2, uzivatel.getIdSezeni());
+                ps.setString(3, uzivatel.getIpAdresa());
+                ps.executeUpdate();
+                return true;
+            } catch (Exception e) {
+                log.log(Level.SEVERE, "Chyba při ukládání historie.", e);
+                return false;
+            } finally {
+                zavri(db, ps, rs);
+            }
+        }
+    }
+
+    public VysledekSQL nactiHistorii(Uzivatel uzivatel) {
+        VysledekSQL v = new VysledekSQL();
+
+
+        Tabulka t = new Tabulka();
+        String[] zahlavi = {"Kdy", "SQL příkaz"};
+        t.setZahlavi(zahlavi);
+
+
+        Connection db = getSpojeni(DATABAZE.APLIKACE);
+        if (db == null) {
+            v.getHlasky().add(new Hlaska("Došlo k chybě spojení.", Typ.Chyba));
+        } else {
+            PreparedStatement ps = null;
+            ResultSet rs = null;
+            try {
+                ps = db.prepareStatement(getSQL(SQL.NACTI));
+                ps.setString(1, uzivatel.getIdSezeni());
+                rs = ps.executeQuery();
+
+                while (rs.next()) {
+                    Timestamp datum = rs.getTimestamp("datum");
+                    String sql = rs.getString("sql");
+                    Object[] hodnoty = {datum, sql};
+                    t.getHodnoty().add(hodnoty);
+                }
+
+                if (t.getHodnoty().size() < 1) {
+                    v.getHlasky().add(new Hlaska("Historie SQL příkazů nenalezena.", Typ.Varovani));
+                } else {
+                    v.getTabulky().add(t);
+                }
+
+            } catch (Exception e) {
+                log.log(Level.SEVERE, "Chyba při ukládání historie.", e);
+                v.getHlasky().add(new Hlaska("Došlo k chybě dotazu.", Typ.Chyba));
+            } finally {
+                zavri(db, ps, rs);
+            }
+        }
+
+        v.getHlasky().add(new Hlaska(tipy.getTip(), Typ.Tip, false));
+        return v;
+    }
+}
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.sql.xml
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.sql.xml	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/HistorieDAO.sql.xml	(revision 16:9acb74ac7346)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+    <entry key="NACTI">
+        <![CDATA[
+        SELECT * FROM historie WHERE id_sezeni = ?
+        ]]>
+    </entry>
+    <entry key="ULOZ">
+        <![CDATA[
+        INSERT INTO historie (sql, id_sezeni, ip_adresa) VALUES (?,?,?)
+        ]]>
+    </entry>
+</properties>
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/PiskovisteDAO.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/PiskovisteDAO.java	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/PiskovisteDAO.java	(revision 16:9acb74ac7346)
@@ -0,0 +1,91 @@
+package cz.frantovo.sql.vyuka.dao;
+
+import cz.frantovo.sql.vyuka.dao.VyukaSuperDAO.DATABAZE;
+import cz.frantovo.sql.vyuka.dto.Hlaska;
+import cz.frantovo.sql.vyuka.dto.Hlaska.Typ;
+import cz.frantovo.sql.vyuka.dto.Tabulka;
+import cz.frantovo.sql.vyuka.dto.Uzivatel;
+import cz.frantovo.sql.vyuka.dto.VysledekSQL;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.logging.Level;
+
+/**
+ * Pro spouštění uživatelových příkazů.
+ * @author fiki
+ */
+public class PiskovisteDAO extends VyukaSuperDAO {
+
+    TipyDAO tipy = new TipyDAO();
+    HistorieDAO historie = new HistorieDAO();
+
+    public VysledekSQL vykonejSQL(String sql, Uzivatel uzivatel) {
+        VysledekSQL v = new VysledekSQL();
+        if (historie.ulozPrikaz(sql, uzivatel)) {
+
+
+
+
+
+
+            Tabulka t = new Tabulka();
+
+
+
+            Connection db = getSpojeni(DATABAZE.PISKOVISTE);
+            if (db == null) {
+                v.getHlasky().add(new Hlaska("Došlo k chybě spojení.", Typ.Chyba));
+            } else {
+                PreparedStatement ps = null;
+                ResultSet rs = null;
+                try {
+                    ps = db.prepareStatement(sql);
+                    rs = ps.executeQuery();
+
+                    int pocetSloupecku = rs.getMetaData().getColumnCount();
+                    String[] zahlavi = new String[pocetSloupecku];
+                    t.setZahlavi(zahlavi);
+                    for (int i = 0; i < pocetSloupecku; i++) {
+                        zahlavi[i] = rs.getMetaData().getColumnName(i + 1);
+                    }
+
+                    while (rs.next()) {
+                        Object[] hodnoty = new Object[pocetSloupecku];
+                        for (int i = 0; i < pocetSloupecku; i++) {
+                            hodnoty[i] = rs.getObject(i + 1);
+                        }
+                        t.getHodnoty().add(hodnoty);
+                    }
+
+                    if (t.getHodnoty().size() > 0 && pocetSloupecku > 0) {
+
+                        v.getTabulky().add(t);
+                    } else {
+                        v.getHlasky().add(new Hlaska("SQL příkaz byl proveden.", Typ.OK));
+                    }
+
+                } catch (SQLException e) {
+                    log.log(Level.SEVERE, "SQL chyba při vykonávání uživatelského dotazu.", e);
+                    v.getHlasky().add(new Hlaska("Chybné SQL: " + e.getMessage(), Typ.Chyba));
+                } catch (Exception e) {
+                    log.log(Level.SEVERE, "Chyba při vykonávání uživatelského dotazu.", e);
+                    v.getHlasky().add(new Hlaska("Došlo k chybě dotazu.", Typ.Chyba));
+                } finally {
+                    zavri(db, ps, rs);
+                }
+            }
+
+            v.getHlasky().add(new Hlaska(tipy.getTip(), Typ.Tip, false));
+
+
+
+
+
+        } else {
+            v.getHlasky().add(new Hlaska("Došlo k chybě historie.", Typ.Chyba));
+        }
+        return v;
+    }
+}
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/TipyDAO.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/TipyDAO.java	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/TipyDAO.java	(revision 16:9acb74ac7346)
@@ -0,0 +1,13 @@
+package cz.frantovo.sql.vyuka.dao;
+
+/**
+ *
+ * @author fiki
+ */
+public class TipyDAO extends VyukaSuperDAO {
+
+    public String getTip() {
+        /** TODO: Tipy brát z databáze. */
+        return "Stejně vám něco <a href=\"http://frantovo.cz/blog/\">doporučíme</a>.";
+    }
+}
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.java	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.java	(revision 16:9acb74ac7346)
@@ -0,0 +1,57 @@
+package cz.frantovo.sql.vyuka.dao;
+
+import cz.frantovo.superDAO.SuperDAO;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.logging.Level;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+
+/**
+ *
+ * @author fiki
+ */
+public class VyukaSuperDAO extends SuperDAO {
+
+    protected InitialContext kontext = null;
+
+    protected enum DATABAZE {
+
+        /** Databáze aplikace – historie, nastavení. */
+        APLIKACE,
+        /** Databáze, na které se spouštějí příkazy uživatelů. */
+        PISKOVISTE
+    }
+
+    public VyukaSuperDAO() {
+        try {
+            kontext = new InitialContext();
+        } catch (NamingException ex) {
+            log.log(Level.SEVERE, "Chyba při inicializaci kontextu", ex);
+        }
+    }
+
+    /**
+     * @param databaze Která databáze (aplikace = historie a nastavení | pískoviště = příkazy uživatele)
+     * @return Databázové spojení
+     */
+    protected Connection getSpojeni(DATABAZE databaze) {
+        if (databaze == null) {
+            databaze = DATABAZE.PISKOVISTE;
+        }
+        log.log(Level.SEVERE, "DATABAZE:" + String.valueOf(databaze));
+        String jndi = orizniJNDI(getVlastnost(databaze, VyukaSuperDAO.class));
+        DataSource zdroj = null;
+        try {
+            zdroj = (DataSource) kontext.lookup(jndi);
+            return zdroj.getConnection();
+        } catch (NamingException ex) {
+            log.log(Level.SEVERE, "getSpojeni: lookup", ex);
+            return null;
+        } catch (SQLException ex) {
+            log.log(Level.SEVERE, "getSpojeni: sql", ex);
+            return null;
+        }
+    }
+}
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.xml
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.xml	(revision 16:9acb74ac7346)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/VyukaSuperDAO.xml	(revision 16:9acb74ac7346)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+    <entry key="APLIKACE">jdbc/sqlVyuka/aplikace</entry>
+    <entry key="PISKOVISTE">jdbc/sqlVyuka/piskoviste</entry>
+</properties>
Index: java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java
===================================================================
--- java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java	(revision 13:96e711f3ef48)
+++ java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dto/Tabulka.java	(revision 16:9acb74ac7346)
@@ -71,7 +71,3 @@
         return hodnoty;
     }
-
-    public void setHodnoty(Collection<Object[]> hodnoty) {
-        this.hodnoty = hodnoty;
-    }
 }
