java/sql-vyuka/src/java/cz/frantovo/sql/vyuka/dao/PiskovisteDAO.java
author František Kučera <franta-hg@frantovo.cz>
Sat May 30 01:26:29 2009 +0200 (2009-05-30)
changeset 18 e7a5763c789c
parent 17 08cd160ec1c6
child 19 2ffdd7be6d5e
permissions -rw-r--r--
Lokalizace v HTML (tlačítka), nastavení search_path proměnné.
franta-hg@16
     1
package cz.frantovo.sql.vyuka.dao;
franta-hg@16
     2
franta-hg@16
     3
import cz.frantovo.sql.vyuka.dao.VyukaSuperDAO.DATABAZE;
franta-hg@16
     4
import cz.frantovo.sql.vyuka.dto.Hlaska;
franta-hg@16
     5
import cz.frantovo.sql.vyuka.dto.Hlaska.Typ;
franta-hg@16
     6
import cz.frantovo.sql.vyuka.dto.Tabulka;
franta-hg@16
     7
import cz.frantovo.sql.vyuka.dto.Uzivatel;
franta-hg@16
     8
import cz.frantovo.sql.vyuka.dto.VysledekSQL;
franta-hg@16
     9
import java.sql.Connection;
franta-hg@16
    10
import java.sql.PreparedStatement;
franta-hg@16
    11
import java.sql.ResultSet;
franta-hg@16
    12
import java.sql.SQLException;
franta-hg@16
    13
import java.util.logging.Level;
franta-hg@16
    14
franta-hg@16
    15
/**
franta-hg@16
    16
 * Pro spouštění uživatelových příkazů.
franta-hg@16
    17
 * @author fiki
franta-hg@16
    18
 */
franta-hg@16
    19
public class PiskovisteDAO extends VyukaSuperDAO {
franta-hg@16
    20
franta-hg@18
    21
    private enum VLASTNOSTI {
franta-hg@18
    22
franta-hg@18
    23
        VYCHOZI_CESTA
franta-hg@18
    24
    }
franta-hg@16
    25
    TipyDAO tipy = new TipyDAO();
franta-hg@16
    26
    HistorieDAO historie = new HistorieDAO();
franta-hg@16
    27
franta-hg@16
    28
    public VysledekSQL vykonejSQL(String sql, Uzivatel uzivatel) {
franta-hg@16
    29
        VysledekSQL v = new VysledekSQL();
franta-hg@16
    30
        if (historie.ulozPrikaz(sql, uzivatel)) {
franta-hg@16
    31
franta-hg@16
    32
            Connection db = getSpojeni(DATABAZE.PISKOVISTE);
franta-hg@16
    33
            if (db == null) {
franta-hg@16
    34
                v.getHlasky().add(new Hlaska("Došlo k chybě spojení.", Typ.Chyba));
franta-hg@16
    35
            } else {
franta-hg@16
    36
                PreparedStatement ps = null;
franta-hg@16
    37
                ResultSet rs = null;
franta-hg@16
    38
                try {
franta-hg@18
    39
                    /**
franta-hg@18
    40
                     * Uživatelskému SQL příkazu předřadíme výchozí cestu.
franta-hg@18
    41
                     * Protože uživatelé si ji mohou měnit a kvůli recyklaci databázových zdrojů
franta-hg@18
    42
                     * by jeden uživatel mohl ovlivnit jiného.
franta-hg@18
    43
                     */
franta-hg@18
    44
                    if (getVlastnost(VLASTNOSTI.VYCHOZI_CESTA) != null) {
franta-hg@18
    45
                        sql = orizni(getVlastnost(VLASTNOSTI.VYCHOZI_CESTA)) + sql;
franta-hg@18
    46
                    }
franta-hg@18
    47
franta-hg@16
    48
                    ps = db.prepareStatement(sql);
franta-hg@17
    49
                    boolean isRS = ps.execute();
franta-hg@16
    50
franta-hg@17
    51
                    if (isRS) {
franta-hg@17
    52
                        rs = ps.getResultSet();
franta-hg@17
    53
                        v.getTabulky().add(zpracujVysledek(rs));
franta-hg@18
    54
                    }
franta-hg@16
    55
franta-hg@18
    56
                    /** TODO: ošetřit případ, kdy vykonáme dva příkazy bez výsledkové sady a třetí příkaz ji už má (teď se nezobrazí výsledná tabulka). */
franta-hg@18
    57
                    while (ps.getMoreResults()) {
franta-hg@18
    58
                        rs = ps.getResultSet();
franta-hg@18
    59
                        v.getTabulky().add(zpracujVysledek(rs));
franta-hg@18
    60
                    }
franta-hg@18
    61
franta-hg@18
    62
                    /** Varování */
franta-hg@18
    63
                    if (v.getHlasky().size() < 1 && v.getTabulky().size() < 1) {
franta-hg@18
    64
                        v.getHlasky().add(new Hlaska("SQL příkaz proběhl, ale nevrátil žádná data.", Typ.Varovani));
franta-hg@18
    65
                    }
franta-hg@18
    66
franta-hg@18
    67
                    /** Varování */
franta-hg@18
    68
                    int pocitadloTabulek = 1;
franta-hg@18
    69
                    for (Tabulka t : v.getTabulky()) {
franta-hg@18
    70
                        if (t.getHodnoty().size() < 1) {
franta-hg@18
    71
                            v.getHlasky().add(new Hlaska("Tabulka " + pocitadloTabulek + "  je prázdná.", Typ.Varovani));
franta-hg@16
    72
                        }
franta-hg@18
    73
                        pocitadloTabulek++;
franta-hg@16
    74
                    }
franta-hg@16
    75
franta-hg@18
    76
franta-hg@16
    77
                } catch (SQLException e) {
franta-hg@16
    78
                    log.log(Level.SEVERE, "SQL chyba při vykonávání uživatelského dotazu.", e);
franta-hg@16
    79
                    v.getHlasky().add(new Hlaska("Chybné SQL: " + e.getMessage(), Typ.Chyba));
franta-hg@16
    80
                } catch (Exception e) {
franta-hg@16
    81
                    log.log(Level.SEVERE, "Chyba při vykonávání uživatelského dotazu.", e);
franta-hg@16
    82
                    v.getHlasky().add(new Hlaska("Došlo k chybě dotazu.", Typ.Chyba));
franta-hg@16
    83
                } finally {
franta-hg@16
    84
                    zavri(db, ps, rs);
franta-hg@16
    85
                }
franta-hg@16
    86
            }
franta-hg@16
    87
franta-hg@16
    88
            v.getHlasky().add(new Hlaska(tipy.getTip(), Typ.Tip, false));
franta-hg@16
    89
franta-hg@16
    90
        } else {
franta-hg@16
    91
            v.getHlasky().add(new Hlaska("Došlo k chybě historie.", Typ.Chyba));
franta-hg@16
    92
        }
franta-hg@16
    93
        return v;
franta-hg@16
    94
    }
franta-hg@17
    95
franta-hg@17
    96
    private Tabulka zpracujVysledek(ResultSet rs) throws SQLException {
franta-hg@17
    97
        Tabulka t = new Tabulka();
franta-hg@17
    98
franta-hg@17
    99
        int pocetSloupecku = rs.getMetaData().getColumnCount();
franta-hg@17
   100
        String[] zahlavi = new String[pocetSloupecku];
franta-hg@17
   101
        t.setZahlavi(zahlavi);
franta-hg@17
   102
        for (int i = 0; i < pocetSloupecku; i++) {
franta-hg@17
   103
            zahlavi[i] = rs.getMetaData().getColumnName(i + 1);
franta-hg@17
   104
        }
franta-hg@17
   105
franta-hg@17
   106
        while (rs.next()) {
franta-hg@17
   107
            Object[] hodnoty = new Object[pocetSloupecku];
franta-hg@17
   108
            for (int i = 0; i < pocetSloupecku; i++) {
franta-hg@17
   109
                hodnoty[i] = rs.getObject(i + 1);
franta-hg@17
   110
            }
franta-hg@17
   111
            t.getHodnoty().add(hodnoty);
franta-hg@17
   112
        }
franta-hg@17
   113
franta-hg@17
   114
        return t;
franta-hg@17
   115
    }
franta-hg@16
   116
}