[Schmitzm-commits] r1694 - trunk/schmitzm-core/src/main/java/de/schmitzm/geotools/postgres

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon Aug 29 14:04:38 CEST 2011


Author: alfonx
Date: 2011-08-29 14:04:38 +0200 (Mon, 29 Aug 2011)
New Revision: 1694

Modified:
   trunk/schmitzm-core/src/main/java/de/schmitzm/geotools/postgres/PGUtil.java
Log:
* Neue Methode um Indexes einer Tabelle aufzuz?\195?\164hlen.  * Neue Indexes werden nur erstellt,w enn ein gleichnamiger Index noch nicht existiert => Spart eine Exception im Log pro Index.

Modified: trunk/schmitzm-core/src/main/java/de/schmitzm/geotools/postgres/PGUtil.java
===================================================================
--- trunk/schmitzm-core/src/main/java/de/schmitzm/geotools/postgres/PGUtil.java	2011-08-26 16:28:04 UTC (rev 1693)
+++ trunk/schmitzm-core/src/main/java/de/schmitzm/geotools/postgres/PGUtil.java	2011-08-29 12:04:38 UTC (rev 1694)
@@ -346,10 +346,34 @@
 	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);
 	}
 
 	/**
+	 * Liefert eine Liste aller Indexnamen die für eine Tabelle existieren. Der
+	 * Tabellenname wird mit <code>like</code> verglichen, darf also
+	 * <code>%</code> enthalten.
+	 */
+	public static List<String> listIndexesForTable(Connection c,
+			String tableName) throws SQLException {
+		Statement s = c.createStatement();
+
+		List<String> idxes = new ArrayList<String>();
+
+		String sql = "select t.relname as table_name, i.relname as index_name, array_to_string(array_agg(a.attname), ', ') as column_names from pg_class t, pg_class i, pg_index ix, pg_attribute a where t.oid = ix.indrelid and i.oid = ix.indexrelid and a.attrelid = t.oid and a.attnum = ANY(ix.indkey) and t.relkind = 'r' and t.relname like '"
+				+ tableName
+				+ "' group by t.relname, i.relname order by t.relname, i.relname; ";
+
+		ResultSet rs = s.executeQuery(sql);
+		while (rs.next()) {
+			idxes.add(rs.getString(2));
+		}
+
+		return idxes;
+
+	}
+
+	/**
 	 * @param tableName
 	 *            e.g. 'inseratabfragen_kvps'
 	 * @param columns
@@ -368,8 +392,13 @@
 			String tablespace) throws SQLException {
 		final String idxName = (tableName + "_" + idxPostfix).replace(".", "_");
 
+		if (listIndexesForTable(c, tableName).contains(idxName)) {
+			// Existiert bereits.
+			return;
+		}
+
 		Statement s = c.createStatement();
-		// TODO DROP FIRST?
+
 		final String queryString = "CREATE " + (unique ? "UNIQUE " : "")
 				+ "INDEX " + idxName + " ON " + tableName + " (" + columns
 				+ ") "
@@ -405,7 +434,8 @@
 	/**
 	 * Fügt einen Benutzer zu einer Rolle hinzu. Wenn der benutzer bereits in
 	 * der Rolle enthalten ist, wird keine Exception geschmisssen.
-	 * @throws SQLException 
+	 * 
+	 * @throws SQLException
 	 */
 	public static void grantRoleToUser(Connection c, String rolename,
 			String username) throws SQLException {



More information about the Schmitzm-commits mailing list