From df738df6c1458f7ebb5361243f5bf4519322db9a Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Fri, 22 Jul 2011 20:04:21 +0000 Subject: [PATCH] SQOOP-125. Allow user to specify database type. This fix allows the user to optionally specify the connection manager class to be used, instead of inferring it from the connection string. From: Ahmed Radwan git-svn-id: https://svn.apache.org/repos/asf/incubator/sqoop/trunk@1149993 13f79535-47bb-0310-9956-ffa450edef68 --- src/docs/man/common-args.txt | 3 +++ src/docs/user/common-args.txt | 1 + src/docs/user/help.txt | 1 + src/docs/user/tools.txt | 1 + src/java/com/cloudera/sqoop/SqoopOptions.java | 11 ++++++++++ .../sqoop/manager/DefaultManagerFactory.java | 22 +++++++++++++++++++ .../cloudera/sqoop/tool/BaseSqoopTool.java | 10 +++++++++ 7 files changed, 49 insertions(+) diff --git a/src/docs/man/common-args.txt b/src/docs/man/common-args.txt index cd9c04c1..f53bc22e 100644 --- a/src/docs/man/common-args.txt +++ b/src/docs/man/common-args.txt @@ -23,6 +23,9 @@ Database connection and common options --connect (jdbc-uri):: Specify JDBC connect string (required) +--connect-manager (class-name):: + Specify connection manager class name (optional) + --driver (class-name):: Manually specify JDBC driver class to use diff --git a/src/docs/user/common-args.txt b/src/docs/user/common-args.txt index 390f2c77..4efd6c8b 100644 --- a/src/docs/user/common-args.txt +++ b/src/docs/user/common-args.txt @@ -22,6 +22,7 @@ Argument Description --------------------------------------------------------------------- +\--connect + Specify JDBC connect string ++\--connect-manager + Specify connection manager class to use +\--driver + Manually specify JDBC driver class to use +\--hadoop-home + Override $HADOOP_HOME +\--help+ Print usage instructions diff --git a/src/docs/user/help.txt b/src/docs/user/help.txt index 3b8aceb5..089986a9 100644 --- a/src/docs/user/help.txt +++ b/src/docs/user/help.txt @@ -65,6 +65,7 @@ usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS] Common arguments: --connect Specify JDBC connect string + --connect-manager Specify connection manager class to use --driver Manually specify JDBC driver class to use --hadoop-home Override $HADOOP_HOME --help Print usage instructions diff --git a/src/docs/user/tools.txt b/src/docs/user/tools.txt index cdcc2661..633d8129 100644 --- a/src/docs/user/tools.txt +++ b/src/docs/user/tools.txt @@ -123,6 +123,7 @@ usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS] Common arguments: --connect Specify JDBC connect string + --connect-manager Specify connection manager class to use --driver Manually specify JDBC driver class to use --hadoop-home Override $HADOOP_HOME --help Print usage instructions diff --git a/src/java/com/cloudera/sqoop/SqoopOptions.java b/src/java/com/cloudera/sqoop/SqoopOptions.java index edf95930..a9209dff 100644 --- a/src/java/com/cloudera/sqoop/SqoopOptions.java +++ b/src/java/com/cloudera/sqoop/SqoopOptions.java @@ -224,6 +224,9 @@ public enum IncrementalMode { // a temporary holding area for compilation work done by this process. private static String curNonce; + // the connection manager fully qualified class name + private String connManagerClassName; + public SqoopOptions() { initDefaults(null); } @@ -1586,5 +1589,13 @@ public String getMergeKeyCol() { return this.mergeKeyCol; } + public void setConnManagerClassName(String connManagerClass) { + this.connManagerClassName = connManagerClass; + } + + public String getConnManagerClassName() { + return connManagerClassName; + } + } diff --git a/src/java/com/cloudera/sqoop/manager/DefaultManagerFactory.java b/src/java/com/cloudera/sqoop/manager/DefaultManagerFactory.java index 84a9d5a3..d989f2c5 100644 --- a/src/java/com/cloudera/sqoop/manager/DefaultManagerFactory.java +++ b/src/java/com/cloudera/sqoop/manager/DefaultManagerFactory.java @@ -18,6 +18,8 @@ package com.cloudera.sqoop.manager; +import java.lang.reflect.Constructor; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -42,6 +44,26 @@ public ConnManager accept(JobData data) { return new GenericJdbcManager(manualDriver, options); } + if (null != options.getConnManagerClassName()){ + String className = options.getConnManagerClassName(); + ConnManager connManager = null; + try { + Class cls = (Class) Class.forName(className); + Constructor constructor = + cls.getDeclaredConstructor(SqoopOptions.class); + connManager = constructor.newInstance(options); + } catch (Exception e) { + System.err + .println("problem finding the connection manager for class name :" + + className); + // Log the stack trace for this exception + LOG.debug(e.getMessage(), e); + // Print exception message. + System.err.println(e.getMessage()); + } + return connManager; + } + String connectStr = options.getConnectString(); // java.net.URL follows RFC-2396 literally, which does not allow a ':' diff --git a/src/java/com/cloudera/sqoop/tool/BaseSqoopTool.java b/src/java/com/cloudera/sqoop/tool/BaseSqoopTool.java index 9ebd34cd..72f31191 100644 --- a/src/java/com/cloudera/sqoop/tool/BaseSqoopTool.java +++ b/src/java/com/cloudera/sqoop/tool/BaseSqoopTool.java @@ -62,6 +62,8 @@ public abstract class BaseSqoopTool extends SqoopTool { // use consistently. The argument parser applies the leading '--' to each // string. public static final String CONNECT_STRING_ARG = "connect"; + public static final String CONN_MANAGER_CLASS_NAME = + "connection-manager"; public static final String DRIVER_ARG = "driver"; public static final String USERNAME_ARG = "username"; public static final String PASSWORD_ARG = "password"; @@ -329,6 +331,10 @@ protected RelatedOptions getCommonOptions() { .hasArg().withDescription("Specify JDBC connect string") .withLongOpt(CONNECT_STRING_ARG) .create()); + commonOpts.addOption(OptionBuilder.withArgName("conn-manager-class-name") + .hasArg().withDescription("Specify connection manager class name") + .withLongOpt(CONN_MANAGER_CLASS_NAME) + .create()); commonOpts.addOption(OptionBuilder.withArgName("class-name") .hasArg().withDescription("Manually specify JDBC driver class to use") .withLongOpt(DRIVER_ARG) @@ -558,6 +564,10 @@ protected void applyCommonOptions(CommandLine in, SqoopOptions out) out.setConnectString(in.getOptionValue(CONNECT_STRING_ARG)); } + if (in.hasOption(CONN_MANAGER_CLASS_NAME)) { + out.setConnManagerClassName(in.getOptionValue(CONN_MANAGER_CLASS_NAME)); + } + if (in.hasOption(DRIVER_ARG)) { out.setDriverClassName(in.getOptionValue(DRIVER_ARG)); }