[Schmitzm-commits] r1730 - trunk/schmitzm-core/src/main/java/de/schmitzm/postgres
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Sun Sep 25 11:52:02 CEST 2011
Author: alfonx
Date: 2011-09-25 11:52:01 +0200 (Sun, 25 Sep 2011)
New Revision: 1730
Modified:
trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java
Log:
Index NEU-erstellung kann bei addINdex in PGUtil jettz erzwungen werden...
Modified: trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java
===================================================================
--- trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java 2011-09-24 14:14:32 UTC (rev 1729)
+++ trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java 2011-09-25 09:52:01 UTC (rev 1730)
@@ -13,14 +13,15 @@
import de.schmitzm.lang.LangUtil;
/**
- * Hilfsmethoden für PostgreSQL. Die Dependency soll nur {@link Connection} sein. In Hibernate kann über #doWork eine
- * {@link Connection} erhalten werden.
+ * Hilfsmethoden für PostgreSQL. Die Dependency soll nur {@link Connection}
+ * sein. In Hibernate kann über #doWork eine {@link Connection} erhalten werden.
*/
public class PGUtil {
static final Logger log = Logger.getLogger(PGUtil.class);
/**
- * PostgreSQL Privilegien die per Grant einer Tabelle zugeordnet werden können.<br/>
+ * PostgreSQL Privilegien die per Grant einer Tabelle zugeordnet werden
+ * können.<br/>
*
* @see http://www.postgresql.org/docs/9.1/static/sql-grant.html
*/
@@ -88,8 +89,8 @@
}
/**
- * Querys the <code>geometry_columns</code> table is part of every POSTGIS installation and must/should describe the
- * geometry columns and tables.
+ * Querys the <code>geometry_columns</code> table is part of every POSTGIS
+ * installation and must/should describe the geometry columns and tables.
*/
static public String[] getColumnsDescribedInGeometryColumnsTable(Statement s) {
String[] columns = new String[0];
@@ -131,8 +132,8 @@
/**
* @param binding
* Eine "einfache" Javaklasse, die in PG abgebildet werden soll.
- * @return einen PG-spezifischen Datentypenamen für einen Javatyp zurück, z.b. "double precision" für
- * <code>Double.class</code>
+ * @return einen PG-spezifischen Datentypenamen für einen Javatyp zurück,
+ * z.b. "double precision" für <code>Double.class</code>
*/
public static String getColTypeName(Class<?> binding) {
@@ -163,7 +164,8 @@
}
/**
- * Liefert <code>true</code> wenn ein Schema mit dem Namen in der PG Datenbank existiert.
+ * Liefert <code>true</code> wenn ein Schema mit dem Namen in der PG
+ * Datenbank existiert.
*/
public static boolean existsSchema(Connection c, String schemaname) throws SQLException {
String sql = "select 1 from pg_catalog.pg_namespace where nspname = '" + schemaname.toLowerCase() + "'";
@@ -177,7 +179,8 @@
}
/**
- * Liefert eine Liste der Rollen in denen der Übergebenen USER (Login role) ist. <br/>
+ * Liefert eine Liste der Rollen in denen der Übergebenen USER (Login role)
+ * ist. <br/>
* Tested with PG 8.4
*/
public static List<String> listRolesForUser(Connection c, String username) throws SQLException {
@@ -214,8 +217,8 @@
}
/**
- * Liste aller Tabellennamen in diesem Schema, ohne die Schemaangabe im Namen. (Also 'anreden' und nicht
- * 'public.anreden') <br/>
+ * Liste aller Tabellennamen in diesem Schema, ohne die Schemaangabe im
+ * Namen. (Also 'anreden' und nicht 'public.anreden') <br/>
* Tested with PG 8.4
*
* @param schemaname
@@ -293,7 +296,9 @@
* @param name
* z.B.: keckformel wird dann zu keckformel()
* @param plCommands
- * z.B. NEW.kpk_kreis = NEW.risiko_soz+NEW.risiko_emo+NEW.risiko_moti +NEW.risiko_spr+NEW.risiko_wohl;
+ * z.B. NEW.kpk_kreis =
+ * NEW.risiko_soz+NEW.risiko_emo+NEW.risiko_moti
+ * +NEW.risiko_spr+NEW.risiko_wohl;
* @throws SQLException
*/
public static void createOrReplaceFunction(Connection c, String name, String plCommands) throws SQLException {
@@ -329,18 +334,20 @@
* @param idxNamePostfix
* e.g. 'idx1'
* @param unique
- * <code>true</code> if the columns are unique. A UNIQUE INDEX will be created.
+ * <code>true</code> if the columns are unique. A UNIQUE INDEX
+ * will be created.
*/
public static void addIndex(Connection c, final String tableName, final String columns, String idxPostfix,
final boolean unique) throws SQLException {
- addIndex(c, tableName, columns, idxPostfix, unique, null);
+ addIndex(c, tableName, columns, idxPostfix, unique, null, false);
}
/**
- * Liefert eine Liste aller Indexnamen die für eine Tabelle existieren. Der Tabellenname wird mit <code>like</code>
- * verglichen, darf also <code>%</code> enthalten.<br/>
- * Achtung: Diese abfrage ist nicht Schema-Spezifisch. Eine schema. Angabe vor dem tabellennamen wird automatisch
- * entfernt.
+ * Liefert eine Liste aller Indexnamen die für eine Tabelle existieren. Der
+ * Tabellenname wird mit <code>like</code> verglichen, darf also
+ * <code>%</code> enthalten.<br/>
+ * Achtung: Diese abfrage ist nicht Schema-Spezifisch. Eine schema. Angabe
+ * vor dem tabellennamen wird automatisch entfernt.
*/
public static List<String> listIndexesForTable(Connection c, String tableName) throws SQLException {
Statement s = c.createStatement();
@@ -374,20 +381,60 @@
* @param idxNamePostfix
* e.g. 'idx1'
* @param unique
- * <code>true</code> if the columns are unique. A UNIQUE INDEX will be created.
+ * <code>true</code> if the columns are unique. A UNIQUE INDEX
+ * will be created.
* @param tablespace
- * <code>null</code> oder der name des tablespace in dem der Index liegen soll.
+ * <code>null</code> oder der name des tablespace in dem der
+ * Index liegen soll.
+ * @param forceRecreationIfExistsAlready
+ * wenn <code>true</code> dann werden der Index vorher gedroppt
+ * falls er exisitert.
*/
public static void addIndex(Connection c, final String tableName, final String columns, String idxPostfix,
- final boolean unique, String tablespace) throws SQLException {
+ final boolean unique, String tablespace, boolean forceRecreationIfExistsAlready) throws SQLException {
final String idxName = (tableName + "_" + idxPostfix).replace(".", "_");
// Wenn der Tablename ein Schema mit "schema.name" enthält, dann liefert
- // listIndexesForTable hier ein schema_table im Index-Namen zurück.
+ // listIndexesForTable hier ein schema_table im Index-Namen zurück. Der
+ // "." wird also zu einem "_"
for (String existIdxName : listIndexesForTable(c, tableName)) {
- if (existIdxName.equalsIgnoreCase(idxName.replaceFirst("\\.", "_")))
+ if (existIdxName.equalsIgnoreCase(idxName.replaceFirst("\\.", "_"))) {
// Existiert bereits.
- return;
+
+ if (!forceRecreationIfExistsAlready)
+ return;
+
+ log.info("Aufgrund von forceRecreationIfExistsAlready=true wird der Index " + idxName
+ + " jetzt gedroppt.");
+
+ Statement s = c.createStatement();
+
+ // Hier die Schreibweise mit . für schematrennung verwenden
+ final String queryString = "DROP INDEX " + idxName + " ON " + tableName + " (" + columns + ") "
+ + (tablespace == null ? "" : " TABLESPACE " + tablespace);
+ try {
+ s.execute(queryString);
+ c.commit();
+ log.debug("Index dropped: " + queryString);
+ } catch (SQLException e) {
+ c.rollback();
+ Throwable cause = e;
+ if (e.getCause() != null)
+ cause = e.getCause();
+
+ // keine Ausgabe bei: already EXISTs, EXISTiert
+ // bereits,
+ // ...
+ // Ex abfangen, wenn IDX schon existiert
+
+ String msg = cause.getMessage();
+ log.error(e.getLocalizedMessage(), e);
+ return;
+ }
+
+ break;
+
+ }
}
Statement s = c.createStatement();
@@ -421,8 +468,8 @@
}
/**
- * Fügt einen Benutzer zu einer Rolle hinzu. Wenn der benutzer bereits in der Rolle enthalten ist, wird keine
- * Exception geschmisssen.
+ * Fügt einen Benutzer zu einer Rolle hinzu. Wenn der benutzer bereits in
+ * der Rolle enthalten ist, wird keine Exception geschmisssen.
*
* @throws SQLException
*/
@@ -431,8 +478,9 @@
}
/**
- * Der : (Doppelpunkt) hat in PSQL eine besondere Bedeutung. Er wind mit dieser methode escaped. Diese Methode
- * sollte mit <code>like E'"+PGUtil.escape(...)+"'</code> verwendet werden.
+ * Der : (Doppelpunkt) hat in PSQL eine besondere Bedeutung. Er wind mit
+ * dieser methode escaped. Diese Methode sollte mit
+ * <code>like E'"+PGUtil.escape(...)+"'</code> verwendet werden.
*/
public static String escape(String key) {
key = key.replaceAll(":", "\\:");
@@ -445,25 +493,30 @@
* @param c
* DB-Verbindung
* @param dbName
- * Name der Datenbank fuer die die Sessions gezaehlt werden (kann {@code null} sein)
+ * Name der Datenbank fuer die die Sessions gezaehlt werden (kann
+ * {@code null} sein)
* @param userName
- * Name des Users fuer den die Sessions gezaehlt werden (kann {@code null} sein)
+ * Name des Users fuer den die Sessions gezaehlt werden (kann
+ * {@code null} sein)
*/
public static int getOpenSessionCount(Connection c, String dbName, String userName) throws SQLException {
return getOpenSessionCount(c, dbName, userName, null);
}
-
+
/**
* Liefert die Anzahl der offenen Sessions zur Datenbank.
*
* @param c
* DB-Verbindung
* @param dbName
- * Name der Datenbank fuer die die Sessions gezaehlt werden (kann {@code null} sein)
+ * Name der Datenbank fuer die die Sessions gezaehlt werden (kann
+ * {@code null} sein)
* @param userName
- * Name des Users fuer den die Sessions gezaehlt werden (kann {@code null} sein)
+ * Name des Users fuer den die Sessions gezaehlt werden (kann
+ * {@code null} sein)
* @param queryLike
- * like-Beindung auf die Query die in der Session ausgeführt wird, oder <code>null</code>
+ * like-Beindung auf die Query die in der Session ausgeführt
+ * wird, oder <code>null</code>
*/
public static int getOpenSessionCount(Connection c, String dbName, String userName, String queryLike)
throws SQLException {
More information about the Schmitzm-commits
mailing list