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
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; |
|
} |
|
} |
|
}
|
|
|