Updated Branches:
  refs/heads/trunk bbc2c17a7 -> 71638a355

SQOOP-1224: Enable use of Oracle Wallets with Oracle Manager

(Venkat Ranganathan via Jarek Jarcec Cecho)


Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/71638a35
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/71638a35
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/71638a35

Branch: refs/heads/trunk
Commit: 71638a355a95e634b8797cddf2bd94b68a80eee9
Parents: bbc2c17
Author: Jarek Jarcec Cecho <[email protected]>
Authored: Tue Nov 5 14:19:06 2013 -0800
Committer: Jarek Jarcec Cecho <[email protected]>
Committed: Tue Nov 5 14:19:06 2013 -0800

----------------------------------------------------------------------
 .../org/apache/sqoop/manager/OracleManager.java | 65 ++++++++++++++++++--
 .../sqoop/manager/OracleManagerTest.java        | 14 +++++
 2 files changed, 75 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/71638a35/src/java/org/apache/sqoop/manager/OracleManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/sqoop/manager/OracleManager.java 
b/src/java/org/apache/sqoop/manager/OracleManager.java
index f6f3afa..8008831 100644
--- a/src/java/org/apache/sqoop/manager/OracleManager.java
+++ b/src/java/org/apache/sqoop/manager/OracleManager.java
@@ -109,6 +109,13 @@ public class OracleManager
      + "ALL_CONS_COLUMNS.TABLE_NAME = ? AND "
      + "ALL_CONS_COLUMNS.OWNER = ?";
 
+  /**
+   * Query to get the current user for the DB session.   Used in case of
+   * wallet logins.
+   */
+  public static final String QUERY_GET_SESSIONUSER =
+     "SELECT USER FROM DUAL";
+
   // driver class to ensure is loaded when making db connection.
   private static final String DRIVER_CLASS = "oracle.jdbc.OracleDriver";
 
@@ -284,6 +291,7 @@ public class OracleManager
     String password = options.getPassword();
     String connectStr = options.getConnectString();
 
+
     connection = CACHE.getConnection(connectStr, username);
     if (null == connection) {
       // Couldn't pull one from the cache. Get a new one.
@@ -326,6 +334,44 @@ public class OracleManager
     return connection;
   }
 
+  public String getSessionUser(Connection conn) {
+    Statement stmt = null;
+    ResultSet rset = null;
+    String user = null;
+    try {
+      stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+              ResultSet.CONCUR_READ_ONLY);
+      rset = stmt.executeQuery(QUERY_GET_SESSIONUSER);
+
+      if (rset.next()) {
+        user = rset.getString(1);
+      }
+      conn.commit();
+    } catch (SQLException e) {
+      try {
+        conn.rollback();
+      } catch (SQLException ex) {
+        LoggingUtils.logAll(LOG, "Failed to rollback transaction", ex);
+      }
+    } finally {
+      if (rset != null) {
+        try {
+          rset.close();
+        } catch (SQLException ex) {
+          LoggingUtils.logAll(LOG, "Failed to close resultset", ex);
+        }
+      }
+      if (stmt != null) {
+        try {
+          stmt.close();
+        } catch (SQLException ex) {
+          LoggingUtils.logAll(LOG, "Failed to close statement", ex);
+        }
+      }
+    }
+    return user;
+  }
+
   /**
    * Set session time zone.
    * @param conn      Connection object
@@ -677,11 +723,12 @@ public class OracleManager
     PreparedStatement pStmt = null;
     ResultSet rset = null;
     List<String> tables = new ArrayList<String>();
-    String tableOwner = this.options.getUsername();
+    String tableOwner = null;
 
 
     try {
       conn = getConnection();
+      tableOwner = getSessionUser(conn);
       pStmt = conn.prepareStatement(QUERY_LIST_TABLES,
           ResultSet.TYPE_FORWARD_ONLY,
               ResultSet.CONCUR_READ_ONLY);
@@ -862,7 +909,7 @@ public class OracleManager
     ResultSet rset = null;
     List<String> columns = new ArrayList<String>();
 
-    String tableOwner = this.options.getUsername();
+    String tableOwner = null;
     String shortTableName = tableName;
     int qualifierIndex = tableName.indexOf('.');
     if (qualifierIndex != -1) {
@@ -873,6 +920,10 @@ public class OracleManager
     try {
       conn = getConnection();
 
+      if (tableOwner == null) {
+        tableOwner = getSessionUser(conn);
+      }
+
       pStmt = conn.prepareStatement(QUERY_COLUMNS_FOR_TABLE,
                   ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
 
@@ -925,7 +976,7 @@ public class OracleManager
     ResultSet rset = null;
     List<String> columns = new ArrayList<String>();
 
-    String tableOwner = this.options.getUsername();
+    String tableOwner = null;
     String shortTableName = tableName;
     int qualifierIndex = tableName.indexOf('.');
     if (qualifierIndex != -1) {
@@ -936,6 +987,10 @@ public class OracleManager
     try {
       conn = getConnection();
 
+      if (tableOwner == null) {
+        tableOwner = getSessionUser(conn);
+      }
+
       pStmt = conn.prepareStatement(QUERY_PRIMARY_KEY_FOR_TABLE,
                   ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
       pStmt.setString(1, shortTableName);
@@ -948,7 +1003,9 @@ public class OracleManager
       conn.commit();
     } catch (SQLException e) {
       try {
-        conn.rollback();
+        if (conn != null) {
+          conn.rollback();
+        }
       } catch (SQLException ex) {
         LoggingUtils.logAll(LOG, "Failed to rollback transaction", ex);
       }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/71638a35/src/test/com/cloudera/sqoop/manager/OracleManagerTest.java
----------------------------------------------------------------------
diff --git a/src/test/com/cloudera/sqoop/manager/OracleManagerTest.java 
b/src/test/com/cloudera/sqoop/manager/OracleManagerTest.java
index 078b447..396f897 100644
--- a/src/test/com/cloudera/sqoop/manager/OracleManagerTest.java
+++ b/src/test/com/cloudera/sqoop/manager/OracleManagerTest.java
@@ -532,4 +532,18 @@ public class OracleManagerTest extends ImportJobTestCase {
 
     m2.close(); // Close the manager's active connection again.
   }
+
+  public void testSessionUserName() throws Exception {
+    SqoopOptions options = new SqoopOptions(OracleUtils.CONNECT_STRING,
+      TABLE_NAME);
+    OracleUtils.setOracleAuth(options);
+
+    // Create a connection manager and get a connection
+    OracleManager m1 = new OracleManager(options);
+    Connection c1 = m1.getConnection();
+    // Make sure that the session username is the same as the Oracle
+    // sqoop user name
+    String sessionUserName = m1.getSessionUser(c1);
+    assertEquals(OracleUtils.ORACLE_USER_NAME, sessionUserName);
+  }
 }

Reply via email to