All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mariadb.jdbc.internal.util.DefaultOptions Maven / Gradle / Ivy

/*
 *
 * MariaDB Client for Java
 *
 * Copyright (c) 2012-2014 Monty Program Ab.
 * Copyright (c) 2015-2017 MariaDB Ab.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along
 * with this library; if not, write to Monty Program Ab [email protected].
 *
 * This particular MariaDB Client for Java file is work
 * derived from a Drizzle-JDBC. Drizzle-JDBC file which is covered by subject to
 * the following copyright and notice provisions:
 *
 * Copyright (c) 2009-2011, Marcus Eriksson
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright notice, this list
 * of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice, this
 * list of conditions and the following disclaimer in the documentation and/or
 * other materials provided with the distribution.
 *
 * Neither the name of the driver nor the names of its contributors may not be
 * used to endorse or promote products derived from this software without specific
 * prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS  AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 *
 */

package org.mariadb.jdbc.internal.util;

import org.mariadb.jdbc.internal.util.constant.HaMode;

import java.lang.reflect.Field;
import java.util.Properties;

public enum DefaultOptions {

    /**
     * Database user name.
     */
    USER("user", "1.0.0"),
    /**
     * Password of database user.
     */
    PASSWORD("password", "1.0.0"),

    /**
     * The connect timeout value, in milliseconds, or zero for no timeout.
     * Default: 30000 (30 seconds) (was 0 before 2.1.2)
     */
    CONNECT_TIMEOUT("connectTimeout", 30000, 0, "1.1.8"),

    /**
     * On Windows, specify named pipe name to connect to mysqld.exe.
     */
    PIPE("pipe", "1.1.3"),

    /**
     * Allows to connect to database via Unix domain socket, if server allows it. The value is the path of Unix domain socket, i.e "socket"
     * database parameter.
     */
    LOCAL_SOCKET("localSocket", "1.1.4"),

    /**
     * Allowed to connect database via shared memory, if server allows it. The value is base name of the shared memory.
     */
    SHARED_MEMORY("sharedMemory", "1.1.4"),

    /**
     * Sets corresponding option on the connection socket.
     */
    TCP_NO_DELAY("tcpNoDelay", Boolean.TRUE, "1.0.0"),

    /**
     * Sets corresponding option on the connection socket.
     */
    TCP_ABORTIVE_CLOSE("tcpAbortiveClose", Boolean.FALSE, "1.1.1"),

    /**
     * Hostname or IP address to bind the connection socket to a local (UNIX domain) socket.
     */
    LOCAL_SOCKET_ADDRESS("localSocketAddress", "1.1.8"),

    /**
     * Defined the network socket timeout (SO_TIMEOUT) in milliseconds.
     * 0 (default) disable this timeout
     */
    SOCKET_TIMEOUT("socketTimeout", new Integer[]{10000, null, null, null, null, null}, 0, "1.1.8"),

    /**
     * Session timeout is defined by the wait_timeout server variable.
     * Setting interactiveClient to true will tell server to use the interactive_timeout server variable
     */
    INTERACTIVE_CLIENT("interactiveClient", Boolean.FALSE, "1.1.8"),

    /**
     * If set to 'true', exception thrown during query execution contain query string.
     */
    DUMP_QUERY_ON_EXCEPTION("dumpQueriesOnException", Boolean.TRUE, "1.1.0"),

    /**
     * Metadata ResultSetMetaData.getTableName() return the physical table name.
     * "useOldAliasMetadataBehavior" permit to activate the legacy code that send the table alias if set.
     */
    USE_OLD_ALIAS_METADATA_BEHAVIOR("useOldAliasMetadataBehavior", Boolean.FALSE, "1.1.9"),

    /**
     * If set to 'false', exception thrown during LOCAL INFILE if no InputStream has already been set.
     */
    ALLOW_LOCAL_INFILE("allowLocalInfile", Boolean.TRUE, "1.2.1"),

    /**
     * var=value pairs separated by comma, mysql session variables, set upon establishing successful connection.
     */
    SESSION_VARIABLES("sessionVariables", "1.1.0"),

    /**
     * The database precised in url will be created if doesn't exist.
     * (legacy alias "createDB")
     */
    CREATE_DATABASE_IF_NOT_EXISTS("createDatabaseIfNotExist", Boolean.FALSE, "1.1.8"),

    /**
     * Defined the server time zone.
     * to use only if jre server as a different time implementation of the server.
     * (best to have the same server time zone when possible)
     */
    SERVER_TIMEZONE("serverTimezone", "1.1.8"),
    /**
     * DatabaseMetaData use current catalog if null.
     */
    NULL_CATALOG_MEANS_CURRENT("nullCatalogMeansCurrent", Boolean.TRUE, "1.1.8"),

    /**
     * Datatype mapping flag, handle MySQL Tiny as BIT(boolean).
     */
    TINY_INT_IS_BIT("tinyInt1isBit", Boolean.TRUE, "1.0.0"),

    /**
     * Year is date type, rather than numerical.
     */
    YEAR_IS_DATE_TYPE("yearIsDateType", Boolean.TRUE, "1.0.0"),

    /**
     * Force SSL on connection.
     * (legacy alias "useSSL")
     */
    USE_SSL("useSsl", Boolean.FALSE, "1.1.0"),

    /**
     * allow compression in MySQL Protocol.
     */
    USER_COMPRESSION("useCompression", Boolean.FALSE, "1.0.0"),

    /**
     * Allows multiple statements in single executeQuery.
     */
    ALLOW_MULTI_QUERIES("allowMultiQueries", Boolean.FALSE, "1.0.0"),

    /**
     * rewrite batchedStatement to have only one server call.
     */
    REWRITE_BATCHED_STATEMENTS("rewriteBatchedStatements", Boolean.FALSE, "1.1.8"),

    /**
     * Sets corresponding option on the connection socket.
     * Defaults to true since 1.6.0 (false before)
     */
    TCP_KEEP_ALIVE("tcpKeepAlive", Boolean.TRUE, "1.0.0"),

    /**
     * set buffer size for TCP buffer (SO_RCVBUF).
     */
    TCP_RCV_BUF("tcpRcvBuf", (Integer) null, 0, "1.0.0"),

    /**
     * set buffer size for TCP buffer (SO_SNDBUF).
     */
    TCP_SND_BUF("tcpSndBuf", (Integer) null, 0, "1.0.0"),

    /**
     * to use custom socket factory, set it to full name of the class that implements javax.net.SocketFactory.
     */
    SOCKET_FACTORY("socketFactory", "1.0.0"),
    PIN_GLOBAL_TX_TO_PHYSICAL_CONNECTION("pinGlobalTxToPhysicalConnection", Boolean.FALSE, "1.1.8"),

    /**
     * When using SSL, do not check server's certificate.
     */
    TRUST_SERVER_CERTIFICATE("trustServerCertificate", Boolean.FALSE, "1.1.1"),

    /**
     * Server's certificate in DER form, or server's CA certificate. Can be used in one of 3 forms, sslServerCert=/path/to/cert.pem
     * (full path to certificate), sslServerCert=classpath:relative/cert.pem (relative to current classpath), or as verbatim DER-encoded certificate
     * string "-----BEGIN CERTIFICATE-----".
     */
    SERVER_SSL_CERT("serverSslCert", "1.1.3"),

    /**
     * Correctly handle subsecond precision in timestamps (feature available with MariaDB 5.3 and later).
     * May confuse 3rd party components (Hibernated).
     */
    USE_FRACTIONAL_SECONDS("useFractionalSeconds", Boolean.TRUE, "1.0.0"),

    /**
     * Driver must recreateConnection after a failover.
     */
    AUTO_RECONNECT("autoReconnect", Boolean.FALSE, "1.2.0"),

    /**
     * After a master failover and no other master found, back on a read-only host ( throw exception if not).
     */
    FAIL_ON_READ_ONLY("failOnReadOnly", Boolean.FALSE, "1.2.0"),

    /**
     * When using loadbalancing, the number of times the driver should cycle through available hosts, attempting to connect.
     * Between cycles, the driver will pause for 250ms if no servers are available.
     */
    RETRY_ALL_DOWN("retriesAllDown", 120, 0, "1.2.0"),

    /**
     * When using failover, the number of times the driver should cycle silently through available hosts, attempting to connect.
     * Between cycles, the driver will pause for 250ms if no servers are available.
     * if set to 0, there will be no silent reconnection
     */
    FAILOVER_LOOP_RETRIES("failoverLoopRetries", 120, 0, "1.2.0"),


    /**
     * When in multiple hosts, after this time in second without used, verification that the connections haven't been lost.
     * When 0, no verification will be done. Defaults to 0 (120 before 1.5.8 version)
     */
    VALID_CONNECTION_TIMEOUT("validConnectionTimeout", 0, 0, "1.2.0"),

    /**
     * time in second a server is blacklisted after a connection failure.  default to 50s
     */
    LOAD_BALANCE_BLACKLIST_TIMEOUT("loadBalanceBlacklistTimeout", 50, 0, "1.2.0"),

    /**
     * enable/disable prepare Statement cache, default true.
     */
    CACHEPREPSTMTS("cachePrepStmts", Boolean.TRUE, "1.3.0"),

    /**
     * This sets the number of prepared statements that the driver will cache per VM if "cachePrepStmts" is enabled.
     * default to 250.
     */
    PREPSTMTCACHESIZE("prepStmtCacheSize", 250, 0, "1.3.0"),

    /**
     * This is the maximum length of a prepared SQL statement that the driver will cache  if "cachePrepStmts" is enabled.
     * default to 2048.
     */
    PREPSTMTCACHESQLLIMIT("prepStmtCacheSqlLimit", 2048, 0, "1.3.0"),

    /**
     * when in high availability, and switching to a read-only host, assure that this host is in read-only mode by
     * setting session read-only.
     * default to false
     */
    ASSUREREADONLY("assureReadOnly", Boolean.FALSE, "1.3.0"),


    /**
     * if true (default) store date/timestamps according to client time zone.
     * if false, store all date/timestamps in DB according to server time zone, and time information (that is a time difference), doesn't take
     * timezone in account.
     */
    USELEGACYDATETIMECODE("useLegacyDatetimeCode", Boolean.TRUE, "1.3.0"),

    /**
     * maximize Mysql compatibility.
     * when using jdbc setDate(), will store date in client timezone, not in server timezone when useLegacyDatetimeCode = false.
     * default to false.
     */
    MAXIMIZEMYSQLCOMPATIBILITY("maximizeMysqlCompatibility", Boolean.FALSE, "1.3.0"),

    /**
     * useServerPrepStmts must prepared statements be prepared on server side, or just faked on client side.
     * if rewriteBatchedStatements is set to true, this options will be set to false.
     * default to false.
     */
    USESERVERPREPSTMTS("useServerPrepStmts", Boolean.FALSE, "1.3.0"),

    /**
     * File path of the trustStore file (similar to java System property "javax.net.ssl.trustStore").
     * Use the specified keystore for trusted root certificates.
     * When set, overrides serverSslCert.
     * 

* (legacy alias trustCertificateKeyStoreUrl) */ TRUSTSTORE("trustStore", "1.3.0"), /** * Password for the trusted root certificate file (similar to java System property "javax.net.ssl.trustStorePassword"). *

* (legacy alias trustCertificateKeyStorePassword) */ TRUST_CERTIFICATE_KEYSTORE_PASSWORD("trustStorePassword", "1.3.0"), /** * File path of the keyStore file that contain client private key store and associate certificates * (similar to java System property "javax.net.ssl.keyStore", but ensure that only the private key's entries are used). * (legacy alias clientCertificateKeyStoreUrl) */ KEYSTORE("keyStore", "1.3.0"), /** * Password for the client certificate keystore (similar to java System property "javax.net.ssl.keyStorePassword"). * (legacy alias clientCertificateKeyStorePassword) */ KEYSTORE_PASSWORD("keyStorePassword", "1.3.0"), /** * Password for the private key contain in client certificate keystore. * needed only in case private key password differ from keyStore password. */ PRIVATE_KEYS_PASSWORD("keyPassword", "1.5.3"), /** * Force TLS/SSL protocol to a specific set of TLS versions (comma separated list) * example : "TLSv1, TLSv1.1, TLSv1.2" */ ENABLED_SSL_PROTOCOL_SUITES("enabledSslProtocolSuites", "1.5.0"), /** * Force TLS/SSL cipher. (comma separated list) * example : "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_DSS_WITH_AES_256_GCM_SHA384" */ ENABLED_SSL_CIPHER_SUITES("enabledSslCipherSuites", "1.5.0"), /** * When executing batch queries, must batch continue on error. * default to true. */ CONTINUE_BATCH_ON_ERROR("continueBatchOnError", Boolean.TRUE, "1.4.0"), /** * Truncation error ("Data truncated for column '%' at row %", "Out of range value for column '%' at row %") will be thrown as error, * and not as warning. */ JDBCOMPLIANTRUNCATION("jdbcCompliantTruncation", Boolean.TRUE, "1.4.0"), /** * enable/disable callable Statement cache, default true. */ CACHE_CALLABLE_STMTS("cacheCallableStmts", Boolean.TRUE, "1.4.0"), /** * This sets the number of callable statements that the driver will cache per VM if "cacheCallableStmts" is enabled. * default to 150. */ CALLABLE_STMT_CACHE_SIZE("callableStmtCacheSize", 150, 0, "1.4.0"), /** * Indicate to server some client information in a key;value pair. * for example connectionAttributes=key1:value1,key2,value2. * Those information can be retrieved on server within tables mysql.session_connect_attrs and mysql.session_account_connect_attrs. * This can permit from server an identification of client. */ CONNECTION_ATTRIBUTES("connectionAttributes", "1.4.0"), /** * PreparedStatement.executeBatch() will send many QUERY before reading result packets. * default to true. * (null is considered true. this permit to know if option was explicitly set) */ USE_BATCH_MULTI_SEND("useBatchMultiSend", (Boolean) null, "1.5.0"), /** * When using useBatchMultiSend, indicate maximum query that can be send at a time. * default to 100 */ USE_BATCH_MULTI_SEND_NUMBER("useBatchMultiSendNumber", 100, 1, "1.5.0"), /** * Enable log information. require Slf4j version > 1.4 dependency. * log informations : * - info : query log * default to false. */ LOGGING("log", Boolean.FALSE, "1.5.0"), /** * log query execution time. * (legacy alias alias profileSQL) */ PROFILESQL("profileSql", Boolean.FALSE, "1.5.0"), /** * Max query log size. * default to 1024. */ MAX_QUERY_LOG_SIZE("maxQuerySizeToLog", 1024, 0, "1.5.0"), /** * Will log query with execution time superior to this value (if defined ) * default to null. */ SLOW_QUERY_TIME("slowQueryThresholdNanos", (Long) null, 0L, "1.5.0"), /** * Indicate password encoding charset. If not set, driver use platform's default charset. * default to null. */ PASSWORD_CHARACTER_ENCODING("passwordCharacterEncoding", "1.5.9"), /** * Fast connection creation (recommended if not using authentication plugins) * default to true. * (null is considered true. this permit to know if option was explicitly set) */ PIPELINE_AUTH("usePipelineAuth", (Boolean) null, "1.6.0"), /** * Driver will save the last 16 MySQL packet exchanges (limited to first 1000 bytes). * Hexadecimal value of those packet will be added to stacktrace when an IOException occur. * This options has no performance incidence (< 1 microseconds per query) but driver will then take 16kb more memory. */ ENABLE_PACKET_DEBUG("enablePacketDebug", Boolean.FALSE, "1.6.0"), /** * When using ssl, driver check hostname against the server's identity as presented in the server's Certificate * (checking alternative names or certificate CN) to prevent man-in-the-middle attack. * This option permit to deactivate this validation. */ SSL_HOSTNAME_VERIFICATION("disableSslHostnameVerification", Boolean.FALSE, "2.1.0"), /** * Use dedicated COM_STMT_BULK_EXECUTE protocol for batch insert when possible. * (batch without Statement.RETURN_GENERATED_KEYS and streams) to have faster batch. * (significant only if server MariaDB ≥ 10.2.7) */ USE_BULK_PROTOCOL("useBulkStmts", Boolean.TRUE, "2.1.0"), /** * Set default autocommit value. * Default: true */ AUTOCOMMIT("autocommit", Boolean.TRUE, "2.2.0"), /** * Enable pool. * This option is usefull only if not using a DataSource object, but only connection. */ POOL("pool", Boolean.FALSE, "2.2.0"), /** * Pool name that will permit to identify thread. * default : auto-generated as MariaDb-pool-≤pool-index≥ */ POOL_NAME("poolName", "2.2.0"), /** * The maximum number of physical connections that * the pool should contain. * default: 8 */ MAX_POOL_SIZE("maxPoolSize", 8, 1, "2.2.0"), /** * The number of physical connections the pool should keep available at all times. * default: maxPoolSize value */ MIN_POOL_SIZE("minPoolSize", (Integer) null, 0, "2.2.0"), /** * The maximum amount of time in seconds that a connection can stay in pool when not used. * This value must always be below @wait_timeout value - 45s * * Default: 600 (10 minutes). minimum value is 60 seconds. */ MAX_IDLE_TIME("maxIdleTime", 600, Options.MIN_VALUE__MAX_IDLE_TIME, "2.2.0"), /** * * When asking a connection to pool, Pool will validate connection state. * "poolValidMinDelay" permit to disable this validation if connection has been borrowed recently avoiding useless * verification in case of frequent reuse of connection * * 0 meaning validation is done each time connection is asked. * * Default: 1000 (in milliseconds) */ POOL_VALID_MIN_DELAY("poolValidMinDelay", 1000, 0, "2.2.0"), /** * Indicate that global variable aren't changed by application, permitting to pool faster connection. * Default: false */ STATIC_GLOBAL("staticGlobal", Boolean.FALSE, "2.2.0"), /** * Register JMX monitoring pools. * Default: true */ REGISTER_POOL_JMX("registerJmxPool", Boolean.TRUE, "2.2.0"), /** * Use COM_RESET_CONNECTION when resetting connection for pools when server permit it (MariaDB > 10.2.4, MySQL > 5.7.3) * This permit to reset session and user variables. * * Default: false */ USE_RESET_CONNECTION("useResetConnection", Boolean.FALSE, "2.2.0"), /** * On master/slave configuration, permit to connect Connection defaulting to a slave * when master is down. */ ALLOW_MASTER_DOWN("allowMasterDownConnection", Boolean.FALSE, "2.2.0"); private final String optionName; private final Object objType; private final Object defaultValue; private final Object minValue; private final Object maxValue; private final String implementationVersion; DefaultOptions(final String optionName, final String implementationVersion) { this.optionName = optionName; this.implementationVersion = implementationVersion; objType = String.class; defaultValue = null; minValue = null; maxValue = null; } DefaultOptions(final String optionName, final Boolean defaultValue, final String implementationVersion) { this.optionName = optionName; this.objType = Boolean.class; this.defaultValue = defaultValue; this.implementationVersion = implementationVersion; minValue = null; maxValue = null; } DefaultOptions(final String optionName, final Integer defaultValue, final Integer minValue, final String implementationVersion) { this.optionName = optionName; this.objType = Integer.class; this.defaultValue = defaultValue; this.minValue = minValue; this.maxValue = Integer.MAX_VALUE; this.implementationVersion = implementationVersion; } DefaultOptions(final String optionName, final Long defaultValue, final Long minValue, final String implementationVersion) { this.optionName = optionName; this.objType = Long.class; this.defaultValue = defaultValue; this.minValue = minValue; this.maxValue = Long.MAX_VALUE; this.implementationVersion = implementationVersion; } DefaultOptions(final String optionName, final Integer[] defaultValue, final Integer minValue, final String implementationVersion) { this.optionName = optionName; this.objType = Integer.class; this.defaultValue = defaultValue; this.minValue = minValue; this.maxValue = Integer.MAX_VALUE; this.implementationVersion = implementationVersion; } public String getOptionName() { return optionName; } public static Options defaultValues(final HaMode haMode) { return parse(haMode, "", new Properties()); } /** * Generate an Options object with default value corresponding to High Availability mode. * * @param haMode current high Availability mode * @param pool is for pool * @return Options object initialized */ public static Options defaultValues(HaMode haMode, boolean pool) { Properties properties = new Properties(); properties.setProperty("pool", String.valueOf(pool)); Options options = parse(haMode, "", properties); optionCoherenceValidation(options); return options; } /** * Parse additional properties. * * @param haMode current haMode. * @param urlParameters options defined in url * @param options initial options */ public static void parse(final HaMode haMode, final String urlParameters, final Options options) { Properties prop = new Properties(); parse(haMode, urlParameters, prop, options); optionCoherenceValidation(options); } private static Options parse(final HaMode haMode, final String urlParameters, final Properties properties) { Options options = parse(haMode, urlParameters, properties, null); optionCoherenceValidation(options); return options; } /** * Parse additional properties . * * @param haMode current haMode. * @param urlParameters options defined in url * @param properties options defined by properties * @param options initial options * @return options */ public static Options parse(final HaMode haMode, final String urlParameters, final Properties properties, final Options options) { if (urlParameters != null && !urlParameters.isEmpty()) { String[] parameters = urlParameters.split("&"); for (String parameter : parameters) { int pos = parameter.indexOf('='); if (pos == -1) { if (!properties.containsKey(parameter)) { properties.setProperty(parameter, ""); } } else { if (!properties.containsKey(parameter.substring(0, pos))) { properties.setProperty(parameter.substring(0, pos), parameter.substring(pos + 1)); } } } } return parse(haMode, properties, options); } private static Options parse(final HaMode haMode, final Properties properties, final Options paramOptions) { final Options options = paramOptions != null ? paramOptions : new Options(); try { //Option object is already initialized to default values. //loop on properties, // - check DefaultOption to check that property value correspond to type (and range) // - set values for (final String key : properties.stringPropertyNames()) { final String propertyValue = properties.getProperty(key); final DefaultOptions o = OptionUtils.OPTIONS_MAP.get(key); if (o != null && propertyValue != null) { final Field field = Options.class.getField(o.optionName); if (o.objType.equals(String.class)) { field.set(options, propertyValue); } else if (o.objType.equals(Boolean.class)) { String lower = propertyValue.toLowerCase(); if ("".equals(lower) || "1".equals(lower) || "true".equals(lower)) { field.set(options, Boolean.TRUE); } else if ("0".equals(lower) || "false".equals(lower)) { field.set(options, Boolean.FALSE); } else { throw new IllegalArgumentException("Optional parameter " + o.optionName + " must be boolean (true/false or 0/1) was \"" + propertyValue + "\""); } } else if (o.objType.equals(Integer.class)) { try { final Integer value = Integer.parseInt(propertyValue); assert o.minValue != null; assert o.maxValue != null; if (value.compareTo((Integer) o.minValue) < 0 || value.compareTo((Integer) o.maxValue) > 0) { throw new IllegalArgumentException("Optional parameter " + o.optionName + " must be greater or equal to " + o.minValue + (((Integer) o.maxValue != Integer.MAX_VALUE) ? " and smaller than " + o.maxValue : " ") + ", was \"" + propertyValue + "\""); } field.set(options, value); } catch (NumberFormatException n) { throw new IllegalArgumentException("Optional parameter " + o.optionName + " must be Integer, was \"" + propertyValue + "\""); } } else if (o.objType.equals(Long.class)) { try { final Long value = Long.parseLong(propertyValue); assert o.minValue != null; assert o.maxValue != null; if (value.compareTo((Long) o.minValue) < 0 || value.compareTo((Long) o.maxValue) > 0) { throw new IllegalArgumentException("Optional parameter " + o.optionName + " must be greater or equal to " + o.minValue + (((Long) o.maxValue != Long.MAX_VALUE) ? " and smaller than " + o.maxValue : " ") + ", was \"" + propertyValue + "\""); } field.set(options, value); } catch (NumberFormatException n) { throw new IllegalArgumentException("Optional parameter " + o.optionName + " must be Long, was \"" + propertyValue + "\""); } } } } //special case : field with multiple default according to HA_MODE if (options.socketTimeout == null) { options.socketTimeout = ((Integer[]) SOCKET_TIMEOUT.defaultValue)[haMode.ordinal()]; } } catch (NoSuchFieldException n) { n.printStackTrace(); } catch (IllegalAccessException n) { n.printStackTrace(); } catch (SecurityException s) { //only for jws, so never thrown throw new IllegalArgumentException("Security too restrictive : " + s.getMessage()); } return options; } /** * Option initialisation end : set option value to a coherent state. * @param options options */ public static void optionCoherenceValidation(final Options options) { //disable use server prepare id using client rewrite if (options.rewriteBatchedStatements) { options.useServerPrepStmts = false; } //pipe cannot use read and write socket simultaneously if (options.pipe != null) { options.useBatchMultiSend = false; options.usePipelineAuth = false; } //if min pool size default to maximum pool size if not set if (options.pool) { options.minPoolSize = options.minPoolSize == null ? options.maxPoolSize : Math.min(options.minPoolSize, options.maxPoolSize); } } /** * Generate parameter String equivalent to options. * * @param options options * @param haMode high availability Mode * @param sb String builder */ public static void propertyString(final Options options, final HaMode haMode, final StringBuilder sb) { try { boolean first = true; for (DefaultOptions o : DefaultOptions.values()) { final Object value = Options.class.getField(o.optionName).get(options); if (value != null && !value.equals(o.defaultValue)) { if (first) { first = false; sb.append('?'); } else { sb.append('&'); } sb.append(o.optionName) .append('='); if (o.objType.equals(String.class)) { sb.append((String) value); } else if (o.objType.equals(Boolean.class)) { sb.append(((Boolean) value).toString()); } else if (o.objType.equals(Integer.class)) { sb.append((Integer) value); } else if (o.objType.equals(Long.class)) { sb.append((Long) value); } } } } catch (NoSuchFieldException n) { n.printStackTrace(); } catch (IllegalAccessException n) { n.printStackTrace(); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy