Author: reschke
Date: Thu Sep 17 12:16:11 2015
New Revision: 1703592

URL: http://svn.apache.org/r1703592
Log:
OAK-3414: RDBDocumentStore: improve DB2 diagnostics

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionWrapper.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java?rev=1703592&r1=1703591&r2=1703592&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
 Thu Sep 17 12:16:11 2015
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.io.Closeable;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -146,6 +147,19 @@ public class RDBConnectionHandler implem
         return this.ds == null;
     }
 
+    /**
+     * Return current schema name or {@code null} when unavailable
+     */
+    @CheckForNull
+    public String getSchema(Connection c) {
+        try {
+            return (String) c.getClass().getMethod("getSchema").invoke(c);
+        } catch (Throwable ex) {
+            // ignored, it's really best effort
+            return null;
+        }
+    }
+
     @Override
     public void close() throws IOException {
         this.ds = null;

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java?rev=1703592&r1=1703591&r2=1703592&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
 Thu Sep 17 12:16:11 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.rdb;
 
+import java.lang.reflect.InvocationTargetException;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.PreparedStatement;
@@ -28,6 +29,7 @@ import java.util.List;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
+import javax.sql.DataSource;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -117,14 +119,25 @@ public enum RDBDocumentStoreDB {
             Map<String, String> result = new HashMap<String, String>();
             try {
                 con = ch.getROConnection();
-                // we can't look up by schema as con.getSchema is JDK 1.7
-                stmt = con
-                        .prepareStatement("SELECT CODEPAGE, COLLATIONSCHEMA, 
COLLATIONNAME, TABSCHEMA FROM SYSCAT.COLUMNS WHERE COLNAME=? and COLNO=0 AND 
UPPER(TABNAME)=UPPER(?)");
+
+                // schema name will only be available with JDK 1.7
+                String conSchema = ch.getSchema(con);
+
+                StringBuilder sb = new StringBuilder();
+                sb.append("SELECT CODEPAGE, COLLATIONSCHEMA, COLLATIONNAME, 
TABSCHEMA FROM SYSCAT.COLUMNS WHERE COLNAME=? and COLNO=0 AND 
UPPER(TABNAME)=UPPER(?)");
+                if (conSchema != null) {
+                    conSchema = conSchema.trim();
+                    sb.append(" AND UPPER(TABSCHEMA)=UPPER(?)");
+                }
+                stmt = con.prepareStatement(sb.toString());
                 stmt.setString(1, "ID");
                 stmt.setString(2, tableName);
+                if (conSchema != null) {
+                    stmt.setString(3, conSchema);
+                }
+
                 rs = stmt.executeQuery();
                 while (rs.next() && result.size() < 20) {
-                    // thus including the schema name here
                     String schema = rs.getString("TABSCHEMA").trim();
                     result.put(schema + ".CODEPAGE", 
rs.getString("CODEPAGE").trim());
                     result.put(schema + ".COLLATIONSCHEMA", 
rs.getString("COLLATIONSCHEMA").trim());

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionWrapper.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionWrapper.java?rev=1703592&r1=1703591&r2=1703592&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionWrapper.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionWrapper.java
 Thu Sep 17 12:16:11 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.rdb;
 
+import java.lang.reflect.InvocationTargetException;
 import java.sql.Array;
 import java.sql.Blob;
 import java.sql.CallableStatement;
@@ -168,7 +169,19 @@ public class RDBConnectionWrapper implem
     // needed in Java 7...
     @SuppressWarnings("unused")
     public String getSchema() throws SQLException {
-        throw new SQLFeatureNotSupportedException();
+        try {
+            return (String) 
connection.getClass().getMethod("getSchema").invoke(connection);
+        } catch (InvocationTargetException ex) {
+            if (ex.getCause() instanceof SQLException) {
+                throw (SQLException) ex.getCause();
+            } else {
+                // best effort otherwise
+                return null;
+            }
+        } catch (Throwable ex) {
+            // best effort otherwise
+            return null;
+        }
     }
 
     public int getTransactionIsolation() throws SQLException {


Reply via email to