package de.superx.bin; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.logging.Logger; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import de.memtext.util.ExceptionHandler; import de.memtext.util.StringUtils; import de.memtext.util.XMLUtils; import de.superx.common.DBServletException; public class XUpdater { /** * TODO Idee war einbau in SXSQLServer.executeAll aber Problem temp tables * sind im preparedstatement nicht bekannt müsste für Batchmode auch * angepasst werden if (sqlstmt.indexOf("") > -1) { try { * XUpdater.execute(mandantenID, sqlstmt); } catch (DBServletException e) { * errorstring = e.toString(); e.printStackTrace(); } } else { * * @param mandantenID * @param content * @param databaseAbbr * PG/IDS * @return * @throws SQLException * @throws DBServletException */ public String execute(Connection con, String databaseAbbr, String content, Logger logger) throws SQLException { String sql=""; String comment = ""; try { content = content.trim(); // Altlast ExceptionHandler old = XMLUtils.getExceptionHandler(); ExceptionHandler2 newE = new ExceptionHandler2(); XMLUtils.setExceptionHandler(newE); Document doc = XMLUtils.buildDocumentFromString(content, false); if (doc == null) { XMLUtils.setExceptionHandler(old); throw new IllegalArgumentException("Ungültiges XML Dokument"); } if (newE.hasException()) { XMLUtils.setExceptionHandler(old); throw new IllegalArgumentException("Ungültiges XML Dokument" + newE.getException()); } Statement stm = con.createStatement(); stm.execute("create temp table tmp_once(col1 integer)"); stm.execute("insert into tmp_once values (1)"); sql="Einzel-SQL"; executeSqlList("sql",databaseAbbr, logger,doc, stm); NodeList list2 = doc.getElementsByTagName("text"); for (int i = 0; i < list2.getLength(); i++) { Node n = list2.item(i); String table = XMLUtils.getAttribValue(n, "table"); String field = XMLUtils.getAttribValue(n, "field"); String where = XMLUtils.getAttribValue(n, "where"); // getChildNodeValues -- Inhalt aller Unterknoten, weil \n vor // CDATA als eigener Knoten interpretiert werden kann if (!XMLUtils.hasValue(n) || XMLUtils.getChildNodeValues(n).trim().equals("")) { comment += "NOTIZ: Kein Inhalt für " + table + " " + field + " " + where + (XMLUtils.getChildNodeValues(n).trim().equals("") ? " (vor CDATA kein Leerzeichen o Umbruch!)" : "") + "
"; } else { String fieldcontent = XMLUtils.getChildNodeValues(n); if (fieldcontent.equals("null")) { sql="update " + table + " set " + field + "=null where " + where; stm.executeUpdate(sql); } else { fieldcontent = StringUtils.replace(fieldcontent, "CDATASTART", ""); sql="update " + table + " set " + field + "=? where " + where; PreparedStatement pst = con.prepareStatement(sql); pst.setString(1, fieldcontent); pst.executeUpdate(); pst.close(); } } } NodeList list3 = doc.getElementsByTagName("themenbaum"); for (int i = 0; i < list3.getLength(); i++) { Node n = list3.item(i); String maskentid = XMLUtils.getAttribValue(n, "maskentid"); String knoten = XMLUtils.getAttribValue(n, "parentname"); sql = "create temp table tmp_themenbaum (tid serial, name char(255) not null, maskeninfo_id integer, parent integer, gueltig_seit date, gueltig_bis date, erlaeuterung char(240)); \n"; stm.executeUpdate(sql); sql = "insert into tmp_themenbaum (tid,name,maskeninfo_id,gueltig_seit,gueltig_bis) select max(T.tid)+1, M.name, " + maskentid + ", date_val('01.01.1900'), date_val('01.01.3000') from maskeninfo M, themenbaum T where M.tid=" + maskentid + "::integer group by 2,3,4,5 ;\n"; stm.executeUpdate(sql); sql = "update tmp_themenbaum set parent=(select tid from themenbaum where name='" + knoten + "'); \n"; stm.executeUpdate(sql); sql = "insert into themenbaum (tid,name,maskeninfo_id,parent,gueltig_seit,gueltig_bis) select tid,name,maskeninfo_id,parent,gueltig_seit,gueltig_bis from tmp_themenbaum; \n"; stm.executeUpdate(sql); sql = "drop table tmp_themenbaum"; stm.executeUpdate(sql); } // postsql executeSqlList("postsql",databaseAbbr, logger, doc, stm); sql="drop table tmp_once"; stm.executeUpdate(sql); stm.close(); con.close(); comment = "Keine Fehler aufgefallen ("+de.memtext.util.DateUtils.getNowString()+")
" + comment; } catch (SQLException e) { throw new SQLException("Fehler bei "+sql+"\n"+e); } return comment; } /** * @param databaseAbbr * @param logger * @param sql * @param doc * @param stm * @return * @throws SQLException */ private void executeSqlList(String sqlElem,String databaseAbbr, Logger logger, Document doc, Statement stm) throws SQLException { String sql; NodeList list = doc.getElementsByTagName(sqlElem); for (int i = 0; i < list.getLength(); i++) { Node n = list.item(i); String database = ""; if (XMLUtils.hasAttrib(n, "database")) database = XMLUtils.getAttribValue(n, "database"); if (database != null && !database.equals("") && !database.equals("PG") && !database.equals("IDS")) throw new IllegalArgumentException( "als database-Attribut hier nur PG oder IDS erlaubt"); if (database.equals("")||database.equals(databaseAbbr)) { sql = XMLUtils.getTheValue(n); logger.log(Level.FINER, " execute SQL from XUpdater:" + sql); try { stm.execute(sql); } catch (Exception e) { throw new SQLException("Fehler bei SQL:"+sql); } } } } static class ExceptionHandler2 extends ExceptionHandler { private Throwable e = null; public void clear() { e = null; } public void handle(String txt, Throwable e) { this.e = e; } public boolean hasException() { return e != null; } public Throwable getException() { return e; } } }