franta-hg@16: package cz.frantovo.sql.vyuka.dao; franta-hg@16: franta-hg@16: import cz.frantovo.sql.vyuka.dao.VyukaSuperDAO.DATABAZE; franta-hg@16: import cz.frantovo.sql.vyuka.dto.Hlaska; franta-hg@16: import cz.frantovo.sql.vyuka.dto.Hlaska.Typ; franta-hg@16: import cz.frantovo.sql.vyuka.dto.Tabulka; franta-hg@16: import cz.frantovo.sql.vyuka.dto.Uzivatel; franta-hg@16: import cz.frantovo.sql.vyuka.dto.VysledekSQL; franta-hg@16: import java.sql.Connection; franta-hg@16: import java.sql.PreparedStatement; franta-hg@16: import java.sql.ResultSet; franta-hg@16: import java.sql.SQLException; franta-hg@16: import java.util.logging.Level; franta-hg@16: franta-hg@16: /** franta-hg@16: * Pro spouštění uživatelových příkazů. franta-hg@16: * @author fiki franta-hg@16: */ franta-hg@16: public class PiskovisteDAO extends VyukaSuperDAO { franta-hg@16: franta-hg@18: private enum VLASTNOSTI { franta-hg@18: franta-hg@18: VYCHOZI_CESTA franta-hg@18: } franta-hg@16: TipyDAO tipy = new TipyDAO(); franta-hg@16: HistorieDAO historie = new HistorieDAO(); franta-hg@16: franta-hg@16: public VysledekSQL vykonejSQL(String sql, Uzivatel uzivatel) { franta-hg@16: VysledekSQL v = new VysledekSQL(); franta-hg@16: if (historie.ulozPrikaz(sql, uzivatel)) { franta-hg@16: franta-hg@16: Connection db = getSpojeni(DATABAZE.PISKOVISTE); franta-hg@16: if (db == null) { franta-hg@16: v.getHlasky().add(new Hlaska("Došlo k chybě spojení.", Typ.Chyba)); franta-hg@16: } else { franta-hg@16: PreparedStatement ps = null; franta-hg@16: ResultSet rs = null; franta-hg@16: try { franta-hg@18: /** franta-hg@19: * Uživatelskému SQL příkazu předřadíme výchozí cestu (search_path). franta-hg@18: * Protože uživatelé si ji mohou měnit a kvůli recyklaci databázových zdrojů franta-hg@18: * by jeden uživatel mohl ovlivnit jiného. franta-hg@18: */ franta-hg@18: if (getVlastnost(VLASTNOSTI.VYCHOZI_CESTA) != null) { franta-hg@18: sql = orizni(getVlastnost(VLASTNOSTI.VYCHOZI_CESTA)) + sql; franta-hg@18: } franta-hg@18: franta-hg@30: long casPred = System.currentTimeMillis(); franta-hg@16: ps = db.prepareStatement(sql); franta-hg@17: boolean isRS = ps.execute(); franta-hg@16: franta-hg@17: if (isRS) { franta-hg@17: rs = ps.getResultSet(); franta-hg@17: v.getTabulky().add(zpracujVysledek(rs)); franta-hg@18: } franta-hg@16: franta-hg@51: /** franta-hg@51: * Ošetříme případ, kdy uživatel zadá SQL příkaz, který nevrací výsledkovou sadu. franta-hg@51: * Typicky nastavení výchozího schématu: SET search_path = '…'; franta-hg@53: * Poznámka: jeden „SET search_path TO "…"“ se obvykle předřazuje uživatelskému SQL (viz PiskovisteDAO.xml). franta-hg@52: */ franta-hg@52: while (ps.getMoreResults() || ps.getUpdateCount() > -1) { franta-hg@18: rs = ps.getResultSet(); franta-hg@51: if (rs == null) { franta-hg@52: /** Jedná se o „update count“. */ franta-hg@51: } else { franta-hg@51: v.getTabulky().add(zpracujVysledek(rs)); franta-hg@51: } franta-hg@18: } franta-hg@30: long dobaProvadeni = System.currentTimeMillis() - casPred; franta-hg@18: franta-hg@18: /** Varování */ franta-hg@18: if (v.getHlasky().size() < 1 && v.getTabulky().size() < 1) { franta-hg@18: v.getHlasky().add(new Hlaska("SQL příkaz proběhl, ale nevrátil žádná data.", Typ.Varovani)); franta-hg@18: } franta-hg@18: franta-hg@18: /** Varování */ franta-hg@18: int pocitadloTabulek = 1; franta-hg@18: for (Tabulka t : v.getTabulky()) { franta-hg@18: if (t.getHodnoty().size() < 1) { franta-hg@18: v.getHlasky().add(new Hlaska("Tabulka " + pocitadloTabulek + " je prázdná.", Typ.Varovani)); franta-hg@16: } franta-hg@18: pocitadloTabulek++; franta-hg@16: } franta-hg@16: franta-hg@30: v.getHlasky().add(new Hlaska("SQL příkaz byl proveden úspěšně, během " + dobaProvadeni + " ms.", Typ.OK)); franta-hg@18: franta-hg@16: } catch (SQLException e) { franta-hg@16: log.log(Level.SEVERE, "SQL chyba při vykonávání uživatelského dotazu.", e); franta-hg@16: v.getHlasky().add(new Hlaska("Chybné SQL: " + e.getMessage(), Typ.Chyba)); franta-hg@16: } catch (Exception e) { franta-hg@16: log.log(Level.SEVERE, "Chyba při vykonávání uživatelského dotazu.", e); franta-hg@16: v.getHlasky().add(new Hlaska("Došlo k chybě dotazu.", Typ.Chyba)); franta-hg@16: } finally { franta-hg@16: zavri(db, ps, rs); franta-hg@16: } franta-hg@16: } franta-hg@16: franta-hg@44: /** Tip pro uživatele */ franta-hg@44: String tip = tipy.getTip(); franta-hg@44: if (tip != null) { franta-hg@44: v.getHlasky().add(new Hlaska(tip, Typ.Tip, false)); franta-hg@44: } franta-hg@16: franta-hg@16: } else { franta-hg@16: v.getHlasky().add(new Hlaska("Došlo k chybě historie.", Typ.Chyba)); franta-hg@16: } franta-hg@16: return v; franta-hg@16: } franta-hg@17: franta-hg@17: private Tabulka zpracujVysledek(ResultSet rs) throws SQLException { franta-hg@17: Tabulka t = new Tabulka(); franta-hg@17: franta-hg@17: int pocetSloupecku = rs.getMetaData().getColumnCount(); franta-hg@17: String[] zahlavi = new String[pocetSloupecku]; franta-hg@17: t.setZahlavi(zahlavi); franta-hg@17: for (int i = 0; i < pocetSloupecku; i++) { franta-hg@17: zahlavi[i] = rs.getMetaData().getColumnName(i + 1); franta-hg@17: } franta-hg@17: franta-hg@17: while (rs.next()) { franta-hg@17: Object[] hodnoty = new Object[pocetSloupecku]; franta-hg@17: for (int i = 0; i < pocetSloupecku; i++) { franta-hg@17: hodnoty[i] = rs.getObject(i + 1); franta-hg@17: } franta-hg@17: t.getHodnoty().add(hodnoty); franta-hg@17: } franta-hg@17: franta-hg@17: return t; franta-hg@17: } franta-hg@16: }