package de.open4me.depot.sql;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import de.open4me.depot.abruf.utils.Utils;
import de.willuhn.jameica.hbci.HBCI;
import de.willuhn.jameica.hbci.server.AbstractDBSupportImpl;
import de.willuhn.jameica.hbci.server.DBSupportH2Impl;
import de.willuhn.jameica.hbci.server.DBSupportMySqlImpl;
import de.willuhn.jameica.hbci.server.HBCIDBServiceImpl;
import de.willuhn.jameica.system.Application;
import de.willuhn.logging.Logger;
import de.willuhn.util.ApplicationException;
public class SQLUtils {
private static AbstractDBSupportImpl driver = null;
public static Connection getConnection() throws Exception {
if (driver == null) {
HBCIDBServiceImpl db = (HBCIDBServiceImpl) Application.getServiceFactory().lookup(HBCI.class,"database");
driver = (AbstractDBSupportImpl) db.getDriver();
}
String url = driver.getJdbcUrl();
if (driver instanceof de.willuhn.jameica.hbci.server.DBSupportMySqlImpl) {
url += "&useServerPrepStmts=false&rewriteBatchedStatements=true";
}
return DriverManager.getConnection(url, driver.getJdbcUsername(), driver.getJdbcPassword());
}
public static int delete(GenericObjectSQL obj) {
int val = 0;
Connection conn = null;
try {
Utils.markRecalc(null);
conn = getConnection();
String sql = "DELETE FROM " + obj.getTable() + " WHERE " + obj.getIdfeld() + "=?";
PreparedStatement prest = conn.prepareStatement(sql);
prest.setString(1, obj.getID());
val = prest.executeUpdate();
conn.close();
} catch (Exception e) {
Logger.error("Fehler beim Löschen", e);
if (conn != null) {
try {
conn.close();
} catch (SQLException e1) {
}
}
}
return val;
}
public static List<GenericObjectSQL> getResultSet(String query, String table, String idfeld) {
return getResultSet(query, table, idfeld, idfeld);
}
public static List<GenericObjectSQL> getResultSet(PreparedStatement statement, String table, String idfeld, String pa) {
List<GenericObjectSQL> list = new ArrayList<GenericObjectSQL>();
try {
ResultSet ret = statement.executeQuery();
while (ret.next()) {
list.add(new GenericObjectSQL(idfeld, pa, table, ret));
}
} catch (Exception e) {
Logger.error("Fehler bei der SQL Anweisung: " + statement.toString(), e);
}
return list;
}
public static List<GenericObjectSQL> getResultSet(String query, String table, String idfeld, String pa) {
List<GenericObjectSQL> list = new ArrayList<GenericObjectSQL>();
Connection conn = null;
try {
conn = getConnection();
Statement statement = conn.createStatement();
ResultSet ret = statement.executeQuery(query);
while (ret.next()) {
list.add(new GenericObjectSQL(idfeld, pa, table, ret));
}
conn.close();
} catch (Exception e) {
Logger.error("Fehler bei der SQL Anweisung: " + query, e);
if (conn != null) {
try {
conn.close();
} catch (SQLException e1) {
}
}
}
return list;
}
public static void saveCfg(String key, String value) throws Exception {
PreparedStatement pre = getPreparedSQL("insert into depotviewer_cfg (key, value) values (?,?)");
pre.setString(1, key);
pre.setString(2, value);
pre.executeUpdate();
}
public static String getCfg(String key) {
try {
PreparedStatement pre = SQLUtils.getPreparedSQL("select value from depotviewer_cfg where `key`=?");
pre.setString(1, key);
ResultSet ret = pre.executeQuery();
if (!ret.next()) {
return null;
}
return ret.getString(1);
} catch (Exception e) {
Logger.error("Fehler beim Zugriff auf cfg", e);
e.printStackTrace();
return null;
}
}
private static int getCurrentDBVersion() {
int version = -1;
Connection conn = null;
try {
conn = getConnection();
Statement statement = conn.createStatement();
ResultSet ret = statement.executeQuery("select value from depotviewer_cfg where `key`='dbversion'");
ret.next();
version = Integer.parseInt(ret.getString(1));
conn.close();
} catch (Exception e) {
Logger.error("Fehler beim der Bestimmung der dbversion des DeportViewers", e);
if (conn != null) {
try {
conn.close();
} catch (SQLException e1) {
}
}
}
return version;
}
/**
* Liefert das erste Objekt der ersten Zeile zurück.
*
* Falls die Query überhaupt kein Ergebnisse zurückliefert hat, wird null zurückgeliefert
*
* @param statement
* @return
*/
public static Object getObject(PreparedStatement statement) {
Connection conn = null;
Object obj = null;
try {
conn = getConnection();
ResultSet ret = statement.executeQuery();
if (!ret.next()) {
return null;
}
obj = ret.getObject(1);
conn.close();
} catch (Exception e) {
Logger.error("Fehler beim Query", e);
if (conn != null) {
try {
conn.close();
} catch (SQLException e1) {
}
}
}
return obj;
}
public static void checkforupdates() throws ApplicationException {
List<SQLChange> liste = SQLChange.getChangesSinceVersion(getCurrentDBVersion());
Connection conn = null;
try {
for (SQLChange changeset : liste) {
Logger.info("Depot-Viewer: Updating DB to " + changeset.getVersion());
conn = getConnection();
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
for (String query : changeset.getQuery()) {
statement.execute(query);
}
statement.execute("update depotviewer_cfg set value = " + changeset.getVersion() + " where `key`='dbversion'");
conn.commit();
conn.close();
}
} catch (Exception e) {
Logger.error("Fehler bei Aktualisierung der Datenbank", e);
if (conn != null) {
try {
conn.rollback();
conn.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
throw new ApplicationException(e);
}
}
public static String getDateDiff(String value1, String value2) throws ApplicationException {
if (driver instanceof DBSupportH2Impl) {
return "datediff('day'," + value1 + ", "+value2+")";
}
if (driver instanceof DBSupportMySqlImpl) {
return "datediff(" + value1 + ", "+value2+")";
}
throw new ApplicationException("Unbekannte Datenbank " + driver.getClass().getName());
}
public static void exec(String sql) throws ApplicationException {
try {
HBCIDBServiceImpl db = (HBCIDBServiceImpl) Application.getServiceFactory().lookup(HBCI.class,"database");
AbstractDBSupportImpl driver = (AbstractDBSupportImpl) db.getDriver();
Connection conn = DriverManager.getConnection(driver.getJdbcUrl(), driver.getJdbcUsername(), driver.getJdbcPassword());
Statement statement = conn.createStatement();
statement.execute(sql);
conn.close();
} catch (Exception e) {
Logger.error("Fehler beim der Ausführung: " + sql, e);
throw new ApplicationException(e);
}
}
public static PreparedStatement getPreparedSQL(String query) throws Exception {
Connection conn = SQLUtils.getConnection();
PreparedStatement prest = conn.prepareStatement(query);
return prest;
}
public static String addTop(int i, String string) throws ApplicationException {
if (driver instanceof DBSupportH2Impl) {
return string.replace("select ", "select top " + i);
}
if (driver instanceof DBSupportMySqlImpl) {
return string + " limit " + i;
}
throw new ApplicationException("Unbekannte Datenbank " + driver.getClass().getName());
}
public static Date getSQLDate(java.util.Date d) {
return new java.sql.Date(d.getTime());
}
}