in src/main/java/com/aliyun/odps/jdbc/utils/ConnectionResource.java [247:549]
void init(Properties info, Map<String, String> paramsInURL) {
List<Map> maps = new ArrayList<Map>();
if (paramsInURL.get(ODPS_CONF_URL_KEY) != null) {
try {
InputStream inputStream = new FileInputStream(paramsInURL.get(ODPS_CONF_URL_KEY));
if (inputStream != null) {
Properties props = new Properties();
props.load(inputStream);
maps.add(props);
}
} catch (IOException e) {
throw new RuntimeException("Load odps conf failed:", e);
}
} else {
maps.add(info);
maps.add(paramsInURL);
}
accessId = tryGetFirstNonNullValueByAltMapAndAltKey(
maps, null, ACCESS_ID_PROP_KEY_ALT, ACCESS_ID_PROP_KEY, ACCESS_ID_URL_KEY);
accessKey = tryGetFirstNonNullValueByAltMapAndAltKey(
maps, null, ACCESS_KEY_PROP_KEY_ALT, ACCESS_KEY_PROP_KEY, ACCESS_KEY_URL_KEY);
if (accessKey != null) {
try {
accessKey = URLDecoder.decode(accessKey, CHARSET_DEFAULT_VALUE);
} catch (UnsupportedEncodingException e) {
accessKey = URLDecoder.decode(accessKey);
}
}
useInstanceTunnel = Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", USE_INSTANCE_TUNNEL_PROP_KEY,
USE_INSTANCE_TUNNEL_URL_KEY));
charset =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, CHARSET_DEFAULT_VALUE, CHARSET_PROP_KEY,
CHARSET_URL_KEY);
project =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, PROJECT_PROP_KEY, PROJECT_URL_KEY);
executeProject =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, EXECUTE_PROJECT_PROP_KEY,
EXECUTE_PROJECT_URL_KEY);
logview =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, LOGVIEW_HOST_PROP_KEY,
LOGVIEW_URL_KEY);
tunnelEndpoint =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, TUNNEL_ENDPOINT_PROP_KEY,
TUNNEL_ENDPOINT_URL_KEY);
tunnelRetryTime = Integer.parseInt(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "6", TUNNEL_RESULT_RETRY_TIME_PROP_KEY,
TUNNEL_RESULT_RETRY_TIME_URL_KEY)
);
logConfFile =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, LOG_CONF_FILE_PROP_KEY,
LOG_CONF_FILE_URL_KEY);
interactiveMode = Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", INTERACTIVE_MODE_PROP_KEY,
INTERACTIVE_MODE_URL_KEY));
interactiveServiceName =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, INTERACTIVE_SERVICE_NAME_DEFAULT_VALUE,
SERVICE_NAME_PROP_KEY,
SERVICE_NAME_URL_KEY);
majorVersion =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, MAJOR_VERSION_PROP_KEY,
MAJOR_VERSION_URL_KEY);
enableOdpsLogger = Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", ENABLE_ODPS_LOGGER_PROP_KEY,
ENABLE_ODPS_LOGGER_URL_KEY)
);
fallbackPolicy.fallback4ResourceNotEnough(Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_RESOURCE_PROP_KEY,
FALLBACK_FOR_RESOURCE_URL_KEY)
));
fallbackPolicy.fallback4RunningTimeout(Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_TIMEOUT_PROP_KEY,
FALLBACK_FOR_TIMEOUT_URL_KEY)
));
fallbackPolicy.fallback4Upgrading(Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_UPGRADING_PROP_KEY,
FALLBACK_FOR_UPGRADING_URL_KEY)
));
fallbackPolicy.fallback4UnsupportedFeature(Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_UNSUPPORTED_PROP_KEY,
FALLBACK_FOR_UNSUPPORTED_URL_KEY)
));
fallbackPolicy.fallback4UnknownError(Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "true", FALLBACK_FOR_UNKNOWN_PROP_KEY,
FALLBACK_FOR_UNKNOWN_URL_KEY)
));
boolean alwaysFallback = Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", ALWAYS_FALLBACK_PROP_KEY,
ALWAYS_FALLBACK_URL_KEY)
);
if (alwaysFallback) {
fallbackPolicy = FallbackPolicy.alwaysFallbackPolicy();
}
boolean disableFallback = Boolean.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", DISABLE_FALLBACK_PROP_KEY,
DISABLE_FALLBACK_URL_KEY)
);
if (disableFallback) {
fallbackPolicy = FallbackPolicy.nonFallbackPolicy();
}
fallbackQuota =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, FALLBACK_QUOTA_PROP_KEY, FALLBACK_QUOTA_URL_KEY);
stsToken =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, STS_TOKEN_PROP_KEY, STS_TOKEN_URL_KEY);
autoSelectLimit = Long.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", AUTO_SELECT_LIMIT_PROP_KEY,
AUTO_SELECT_LIMIT_URL_KEY)
);
countLimit = Long.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", INSTANCE_TUNNEL_MAX_RECORD_PROP_KEY,
INSTANCE_TUNNEL_MAX_RECORD_URL_KEY)
);
if (countLimit <= 0L) {
countLimit = null;
}
sizeLimit = Long.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", INSTANCE_TUNNEL_MAX_SIZE_PROP_KEY,
INSTANCE_TUNNEL_MAX_SIZE_URL_KEY)
);
if (sizeLimit <= 0L) {
sizeLimit = null;
}
attachTimeout = Long.valueOf(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", ATTACH_TIMEOUT_PROP_KEY,
ATTACH_TIMEOUT_URL_KEY)
);
if (attachTimeout <= 0L) {
attachTimeout = null;
}
disableConnSetting = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
maps, "false", DISABLE_CONN_SETTING_PROP_KEY, DISABLE_CONN_SETTING_URL_KEY)
);
useProjectTimeZone = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
maps, "false", USE_PROJECT_TIME_ZONE_PROP_KEY, USE_PROJECT_TIME_ZONE_URL_KEY)
);
enableLimit = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
maps, "true", ENABLE_LIMIT_PROP_KEY, ENABLE_LIMIT_URL_KEY)
);
readTimeout =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, READ_TIMEOUT_DEFAULT_VALUE, READ_TIMEOUT_PROP_KEY, READ_TIMEOUT_URL_KEY);
connectTimeout =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, CONNECT_TIMEOUT_DEFAULT_VALUE, CONNECT_TIMEOUT_PROP_KEY, CONNECT_TIMEOUT_URL_KRY);
tunnelReadTimeout =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, READ_TIMEOUT_DEFAULT_VALUE, TUNNEL_READ_TIMEOUT_PROP_KEY, TUNNEL_READ_TIMEOUT_URL_KEY);
tunnelConnectTimeout =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, CONNECT_TIMEOUT_DEFAULT_VALUE, TUNNEL_CONNECT_TIMEOUT_PROP_KEY, TUNNEL_CONNECT_TIMEOUT_URL_KRY);
String tunnelDownloadUseSingleReaderStr = tryGetFirstNonNullValueByAltMapAndAltKey(
maps, "true", TUNNEL_DOWNLOAD_USE_SINGLE_READER_PROP_KEY, TUNNEL_DOWNLOAD_USE_SINGLE_READER_URL_KEY);
checkValueIsValidBoolean(TUNNEL_DOWNLOAD_USE_SINGLE_READER_URL_KEY, tunnelDownloadUseSingleReaderStr);
tunnelDownloadUseSingleReader = Boolean.parseBoolean(tunnelDownloadUseSingleReaderStr);
// cancel enableLimit hint if autoSelectLimit turns on
if (autoSelectLimit > 0) {
enableLimit = false;
}
autoLimitFallback = Boolean.parseBoolean(tryGetFirstNonNullValueByAltMapAndAltKey(
maps, "false", AUTO_FALLBACK_PROP_KEY, AUTO_LIMIT_FALLBACK_URL_KEY));
enableCommandApi =
Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", ENABLE_COMMAND_API_PROP_KEY,
ENABLE_COMMAND_API_URL_KEY));
httpsCheck = Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", HTTPS_CHECK_PROP_KEY,
HTTPS_CHECK_URL_KEY));
skipSqlRewrite = Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", SKIP_SQL_REWRITE_PROP_KEY,
SKIP_SQL_REWRITE_URL_KEY));
skipSqlInjectCheck = Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", SKIP_SQL_INJECT_CHECK_PROP_KEY,
SKIP_SQL_INJECT_CHECK_URL_KEY));
retryTime = Integer.parseInt(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", RETRY_TIME_PROP_KEY, RETRY_TIME_URL_KEY)
);
logLevel = tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, LOG_LEVEL_PROP_KEY, LOG_LEVEL_URL_KEY);
quotaName = tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, QUOTA_NAME_PROP_KEY, QUOTA_NAME_URL_KEY);
verbose =
Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", VERBOSE_PROP_KEY,
VERBOSE_PROP_KEY));
async =
Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "async", ASYNC_PROP_KEY,
ASYNC_PROP_KEY));
timeZone =
tryGetFirstNonNullValueByAltMapAndAltKey(maps, null, TIME_ZONE_URL_KEY,
TIME_ZONE_URL_KEY);
fetchResultSplitSize =
Long.parseLong(tryGetFirstNonNullValueByAltMapAndAltKey(maps, "10000", FETCH_RESULT_SPLIT_SIZE, FETCH_RESULT_SPLIT_SIZE));
fetchResultPreloadSplitNum =
Integer.parseInt(tryGetFirstNonNullValueByAltMapAndAltKey(maps, "5", FETCH_RESULT_PRELOAD_SPLIT_NUM, FETCH_RESULT_PRELOAD_SPLIT_NUM));
fetchResultThreadNum = Integer.parseInt(tryGetFirstNonNullValueByAltMapAndAltKey(maps, "5", FETCH_RESULT_THREAD_NUM, FETCH_RESULT_THREAD_NUM));
logviewVersion = Integer.parseInt(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "1", LOGVIEW_VERSION_PROP_KEY, LOGVIEW_VERSION_URL_KEY)
);
skipCheckIfSelect =
Boolean.parseBoolean(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "false", SKIP_CHECK_IF_SELECT,
SKIP_CHECK_IF_SELECT));
longJobWarningThreshold = Long.parseLong(
tryGetFirstNonNullValueByAltMapAndAltKey(maps, "-1", LONG_JOB_WARNING_THRESHOLD, LONG_JOB_WARNING_THRESHOLD)
);
// odpsNamespaceSchema in url or prop | odps.namespace.schema in settings | odpsNamespaceSchema field
// key not exists | not set | null
// true/false | true/false | true/false
String odpsNamespaceSchemaStr = tryGetFirstNonNullValueByAltMapAndAltKey(
maps, null, ODPS_NAMESPACE_SCHEMA_PROP_KEY, ODPS_NAMESPACE_SCHEMA_URL_KEY);
checkValueIsValidBoolean(ODPS_NAMESPACE_SCHEMA_URL_KEY, odpsNamespaceSchemaStr);
// not set => use tenant flag in sql
// set true/false => use set value as session flag
if (odpsNamespaceSchemaStr != null) {
odpsNamespaceSchema = Boolean.parseBoolean(odpsNamespaceSchemaStr);
settings.put("odps.namespace.schema", odpsNamespaceSchemaStr);
}
schema = tryGetFirstNonNullValueByAltMapAndAltKey(
maps, null, SCHEMA_PROP_KEY, SCHEMA_URL_KEY);
if (schema != null) {
if (odpsNamespaceSchema == null) {
odpsNamespaceSchema = true;
settings.put("odps.namespace.schema", "true");
} else if (odpsNamespaceSchema == false) {
throw new RuntimeException("ERROR: connection config invalid: schema can not be set when odpsNamespaceSchema=false");
}
settings.put("odps.default.schema", schema);
}
// The option 'tableList' accepts table names in pattern:
// <project name>.<table name>(,<project name>.<table name>)*
//
// This option is used to accelerate table loading. For a project contains thousands of tables,
// BI software such as Tableau may load all the tables when the software starts and it could
// take several minutes before the user could really start using it. To avoid this situation,
// users could specify the table names they are going to use and the driver will only load
// these tables.
String tablesStr = tryGetFirstNonNullValueByAltMapAndAltKey(
maps, null, TABLE_LIST_PROP_KEY, TABLE_LIST_URL_KEY);
String[] reusedParts = new String[3];
if (!StringUtils.isNullOrEmpty(tablesStr)) {
for (String tableStr : tablesStr.split(",")) {
String[] parts = tableStr.split("\\.");
if (parts.length == 2) {
reusedParts[0] = parts[0];
reusedParts[1] = null;
reusedParts[2] = parts[1];
} else if (parts.length == 3) {
reusedParts = parts;
} else {
throw new IllegalArgumentException("Invalid table name: " + tableStr);
}
tables.computeIfAbsent(reusedParts[0], p -> new HashMap<>());
tables.get(reusedParts[0]).computeIfAbsent(reusedParts[1], p -> new LinkedList<>());
tables.get(reusedParts[0]).get(reusedParts[1]).add(reusedParts[2]);
}
}
String globalSettingsInJson = tryGetFirstNonNullValueByAltMapAndAltKey(
maps, null, SETTINGS_URL_KEY, SETTINGS_PROP_KEY);
if (globalSettingsInJson != null) {
Type type = new TypeToken<Map<String, String>>() {
}.getType();
settings.putAll(GsonObjectBuilder.get().fromJson(globalSettingsInJson, type));
}
}