SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

176 lines
5.8 KiB

package de.superx.bin;
import java.io.IOException;
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 org.xml.sax.SAXException;
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("<xupdate>") > -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();
Document doc = XMLUtils.buildDocumentFromString(content, false);
Statement stm = con.createStatement();
stm.execute("create temp table tmp_once(col1 integer)");
stm.execute("insert into tmp_once values (1)");
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 += "HINWEIS: Kein Inhalt für " + table + " " + field + " " + where
+ (XMLUtils.getChildNodeValues(n).trim().equals("")
? " (vor CDATA kein Leerzeichen o Umbruch!)"
: "")
+ "<br> ";
} 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", "<![CDATA[");
fieldcontent = StringUtils.replace(fieldcontent, "CDATAEND", "]]>");
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() + ")<br>" + comment;
} catch (SQLException e) {
throw new SQLException("Fehler bei " + sql + "\n" + e);
} catch (SAXException e) {
e.printStackTrace();
throw new SQLException("XML konnte nicht verarbeitet werden: " + e);
} catch (IOException e) {
e.printStackTrace();
throw new SQLException("IO-Fehler: " + 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);
stm.execute(sql);
}
}
}
static class ExceptionHandler2 extends ExceptionHandler {
private Throwable e = null;
public void clear() {
e = null;
}
@Override
public void handle(String txt, Throwable e) {
this.e = e;
}
public boolean hasException() {
return e != null;
}
public Throwable getException() {
return e;
}
}
}