From be4f08487ca7983e84d2fbf07d60e9a6047b5cf4 Mon Sep 17 00:00:00 2001 From: nouriahm Date: Tue, 21 Aug 2018 19:41:13 +0200 Subject: [PATCH 01/48] check JDBC connection #69 --- .../streamsx/jdbc/AbstractJDBCOperator.java | 22 ++- .../ibm/streamsx/jdbc/JDBCClientHelper.java | 21 +-- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 131 ++++++++++++++++-- 3 files changed, 150 insertions(+), 24 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index ab48b0a..a1ad4b8 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -57,7 +57,7 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S protected static Logger TRACE = Logger.getLogger(PACKAGE_NAME); /** - * Define operator parameters + * Define operator parameters */ // This parameter specifies the path and the filename of jdbc driver libraries in one comma separated string). private String jdbcDriverLib; @@ -228,6 +228,8 @@ public String getTrustStorePassword() { return trustStorePassword; } + + /* * The method checkParametersRuntime */ @@ -236,6 +238,21 @@ public static void checkParametersRuntime(OperatorContextChecker checker) { OperatorContext context = checker.getOperatorContext(); + String strReconnectionPolicy = ""; + if (context.getParameterNames().contains("reconnectionPolicy")) { + // reconnectionPolicy can be either InfiniteRetry, NoRetry, + // BoundedRetry + strReconnectionPolicy = context.getParameterValues("reconnectionPolicy").get(0).trim(); + if (!(strReconnectionPolicy.equalsIgnoreCase(IJDBCConstants.RECONNPOLICY_NORETRY) + || strReconnectionPolicy.equalsIgnoreCase(IJDBCConstants.RECONNPOLICY_BOUNDEDRETRY) + || strReconnectionPolicy.equalsIgnoreCase(IJDBCConstants.RECONNPOLICY_INFINITERETRY))) { + LOGGER.log(LogLevel.ERROR, "reconnectionPolicy has to be set to InfiniteRetry or NoRetry or BoundedRetry"); + checker.setInvalidContext("reconnectionPolicy has to be set to InfiniteRetry or NoRetry or BoundedRetry", new String[] { context.getParameterValues( + "reconnectionPolicy").get(0) }); + + } + } + // Check reconnection related parameters at runtime if ((context.getParameterNames().contains("reconnectionBound"))) { // reconnectionBound value should be non negative. @@ -248,7 +265,7 @@ public static void checkParametersRuntime(OperatorContextChecker checker) { if (context.getParameterNames().contains("reconnectionPolicy")) { // reconnectionPolicy can be either InfiniteRetry, NoRetry, // BoundedRetry - String strReconnectionPolicy = context.getParameterValues("reconnectionPolicy").get(0).trim(); + strReconnectionPolicy = context.getParameterValues("reconnectionPolicy").get(0).trim(); // reconnectionBound can appear only when the reconnectionPolicy // parameter is set to BoundedRetry and cannot appear otherwise if (! strReconnectionPolicy.equalsIgnoreCase(IJDBCConstants.RECONNPOLICY_BOUNDEDRETRY)) { @@ -259,6 +276,7 @@ public static void checkParametersRuntime(OperatorContextChecker checker) { } } } + } diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index cf1bab0..7497aeb 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -12,7 +12,6 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; -import java.util.Stack; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; @@ -151,16 +150,20 @@ public synchronized void createConnection() throws Exception{ break; } catch (SQLException e) { // output excpetion info into trace file if in debug mode - TRACE.log(LogLevel.ERROR,"JDBC connect threw SQL Exception",e); - System.out.println("sqlCode: " + e.getErrorCode() + " sqlState: " + e.getSQLState() + " sqlMessage: " + e.getMessage()); - // If Reconnection Policy is NoRetry, throw SQLException - if (reconnectionPolicy == IJDBCConstants.RECONNPOLICY_NORETRY) { + TRACE.log(LogLevel.ERROR,"JDBC connect threw SQL Exception",e); + System.out.println("createConnection SQLException sqlCode: " + e.getErrorCode() + " sqlState: " + e.getSQLState() + " sqlMessage: " + e.getMessage()); + System.out.println("createConnection reconnectionPolicy: " + reconnectionPolicy); + System.out.println("createConnection reconnectionBound: " + reconnectionBound); + System.out.println("createConnection reconnectionInterval: " + reconnectionInterval); + System.out.println("createConnection Connection Attempts: " + nConnectionAttempts); + + // If Reconnection Policy is NoRetry, throw SQLException + if (reconnectionPolicy.equalsIgnoreCase(IJDBCConstants.RECONNPOLICY_NORETRY)) { throw e; } // If Reconnection Policy is BoundedRetry, reconnect until maximum reconnectionBound value - if (reconnectionPolicy == IJDBCConstants.RECONNPOLICY_BOUNDEDRETRY) { - + if (reconnectionPolicy.equalsIgnoreCase(IJDBCConstants.RECONNPOLICY_BOUNDEDRETRY)) { if (nConnectionAttempts == reconnectionBound){ //Throw SQLException if the connection attempts reach to maximum reconnectionBound value throw e; @@ -170,7 +173,7 @@ public synchronized void createConnection() throws Exception{ } } // If Reconnection Policy is InfiniteRetry, reconnect - if (reconnectionPolicy == IJDBCConstants.RECONNPOLICY_INFINITERETRY) { + if (reconnectionPolicy.equalsIgnoreCase(IJDBCConstants.RECONNPOLICY_INFINITERETRY)) { // Sleep for specified wait period Thread.sleep(interval); } @@ -215,7 +218,7 @@ public synchronized boolean isValidConnection() throws SQLException{ // Return JDBC connection status public boolean isConnected(){ - return connected; + return connected; } // Reset the JDBC connection with the same configuration information diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 922b5c3..8a79fe0 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -69,7 +69,7 @@ + " The SPL applications based on new JDBC toolkit and created with a new Streams that supports `optional type`" + " are able to write/read 'null' to/from a `nullable` column in a table. ") -@InputPorts({ +@InputPorts({ @InputPortSet(cardinality = 1, description = "The `JDBCRun` operator has one required input port. When a tuple is received on the required input port, the operator runs an SQL statement."), @InputPortSet(cardinality = 1, optional = true, controlPort = true, description = "The `JDBCRun` operator has one optional input port. This port allows operator to change jdbc connection information at run time.") }) @OutputPorts({ @@ -160,7 +160,12 @@ public class JDBCRun extends AbstractJDBCOperator { private String[] sqlStatusDataAttrs = null; // sqlStatus attribute for error output port private String[] sqlStatusErrorAttrs = null; + // check connection + private boolean checkConnection = true; + + private Thread checkConnectionThread; + private CommitPolicy commitPolicy = DEFAULT_COMMIT_POLICY; @Parameter(optional = true, description = "This parameter specifies the commit policy that should be used when the operator is in a consistent region. If set to *OnCheckpoint*, then commits will only occur during checkpointing. If set to *OnTransactionAndCheckpoint*, commits will occur during checkpointing as well as whenever the **transactionCount** or **commitInterval** are reached. The default value is *OnCheckpoint*. It is recommended that the *OnTransactionAndCheckpoint* value be set if the tables that the statements are being executed against can tolerate duplicate entries as these parameter value may cause the same statements to be executed if the operator is reset. It is also highly recommended that the **transactionCount** parameter not be set to a value greater than 1 when the policy is *onTransactionAndCheckpoint*, as this can lead to some statements not being executed in the event of a reset. This parameter is ignored if the operator is not in a consistent region. The default value for this parameter is *OnCheckpoint*.") @@ -223,6 +228,18 @@ public void setCommitInterval(int commitInterval) { this.commitInterval = commitInterval; } + // Parameter checkConnection + @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The default value is `ture`.") + public void setcheckConnection(boolean checkConnection) { + this.checkConnection = checkConnection; + } + + public boolean getCheckConnection() { + return checkConnection; + } + + + /* * The method checkErrorOutputPort validates that the stream on error output * port contains the optional attribute of type which is the incoming tuple, @@ -273,12 +290,14 @@ public static void checkCompileTimeConsistentRegion(OperatorContextChecker check * * @param checker */ + @ContextCheck(compile = true) public static void checkDeleteAll(OperatorContextChecker checker) { if (!checker.checkDependentParameters("jdbcDriverLib", "jdbcUrl")){ checker.setInvalidContext(Messages.getString("JDBC_URL_NOT_EXIST"), null); } } + @ContextCheck(compile = false, runtime = true) public static void checkParameterAttributes(OperatorContextChecker checker) { @@ -423,7 +442,12 @@ public synchronized void initialize(OperatorContext context) throws Exception { hasErrorPort = true; errorOutputPort = getOutput(1); } - + + + if (checkConnection) { + startCheckConnection(context); + } + // set the data output port dataOutputPort = getOutput(0); @@ -431,13 +455,84 @@ public synchronized void initialize(OperatorContext context) throws Exception { initSqlStatusAttr(); // Initiate PreparedStatement - initPreparedStatement(); - + initPreparedStatement(); + } + + /** + * startCheckConnection starts a thread to check the JDBC connection. + * In case of any connection problem it tries to create a new connection + * with reconnectionPolicy parameters. + * When the connection fails it return a sqlcode -1 to the SPL application. + * The SPL application has to use the 2. optional output port of JDBCRun operator. + * @param context + */ + public void startCheckConnection(OperatorContext context) { + checkConnectionThread = context.getThreadFactory().newThread(new Runnable() { + + @Override + public void run() { + int i = 0; + while(true) + { + // check the JDBC connection every 5 seconds + try + { + Thread.sleep(5000); + System.out.println("checkConnection " + i++); + } + catch(InterruptedException ex) + { + Thread.currentThread().interrupt(); + } + try + { + if (!jdbcClientHelper.isValidConnection()) { + System.out.println("JDBC connection is invalid "); + try + { + // f connection files it tries to reset JDBC connection + // it is depending to the reconnection policy parameters + resetJDBCConnection(); + } + catch (Exception e2) { + if (!jdbcClientHelper.isValidConnection() && hasErrorPort){ + try + { + // if connection files it sends a sqlcode = -1 to the error output port + JDBCSqlStatus jSqlStatus = new JDBCSqlStatus(); + jSqlStatus.sqlCode = -1; + jSqlStatus.sqlMessage = "Invalid Connection"; + // submit error message + submitErrorTuple(errorOutputPort, null, jSqlStatus); + } + catch (Exception e1) { + e1.printStackTrace(); + } + + } + } + + } + } catch (SQLException e3) { + } + } // end while + } // end of run() + + }); + + // start checkConnectionThread + checkConnectionThread.start(); } - // Process control port - // The port allows operator to change JDBC connection information at runtime - // The port expects a value with JSON format + + /** + * Process control port + * he port allows operator to change JDBC connection information at runtime + * The port expects a value with JSON format + * @param stream + * @param tuple + * @throws Exception + */ @Override protected void processControlPort(StreamingInput stream, Tuple tuple) throws Exception { super.processControlPort(stream, tuple); @@ -553,8 +648,14 @@ protected void processTuple(StreamingInput stream, Tuple tuple) throws Ex } } - - + /** + * handleException + * @param tuple + * @param e + * @throws Exception + * @throws SQLException + * @throws IOException + */ private void handleException(Tuple tuple, SQLException e) throws Exception, SQLException, IOException { JDBCSqlStatus jSqlStatus = new JDBCSqlStatus(); // System.out.println(" sqlCode: " + e.getErrorCode() + " sqlState: " + e.getSQLState() + " sqlMessage: " + e.getMessage()); @@ -960,7 +1061,10 @@ public synchronized void shutdown() throws Exception { commitThread.cancel(false); } - // Roll back transaction & close connection + // stop checkConnectionThread + if (checkConnectionThread.isAlive()) { + checkConnectionThread.interrupt(); + } super.shutdown(); } @@ -1020,6 +1124,10 @@ public void resetToInitialState() throws Exception { } } + /** + * allPortsReady + * @throws Exception + */ @Override public void allPortsReady() throws Exception { if ((consistentRegionContext == null @@ -1049,13 +1157,10 @@ public void run() { try { handleException(null, e); } catch (SQLException e1) { - // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { - // TODO Auto-generated catch block e1.printStackTrace(); } catch (Exception e1) { - // TODO Auto-generated catch block e1.printStackTrace(); } finally { commitLock.unlock(); From dc9275174b6372ebe334d5ae04b85a898df70927 Mon Sep 17 00:00:00 2001 From: nouriahm Date: Tue, 21 Aug 2018 19:54:57 +0200 Subject: [PATCH 02/48] check JDBC connection #69 --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 2 +- com.ibm.streamsx.jdbc/info.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 8a79fe0..319f62f 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -229,7 +229,7 @@ public void setCommitInterval(int commitInterval) { } // Parameter checkConnection - @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The default value is `ture`.") + @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The default value is `true`.") public void setcheckConnection(boolean checkConnection) { this.checkConnection = checkConnection; } diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 0dd3ec7..cba761b 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -28,8 +28,8 @@ - 1.3.0 - 4.1.0.0 + 1.4.0 + 4.2.0.0 From 0f19fc851b17a7bc82b549ac2ae1137c0dcfdf12 Mon Sep 17 00:00:00 2001 From: nouriahm Date: Mon, 3 Sep 2018 15:32:41 +0200 Subject: [PATCH 03/48] Add getDBMajorVersion only for test --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 319f62f..bcdb5ed 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -5,6 +5,7 @@ package com.ibm.streamsx.jdbc; import java.io.IOException; +import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; @@ -166,6 +167,7 @@ public class JDBCRun extends AbstractJDBCOperator { private Thread checkConnectionThread; + private CommitPolicy commitPolicy = DEFAULT_COMMIT_POLICY; @Parameter(optional = true, description = "This parameter specifies the commit policy that should be used when the operator is in a consistent region. If set to *OnCheckpoint*, then commits will only occur during checkpointing. If set to *OnTransactionAndCheckpoint*, commits will occur during checkpointing as well as whenever the **transactionCount** or **commitInterval** are reached. The default value is *OnCheckpoint*. It is recommended that the *OnTransactionAndCheckpoint* value be set if the tables that the statements are being executed against can tolerate duplicate entries as these parameter value may cause the same statements to be executed if the operator is reset. It is also highly recommended that the **transactionCount** parameter not be set to a value greater than 1 when the policy is *onTransactionAndCheckpoint*, as this can lead to some statements not being executed in the event of a reset. This parameter is ignored if the operator is not in a consistent region. The default value for this parameter is *OnCheckpoint*.") @@ -513,6 +515,14 @@ public void run() { } } + else + { + + DatabaseMetaData metadata = jdbcClientHelper.getConnection().getMetaData(); + // Get database major version for test + int version = metadata.getDatabaseMajorVersion(); + System.out.println("Database Version: " + version); + } } catch (SQLException e3) { } } // end while From 9b15e42de3e5bf3e490ef9dfd5268816a705595d Mon Sep 17 00:00:00 2001 From: nouriahm Date: Tue, 11 Sep 2018 15:57:28 +0200 Subject: [PATCH 04/48] added checkConnectionTimeOut --- .../src/com/ibm/streamsx/jdbc/JDBCClientHelper.java | 7 ++++++- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 12 ++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index 7497aeb..6cbe5bb 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -65,6 +65,10 @@ public class JDBCClientHelper { // The time period in seconds which it will be wait before trying to reconnect. // If not specified, the default value is 10.0. private double reconnectionInterval = IJDBCConstants.RECONN_INTERVAL_DEFAULT; + + //The time in seconds to wait for the database operation used to validate the connection to complete. + private int checkConnectionTimeOut = 2; + // The statement Statement stmt = null; @@ -133,6 +137,7 @@ public synchronized void createConnection() throws Exception{ // for each unsuccessful attempt increment the // nConnectionAttempts try { + DriverManager.setLoginTimeout(5); nConnectionAttempts ++; TRACE.log(TraceLevel.DEBUG,"JDBC connection attempt "+nConnectionAttempts); if (jdbcConnectionProps != null){ @@ -207,7 +212,7 @@ public synchronized void createConnection() throws Exception{ // Check if JDBC connection is valid public synchronized boolean isValidConnection() throws SQLException{ LOGGER.log(LogLevel.INFO,"JDBC connection validation"); - if (connection == null || !connection.isValid(0)){ + if (connection == null || !connection.isValid(checkConnectionTimeOut)){ connected = false; LOGGER.log(LogLevel.INFO,"JDBC connection invalid "); return false; diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index bcdb5ed..3302c91 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -162,7 +162,7 @@ public class JDBCRun extends AbstractJDBCOperator { // sqlStatus attribute for error output port private String[] sqlStatusErrorAttrs = null; // check connection - private boolean checkConnection = true; + private boolean checkConnection = false; private Thread checkConnectionThread; @@ -231,7 +231,7 @@ public void setCommitInterval(int commitInterval) { } // Parameter checkConnection - @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The default value is `true`.") + @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The default value is `false`.") public void setcheckConnection(boolean checkConnection) { this.checkConnection = checkConnection; } @@ -515,14 +515,6 @@ public void run() { } } - else - { - - DatabaseMetaData metadata = jdbcClientHelper.getConnection().getMetaData(); - // Get database major version for test - int version = metadata.getDatabaseMajorVersion(); - System.out.println("Database Version: " + version); - } } catch (SQLException e3) { } } // end while From 2f6246e41ecfefcd22b158faa51f8108600a18df Mon Sep 17 00:00:00 2001 From: nouriahm Date: Fri, 14 Sep 2018 10:41:48 +0200 Subject: [PATCH 05/48] JDBC info.xml updated. --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 2 +- com.ibm.streamsx.jdbc/info.xml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 3302c91..1c7eb40 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -231,7 +231,7 @@ public void setCommitInterval(int commitInterval) { } // Parameter checkConnection - @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The default value is `false`.") + @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The therad checks periodically the status of JDBC connection. The JDBCRun sends in case of any connection failure a SqlCode and a message to SPL application.The default value is `false`.") public void setcheckConnection(boolean checkConnection) { this.checkConnection = checkConnection; } diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index cba761b..0c1a597 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -6,7 +6,7 @@ The statement is run once for each input tuple received. Result sets that are produced by the statement are emitted as output stream tuples. - The JDBCRun operator is commonly used to update, merge, and delete database management system (DBMS) records. + The **JDBCRun** operator is commonly used to update, merge, and delete database management system (DBMS) records. This operator is also used to retrieve records, create and drop tables, and to call stored procedures. @@ -26,6 +26,8 @@ It supports also **phoenix jdbc** to connect to the HBASE database. + The **JDBCRun** operator has been improved in version 1.4.0 with a new parameter **checkConnection**. This optional parameter specifies whether a **checkConnection** thread should be start. It checks periodically the status of JDBC connection. The JDBCRun sends in case of any failure a SqlCode and a message to SPL application. + 1.4.0 From db14299b31c222fb7ba611befb19a6845ca64ed5 Mon Sep 17 00:00:00 2001 From: nouriahm Date: Fri, 14 Sep 2018 10:44:10 +0200 Subject: [PATCH 06/48] JDBC info.xml file updated. --- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 2 +- samples/JDBCSample/toolkit.xml | 27 +++++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 1c7eb40..cc55b18 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -240,7 +240,7 @@ public boolean getCheckConnection() { return checkConnection; } - + /* * The method checkErrorOutputPort validates that the stream on error output diff --git a/samples/JDBCSample/toolkit.xml b/samples/JDBCSample/toolkit.xml index ea50e04..f20bd32 100644 --- a/samples/JDBCSample/toolkit.xml +++ b/samples/JDBCSample/toolkit.xml @@ -4,20 +4,20 @@ JDBCSample + - + - + ***************************************************************************** - - - - - - + + + + + ***************************************************************************** @@ -30,6 +30,17 @@ + + ***************************************************************************** + + + + + + + + + From cb3edb03f74883d26f4004b619f893ad93b9e171 Mon Sep 17 00:00:00 2001 From: nouriahm Date: Wed, 12 Dec 2018 12:15:13 +0100 Subject: [PATCH 07/48] Add new parameter jdbcCredentials --- .../streamsx/jdbc/AbstractJDBCOperator.java | 192 ++++++++++++------ .../com/ibm/streamsx/jdbc/IJDBCConstants.java | 2 +- .../ibm/streamsx/jdbc/JDBCClientHelper.java | 20 +- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 12 +- .../com/ibm/streamsx/jdbc/JDBCSqlStatus.java | 2 +- .../src/com/ibm/streamsx/jdbc/Messages.java | 4 + com.ibm.streamsx.jdbc/info.xml | 7 +- 7 files changed, 159 insertions(+), 80 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index a1ad4b8..b633a73 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2015 International Business Machines Corporation + * Copyright (C) 2015-2018 International Business Machines Corporation * All Rights Reserved *******************************************************************************/ package com.ibm.streamsx.jdbc; @@ -9,16 +9,14 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; +import java.nio.charset.Charset; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.sql.SQLException; -import java.util.StringTokenizer; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Logger; -import java.util.List; -import java.util.ArrayList; - import com.ibm.json.java.JSONObject; import com.ibm.streams.operator.AbstractOperator; @@ -71,6 +69,8 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S private String jdbcPassword; // This parameter specifies the path name of the file that contains the jdbc connection properties. private String jdbcProperties; + // This parameter specifies the path name of the json file that contains the jdbc credentials . + private String jdbcCredentials; // This parameter specifies the transaction isolation level at which statement runs. // If omitted, the statement runs at level READ_UNCOMMITTED private String isolationLevel = IJDBCConstants.TRANSACTION_READ_UNCOMMITTED; @@ -148,6 +148,13 @@ public void setJdbcProperties(String jdbcProperties){ this.jdbcProperties = jdbcProperties; } + //Parameter jdbcCredentials + @Parameter(optional = true, description="This optional parameter specifies the path name of the json file that contains the jdbc credentials.") + public void setJdbcCredentials(String jdbcCredentials){ + this.jdbcCredentials = jdbcCredentials; + } + + //Parameter isolationLevel @Parameter(optional = true, description="This optional parameter specifies the transaction isolation level at which statement runs. If omitted, the statement runs at level READ_UNCOMMITTED.") public void setIsolationLevel(String isolationLevel){ @@ -178,51 +185,51 @@ public void setReconnectionInterval(double reconnectionInterval){ this.reconnectionInterval = reconnectionInterval; } - // Parameter sslConnection - @Parameter(optional = true, description="This optional parameter specifies whether an SSL connection should be made to the database. When set to `true`, the **keyStore**, **keyStorePassword**, **trustStore** and **trustStorePassword** parameters can be used to specify the locations and passwords of the keyStore and trustStore. The default value is `false`.") - public void setSslConnection(boolean sslConnection) { - this.sslConnection = sslConnection; - } +// Parameter sslConnection + @Parameter(optional = true, description="This optional parameter specifies whether an SSL connection should be made to the database. When set to `true`, the **keyStore**, **keyStorePassword**, **trustStore** and **trustStorePassword** parameters can be used to specify the locations and passwords of the keyStore and trustStore. The default value is `false`.") + public void setSslConnection(boolean sslConnection) { + this.sslConnection = sslConnection; + } - public boolean isSslConnection() { - return sslConnection; - } + public boolean isSslConnection() { + return sslConnection; + } - // Parameter keyStore - @Parameter(optional = true, description="This optional parameter specifies the path to the keyStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") - public void setKeyStore(String keyStore) { - this.keyStore = keyStore; - } + // Parameter keyStore + @Parameter(optional = true, description="This optional parameter specifies the path to the keyStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setKeyStore(String keyStore) { + this.keyStore = keyStore; + } - public String getKeyStore() { - return keyStore; - } + public String getKeyStore() { + return keyStore; + } - // Parameter keyStorePassword - @Parameter(optional = true, description="This parameter specifies the password for the keyStore given by the **keyStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") - public void setKeyStorePassword(String keyStorePassword) { - this.keyStorePassword = keyStorePassword; - } + // Parameter keyStorePassword + @Parameter(optional = true, description="This parameter specifies the password for the keyStore given by the **keyStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setKeyStorePassword(String keyStorePassword) { + this.keyStorePassword = keyStorePassword; + } - public String getKeyStorePassword() { - return keyStorePassword; - } + public String getKeyStorePassword() { + return keyStorePassword; + } - // Parameter trustStore - @Parameter(optional = true, description="This optional parameter specifies the path to the trustStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") - public void setTrustStore(String trustStore) { - this.trustStore = trustStore; - } + // Parameter trustStore + @Parameter(optional = true, description="This optional parameter specifies the path to the trustStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setTrustStore(String trustStore) { + this.trustStore = trustStore; + } - public String getTrustStore() { - return trustStore; - } + public String getTrustStore() { + return trustStore; + } - // Parameter trustStorePassword - @Parameter(optional = true, description="This parameter specifies the password for the trustStore given by the **trustStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") - public void setTrustStorePassword(String trustStorePassword) { - this.trustStorePassword = trustStorePassword; - } + // Parameter trustStorePassword + @Parameter(optional = true, description="This parameter specifies the password for the trustStore given by the **trustStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setTrustStorePassword(String trustStorePassword) { + this.trustStorePassword = trustStorePassword; + } public String getTrustStorePassword() { return trustStorePassword; @@ -288,6 +295,11 @@ public static void checkParameters(OperatorContextChecker checker) { // If jdbcProperties is set as parameter, jdbcUser and jdbcPassword can not be set checker.checkExcludedParameters("jdbcUser", "jdbcProperties"); checker.checkExcludedParameters("jdbcPassword", "jdbcProperties"); + // If jdbcCredentials is set as parameter, jdbcUser and jdbcPassword can not be set + checker.checkExcludedParameters("jdbcUser", "jdbcCredentials"); + checker.checkExcludedParameters("jdbcPassword", "jdbcCredentials"); + // If jdbcCredentials is set as parameter, jdbcCredentials can not be set + checker.checkExcludedParameters("jdbcProperties", "jdbcCredentials"); // check reconnection related parameters checker.checkDependentParameters("reconnecionInterval", "reconnectionPolicy"); checker.checkDependentParameters("reconnecionBound", "reconnectionPolicy"); @@ -436,6 +448,15 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr { jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } + + // if jdbcProperties is relative path, convert to absolute path + if (jdbcCredentials != null && !jdbcCredentials.trim().isEmpty() && !jdbcCredentials.startsWith(File.separator)) + { + jdbcCredentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; + } + + // System.out.println("jdbcCredentials : " + jdbcCredentials); + // Roll back the transaction jdbcClientHelper.rollbackWithClearBatch(); // Reset JDBC connection @@ -482,28 +503,33 @@ public synchronized void shutdown() throws Exception { } - // Set up JDBC driver class path + // Set up JDBC driver class path private void setupClassPath(OperatorContext context) throws MalformedURLException{ - // Split the jdbcDriverLib by "/" - StringTokenizer st = new StringTokenizer(jdbcDriverLib , File.separator); - String libDir = st.nextToken(); + + String libDir = jdbcDriverLib; + if (jdbcDriverLib.lastIndexOf(File.separator) > 0) { + libDir = jdbcDriverLib.substring(0, jdbcDriverLib.lastIndexOf(File.separator)); + } TRACE.log(TraceLevel.INFO, "Operator " + context.getName() + "setupClassPath " + jdbcDriverLib + " " + libDir); - List results = new ArrayList(); - - String jarDir = getOperatorContext().getPE().getApplicationDirectory() + File.separator + libDir; - File[] files = new File(jarDir).listFiles(); - // If this pathname does not denote a directory, then listFiles() returns null. - // Search in the "opt" directory and add all jar files to the class path. - for (File file : files) { - if (file.isFile()) { - results.add(file.getName()); - String jarFile = jarDir + File.separator + file.getName(); - TRACE.log(TraceLevel.INFO, "Operator " + context.getName() + "setupClassPath " + jarFile); - context.addClassLibraries(new String[] {jarFile}); - } - } - + String jarDir = libDir; + File f = new File(libDir); + if (!f.isAbsolute()) { + File appDir = getOperatorContext().getPE().getApplicationDirectory(); + TRACE.log(TraceLevel.INFO, "Operator " + context.getName() + "extending relative path '" + libDir + "' by the '" + appDir + "' directory"); + jarDir = appDir + File.separator + libDir; + } + + File[] files = new File(jarDir).listFiles(); + // If this pathname does not denote a directory, then listFiles() returns null. + // Search in the "opt" directory and add all jar files to the class path. + for (File file : files) { + if (file.isFile()) { + String jarFile = jarDir + File.separator + file.getName(); + TRACE.log(TraceLevel.INFO, "Operator " + context.getName() + "setupClassPath " + jarFile); + context.addClassLibraries(new String[] {jarFile}); + } + } TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " JDBC Driver Lib: " + jdbcDriverLib); } @@ -519,6 +545,14 @@ private synchronized void setupJDBCConnection() throws Exception{ { jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } + + // if jdbcProperties is relative path, convert to absolute path + if (jdbcCredentials != null && !jdbcCredentials.trim().isEmpty() && !jdbcCredentials.startsWith(File.separator)) + { + jdbcCredentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcCredentials; + getCredentials(jdbcCredentials); + } + jdbcClientHelper = new JDBCClientHelper(jdbcClassName, jdbcUrl, jdbcUser, jdbcPassword, sslConnection, jdbcProperties, isAutoCommit(), isolationLevel, reconnectionPolicy, reconnectionBound, reconnectionInterval); jdbcClientHelper.createConnection(); @@ -530,6 +564,42 @@ private synchronized void setupJDBCConnection() throws Exception{ throw e; } } + + // read credentials file and set user name, password und jdbc url. + public void getCredentials(String jdbcCredentials) throws IOException { + String jsonString = ""; + // read json file to string + try { + byte[] encoded = Files.readAllBytes(Paths.get(jdbcCredentials)); + jsonString = new String(encoded, Charset.defaultCharset()); + }catch (IOException e){ + LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_PROPERTIES_NOT_EXIST"), new Object[]{jdbcCredentials}); + throw e; + } + +// System.out.println(" jsonString " + jsonString); + + try { + JSONObject obj = JSONObject.parse(jsonString); + jdbcUser = (String)obj.get("username"); + if (jdbcUser == null) { + throw new Exception("String username was incorrect"); + } + + jdbcPassword = (String)obj.get("password"); + if (jdbcPassword == null){ + throw new Exception("String password was incorrect"); + } + + jdbcUrl = (String)obj.get("jdbcurl"); + if (jdbcUrl == null) { + throw new Exception("String jdbcUrl was incorrect"); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + // Reset JDBC connection protected void resetJDBCConnection() throws Exception{ diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/IJDBCConstants.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/IJDBCConstants.java index 39c0a38..c7fe3ba 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/IJDBCConstants.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/IJDBCConstants.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2015 International Business Machines Corporation + * Copyright (C) 2015-2018 International Business Machines Corporation * All Rights Reserved *******************************************************************************/ package com.ibm.streamsx.jdbc; diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index 6cbe5bb..6db00a7 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2015 International Business Machines Corporation + * Copyright (C) 2015-2018 International Business Machines Corporation * All Rights Reserved *******************************************************************************/ package com.ibm.streamsx.jdbc; @@ -38,7 +38,7 @@ public class JDBCClientHelper { + "." + CLASS_NAME); // logger for trace/debug information - protected static Logger TRACE = Logger.getLogger("com.ibm.streamsx.jdbc"); + protected static Logger TRACE = Logger.getLogger("com.ibm.streamsx.jdbc"); // the class name for jdbc driver. private String jdbcClassName; @@ -112,12 +112,12 @@ public synchronized void createConnection() throws Exception{ jdbcConnectionProps.load(fileInput); fileInput.close(); } else { - // pick up user and passwrod if they are parameters + // pick up user and password if they are parameters if (jdbcUser != null && jdbcPassword != null) { - jdbcConnectionProps.put("user", jdbcUser); - jdbcConnectionProps.put("password", jdbcPassword); - jdbcConnectionProps.put("avatica_user", jdbcUser); - jdbcConnectionProps.put("avatica_password", jdbcPassword); + jdbcConnectionProps.put("user", jdbcUser); + jdbcConnectionProps.put("password", jdbcPassword); + jdbcConnectionProps.put("avatica_user", jdbcUser); + jdbcConnectionProps.put("avatica_password", jdbcPassword); } } @@ -139,8 +139,8 @@ public synchronized void createConnection() throws Exception{ try { DriverManager.setLoginTimeout(5); nConnectionAttempts ++; - TRACE.log(TraceLevel.DEBUG,"JDBC connection attempt "+nConnectionAttempts); - if (jdbcConnectionProps != null){ + TRACE.log(TraceLevel.DEBUG,"JDBC connection attempt "+nConnectionAttempts); + if (jdbcConnectionProps != null){ TRACE.log(TraceLevel.DEBUG,"JDBC connection -- props not null "); TRACE.log(TraceLevel.DEBUG,jdbcConnectionProps.toString()); connection = DriverManager.getConnection(jdbcUrl, jdbcConnectionProps); @@ -154,7 +154,7 @@ public synchronized void createConnection() throws Exception{ } break; } catch (SQLException e) { - // output excpetion info into trace file if in debug mode + // output exception info into trace file if in debug mode TRACE.log(LogLevel.ERROR,"JDBC connect threw SQL Exception",e); System.out.println("createConnection SQLException sqlCode: " + e.getErrorCode() + " sqlState: " + e.getSQLState() + " sqlMessage: " + e.getMessage()); System.out.println("createConnection reconnectionPolicy: " + reconnectionPolicy); diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index cc55b18..0df3213 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -1,11 +1,10 @@ /******************************************************************************* - * Copyright (C) 2015 International Business Machines Corporation + * Copyright (C) 2015-2018 International Business Machines Corporation * All Rights Reserved *******************************************************************************/ package com.ibm.streamsx.jdbc; import java.io.IOException; -import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; @@ -165,7 +164,7 @@ public class JDBCRun extends AbstractJDBCOperator { private boolean checkConnection = false; - private Thread checkConnectionThread; + private Thread checkConnectionThread = null; private CommitPolicy commitPolicy = DEFAULT_COMMIT_POLICY; @@ -241,7 +240,6 @@ public boolean getCheckConnection() { } - /* * The method checkErrorOutputPort validates that the stream on error output * port contains the optional attribute of type which is the incoming tuple, @@ -1064,8 +1062,10 @@ public synchronized void shutdown() throws Exception { } // stop checkConnectionThread - if (checkConnectionThread.isAlive()) { - checkConnectionThread.interrupt(); + if (checkConnectionThread != null) { + if (checkConnectionThread.isAlive()) { + checkConnectionThread.interrupt(); + } } super.shutdown(); diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCSqlStatus.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCSqlStatus.java index 31229e6..dd2c65d 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCSqlStatus.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCSqlStatus.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2015 International Business Machines Corporation + * Copyright (C) 2015-2018 International Business Machines Corporation * All Rights Reserved *******************************************************************************/ package com.ibm.streamsx.jdbc; diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/Messages.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/Messages.java index 12404dc..7af9589 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/Messages.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/Messages.java @@ -1,3 +1,7 @@ +/******************************************************************************* + * Copyright (C) 2015-2018 International Business Machines Corporation + * All Rights Reserved + *******************************************************************************/ package com.ibm.streamsx.jdbc; diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 0c1a597..5ebda33 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -28,9 +28,14 @@ The **JDBCRun** operator has been improved in version 1.4.0 with a new parameter **checkConnection**. This optional parameter specifies whether a **checkConnection** thread should be start. It checks periodically the status of JDBC connection. The JDBCRun sends in case of any failure a SqlCode and a message to SPL application. + ++ What is new in version 1.4.3 + * The JDBCRun operators provides a new parameter 'jdbcCredentials'. + This optional parameter specifies the path name of the json file that contains the jdbc credentials. + + - 1.4.0 + 1.4.3 4.2.0.0 From 096dad22eb5b0ed9d06e4ef01f50ce764bae212c Mon Sep 17 00:00:00 2001 From: nouriahm Date: Wed, 12 Dec 2018 12:20:02 +0100 Subject: [PATCH 08/48] Add new parameter jdbcCredentials --- .../impl/java/src/com/ibm/streamsx/jdbc/StatementParameter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/StatementParameter.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/StatementParameter.java index 9fe88cd..4313351 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/StatementParameter.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/StatementParameter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2015 International Business Machines Corporation + * Copyright (C) 2015-2018 International Business Machines Corporation * All Rights Reserved *******************************************************************************/ package com.ibm.streamsx.jdbc; From cc6469ae1b93d29c7153304b4f4ccdf747c43c76 Mon Sep 17 00:00:00 2001 From: nouriahm Date: Wed, 12 Dec 2018 14:14:36 +0100 Subject: [PATCH 09/48] Fix SPLDOC typo in checkConnection parameter #74 --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 0df3213..a85354f 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -230,7 +230,7 @@ public void setCommitInterval(int commitInterval) { } // Parameter checkConnection - @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** therad should be start. The therad checks periodically the status of JDBC connection. The JDBCRun sends in case of any connection failure a SqlCode and a message to SPL application.The default value is `false`.") + @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** thread should be start. The thread checks periodically the status of JDBC connection. The JDBCRun sends in case of any connection failure a SqlCode and a message to SPL application.The default value is `false`.") public void setcheckConnection(boolean checkConnection) { this.checkConnection = checkConnection; } From 3b39de0edf7bd1c1a1f7ee5d683d1143c341ffcf Mon Sep 17 00:00:00 2001 From: nouriahm Date: Wed, 12 Dec 2018 16:06:02 +0100 Subject: [PATCH 10/48] Add new parameter jdbcCredentials --- .../streamsx/jdbc/AbstractJDBCOperator.java | 65 +++++++++---------- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 35 +++++++++- 2 files changed, 62 insertions(+), 38 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index b633a73..87db80a 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -121,7 +121,7 @@ public void setJdbcClassName(String jdbcClassName){ } //Parameter jdbcUrl - @Parameter(optional = false, description="This parameter specifies the database url that JDBC driver uses to connect to a database and it must have exactly one value of type rstring. The syntax of jdbc url is specified by database vendors. For example, jdbc:db2://:/\\n\\n" + @Parameter(optional = true, description="This parameter specifies the database url that JDBC driver uses to connect to a database and it must have exactly one value of type rstring. The syntax of jdbc url is specified by database vendors. For example, jdbc:db2://:/\\n\\n" + ". jdbc:db2 indicates that the connection is to a DB2 for z/OS, DB2 for Linux, UNIX, and Windows.\\n\\n" + ". server, the domain name or IP address of the data source.\\n\\n" + ". port, the TCP/IP server port number that is assigned to the data source.\\n\\n" @@ -287,24 +287,7 @@ public static void checkParametersRuntime(OperatorContextChecker checker) { } - /* - * The method checkParameters - */ - @ContextCheck(compile = true) - public static void checkParameters(OperatorContextChecker checker) { - // If jdbcProperties is set as parameter, jdbcUser and jdbcPassword can not be set - checker.checkExcludedParameters("jdbcUser", "jdbcProperties"); - checker.checkExcludedParameters("jdbcPassword", "jdbcProperties"); - // If jdbcCredentials is set as parameter, jdbcUser and jdbcPassword can not be set - checker.checkExcludedParameters("jdbcUser", "jdbcCredentials"); - checker.checkExcludedParameters("jdbcPassword", "jdbcCredentials"); - // If jdbcCredentials is set as parameter, jdbcCredentials can not be set - checker.checkExcludedParameters("jdbcProperties", "jdbcCredentials"); - // check reconnection related parameters - checker.checkDependentParameters("reconnecionInterval", "reconnectionPolicy"); - checker.checkDependentParameters("reconnecionBound", "reconnectionPolicy"); - } - + @ContextCheck public static void checkControlPortInputAttribute(OperatorContextChecker checker) { OperatorContext context = checker.getOperatorContext(); @@ -434,25 +417,28 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr String jdbcUser = (String)jdbcConnections.get("jdbcUser"); String jdbcPassword = (String)jdbcConnections.get("jdbcPassword"); String jdbcProperties = (String)jdbcConnections.get("jdbcProperties"); + String jdbcCredentials = (String)jdbcConnections.get("jdbcCredentials"); // jdbcClassName is required if (jdbcClassName == null || jdbcClassName.trim().isEmpty()){ LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_CLASS_NAME_NOT_EXIST")); } - // jdbcUrl is required - if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ - LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); - } // if jdbcProperties is relative path, convert to absolute path if (jdbcProperties != null && !jdbcProperties.trim().isEmpty() && !jdbcProperties.startsWith(File.separator)) { jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } - // if jdbcProperties is relative path, convert to absolute path + // if jdbcCredentials is relative path, convert to absolute path if (jdbcCredentials != null && !jdbcCredentials.trim().isEmpty() && !jdbcCredentials.startsWith(File.separator)) { jdbcCredentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; + getCredentials(jdbcCredentials); + } + + // jdbcUrl is required + if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ + LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); } // System.out.println("jdbcCredentials : " + jdbcCredentials); @@ -546,13 +532,18 @@ private synchronized void setupJDBCConnection() throws Exception{ jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } - // if jdbcProperties is relative path, convert to absolute path + // if jdbcCredentials is relative path, convert to absolute path if (jdbcCredentials != null && !jdbcCredentials.trim().isEmpty() && !jdbcCredentials.startsWith(File.separator)) { jdbcCredentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcCredentials; getCredentials(jdbcCredentials); } - + + // jdbcUrl is required + if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ + LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); + } + jdbcClientHelper = new JDBCClientHelper(jdbcClassName, jdbcUrl, jdbcUser, jdbcPassword, sslConnection, jdbcProperties, isAutoCommit(), isolationLevel, reconnectionPolicy, reconnectionBound, reconnectionInterval); jdbcClientHelper.createConnection(); @@ -582,19 +573,23 @@ public void getCredentials(String jdbcCredentials) throws IOException { try { JSONObject obj = JSONObject.parse(jsonString); jdbcUser = (String)obj.get("username"); - if (jdbcUser == null) { - throw new Exception("String username was incorrect"); - } + if (jdbcUser == null || jdbcUser.trim().isEmpty()){ + LOGGER.log(LogLevel.ERROR, Messages.getString("'jdbcUser' is required to create JDBC connection.")); + throw new Exception(Messages.getString("'jdbcUser' is required to create JDBC connection.")); + } jdbcPassword = (String)obj.get("password"); - if (jdbcPassword == null){ - throw new Exception("String password was incorrect"); - } + if (jdbcPassword == null || jdbcPassword.trim().isEmpty()){ + LOGGER.log(LogLevel.ERROR, Messages.getString("'jdbcPassword' is required to create JDBC connection.")); + throw new Exception(Messages.getString("'jdbcPassword' is required to create JDBC connection.")); + } jdbcUrl = (String)obj.get("jdbcurl"); - if (jdbcUrl == null) { - throw new Exception("String jdbcUrl was incorrect"); - } + // jdbcUrl is required + if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ + LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); + throw new Exception(Messages.getString("JDBC_URL_NOT_EXIST")); + } } catch (Exception ex) { ex.printStackTrace(); } diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index a85354f..5ca1c3e 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -293,7 +293,8 @@ public static void checkCompileTimeConsistentRegion(OperatorContextChecker check @ContextCheck(compile = true) public static void checkDeleteAll(OperatorContextChecker checker) { - if (!checker.checkDependentParameters("jdbcDriverLib", "jdbcUrl")){ + if (!checker.checkDependentParameters("jdbcDriverLib")){ +// if (!checker.checkDependentParameters("jdbcDriverLib", "jdbcUrl")){ checker.setInvalidContext(Messages.getString("JDBC_URL_NOT_EXIST"), null); } } @@ -414,13 +415,41 @@ private static int findSqlStatusAttr(StreamingOutput dataPort, Stre public static void checkParameters(OperatorContextChecker checker) { // If statement is set as parameter, statementAttr can not be set checker.checkExcludedParameters("statement", "statementAttr"); - // If jdbcProperties is set as parameter, jdbcUser and jdbcPassword can - // not be set + // If jdbcProperties is set as parameter, jdbcUser and jdbcPassword can not be set checker.checkExcludedParameters("jdbcUser", "jdbcProperties"); checker.checkExcludedParameters("jdbcPassword", "jdbcProperties"); + + // If jdbcCredentials is set as parameter, jdbcUser, jdbcPassword and jdbcUrl can not be set. + checker.checkExcludedParameters("jdbcUser", "jdbcCredentials"); + checker.checkExcludedParameters("jdbcPassword", "jdbcCredentials"); + checker.checkExcludedParameters("jdbcUrl", "jdbcCredentials"); + checker.checkExcludedParameters("jdbcCredentials", "jdbcUrl"); + + // If jdbcCredentials is set as parameter, jdbcCredentials can not be set + checker.checkExcludedParameters("jdbcProperties", "jdbcCredentials"); + // check reconnection related parameters checker.checkDependentParameters("reconnecionInterval", "reconnectionPolicy"); checker.checkDependentParameters("reconnecionBound", "reconnectionPolicy"); + + // check parameters jdbcUrl jdbcUser and jdbcPassword + OperatorContext context = checker.getOperatorContext(); + if ((!context.getParameterNames().contains("jdbcCredentials")) + && (!context.getParameterNames().contains("jdbcUrl"))) { + checker.setInvalidContext("The parameter 'jdbcUrl' is not defined. It must be set in one of these parameters: 'jdbcUrl' or 'jdbcCredentials'", null); + } + + if ((!context.getParameterNames().contains("jdbcCredentials")) + && (!context.getParameterNames().contains("jdbcProperties")) + && (!context.getParameterNames().contains("jdbcUser"))) { + checker.setInvalidContext("The 'jdbcUser' is not defined. It must be set in one of these parameters: 'jdbcUser' or 'jdbcCredentials' or 'jdbcProperties' ", null); + } + if ((!context.getParameterNames().contains("jdbcCredentials")) + && (!context.getParameterNames().contains("jdbcProperties")) + && (!context.getParameterNames().contains("jdbcPassword"))) { + checker.setInvalidContext("The 'jdbcPassword' is not defined. It must be set in one of these parameters: 'jdbcPassword' or 'jdbcCredentials' or 'jdbcProperties'", null); + } + } /** From d80ba341ae8efbdb822d1e0149583aac3fe59491 Mon Sep 17 00:00:00 2001 From: anouri Date: Thu, 13 Dec 2018 13:08:15 +0100 Subject: [PATCH 11/48] Add new parameter jdbcCredentials --- .../impl/java/src/com/ibm/streamsx/jdbc/CommitPolicy.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/CommitPolicy.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/CommitPolicy.java index 404b485..914067b 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/CommitPolicy.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/CommitPolicy.java @@ -1,3 +1,7 @@ +/******************************************************************************* + * Copyright (C) 2015-2018 International Business Machines Corporation + * All Rights Reserved + *******************************************************************************/ package com.ibm.streamsx.jdbc; public enum CommitPolicy { From fd59a03dd03162aad08d3e127b5e5f8636e86989 Mon Sep 17 00:00:00 2001 From: anouri Date: Thu, 13 Dec 2018 13:26:32 +0100 Subject: [PATCH 12/48] info.xml updated parameter jdbcCredentials --- com.ibm.streamsx.jdbc/info.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 5ebda33..fe2f86c 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -32,6 +32,8 @@ * The JDBCRun operators provides a new parameter 'jdbcCredentials'. This optional parameter specifies the path name of the json file that contains the jdbc credentials. + The jdbc credentials file must conatain valid JSON format and a set of name/value pairs for + 'username', 'password' and 'jdbcurl'. From 1fd2a3bba4f5f2f884cabf60c977189fc6d18489 Mon Sep 17 00:00:00 2001 From: anouri Date: Fri, 4 Jan 2019 11:23:17 +0100 Subject: [PATCH 13/48] JDBC SPLDOC improved #76 --- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 5ca1c3e..265624b 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -54,19 +54,19 @@ * input tuple. The statement is run once for each input tuple received. Result * sets that are produced by the statement are emitted as output stream tuples. */ -@PrimitiveOperator(description = "The `JDBCRun` operator runs a user-defined SQL statement that is based on an input tuple." - + " The statement is run once for each input tuple received." - + " Result sets that are produced by the statement are emitted as output stream tuples." - + " The `JDBCRun` operator is commonly used to update, merge, and delete database management system (DBMS) records." - + " This operator is also used to retrieve records, create and drop tables, and to call stored procedures." - + " # Behavior in a consistent region" - + " The `JDBCRun` operator can be used in a consistent region. It cannot be the start operator of a consistent region." +@PrimitiveOperator(description = "The **JDBCRun** operator runs a user-defined SQL statement that is based on an input tuple.\\n\\n" + + " The statement is run once for each input tuple received.\\n\\n" + + " Result sets that are produced by the statement are emitted as output stream tuples.\\n\\n" + + " The `JDBCRun` operator is commonly used to update, merge, and delete database management system (DBMS) records.\\n" + + " This operator is also used to retrieve records, create and drop tables, and to call stored procedures.\\n\\n" + + " Behavior in a **consistent region**:\\n\\n" + + " The **JDBCRun** operator can be used in a consistent region. It cannot be the start operator of a consistent region." + " In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets." + " On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port." + " On checkpoint: A database commit is performed." - + " On reset: Any pending statements are discarded. A rollback is performed." - + " The new version of toolkit 1.3.x. supports also `optional type`." - + " The SPL applications based on new JDBC toolkit and created with a new Streams that supports `optional type`" + + " On reset: Any pending statements are discarded. A rollback is performed.\\n\\n" + + " The new version of toolkit 1.3.x. supports also `optional type`.\\n\\n" + + " The SPL applications based on new JDBC toolkit and created with a new Streams that supports **optional type**" + " are able to write/read 'null' to/from a `nullable` column in a table. ") @InputPorts({ From 8fe42b458bd0b6a3a3d92215af0b296687ac4028 Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 7 Jan 2019 15:31:30 +0100 Subject: [PATCH 14/48] java.net.ConnectException not catched #57 --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index 6db00a7..c13d4b8 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -98,7 +98,7 @@ public Connection getConnection(){ } // Create the JDBC connection - public synchronized void createConnection() throws Exception{ + public synchronized void createConnection() throws Exception, SQLException{ LOGGER.log(LogLevel.INFO, "createConnection \njdbcUser = " + jdbcUser + "\njdbcUrl = " + jdbcUrl); // Attempt to create connection only when existing connection is invalid. if (!isConnected()){ @@ -146,7 +146,6 @@ public synchronized void createConnection() throws Exception{ connection = DriverManager.getConnection(jdbcUrl, jdbcConnectionProps); }else if (jdbcUser != null && jdbcPassword != null){ TRACE.log(TraceLevel.DEBUG,"JDBC connection -- userid password exist "+jdbcUrl); - ; connection = DriverManager.getConnection(jdbcUrl, jdbcConnectionProps); }else{ TRACE.log(TraceLevel.DEBUG,"JDBC connection -- using url only "+jdbcUrl); From 5f70c7da28d66346b7587b327d8d62d866686020 Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 7 Jan 2019 17:29:32 +0100 Subject: [PATCH 15/48] support application configuration --- .../streamsx/jdbc/AbstractJDBCOperator.java | 186 ++++++++++++++---- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 85 +++----- com.ibm.streamsx.jdbc/info.xml | 11 +- 3 files changed, 182 insertions(+), 100 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 87db80a..543e277 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -14,6 +14,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Logger; @@ -70,7 +72,7 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S // This parameter specifies the path name of the file that contains the jdbc connection properties. private String jdbcProperties; // This parameter specifies the path name of the json file that contains the jdbc credentials . - private String jdbcCredentials; + private String credentials; // This parameter specifies the transaction isolation level at which statement runs. // If omitted, the statement runs at level READ_UNCOMMITTED private String isolationLevel = IJDBCConstants.TRANSACTION_READ_UNCOMMITTED; @@ -101,6 +103,13 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S // consistent region context protected ConsistentRegionContext consistentRegionContext; + // The name of the application config object + private String appConfigName = null; + + // data from application config object + Map appConfig = null; + + // SSL parameters private String keyStore; private String trustStore; @@ -109,19 +118,22 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S private boolean sslConnection; //Parameter jdbcDriverLib - @Parameter(optional = false, description="This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string.") + @Parameter(name = "jdbcDriverLib", optional = false, + description = "This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string.") public void setJdbcDriverLib(String jdbcDriverLib){ this.jdbcDriverLib = jdbcDriverLib; } //Parameter jdbcClassName - @Parameter(optional = false, description="This required parameter specifies the class name for jdbc driver and it must have exactly one value of type rstring.") + @Parameter(name = "jdbcClassName", optional = false, + description = "This required parameter specifies the class name for jdbc driver and it must have exactly one value of type rstring.") public void setJdbcClassName(String jdbcClassName){ this.jdbcClassName = jdbcClassName; } //Parameter jdbcUrl - @Parameter(optional = true, description="This parameter specifies the database url that JDBC driver uses to connect to a database and it must have exactly one value of type rstring. The syntax of jdbc url is specified by database vendors. For example, jdbc:db2://:/\\n\\n" + @Parameter(name = "jdbcUrl", optional = true, + description = "This parameter specifies the database url that JDBC driver uses to connect to a database and it must have exactly one value of type rstring. The syntax of jdbc url is specified by database vendors. For example, jdbc:db2://:/\\n\\n" + ". jdbc:db2 indicates that the connection is to a DB2 for z/OS, DB2 for Linux, UNIX, and Windows.\\n\\n" + ". server, the domain name or IP address of the data source.\\n\\n" + ". port, the TCP/IP server port number that is assigned to the data source.\\n\\n" @@ -131,62 +143,72 @@ public void setJdbcUrl(String jdbcUrl){ } //Parameter jdbcUser - @Parameter(optional = true, description="This optional parameter specifies the database user on whose behalf the connection is being made. If the jdbcUser parameter is specified, it must have exactly one value of type rstring.") + @Parameter(name = "jdbcUser", optional = true, + description = "This optional parameter specifies the database user on whose behalf the connection is being made. If the jdbcUser parameter is specified, it must have exactly one value of type rstring.") public void setJdbcUser(String jdbcUser){ this.jdbcUser = jdbcUser; } //Parameter jdbcPassword - @Parameter(optional = true, description="This optional parameter specifies the user’s password. If the jdbcPassword parameter is specified, it must have exactly one value of type rstring.") + @Parameter(name = "jdbcPassword", optional = true, + description = "This optional parameter specifies the user’s password. If the jdbcPassword parameter is specified, it must have exactly one value of type rstring.") public void setJdbcPassword(String jdbcPassword){ this.jdbcPassword = jdbcPassword; } //Parameter jdbcProperties - @Parameter(optional = true, description="This optional parameter specifies the path name of the file that contains the jdbc connection properties.") + @Parameter(name = "jdbcProperties", optional = true, + description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: jdbcUser and jdbcPassword") public void setJdbcProperties(String jdbcProperties){ this.jdbcProperties = jdbcProperties; } - //Parameter jdbcCredentials - @Parameter(optional = true, description="This optional parameter specifies the path name of the json file that contains the jdbc credentials.") - public void setJdbcCredentials(String jdbcCredentials){ - this.jdbcCredentials = jdbcCredentials; + //Parameter credentials + @Parameter(name = "credentials", optional = true, + description = "This optional parameter specifies the path name of the JSON file that contains the jdbc credentials: username, password and jdbcUrl") + public void setcredentials(String credentials){ + this.credentials = credentials; } //Parameter isolationLevel - @Parameter(optional = true, description="This optional parameter specifies the transaction isolation level at which statement runs. If omitted, the statement runs at level READ_UNCOMMITTED.") + @Parameter(name = "isolationLevel", optional = true, + description = "This optional parameter specifies the transaction isolation level at which statement runs. If omitted, the statement runs at level READ_UNCOMMITTED.") public void setIsolationLevel(String isolationLevel){ this.isolationLevel = isolationLevel; } //Parameter sqlFailureAction - @Parameter(optional = true, description="This optional parameter has values of log, rollback and terminate. If not specified, log is assumed. If sqlFailureAction is log, the error is logged, and the error condition is cleared. If sqlFailureAction is rollback, the error is logged, the transaction rolls back. If sqlFailureAction is terminate, the error is logged, the transaction rolls back and the operator terminates.") + @Parameter(name = "sqlFailureAction", optional = true, + description = "This optional parameter has values of log, rollback and terminate. If not specified, log is assumed. If sqlFailureAction is log, the error is logged, and the error condition is cleared. If sqlFailureAction is rollback, the error is logged, the transaction rolls back. If sqlFailureAction is terminate, the error is logged, the transaction rolls back and the operator terminates.") public void setSqlFailureAction(String sqlFailureAction){ this.sqlFailureAction = sqlFailureAction; } //Parameter reconnectionPolicy - @Parameter(optional = true, description="This optional parameter specifies the policy that is used by the operator to handle database connection failures. The valid values are: `NoRetry`, `InfiniteRetry`, and `BoundedRetry`. The default value is `BoundedRetry`. If `NoRetry` is specified and a database connection failure occurs, the operator does not try to connect to the database again. The operator shuts down at startup time if the initial connection attempt fails. If `BoundedRetry` is specified and a database connection failure occurs, the operator tries to connect to the database again up to a maximum number of times. The maximum number of connection attempts is specified in the **reconnectionBound** parameter. The sequence of connection attempts occurs at startup time. If a connection does not exist, the sequence of connection attempts also occurs before each operator is run. If `InfiniteRetry` is specified, the operator continues to try and connect indefinitely until a connection is made. This behavior blocks all other operator operations while a connection is not successful. For example, if an incorrect connection password is specified in the connection configuration document, the operator remains in an infinite startup loop until a shutdown is requested.") + @Parameter(name = "reconnectionPolicy", optional = true, + description = "This optional parameter specifies the policy that is used by the operator to handle database connection failures. The valid values are: `NoRetry`, `InfiniteRetry`, and `BoundedRetry`. The default value is `BoundedRetry`. If `NoRetry` is specified and a database connection failure occurs, the operator does not try to connect to the database again. The operator shuts down at startup time if the initial connection attempt fails. If `BoundedRetry` is specified and a database connection failure occurs, the operator tries to connect to the database again up to a maximum number of times. The maximum number of connection attempts is specified in the **reconnectionBound** parameter. The sequence of connection attempts occurs at startup time. If a connection does not exist, the sequence of connection attempts also occurs before each operator is run. If `InfiniteRetry` is specified, the operator continues to try and connect indefinitely until a connection is made. This behavior blocks all other operator operations while a connection is not successful. For example, if an incorrect connection password is specified in the connection configuration document, the operator remains in an infinite startup loop until a shutdown is requested.") public void setReconnectionPolicy(String reconnectionPolicy){ this.reconnectionPolicy = reconnectionPolicy; } //Parameter reconnectionBound - @Parameter(optional = true, description="This optional parameter specifies the number of successive connection attempts that occur when a connection fails or a disconnect occurs. It is used only when the **reconnectionPolicy** parameter is set to `BoundedRetry`; otherwise, it is ignored. The default value is `5`.") + @Parameter(name = "reconnectionBound", optional = true, + description = "This optional parameter specifies the number of successive connection attempts that occur when a connection fails or a disconnect occurs. It is used only when the **reconnectionPolicy** parameter is set to `BoundedRetry`; otherwise, it is ignored. The default value is `5`.") public void setReconnectionBound(int reconnectionBound){ this.reconnectionBound = reconnectionBound; } //Parameter reconnectionBound - @Parameter(optional = true, description="This optional parameter specifies the amount of time (in seconds) that the operator waits between successive connection attempts. It is used only when the **reconnectionPolicy** parameter is set to `BoundedRetry` or `InfiniteRetry`; othewise, it is ignored. The default value is `10`.") + @Parameter(name = "reconnectionInterval", optional = true, + description = "This optional parameter specifies the amount of time (in seconds) that the operator waits between successive connection attempts. It is used only when the **reconnectionPolicy** parameter is set to `BoundedRetry` or `InfiniteRetry`; othewise, it is ignored. The default value is `10`.") public void setReconnectionInterval(double reconnectionInterval){ this.reconnectionInterval = reconnectionInterval; } -// Parameter sslConnection - @Parameter(optional = true, description="This optional parameter specifies whether an SSL connection should be made to the database. When set to `true`, the **keyStore**, **keyStorePassword**, **trustStore** and **trustStorePassword** parameters can be used to specify the locations and passwords of the keyStore and trustStore. The default value is `false`.") + //Parameter sslConnection + @Parameter(name = "sslConnection", optional = true, + description = "This optional parameter specifies whether an SSL connection should be made to the database. When set to `true`, the **keyStore**, **keyStorePassword**, **trustStore** and **trustStorePassword** parameters can be used to specify the locations and passwords of the keyStore and trustStore. The default value is `false`.") public void setSslConnection(boolean sslConnection) { this.sslConnection = sslConnection; } @@ -196,7 +218,8 @@ public boolean isSslConnection() { } // Parameter keyStore - @Parameter(optional = true, description="This optional parameter specifies the path to the keyStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + @Parameter(name = "keyStore" , optional = true, + description = "This optional parameter specifies the path to the keyStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") public void setKeyStore(String keyStore) { this.keyStore = keyStore; } @@ -206,7 +229,8 @@ public String getKeyStore() { } // Parameter keyStorePassword - @Parameter(optional = true, description="This parameter specifies the password for the keyStore given by the **keyStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + @Parameter(name = "keyStorePassword", optional = true, + description = "This parameter specifies the password for the keyStore given by the **keyStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") public void setKeyStorePassword(String keyStorePassword) { this.keyStorePassword = keyStorePassword; } @@ -216,7 +240,8 @@ public String getKeyStorePassword() { } // Parameter trustStore - @Parameter(optional = true, description="This optional parameter specifies the path to the trustStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + @Parameter(name = "trustStore", optional = true, + description = "This optional parameter specifies the path to the trustStore. If a relative path is specified, the path is relative to the application directory. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") public void setTrustStore(String trustStore) { this.trustStore = trustStore; } @@ -226,14 +251,25 @@ public String getTrustStore() { } // Parameter trustStorePassword - @Parameter(optional = true, description="This parameter specifies the password for the trustStore given by the **trustStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + @Parameter(name = "trustStorePassword", optional = true, + description = "This parameter specifies the password for the trustStore given by the **trustStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") public void setTrustStorePassword(String trustStorePassword) { this.trustStorePassword = trustStorePassword; } - public String getTrustStorePassword() { - return trustStorePassword; - } + public String getTrustStorePassword() { + return trustStorePassword; + } + + // Parameter appConfigName + @Parameter(name = "appConfigName", optional = true, + description = "Specifies the name of the application configuration that contains JDBC connection related configuration parameters. The keys in the application configuration have the same name as the operator parameters. " + + " The following keys are supported: username, password, and jdbcurl . " + + " If a value is specified in the application configuration and as operator parameter, the application configuration parameter value takes precedence. " + ) + public void setAppConfigName(String appConfigName) { + this.appConfigName = appConfigName; + } @@ -288,6 +324,51 @@ public static void checkParametersRuntime(OperatorContextChecker checker) { } + /* + * The method checkParameters + */ + @ContextCheck(compile = true) + public static void checkParameters(OperatorContextChecker checker) { + // If statement is set as parameter, statementAttr can not be set + checker.checkExcludedParameters("statement", "statementAttr"); + // If jdbcProperties is set as parameter, jdbcUser and jdbcPassword can not be set + checker.checkExcludedParameters("jdbcUser", "jdbcProperties"); + checker.checkExcludedParameters("jdbcPassword", "jdbcProperties"); + + // If credentials is set as parameter, jdbcUser, jdbcPassword and jdbcUrl can not be set. + checker.checkExcludedParameters("jdbcUser", "credentials"); + checker.checkExcludedParameters("jdbcPassword", "credentials"); + checker.checkExcludedParameters("jdbcUrl", "credentials"); + checker.checkExcludedParameters("credentials", "jdbcUrl"); + + // If credentials is set as parameter, credentials can not be set + checker.checkExcludedParameters("jdbcProperties", "credentials"); + + // check reconnection related parameters + checker.checkDependentParameters("reconnecionInterval", "reconnectionPolicy"); + checker.checkDependentParameters("reconnecionBound", "reconnectionPolicy"); + + // check parameters jdbcUrl jdbcUser and jdbcPassword + OperatorContext context = checker.getOperatorContext(); + if ((!context.getParameterNames().contains("credentials")) + && (!context.getParameterNames().contains("jdbcUrl"))) { + checker.setInvalidContext("The parameter 'jdbcUrl' is not defined. It must be set in one of these parameters: 'jdbcUrl' or 'credentials'", null); + } + + if ((!context.getParameterNames().contains("credentials")) + && (!context.getParameterNames().contains("jdbcProperties")) + && (!context.getParameterNames().contains("jdbcUser"))) { + checker.setInvalidContext("The 'jdbcUser' is not defined. It must be set in one of these parameters: 'jdbcUser' or 'credentials' or 'jdbcProperties' ", null); + } + if ((!context.getParameterNames().contains("credentials")) + && (!context.getParameterNames().contains("jdbcProperties")) + && (!context.getParameterNames().contains("jdbcPassword"))) { + checker.setInvalidContext("The 'jdbcPassword' is not defined. It must be set in one of these parameters: 'jdbcPassword' or 'credentials' or 'jdbcProperties'", null); + } + + } + + @ContextCheck public static void checkControlPortInputAttribute(OperatorContextChecker checker) { OperatorContext context = checker.getOperatorContext(); @@ -315,6 +396,9 @@ public static void checkControlPortInputAttribute(OperatorContextChecker checker public synchronized void initialize(OperatorContext context) throws Exception { super.initialize(context); + + loadAppConfig(context); + if (isSslConnection()) { if (context.getParameterNames().contains("keyStore")) System.setProperty("javax.net.ssl.keyStore", getAbsolutePath(getKeyStore())); @@ -341,6 +425,32 @@ public synchronized void initialize(OperatorContext context) TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " Setting up JDBC connection - Completed"); } + /** + * read the application config into a map + * @param context the operator context + */ + protected void loadAppConfig(OperatorContext context) { + + // if no appconfig name is specified, create empty map + if (appConfigName == null) { + appConfig = new HashMap(); + return; + } + + appConfig = context.getPE().getApplicationConfiguration(appConfigName); + if (appConfig.isEmpty()) { + LOGGER.log(LogLevel.WARN, "Application config not found or empty: " + appConfigName); + } + + for (Map.Entry kv : appConfig.entrySet()) { + LOGGER.log(LogLevel.INFO, "Found application config entry: " + kv.getKey() + "=" + kv.getValue()); + } + + } + + + + /** * Process an incoming tuple that arrived on the specified port. *

@@ -417,7 +527,7 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr String jdbcUser = (String)jdbcConnections.get("jdbcUser"); String jdbcPassword = (String)jdbcConnections.get("jdbcPassword"); String jdbcProperties = (String)jdbcConnections.get("jdbcProperties"); - String jdbcCredentials = (String)jdbcConnections.get("jdbcCredentials"); + String credentials = (String)jdbcConnections.get("credentials"); // jdbcClassName is required if (jdbcClassName == null || jdbcClassName.trim().isEmpty()){ @@ -429,11 +539,11 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } - // if jdbcCredentials is relative path, convert to absolute path - if (jdbcCredentials != null && !jdbcCredentials.trim().isEmpty() && !jdbcCredentials.startsWith(File.separator)) + // if credentials is relative path, convert to absolute path + if (credentials != null && !credentials.trim().isEmpty() && !credentials.startsWith(File.separator)) { - jdbcCredentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; - getCredentials(jdbcCredentials); + credentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; + getCredentials(credentials); } // jdbcUrl is required @@ -441,7 +551,7 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); } - // System.out.println("jdbcCredentials : " + jdbcCredentials); + // System.out.println("credentials : " + credentials); // Roll back the transaction jdbcClientHelper.rollbackWithClearBatch(); @@ -532,11 +642,11 @@ private synchronized void setupJDBCConnection() throws Exception{ jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } - // if jdbcCredentials is relative path, convert to absolute path - if (jdbcCredentials != null && !jdbcCredentials.trim().isEmpty() && !jdbcCredentials.startsWith(File.separator)) + // if credentials is relative path, convert to absolute path + if (credentials != null && !credentials.trim().isEmpty() && !credentials.startsWith(File.separator)) { - jdbcCredentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcCredentials; - getCredentials(jdbcCredentials); + credentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + credentials; + getCredentials(credentials); } // jdbcUrl is required @@ -557,14 +667,14 @@ private synchronized void setupJDBCConnection() throws Exception{ } // read credentials file and set user name, password und jdbc url. - public void getCredentials(String jdbcCredentials) throws IOException { + public void getCredentials(String credentials) throws IOException { String jsonString = ""; // read json file to string try { - byte[] encoded = Files.readAllBytes(Paths.get(jdbcCredentials)); + byte[] encoded = Files.readAllBytes(Paths.get(credentials)); jsonString = new String(encoded, Charset.defaultCharset()); }catch (IOException e){ - LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_PROPERTIES_NOT_EXIST"), new Object[]{jdbcCredentials}); + LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_PROPERTIES_NOT_EXIST"), new Object[]{credentials}); throw e; } diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 265624b..e452c60 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -166,22 +166,26 @@ public class JDBCRun extends AbstractJDBCOperator { private Thread checkConnectionThread = null; - + private CommitPolicy commitPolicy = DEFAULT_COMMIT_POLICY; - @Parameter(optional = true, description = "This parameter specifies the commit policy that should be used when the operator is in a consistent region. If set to *OnCheckpoint*, then commits will only occur during checkpointing. If set to *OnTransactionAndCheckpoint*, commits will occur during checkpointing as well as whenever the **transactionCount** or **commitInterval** are reached. The default value is *OnCheckpoint*. It is recommended that the *OnTransactionAndCheckpoint* value be set if the tables that the statements are being executed against can tolerate duplicate entries as these parameter value may cause the same statements to be executed if the operator is reset. It is also highly recommended that the **transactionCount** parameter not be set to a value greater than 1 when the policy is *onTransactionAndCheckpoint*, as this can lead to some statements not being executed in the event of a reset. This parameter is ignored if the operator is not in a consistent region. The default value for this parameter is *OnCheckpoint*.") + // Parameter commitPolicy + @Parameter(name = "commitPolicy", optional = true, + description = "This parameter specifies the commit policy that should be used when the operator is in a consistent region. If set to *OnCheckpoint*, then commits will only occur during checkpointing. If set to *OnTransactionAndCheckpoint*, commits will occur during checkpointing as well as whenever the **transactionCount** or **commitInterval** are reached. The default value is *OnCheckpoint*. It is recommended that the *OnTransactionAndCheckpoint* value be set if the tables that the statements are being executed against can tolerate duplicate entries as these parameter value may cause the same statements to be executed if the operator is reset. It is also highly recommended that the **transactionCount** parameter not be set to a value greater than 1 when the policy is *onTransactionAndCheckpoint*, as this can lead to some statements not being executed in the event of a reset. This parameter is ignored if the operator is not in a consistent region. The default value for this parameter is *OnCheckpoint*.") public void setCommitPolicy(CommitPolicy commitPolicy) { this.commitPolicy = commitPolicy; } // Parameter statement - @Parameter(optional = true, description = "This parameter specifies the value of any valid SQL or stored procedure statement. The statement can contain parameter markers") + @Parameter(name = "statement", optional = true, + description = "This parameter specifies the value of any valid SQL or stored procedure statement. The statement can contain parameter markers") public void setStatement(String statement) { this.statement = statement; } // Parameter statementParameters - @Parameter(optional = true, description = "This optional parameter specifies the value of statement parameters. The statementParameter value and SQL statement parameter markers are associated in lexicographic order. For example, the first parameter marker in the SQL statement is associated with the first statementParameter value.") + @Parameter(name = "statementParamAttrs", optional = true, + description = "This optional parameter specifies the value of statement parameters. The statementParameter value and SQL statement parameter markers are associated in lexicographic order. For example, the first parameter marker in the SQL statement is associated with the first statementParameter value.") public void setStatementParamAttrs(String statementParamAttrs) { this.statementParamAttrs = statementParamAttrs; @@ -194,47 +198,54 @@ public void setStatementParamAttrs(String statementParamAttrs) { } // Parameter statementAttr - @Parameter(optional = true, description = "This parameter specifies the value of complete SQL or stored procedure statement that is from stream attribute (no parameter markers).") + @Parameter(name = "statementAttr", optional = true, + description = "This parameter specifies the value of complete SQL or stored procedure statement that is from stream attribute (no parameter markers).") public void setStatementAttr(TupleAttribute statementAttr) { this.statementAttr = statementAttr; } // Parameter transactionSize - @Parameter(optional = true, description = "This optional parameter specifies the number of executions to commit per transaction. The default transaction size is 1 and transactions are automatically committed.") + @Parameter(name = "transactionSize", optional = true, + description = "This optional parameter specifies the number of executions to commit per transaction. The default transaction size is 1 and transactions are automatically committed.") public void setTransactionSize(int transactionSize) { this.transactionSize = transactionSize; } // Parameter batchSize - @Parameter(optional = true, description = "This optional parameter specifies the number of statement to execute as a batch. The default batch size is 1.") + @Parameter(name = "batchSize", optional = true, + description = "This optional parameter specifies the number of statement to execute as a batch. The default batch size is 1.") public void setBatchSize(int batchSize) { this.batchSize = batchSize; } // Parameter hasResultSetAttr - @Parameter(optional = true, description = "This parameter points to an output attribute and returns true if the statement produces result sets, otherwise, returns false") + @Parameter(name = "hasResultSetAttr", optional = true, + description = "This parameter points to an output attribute and returns true if the statement produces result sets, otherwise, returns false") public void setHasResultSetAttr(String hasResultSetAttr) { this.hasResultSetAttr = hasResultSetAttr; } // Parameter sqlStatusAttr - @Parameter(optional = true, description = "This parameter points to one or more output attributes and returns the SQL status information, including SQL code (the error number associated with the SQLException) and SQL state (the five-digit XOPEN SQLState code for a database error)") + @Parameter(name = "sqlStatusAttr", optional = true, + description = "This parameter points to one or more output attributes and returns the SQL status information, including SQL code (the error number associated with the SQLException) and SQL state (the five-digit XOPEN SQLState code for a database error)") public void setSqlStatusAttr(String sqlStatusAttr) { this.sqlStatusAttr = sqlStatusAttr; } - // Parameter sqlStatusAttr - @Parameter(optional = true, description = "This parameter sets a commit interval for the sql statements that are being processed and overrides the batchSize and transactionSize parameters. ") + // Parameter commitInterval + @Parameter(name = "commitInterval", optional = true, + description = "This parameter sets a commit interval for the sql statements that are being processed and overrides the batchSize and transactionSize parameters. ") public void setCommitInterval(int commitInterval) { this.commitInterval = commitInterval; } // Parameter checkConnection - @Parameter(optional = true, description="This optional parameter specifies whether a **checkConnection** thread should be start. The thread checks periodically the status of JDBC connection. The JDBCRun sends in case of any connection failure a SqlCode and a message to SPL application.The default value is `false`.") + @Parameter(name = "checkConnection", optional = true, + description = "This optional parameter specifies whether a **checkConnection** thread should be start. The thread checks periodically the status of JDBC connection. The JDBCRun sends in case of any connection failure a SqlCode and a message to SPL application.The default value is `false`.") public void setcheckConnection(boolean checkConnection) { this.checkConnection = checkConnection; } - + public boolean getCheckConnection() { return checkConnection; } @@ -244,6 +255,7 @@ public boolean getCheckConnection() { * The method checkErrorOutputPort validates that the stream on error output * port contains the optional attribute of type which is the incoming tuple, * and a JdbcSqlStatus_T which will contain the error message in order. + * @param checker */ @ContextCheck public static void checkErrorOutputPort(OperatorContextChecker checker) { @@ -408,50 +420,7 @@ private static int findSqlStatusAttr(StreamingOutput dataPort, Stre } - /* - * The method checkParameters - */ - @ContextCheck(compile = true) - public static void checkParameters(OperatorContextChecker checker) { - // If statement is set as parameter, statementAttr can not be set - checker.checkExcludedParameters("statement", "statementAttr"); - // If jdbcProperties is set as parameter, jdbcUser and jdbcPassword can not be set - checker.checkExcludedParameters("jdbcUser", "jdbcProperties"); - checker.checkExcludedParameters("jdbcPassword", "jdbcProperties"); - - // If jdbcCredentials is set as parameter, jdbcUser, jdbcPassword and jdbcUrl can not be set. - checker.checkExcludedParameters("jdbcUser", "jdbcCredentials"); - checker.checkExcludedParameters("jdbcPassword", "jdbcCredentials"); - checker.checkExcludedParameters("jdbcUrl", "jdbcCredentials"); - checker.checkExcludedParameters("jdbcCredentials", "jdbcUrl"); - - // If jdbcCredentials is set as parameter, jdbcCredentials can not be set - checker.checkExcludedParameters("jdbcProperties", "jdbcCredentials"); - - // check reconnection related parameters - checker.checkDependentParameters("reconnecionInterval", "reconnectionPolicy"); - checker.checkDependentParameters("reconnecionBound", "reconnectionPolicy"); - - // check parameters jdbcUrl jdbcUser and jdbcPassword - OperatorContext context = checker.getOperatorContext(); - if ((!context.getParameterNames().contains("jdbcCredentials")) - && (!context.getParameterNames().contains("jdbcUrl"))) { - checker.setInvalidContext("The parameter 'jdbcUrl' is not defined. It must be set in one of these parameters: 'jdbcUrl' or 'jdbcCredentials'", null); - } - - if ((!context.getParameterNames().contains("jdbcCredentials")) - && (!context.getParameterNames().contains("jdbcProperties")) - && (!context.getParameterNames().contains("jdbcUser"))) { - checker.setInvalidContext("The 'jdbcUser' is not defined. It must be set in one of these parameters: 'jdbcUser' or 'jdbcCredentials' or 'jdbcProperties' ", null); - } - if ((!context.getParameterNames().contains("jdbcCredentials")) - && (!context.getParameterNames().contains("jdbcProperties")) - && (!context.getParameterNames().contains("jdbcPassword"))) { - checker.setInvalidContext("The 'jdbcPassword' is not defined. It must be set in one of these parameters: 'jdbcPassword' or 'jdbcCredentials' or 'jdbcProperties'", null); - } - - } - + /** * Initialize this operator. Called once before any tuples are processed. * @@ -487,6 +456,8 @@ public synchronized void initialize(OperatorContext context) throws Exception { initPreparedStatement(); } + + /** * startCheckConnection starts a thread to check the JDBC connection. * In case of any connection problem it tries to create a new connection diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index fe2f86c..d810539 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -30,11 +30,12 @@ ++ What is new in version 1.4.3 - * The JDBCRun operators provides a new parameter 'jdbcCredentials'. - This optional parameter specifies the path name of the json file that contains the jdbc credentials. - The jdbc credentials file must conatain valid JSON format and a set of name/value pairs for - 'username', 'password' and 'jdbcurl'. - + * The JDBCRun operators provides a new parameter **credentials**. + This optional parameter specifies the path name of the JSON file that contains the JDBC credentials. + The JDBC credentials file must contain valid JSON format and a set of name/value pairs for + **username**, **password** and **jdbcurl**. + + * support **Streams application configuration** 1.4.3 From 929500be7a0cc7524249f8a7eede7374c93d6278 Mon Sep 17 00:00:00 2001 From: anouri Date: Tue, 15 Jan 2019 09:12:03 -0800 Subject: [PATCH 16/48] exception handling improved. --- .../streamsx/jdbc/AbstractJDBCOperator.java | 54 +++++++++++++++---- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 6 ++- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 543e277..04d7d82 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -409,13 +409,17 @@ public synchronized void initialize(OperatorContext context) if (context.getParameterNames().contains("trustStorePassword")) System.setProperty("javax.net.ssl.trustStorePassword", getTrustStorePassword()); } - TRACE.log(TraceLevel.DEBUG,"201701191030 propperties: "+System.getProperties().toString()); + TRACE.log(TraceLevel.DEBUG," propperties: " + System.getProperties().toString()); TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " initializing in PE: " + context.getPE().getPEId() + " in Job: " + context.getPE().getJobId()); //$NON-NLS-3$ // set up JDBC driver class path TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " setting up class path..."); - setupClassPath(context); - TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " setting up class path - Completed"); + if(!setupClassPath(context)){ + TRACE.log(TraceLevel.ERROR, "Operator " + context.getName() + " setting up class path failed."); +// throw new FileNotFoundException(); + throw new IOException(); + } + TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " setting up class path - Completed."); consistentRegionContext = context.getOptionalContext(ConsistentRegionContext.class); @@ -496,8 +500,10 @@ public void process(StreamingInput inputStream, Tuple tuple) try{ processTuple(inputStream, tuple); }catch (Exception e){ - LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_CONNECTION_FAILED_ERROR"), new Object[]{e.toString()}); - // Check if JDBC connection valid + if((e.toString() != null ) && (e.toString().length() > 0)){ + LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_CONNECTION_FAILED_ERROR"), new Object[]{e.toString()}); + } + // Check if JDBC connection valid if (jdbcClientHelper.isValidConnection()){ // Throw exception for operator to process if JDBC connection is valid throw e; @@ -600,9 +606,10 @@ public synchronized void shutdown() throws Exception { } // Set up JDBC driver class path - private void setupClassPath(OperatorContext context) throws MalformedURLException{ + private boolean setupClassPath(OperatorContext context) throws MalformedURLException{ String libDir = jdbcDriverLib; + if (jdbcDriverLib.lastIndexOf(File.separator) > 0) { libDir = jdbcDriverLib.substring(0, jdbcDriverLib.lastIndexOf(File.separator)); } @@ -616,17 +623,44 @@ private void setupClassPath(OperatorContext context) throws MalformedURLExceptio jarDir = appDir + File.separator + libDir; } + + File jarDirectory = new File(jarDir); + // Check if directory exists. + if(!jarDirectory.exists()) + { + TRACE.log(TraceLevel.ERROR, "Operator " + context.getName() + " ERROR: jdbcDriverLib " + jarDir + " does'nt exists or it is empty."); + return false; + } + + // Check if directory contains files File[] files = new File(jarDir).listFiles(); + if (files.length == 0){ + TRACE.log(TraceLevel.ERROR, "Operator " + context.getName() + " ERROR: jdbcDriverLib directory " + jarDir + "is empty."); + return false; + } + // If this pathname does not denote a directory, then listFiles() returns null. // Search in the "opt" directory and add all jar files to the class path. + boolean jarFileFound = false; for (File file : files) { if (file.isFile()) { - String jarFile = jarDir + File.separator + file.getName(); - TRACE.log(TraceLevel.INFO, "Operator " + context.getName() + "setupClassPath " + jarFile); - context.addClassLibraries(new String[] {jarFile}); + String jarFile = jarDir + File.separator + file.getName(); + // check if the file is a JAR file + if (jarFile.endsWith(".jar")){ + jarFileFound = true; + TRACE.log(TraceLevel.INFO, "Operator " + context.getName() + "setupClassPath " + jarFile); + context.addClassLibraries(new String[] {jarFile}); + } } } - TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " JDBC Driver Lib: " + jdbcDriverLib); + if (!jarFileFound){ + TRACE.log(TraceLevel.ERROR, "Operator " + context.getName() + " ERROR: No JAR file found in jdbcDriverLib directory: " + jarDir); + return false; + } + else { + TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " JDBC Driver Lib: " + jdbcDriverLib); + } + return true; } // Set up JDBC connection diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index e452c60..842e0e4 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -703,8 +703,10 @@ private void handleException(Tuple tuple, SQLException e) throws Exception, SQLE if (sqlFailureAction.equalsIgnoreCase(IJDBCConstants.SQLFAILURE_ACTION_LOG)) { TRACE.log(TraceLevel.DEBUG, "SQL Failure - Log..."); // The error is logged, and the error condition is cleared - LOGGER.log(LogLevel.WARNING, Messages.getString("JDBC_SQL_EXCEPTION_WARNING"), new Object[] { e.toString() }); - // Commit the transactions according to transactionSize + if((e.toString() != null ) && (e.toString().length() > 0)){ + TRACE.log(TraceLevel.WARNING, Messages.getString("JDBC_SQL_EXCEPTION_WARNING"), new Object[] { e.toString() }); + } + // Commit the transactions according to transactionSize if ((consistentRegionContext == null || (consistentRegionContext != null && commitPolicy == CommitPolicy.OnTransactionAndCheckpoint)) From 0d9d8cbcab6eab072585d16bd8c245b6a5053287 Mon Sep 17 00:00:00 2001 From: anouri Date: Thu, 17 Jan 2019 08:03:48 -0800 Subject: [PATCH 17/48] loop in exception handling fixed --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 842e0e4..fffd2e8 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -683,13 +683,15 @@ private void handleException(Tuple tuple, SQLException e) throws Exception, SQLE // submit error message submitErrorTuple(errorOutputPort, tuple, jSqlStatus); // get next Exception message and sqlCode and submit it to the error output. +// System.out.println("1111111111 Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); SQLException eNext = e.getNextException(); while(eNext != null) { jSqlStatus.setSqlCode(eNext.getErrorCode()); jSqlStatus.setSqlState(eNext.getSQLState()); jSqlStatus.setSqlMessage(eNext.getMessage()); - // System.out.println("NextException sqlCode: " + eNext.getErrorCode() + " sqlState: " + eNext.getSQLState() + " sqlMessage: " + eNext.getMessage()); submitErrorTuple(errorOutputPort, tuple, jSqlStatus); +// System.out.println("2222222222222 Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); + eNext = eNext.getNextException(); } } From bbd0f9bf1e236852367cb717f50307a8cba2a019 Mon Sep 17 00:00:00 2001 From: anouri Date: Thu, 17 Jan 2019 09:10:21 -0800 Subject: [PATCH 18/48] credentials is a string and not a file --- .../streamsx/jdbc/AbstractJDBCOperator.java | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 04d7d82..d58045c 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -545,10 +545,8 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } - // if credentials is relative path, convert to absolute path - if (credentials != null && !credentials.trim().isEmpty() && !credentials.startsWith(File.separator)) + if (credentials != null && !credentials.trim().isEmpty()) { - credentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; getCredentials(credentials); } @@ -676,13 +674,10 @@ private synchronized void setupJDBCConnection() throws Exception{ jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; } - // if credentials is relative path, convert to absolute path - if (credentials != null && !credentials.trim().isEmpty() && !credentials.startsWith(File.separator)) - { - credentials = getOperatorContext().getPE().getApplicationDirectory() + File.separator + credentials; + if (credentials != null && !credentials.trim().isEmpty()) { getCredentials(credentials); } - + // jdbcUrl is required if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); @@ -700,20 +695,10 @@ private synchronized void setupJDBCConnection() throws Exception{ } } - // read credentials file and set user name, password und jdbc url. + // read credentials and set user name, password and jdbcUrl. public void getCredentials(String credentials) throws IOException { - String jsonString = ""; - // read json file to string - try { - byte[] encoded = Files.readAllBytes(Paths.get(credentials)); - jsonString = new String(encoded, Charset.defaultCharset()); - }catch (IOException e){ - LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_PROPERTIES_NOT_EXIST"), new Object[]{credentials}); - throw e; - } - -// System.out.println(" jsonString " + jsonString); - + String jsonString = credentials; + try { JSONObject obj = JSONObject.parse(jsonString); jdbcUser = (String)obj.get("username"); From ecbd83fc799ddc0f319592206ff4ff1febe3e86f Mon Sep 17 00:00:00 2001 From: anouri Date: Fri, 18 Jan 2019 03:01:08 -0800 Subject: [PATCH 19/48] Document JDBC driver setup. #77 --- .../com/ibm/streamsx/jdbc/AbstractJDBCOperator.java | 10 +++++----- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 9 ++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index d58045c..1274ce7 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -4,13 +4,10 @@ *******************************************************************************/ package com.ibm.streamsx.jdbc; - import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; -import java.nio.charset.Charset; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.sql.SQLException; @@ -119,7 +116,7 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S //Parameter jdbcDriverLib @Parameter(name = "jdbcDriverLib", optional = false, - description = "This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string.") + description = "This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string. It is recommended to set the value of this parameter without slash at begin, like 'opt/db2jcc4.jar'. In this case the SAB file will contain the driver libraries.") public void setJdbcDriverLib(String jdbcDriverLib){ this.jdbcDriverLib = jdbcDriverLib; } @@ -449,7 +446,10 @@ protected void loadAppConfig(OperatorContext context) { for (Map.Entry kv : appConfig.entrySet()) { LOGGER.log(LogLevel.INFO, "Found application config entry: " + kv.getKey() + "=" + kv.getValue()); } - + + jdbcUser = (null != appConfig.get("username")) ? appConfig.get("username") : jdbcUser; + jdbcPassword = (null != appConfig.get("password")) ? appConfig.get("password") : jdbcPassword; + jdbcUrl = (null != appConfig.get("jdbcUrl")) ? appConfig.get("jdbcUrl") : jdbcUrl; } diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index fffd2e8..c0315e5 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -682,15 +682,15 @@ private void handleException(Tuple tuple, SQLException e) throws Exception, SQLE if (hasErrorPort) { // submit error message submitErrorTuple(errorOutputPort, tuple, jSqlStatus); - // get next Exception message and sqlCode and submit it to the error output. -// System.out.println("1111111111 Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); + // System.out.println("First Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); + // get next Exception message and sqlCode and submit it to the error output. SQLException eNext = e.getNextException(); while(eNext != null) { jSqlStatus.setSqlCode(eNext.getErrorCode()); jSqlStatus.setSqlState(eNext.getSQLState()); jSqlStatus.setSqlMessage(eNext.getMessage()); submitErrorTuple(errorOutputPort, tuple, jSqlStatus); -// System.out.println("2222222222222 Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); + // System.out.println("Next Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); eNext = eNext.getNextException(); } @@ -698,8 +698,7 @@ private void handleException(Tuple tuple, SQLException e) throws Exception, SQLE // Check if JDBC connection valid if (!jdbcClientHelper.isValidConnection()) { - // sqlFailureAction need not process if JDBC Connection is not valid - + // sqlFailureAction need not process if JDBC Connection is not valid throw e; } if (sqlFailureAction.equalsIgnoreCase(IJDBCConstants.SQLFAILURE_ACTION_LOG)) { From 9f3755d36ee6ec9b5290f59a5881e150f75b2650 Mon Sep 17 00:00:00 2001 From: anouri Date: Wed, 23 Jan 2019 01:33:01 -0800 Subject: [PATCH 20/48] corrections for #79 #78 --- .../streamsx/jdbc/AbstractJDBCOperator.java | 16 ++++----- .../ibm/streamsx/jdbc/JDBCClientHelper.java | 11 ++++++ .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 15 ++------ .../jdbc/messages/messages.properties | 32 +++++++++--------- .../jdbc/messages/messages_de_DE.properties | 32 +++++++++--------- .../jdbc/messages/messages_en_US.properties | 32 +++++++++--------- .../jdbc/messages/messages_es_ES.properties | 28 +++++++-------- .../jdbc/messages/messages_fr_FR.properties | 32 +++++++++--------- .../jdbc/messages/messages_it_IT.properties | 32 +++++++++--------- .../jdbc/messages/messages_ja_JP.properties | 32 +++++++++--------- .../jdbc/messages/messages_ko_KR.properties | 32 +++++++++--------- .../jdbc/messages/messages_pt_BR.properties | 32 +++++++++--------- .../jdbc/messages/messages_ru_RU.properties | 32 +++++++++--------- .../jdbc/messages/messages_zh_CN.properties | 32 +++++++++--------- .../jdbc/messages/messages_zh_TW.properties | 32 +++++++++--------- .../impl/lib/com.ibm.streamsx.jdbc.jar | Bin 0 -> 59930 bytes samples/JDBCSample/toolkit.xml | 30 ++++++++-------- 17 files changed, 227 insertions(+), 225 deletions(-) create mode 100644 com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 1274ce7..65e3e52 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -155,7 +155,7 @@ public void setJdbcPassword(String jdbcPassword){ //Parameter jdbcProperties @Parameter(name = "jdbcProperties", optional = true, - description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: jdbcUser and jdbcPassword") + description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user' and 'password'") public void setJdbcProperties(String jdbcProperties){ this.jdbcProperties = jdbcProperties; } @@ -261,7 +261,7 @@ public String getTrustStorePassword() { // Parameter appConfigName @Parameter(name = "appConfigName", optional = true, description = "Specifies the name of the application configuration that contains JDBC connection related configuration parameters. The keys in the application configuration have the same name as the operator parameters. " - + " The following keys are supported: username, password, and jdbcurl . " + + " The 'credentials' is supported as application configuration" + " If a value is specified in the application configuration and as operator parameter, the application configuration parameter value takes precedence. " ) public void setAppConfigName(String appConfigName) { @@ -447,14 +447,12 @@ protected void loadAppConfig(OperatorContext context) { LOGGER.log(LogLevel.INFO, "Found application config entry: " + kv.getKey() + "=" + kv.getValue()); } - jdbcUser = (null != appConfig.get("username")) ? appConfig.get("username") : jdbcUser; - jdbcPassword = (null != appConfig.get("password")) ? appConfig.get("password") : jdbcPassword; - jdbcUrl = (null != appConfig.get("jdbcUrl")) ? appConfig.get("jdbcUrl") : jdbcUrl; + if (null != appConfig.get("credentials")){ + credentials = appConfig.get("credentials"); + } } - - - + /** * Process an incoming tuple that arrived on the specified port. *

@@ -694,6 +692,8 @@ private synchronized void setupJDBCConnection() throws Exception{ throw e; } } + + // read credentials and set user name, password and jdbcUrl. public void getCredentials(String credentials) throws IOException { diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index c13d4b8..2e717df 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -111,6 +111,17 @@ public synchronized void createConnection() throws Exception, SQLException{ FileInputStream fileInput = new FileInputStream(jdbcProperties); jdbcConnectionProps.load(fileInput); fileInput.close(); + String user = jdbcConnectionProps.getProperty("user"); + if (null == user){ + LOGGER.log(LogLevel.ERROR, "'user' is not defined in property file: " + jdbcProperties); + return; + } + String password = jdbcConnectionProps.getProperty("password"); + if (null == password){ + LOGGER.log(LogLevel.ERROR, "'password' is not defined in property file: " + jdbcProperties); + return; + } + } else { // pick up user and password if they are parameters if (jdbcUser != null && jdbcPassword != null) { diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index c0315e5..192a12b 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -660,15 +660,7 @@ private void handleException(Tuple tuple, SQLException e) throws Exception, SQLE JDBCSqlStatus jSqlStatus = new JDBCSqlStatus(); // System.out.println(" sqlCode: " + e.getErrorCode() + " sqlState: " + e.getSQLState() + " sqlMessage: " + e.getMessage()); - String sqlMessage = e.getMessage(); - - // add cause text to the error message - Throwable t = e.getCause(); - while(t != null) { - // System.out.println("Cause: " + t); - sqlMessage = sqlMessage + t; - t = t.getCause(); - } + String sqlMessage = e.getMessage(); jSqlStatus.setSqlCode(e.getErrorCode()); jSqlStatus.setSqlState(e.getSQLState()); @@ -682,16 +674,15 @@ private void handleException(Tuple tuple, SQLException e) throws Exception, SQLE if (hasErrorPort) { // submit error message submitErrorTuple(errorOutputPort, tuple, jSqlStatus); - // System.out.println("First Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); + // System.out.println("First Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); // get next Exception message and sqlCode and submit it to the error output. SQLException eNext = e.getNextException(); - while(eNext != null) { + if(eNext != null) { jSqlStatus.setSqlCode(eNext.getErrorCode()); jSqlStatus.setSqlState(eNext.getSQLState()); jSqlStatus.setSqlMessage(eNext.getMessage()); submitErrorTuple(errorOutputPort, tuple, jSqlStatus); // System.out.println("Next Exception sqlCode: " + jSqlStatus.getSqlCode() + " sqlState: " + jSqlStatus.getSqlState() + " sqlMessage: " + jSqlStatus.getSqlMessage()); - eNext = eNext.getNextException(); } } diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages.properties index 5582a20..c07161a 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Specified JDBC properties file does not exist. The specified file is ''{0}'' . -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC connection failed. The exception is ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Specified JDBC properties file does not exist. The specified file is '{0}' . +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC connection failed. The exception is '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E jdbcClassName is required to create JDBC connection. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E ''jdbcUrl'' is required to create JDBC connection. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E Reset JDBC connection failed. The exception is ''{0}'' . -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E The attribute specified in Statement Parameter does not exist: ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E The operator does not support this SPL type: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E Reset JDBC connection failed. The exception is '{0}' . +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E The attribute specified in Statement Parameter does not exist: '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E The operator does not support this SPL type: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E The SQL statement is empty. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E A SQL exception occurred. The exception is ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E A SQL exception occurred. The exception is '{0}' JDBC_REC_BOUND_NEG=CDIST2809E The value of the reconnectionBound parameter must be zero or greater than zero. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E The reconnectionBound appears only when the reconnectionPolicy parameter is set to BoundedRetry. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E The control port must have an attribute of type ''rstring'', found ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E The control port must have an attribute of type ''rstring'', found '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E The optional error output port can have no more than two attributes. JDBC_ATLEAST_ONE_ATTR=CDIST2813E The optional error output port must have at least one attribute. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E The first attribute in the optional error output port must be a tuple. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E The attribute specified in the hasResultSetAttr Parameter does not exist: ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E The attribute specified in the sqlStatusAttr Parameter does not exist: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E The operator ''{0}'' cannot be the start of a consistent region. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E The attribute specified in the hasResultSetAttr Parameter does not exist: '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E The attribute specified in the sqlStatusAttr Parameter does not exist: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E The operator '{0}' cannot be the start of a consistent region. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound value ''{0}'' should be zero or greater than zero -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' can appear only when the reconnectionPolicy parameter is set to BoundedRetry and cannot appear otherwise. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC connection failed. The exception is ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W A SQL exception occurred. The exception is ''{0}'' . +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound value '{0}' should be zero or greater than zero +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' can appear only when the reconnectionPolicy parameter is set to BoundedRetry and cannot appear otherwise. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC connection failed. The exception is '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W A SQL exception occurred. The exception is '{0}' . JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I Attempting to recreate JDBC connection. JDBC_CR_CLOSE=CDIST2823I StateHandler Close. -JDBC_CR_CHECKPOINT=CDIST2824I Checkpoint. The checkpoint id is ''{0}'' . +JDBC_CR_CHECKPOINT=CDIST2824I Checkpoint. The checkpoint id is '{0}' . JDBC_CR_DRAIN=CDIST2825I Drain. -JDBC_CR_RESET=CDIST2826I Reset to checkpoint: ''{0}'' +JDBC_CR_RESET=CDIST2826I Reset to checkpoint: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I Reset to initial state. JDBC_CR_RETIRE=CDIST2828I Retire checkpoint. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_de_DE.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_de_DE.properties index a8c49df..f8be602 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_de_DE.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_de_DE.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Angegebene JDBC-Eigenschaftendatei ist nicht vorhanden. Angegebene Datei: ''{0}'' . -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC-Verbindung ist fehlgeschlagen. Ausnahmebedingung: ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Angegebene JDBC-Eigenschaftendatei ist nicht vorhanden. Angegebene Datei: '{0}' . +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC-Verbindung ist fehlgeschlagen. Ausnahmebedingung: '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E jdbcClassName ist zum Erstellen der JDBC-Verbindung erforderlich. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E ''jdbcUrl'' ist zum Erstellen der JDBC-Verbindung erforderlich. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E Das Zur\u00fccksetzen der JDBC-Verbindung ist fehlgeschlagen. Ausnahmebedingung: ''{0}'' . -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E Das im Anweisungsparameter angegebene Attribut ist nicht vorhanden: ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E Der Operator unterst\u00fctzt diesen SPL-Typ nicht: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E Das Zur\u00fccksetzen der JDBC-Verbindung ist fehlgeschlagen. Ausnahmebedingung: '{0}' . +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E Das im Anweisungsparameter angegebene Attribut ist nicht vorhanden: '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E Der Operator unterst\u00fctzt diesen SPL-Typ nicht: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E Die SQL-Anweisung ist leer. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Eine SQL-Ausnahmebedingung ist aufgetreten. Ausnahmebedingung: ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Eine SQL-Ausnahmebedingung ist aufgetreten. Ausnahmebedingung: '{0}' JDBC_REC_BOUND_NEG=CDIST2809E Der Wert des Parameters reconnectionBound muss gr\u00f6\u00dfer-gleich null sein. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E reconnectionBound wird nur angezeigt, wenn der Parameter reconnectionPolicy auf BoundedRetry gesetzt ist. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E Der Steuerport muss ein Attribut des Typs ''rstring'' haben, gefunden wurde ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E Der Steuerport muss ein Attribut des Typs ''rstring'' haben, gefunden wurde '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E Der optionale Port f\u00fcr die Fehlernachrichten kann nicht mehr als zwei Attribute haben. JDBC_ATLEAST_ONE_ATTR=CDIST2813E Der optionale Port f\u00fcr Fehlernachrichten muss mindestens ein Attribut haben. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E Das erste Attribut im optionalen Port f\u00fcr Fehlernachrichten muss ein Tupel sein. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E Das im Parameter hasResultSetAttr angegebene Attribut ist nicht vorhanden: ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E Das im Parameter sqlStatusAttr angegebene Attribut ist nicht vorhanden: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E Der Operator ''{0}'' darf nicht der Anfang einer konsistenten Region sein. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E Das im Parameter hasResultSetAttr angegebene Attribut ist nicht vorhanden: '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E Das im Parameter sqlStatusAttr angegebene Attribut ist nicht vorhanden: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E Der Operator '{0}' darf nicht der Anfang einer konsistenten Region sein. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E Der reconnectionBound-Wert ''{0}'' muss gr\u00f6\u00dfer-gleich null sein. -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' kann nur verwendet werden, wenn der Parameter reconnectionPolicy auf BoundedRetry gesetzt ist. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC-Verbindung ist fehlgeschlagen. Ausnahmebedingung: ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Eine SQL-Ausnahmebedingung ist aufgetreten. Ausnahmebedingung: ''{0}'' . +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E Der reconnectionBound-Wert '{0}' muss gr\u00f6\u00dfer-gleich null sein. +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' kann nur verwendet werden, wenn der Parameter reconnectionPolicy auf BoundedRetry gesetzt ist. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC-Verbindung ist fehlgeschlagen. Ausnahmebedingung: '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Eine SQL-Ausnahmebedingung ist aufgetreten. Ausnahmebedingung: '{0}' . JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I Es wird versucht, eine JDBC-Verbindung erneut zu erstellen. JDBC_CR_CLOSE=CDIST2823I StateHandler Close. -JDBC_CR_CHECKPOINT=CDIST2824I Pr\u00fcfpunkt. Pr\u00fcfpunkt-ID: ''{0}'' . +JDBC_CR_CHECKPOINT=CDIST2824I Pr\u00fcfpunkt. Pr\u00fcfpunkt-ID: '{0}' . JDBC_CR_DRAIN=CDIST2825I Bereinigung. -JDBC_CR_RESET=CDIST2826I Zur\u00fccksetzung auf Pr\u00fcfpunkt: ''{0}'' +JDBC_CR_RESET=CDIST2826I Zur\u00fccksetzung auf Pr\u00fcfpunkt: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I Zur\u00fccksetzung auf Anfangsstatus. JDBC_CR_RETIRE=CDIST2828I Pr\u00fcfpunkt au\u00dfer Kraft setzen. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_en_US.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_en_US.properties index 5582a20..c07161a 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_en_US.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_en_US.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Specified JDBC properties file does not exist. The specified file is ''{0}'' . -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC connection failed. The exception is ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Specified JDBC properties file does not exist. The specified file is '{0}' . +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC connection failed. The exception is '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E jdbcClassName is required to create JDBC connection. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E ''jdbcUrl'' is required to create JDBC connection. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E Reset JDBC connection failed. The exception is ''{0}'' . -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E The attribute specified in Statement Parameter does not exist: ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E The operator does not support this SPL type: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E Reset JDBC connection failed. The exception is '{0}' . +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E The attribute specified in Statement Parameter does not exist: '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E The operator does not support this SPL type: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E The SQL statement is empty. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E A SQL exception occurred. The exception is ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E A SQL exception occurred. The exception is '{0}' JDBC_REC_BOUND_NEG=CDIST2809E The value of the reconnectionBound parameter must be zero or greater than zero. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E The reconnectionBound appears only when the reconnectionPolicy parameter is set to BoundedRetry. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E The control port must have an attribute of type ''rstring'', found ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E The control port must have an attribute of type ''rstring'', found '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E The optional error output port can have no more than two attributes. JDBC_ATLEAST_ONE_ATTR=CDIST2813E The optional error output port must have at least one attribute. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E The first attribute in the optional error output port must be a tuple. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E The attribute specified in the hasResultSetAttr Parameter does not exist: ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E The attribute specified in the sqlStatusAttr Parameter does not exist: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E The operator ''{0}'' cannot be the start of a consistent region. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E The attribute specified in the hasResultSetAttr Parameter does not exist: '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E The attribute specified in the sqlStatusAttr Parameter does not exist: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E The operator '{0}' cannot be the start of a consistent region. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound value ''{0}'' should be zero or greater than zero -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' can appear only when the reconnectionPolicy parameter is set to BoundedRetry and cannot appear otherwise. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC connection failed. The exception is ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W A SQL exception occurred. The exception is ''{0}'' . +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound value '{0}' should be zero or greater than zero +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' can appear only when the reconnectionPolicy parameter is set to BoundedRetry and cannot appear otherwise. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC connection failed. The exception is '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W A SQL exception occurred. The exception is '{0}' . JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I Attempting to recreate JDBC connection. JDBC_CR_CLOSE=CDIST2823I StateHandler Close. -JDBC_CR_CHECKPOINT=CDIST2824I Checkpoint. The checkpoint id is ''{0}'' . +JDBC_CR_CHECKPOINT=CDIST2824I Checkpoint. The checkpoint id is '{0}' . JDBC_CR_DRAIN=CDIST2825I Drain. -JDBC_CR_RESET=CDIST2826I Reset to checkpoint: ''{0}'' +JDBC_CR_RESET=CDIST2826I Reset to checkpoint: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I Reset to initial state. JDBC_CR_RETIRE=CDIST2828I Retire checkpoint. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_es_ES.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_es_ES.properties index a5fc159..c68a3f3 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_es_ES.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_es_ES.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E El archivo de propiedades JDBC especificado no existe. El archivo especificado es ''{0}''. -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E La conexi\u00f3n JDBC ha fallado. La excepci\u00f3n es ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E El archivo de propiedades JDBC especificado no existe. El archivo especificado es '{0}'. +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E La conexi\u00f3n JDBC ha fallado. La excepci\u00f3n es '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E Se requiere jdbcClassName para crear una conexi\u00f3n JDBC. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E Se requiere jdbcUrl para crear una conexi\u00f3n JDBC. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E No se ha podido restablecer la conexi\u00f3n JDBC. La excepci\u00f3n es ''{0}''. -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E El atributo especificado en el par\u00e1metro de sentencia no existe: ''{0}''. -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E El operador no da soporte a este tipo SPL: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E No se ha podido restablecer la conexi\u00f3n JDBC. La excepci\u00f3n es '{0}'. +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E El atributo especificado en el par\u00e1metro de sentencia no existe: '{0}'. +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E El operador no da soporte a este tipo SPL: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E La sentencia SQL est\u00e1 vac\u00eda. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Se ha producido una excepci\u00f3n SQL. La excepci\u00f3n es ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Se ha producido una excepci\u00f3n SQL. La excepci\u00f3n es '{0}' JDBC_REC_BOUND_NEG=CDIST2809E El valor del par\u00e1metro reconnectionBound debe ser cero o mayor que cero. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E reconnectionBound aparece s\u00f3lo cuando el par\u00e1metro reconnectionPolicy est\u00e1 establecido en BoundedRetry. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E El puerto de control debe tener un atributo de tipo ''rstring'', se ha encontrado ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E El puerto de control debe tener un atributo de tipo ''rstring'', se ha encontrado '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E El puerto de salida de error opcional no puede tener m\u00e1s de dos atributos. JDBC_ATLEAST_ONE_ATTR=CDIST2813E El puerto de salida de error opcional debe tener como m\u00ednimo un atributo. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E El primer atributo en el puerto de salida de error opcional debe ser una tupla. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E El atributo especificado en el par\u00e1metro hasResultSetAttr no existe: ''{0}''. -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E El atributo especificado en el par\u00e1metro sqlStatusAttr no existe: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E El operador ''{0}'' no puede ser el inicio de una regi\u00f3n coherente. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E El atributo especificado en el par\u00e1metro hasResultSetAttr no existe: '{0}'. +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E El atributo especificado en el par\u00e1metro sqlStatusAttr no existe: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E El operador '{0}' no puede ser el inicio de una regi\u00f3n coherente. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region JDBC_REC_BOUND_NOT_ZERO=CDIST2818E El valor de reconnectionBound {0} debe ser cero o mayor que cero JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound {0} puede aparecer s\u00f3lo cuando el par\u00e1metro reconnectionPolicy est\u00e1 establecido en BoundedRetry y no puede aparecer de otra forma. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W La conexi\u00f3n JDBC ha fallado. La excepci\u00f3n es ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Se ha producido una excepci\u00f3n SQL. La excepci\u00f3n es ''{0}''. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W La conexi\u00f3n JDBC ha fallado. La excepci\u00f3n es '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Se ha producido una excepci\u00f3n SQL. La excepci\u00f3n es '{0}'. JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I Intentando volver a crear la conexi\u00f3n JDBC. JDBC_CR_CLOSE=CDIST2823I StateHandler cerrado. -JDBC_CR_CHECKPOINT=CDIST2824I Comprobaci\u00f3n. El ID de comprobaci\u00f3n es ''{0}''. +JDBC_CR_CHECKPOINT=CDIST2824I Comprobaci\u00f3n. El ID de comprobaci\u00f3n es '{0}'. JDBC_CR_DRAIN=CDIST2825I Drenar. -JDBC_CR_RESET=CDIST2826I Restablecer a comprobaci\u00f3n: ''{0}'' +JDBC_CR_RESET=CDIST2826I Restablecer a comprobaci\u00f3n: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I Restablecer a estado inicial. JDBC_CR_RETIRE=CDIST2828I Retirar comprobaci\u00f3n. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_fr_FR.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_fr_FR.properties index 280f32a..9d09b7d 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_fr_FR.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_fr_FR.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Le fichier de propri\u00e9t\u00e9s JDBC sp\u00e9cifi\u00e9 n''existe pas. Il s''agit du fichier ''{0}'' . -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E Echec de la connexion JDBC. Exception ''{0}'' . +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Le fichier de propri\u00e9t\u00e9s JDBC sp\u00e9cifi\u00e9 n''existe pas. Il s''agit du fichier '{0}' . +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E Echec de la connexion JDBC. Exception '{0}' . JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E jdbcClassName est requis pour la cr\u00e9ation d''une connexion JDBC. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E ''jdbcUrl'' est requis pour la cr\u00e9ation d''une connexion JDBC. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E Echec de la r\u00e9initialisation de la connexion JDBC. Exception : ''{0}'' . -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E L''attribut sp\u00e9cifi\u00e9 dans le param\u00e8tre d''instruction n''existe pas : ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E L''op\u00e9rateur ne prend pas en charge ce type de SPL : ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E Echec de la r\u00e9initialisation de la connexion JDBC. Exception : '{0}' . +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E L''attribut sp\u00e9cifi\u00e9 dans le param\u00e8tre d''instruction n''existe pas : '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E L''op\u00e9rateur ne prend pas en charge ce type de SPL : '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E L''instruction SQL est vide. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Une exception SQL s''est produite. Exception ''{0}'' . +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Une exception SQL s''est produite. Exception '{0}' . JDBC_REC_BOUND_NEG=CDIST2809E La valeur du param\u00e8tre reconnectionBound doit \u00eatre \u00e9gale ou sup\u00e9rieure \u00e0 z\u00e9ro. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E Le param\u00e8tre reconnectionBound s''affiche uniquement lorsque le param\u00e8tre reconnectionPolicy est d\u00e9fini sur BoundedRetry. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E Le port de contr\u00f4le doit comporter un attribut de type ''rstring'' mais ''{0}'' a \u00e9t\u00e9 d\u00e9tect\u00e9 +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E Le port de contr\u00f4le doit comporter un attribut de type ''rstring'' mais '{0}' a \u00e9t\u00e9 d\u00e9tect\u00e9 # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E Le port de sortie d''erreur facultatif ne peut pas comporter plus de deux attributs. JDBC_ATLEAST_ONE_ATTR=CDIST2813E Le port de sortie d''erreur facultatif doit comporter au moins un attribut. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E Le premier attribut du port de sortie d''erreur facultatif doit \u00eatre un bloc de donn\u00e9es. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E L''attribut sp\u00e9cifi\u00e9 dans le param\u00e8tre hasResultSetAttr n''existe pas : ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E L''attribut sp\u00e9cifi\u00e9 dans le param\u00e8tre sqlStatusAttr n''existe pas : ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E L''op\u00e9rateur ''{0}'' ne peut pas \u00eatre au d\u00e9but d''une r\u00e9gion coh\u00e9rente. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E L''attribut sp\u00e9cifi\u00e9 dans le param\u00e8tre hasResultSetAttr n''existe pas : '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E L''attribut sp\u00e9cifi\u00e9 dans le param\u00e8tre sqlStatusAttr n''existe pas : '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E L''op\u00e9rateur '{0}' ne peut pas \u00eatre au d\u00e9but d''une r\u00e9gion coh\u00e9rente. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E La valeur de reconnectionBound ''{0}'' doit \u00eatre \u00e9gale ou sup\u00e9rieure \u00e0 z\u00e9ro -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' peut s''afficher uniquement lorsque le param\u00e8tre reconnectionPolicy est d\u00e9fini sur BoundedRetry. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W Echec de la connexion JDBC. Exception ''{0}'' . -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Une exception SQL s''est produite. Exception : ''{0}'' . +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E La valeur de reconnectionBound '{0}' doit \u00eatre \u00e9gale ou sup\u00e9rieure \u00e0 z\u00e9ro +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' peut s''afficher uniquement lorsque le param\u00e8tre reconnectionPolicy est d\u00e9fini sur BoundedRetry. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W Echec de la connexion JDBC. Exception '{0}' . +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Une exception SQL s''est produite. Exception : '{0}' . JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I Tentative de recr\u00e9ation de la connexion JDBC. JDBC_CR_CLOSE=CDIST2823I Fermeture de StateHandler. -JDBC_CR_CHECKPOINT=CDIST2824I Point de contr\u00f4le. L''ID du point de contr\u00f4le est ''{0}'' . +JDBC_CR_CHECKPOINT=CDIST2824I Point de contr\u00f4le. L''ID du point de contr\u00f4le est '{0}' . JDBC_CR_DRAIN=CDIST2825I Vidange. -JDBC_CR_RESET=CDIST2826I Restauration du point de contr\u00f4le : ''{0}'' +JDBC_CR_RESET=CDIST2826I Restauration du point de contr\u00f4le : '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I Restauration de l''\u00e9tat initial. JDBC_CR_RETIRE=CDIST2828I Suppression du point de contr\u00f4le. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_it_IT.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_it_IT.properties index d97afa4..05ebd78 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_it_IT.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_it_IT.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Il file delle propriet\u00e0 JDBC specificato non esiste. Il file specificato \u00e8 ''{0}'' . -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E Connessione JDBC non riuscita. L''eccezione \u00e8 ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E Il file delle propriet\u00e0 JDBC specificato non esiste. Il file specificato \u00e8 '{0}' . +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E Connessione JDBC non riuscita. L''eccezione \u00e8 '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E jdbcClassName \u00e8 richiesto per creare la connessione JDBC. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E ''jdbcUrl'' \u00e8 richiesto per creare la connessione JDBC. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E Reimpostazione della connessione JDBC non riuscita. L''eccezione \u00e8 ''{0}'' . -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E L''attributo specificato nel parametro dell''istruzione non esiste: ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E L''operatore non supporta questo tipo SPL: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E Reimpostazione della connessione JDBC non riuscita. L''eccezione \u00e8 '{0}' . +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E L''attributo specificato nel parametro dell''istruzione non esiste: '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E L''operatore non supporta questo tipo SPL: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E L''istruzione SQL \u00e8 vuota. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Si \u00e8 verificata un''eccezione SQL. L''eccezione \u00e8 ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Si \u00e8 verificata un''eccezione SQL. L''eccezione \u00e8 '{0}' JDBC_REC_BOUND_NEG=CDIST2809E Il valore del parametro reconnectionBound deve essere maggiore o uguale a zero. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E reconnectionBound \u00e8 presente solo quando il parametro reconnectionPolicy \u00e8 impostato su BoundedRetry. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E La porta di controllo deve avere un attributo di tipo ''rstring'', trovato ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E La porta di controllo deve avere un attributo di tipo ''rstring'', trovato '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E La porta di output di errore facoltativa non pu\u00f2 avere pi\u00f9 di due attributi. JDBC_ATLEAST_ONE_ATTR=CDIST2813E La porta di output di errore facoltativa deve avere almeno un attributo. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E Il primo attributo nella porta di output di errore facoltativa deve essere una tupla. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E L''attributo specificato nel parametro hasResultSetAttr non esiste: ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E L''attributo specificato nel parametro sqlStatusAttr non esiste: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E L''operatore ''{0}'' non pu\u00f2 essere l''inizio di una regione congruente. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E L''attributo specificato nel parametro hasResultSetAttr non esiste: '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E L''attributo specificato nel parametro sqlStatusAttr non esiste: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E L''operatore '{0}' non pu\u00f2 essere l''inizio di una regione congruente. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E Il valore di reconnectionBound ''{0}'' deve essere maggiore o uguale a zero -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' pu\u00f2 essere presente solo quando il parametro reconnectionPolicy \u00e8 impostato su BoundedRetry e non pu\u00f2 essere presente negli altri casi. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W Connessione JDBC non riuscita. L''eccezione \u00e8 ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Si \u00e8 verificata un''eccezione SQL. L''eccezione \u00e8 ''{0}'' . +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E Il valore di reconnectionBound '{0}' deve essere maggiore o uguale a zero +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' pu\u00f2 essere presente solo quando il parametro reconnectionPolicy \u00e8 impostato su BoundedRetry e non pu\u00f2 essere presente negli altri casi. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W Connessione JDBC non riuscita. L''eccezione \u00e8 '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Si \u00e8 verificata un''eccezione SQL. L''eccezione \u00e8 '{0}' . JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I Tentativo di ricreare la connessione JDBC. JDBC_CR_CLOSE=CDIST2823I Chiusura di StateHandler. -JDBC_CR_CHECKPOINT=CDIST2824I Punto di controllo. L''id punto di controllo \u00e8 ''{0}'' . +JDBC_CR_CHECKPOINT=CDIST2824I Punto di controllo. L''id punto di controllo \u00e8 '{0}' . JDBC_CR_DRAIN=CDIST2825I Svuotamento. -JDBC_CR_RESET=CDIST2826I Reimpostazione al punto di controllo: ''{0}'' +JDBC_CR_RESET=CDIST2826I Reimpostazione al punto di controllo: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I Reimpostazione allo stato iniziale. JDBC_CR_RETIRE=CDIST2828I Disattivazione del punto di controllo. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ja_JP.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ja_JP.properties index a8e607b..b842a47 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ja_JP.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ja_JP.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u6307\u5b9a\u3055\u308c\u305f JDBC \u30d7\u30ed\u30d1\u30c6\u30a3\u30fc\u30fb\u30d5\u30a1\u30a4\u30eb\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 \u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306f ''{0}'' \u3067\u3059\u3002 -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \u63a5\u7d9a\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u6307\u5b9a\u3055\u308c\u305f JDBC \u30d7\u30ed\u30d1\u30c6\u30a3\u30fc\u30fb\u30d5\u30a1\u30a4\u30eb\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 \u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306f '{0}' \u3067\u3059\u3002 +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \u63a5\u7d9a\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E JDBC \u63a5\u7d9a\u3092\u4f5c\u6210\u3059\u308b\u306b\u306f\u3001jdbcClassName \u304c\u5fc5\u8981\u3067\u3059\u3002 # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E JDBC \u63a5\u7d9a\u3092\u4f5c\u6210\u3059\u308b\u306b\u306f\u3001''jdbcUrl'' \u304c\u5fc5\u8981\u3067\u3059\u3002 -JDBC_RESET_CONNECTION_FAILED=CDIST2804E JDBC \u63a5\u7d9a\u306e\u30ea\u30bb\u30c3\u30c8\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: ''{0}'' \u3002 -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E \u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u30fb\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3067\u6307\u5b9a\u3055\u308c\u305f\u5c5e\u6027\u304c\u5b58\u5728\u3057\u307e\u305b\u3093: ''{0}'' \u3002 -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u304c\u3053\u306e SPL \u30bf\u30a4\u30d7\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u305b\u3093: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E JDBC \u63a5\u7d9a\u306e\u30ea\u30bb\u30c3\u30c8\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: '{0}' \u3002 +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E \u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u30fb\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3067\u6307\u5b9a\u3055\u308c\u305f\u5c5e\u6027\u304c\u5b58\u5728\u3057\u307e\u305b\u3093: '{0}' \u3002 +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u304c\u3053\u306e SPL \u30bf\u30a4\u30d7\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u305b\u3093: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E SQL \u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u304c\u7a7a\u3067\u3059\u3002 -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E SQL \u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E SQL \u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: '{0}' JDBC_REC_BOUND_NEG=CDIST2809E reconnectionBound \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u306e\u5024\u306f\u3001\u30bc\u30ed\u4ee5\u4e0a\u3067\u3042\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E reconnectionBound \u306f\u3001reconnectionPolicy \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u304c BoundedRetry \u306b\u8a2d\u5b9a\u3055\u308c\u305f\u5834\u5408\u306b\u306e\u307f\u6307\u5b9a\u3057\u307e\u3059\u3002 # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u5236\u5fa1\u30dd\u30fc\u30c8\u306b\u306f\u3001\u30bf\u30a4\u30d7 ''rstring'' \u306e\u5c5e\u6027\u304c\u5fc5\u8981\u3067\u3059\u304c\u3001 ''{0}'' \u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002 +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u5236\u5fa1\u30dd\u30fc\u30c8\u306b\u306f\u3001\u30bf\u30a4\u30d7 ''rstring'' \u306e\u5c5e\u6027\u304c\u5fc5\u8981\u3067\u3059\u304c\u3001 '{0}' \u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002 # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E \u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u30a8\u30e9\u30fc\u51fa\u529b\u30dd\u30fc\u30c8\u306e\u5c5e\u6027\u306f 2 \u3064\u3092\u8d85\u3048\u3066\u306f\u306a\u308a\u307e\u305b\u3093\u3002 JDBC_ATLEAST_ONE_ATTR=CDIST2813E \u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u30a8\u30e9\u30fc\u51fa\u529b\u30dd\u30fc\u30c8\u306b\u306f\u3001\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u306e\u5c5e\u6027\u304c\u5fc5\u8981\u3067\u3059\u3002 JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E \u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u30a8\u30e9\u30fc\u51fa\u529b\u30dd\u30fc\u30c8\u306e\u6700\u521d\u306e\u5c5e\u6027\u306f\u30bf\u30d7\u30eb\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002 -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3067\u6307\u5b9a\u3055\u308c\u305f\u5c5e\u6027\u304c\u5b58\u5728\u3057\u307e\u305b\u3093: ''{0}'' \u3002 -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3067\u6307\u5b9a\u3055\u308c\u305f\u5c5e\u6027\u304c\u5b58\u5728\u3057\u307e\u305b\u3093: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E \u30aa\u30da\u30ec\u30fc\u30bf\u30fc ''{0}'' \u306f consistent region \u306e\u958b\u59cb\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3067\u6307\u5b9a\u3055\u308c\u305f\u5c5e\u6027\u304c\u5b58\u5728\u3057\u307e\u305b\u3093: '{0}' \u3002 +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3067\u6307\u5b9a\u3055\u308c\u305f\u5c5e\u6027\u304c\u5b58\u5728\u3057\u307e\u305b\u3093: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E \u30aa\u30da\u30ec\u30fc\u30bf\u30fc '{0}' \u306f consistent region \u306e\u958b\u59cb\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \u5024 ''{0}'' \u306f\u3001\u30bc\u30ed\u4ee5\u4e0a\u306b\u3057\u3066\u304f\u3060\u3055\u3044 -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' \u306f\u3001reconnectionPolicy \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u304c BoundedRetry \u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u306b\u307f\u6307\u5b9a\u53ef\u80fd\u3067\u3001\u305d\u308c\u4ee5\u5916\u306e\u5834\u5408\u306f\u6307\u5b9a\u3067\u304d\u307e\u305b\u3093\u3002 -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \u63a5\u7d9a\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W SQL \u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: ''{0}'' \u3002 +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \u5024 '{0}' \u306f\u3001\u30bc\u30ed\u4ee5\u4e0a\u306b\u3057\u3066\u304f\u3060\u3055\u3044 +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' \u306f\u3001reconnectionPolicy \u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u304c BoundedRetry \u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u306b\u307f\u6307\u5b9a\u53ef\u80fd\u3067\u3001\u305d\u308c\u4ee5\u5916\u306e\u5834\u5408\u306f\u6307\u5b9a\u3067\u304d\u307e\u305b\u3093\u3002 +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \u63a5\u7d9a\u304c\u5931\u6557\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W SQL \u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u4f8b\u5916: '{0}' \u3002 JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I JDBC \u63a5\u7d9a\u3092\u518d\u4f5c\u6210\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307e\u3059\u3002 JDBC_CR_CLOSE=CDIST2823I StateHandler \u306e\u30af\u30ed\u30fc\u30ba\u3002 -JDBC_CR_CHECKPOINT=CDIST2824I \u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8\u3002 \u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8 ID \u306f ''{0}'' \u3067\u3059\u3002 +JDBC_CR_CHECKPOINT=CDIST2824I \u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8\u3002 \u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8 ID \u306f '{0}' \u3067\u3059\u3002 JDBC_CR_DRAIN=CDIST2825I \u30c9\u30ec\u30fc\u30f3\u3002 -JDBC_CR_RESET=CDIST2826I checkpoint \u306b\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3057\u305f: ''{0}'' +JDBC_CR_RESET=CDIST2826I checkpoint \u306b\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3057\u305f: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I \u521d\u671f\u72b6\u614b\u306b\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3057\u305f\u3002 JDBC_CR_RETIRE=CDIST2828I checkpoint \u3092\u7834\u68c4\u3057\u307e\u3059\u3002 diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ko_KR.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ko_KR.properties index a4713d0..49328de 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ko_KR.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ko_KR.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \uc9c0\uc815\ub41c JDBC \ud2b9\uc131 \ud30c\uc77c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ub41c \ud30c\uc77c\uc740 ''{0}'' \uc785\ub2c8\ub2e4. -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \uc5f0\uacb0\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 ''{0}'' \uc785\ub2c8\ub2e4. +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \uc9c0\uc815\ub41c JDBC \ud2b9\uc131 \ud30c\uc77c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ub41c \ud30c\uc77c\uc740 '{0}' \uc785\ub2c8\ub2e4. +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \uc5f0\uacb0\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 '{0}' \uc785\ub2c8\ub2e4. JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E jdbcClassName\uc740 JDBC \uc5f0\uacb0 \uc791\uc131\uc5d0 \ud544\uc694\ud569\ub2c8\ub2e4. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E ''jdbcUrl''\uc740 JDBC \uc5f0\uacb0 \uc791\uc131\uc5d0 \ud544\uc694\ud569\ub2c8\ub2e4. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E JDBC \uc5f0\uacb0 \uc7ac\uc124\uc815\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 ''{0}'' \uc785\ub2c8\ub2e4. -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E \uba85\ub839\ubb38 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \uc9c0\uc815\ub41c \uc18d\uc131\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \uc5f0\uc0b0\uc790\uac00 \uc774 SPL \uc720\ud615\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc74c: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E JDBC \uc5f0\uacb0 \uc7ac\uc124\uc815\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 '{0}' \uc785\ub2c8\ub2e4. +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E \uba85\ub839\ubb38 \ub9e4\uac1c\ubcc0\uc218\uc5d0 \uc9c0\uc815\ub41c \uc18d\uc131\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \uc5f0\uc0b0\uc790\uac00 \uc774 SPL \uc720\ud615\uc744 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc74c: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E SQL\ubb38\uc774 \ube44\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E SQL \uc608\uc678\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 ''{0}'' \uc785\ub2c8\ub2e4. +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E SQL \uc608\uc678\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 '{0}' \uc785\ub2c8\ub2e4. JDBC_REC_BOUND_NEG=CDIST2809E reconnectionBound \ub9e4\uac1c\ubcc0\uc218 \uac12\uc740 0 \uc774\uc0c1\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E reconnectionPolicy \ub9e4\uac1c\ubcc0\uc218\uac00 BoundedRetry\ub85c \uc124\uc815\ub41c \uacbd\uc6b0\uc5d0\ub9cc reconnectionBound\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \uc81c\uc5b4 \ud3ec\ud2b8\uc5d0 \uc720\ud615 ''rstring''\uc758 \uc18d\uc131\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. ''{0}'' \uc774(\uac00) \ubc1c\uacac\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \uc81c\uc5b4 \ud3ec\ud2b8\uc5d0 \uc720\ud615 ''rstring''\uc758 \uc18d\uc131\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. '{0}' \uc774(\uac00) \ubc1c\uacac\ub418\uc5c8\uc2b5\ub2c8\ub2e4. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E \uc120\ud0dd\uc801 \uc624\ub958 \ucd9c\ub825 \ud3ec\ud2b8\uc5d0\ub294 \ub458 \uc774\ud558\uc758 \uc18d\uc131\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. JDBC_ATLEAST_ONE_ATTR=CDIST2813E \uc120\ud0dd\uc801 \uc624\ub958 \ucd9c\ub825 \ud3ec\ud2b8\uc5d0 \ud558\ub098 \uc774\uc0c1\uc758 \uc18d\uc131\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E \uc120\ud0dd\uc801 \uc624\ub958 \ucd9c\ub825 \ud3ec\ud2b8\uc758 \uccab \ubc88\uc9f8 \uc18d\uc131\uc740 \ud29c\ud50c\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \ub9e4\uac1c\ubcc0\uc218\uc5d0 \uc9c0\uc815\ub41c \uc18d\uc131\uc774 \uc5c6\uc74c: ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \ub9e4\uac1c\ubcc0\uc218\uc5d0 \uc9c0\uc815\ub41c \uc18d\uc131\uc774 \uc5c6\uc74c: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E ''{0}'' \uc5f0\uc0b0\uc790\ub294 consistent region\uc758 \uc2dc\uc791\uc774 \ub420 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \ub9e4\uac1c\ubcc0\uc218\uc5d0 \uc9c0\uc815\ub41c \uc18d\uc131\uc774 \uc5c6\uc74c: '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \ub9e4\uac1c\ubcc0\uc218\uc5d0 \uc9c0\uc815\ub41c \uc18d\uc131\uc774 \uc5c6\uc74c: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E '{0}' \uc5f0\uc0b0\uc790\ub294 consistent region\uc758 \uc2dc\uc791\uc774 \ub420 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \uac12 ''{0}'' \uc740(\ub294) 0 \uc774\uc0c1\uc774\uc5b4\uc57c \ud568 -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionPolicy \ub9e4\uac1c\ubcc0\uc218\uac00 BoundedRetry\ub85c \uc124\uc815\ub41c \uacbd\uc6b0\uc5d0\ub9cc reconnectionBound ''{0}'' \uc774(\uac00) \ud45c\uc2dc\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \uc5f0\uacb0\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 ''{0}'' \uc785\ub2c8\ub2e4. -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W SQL \uc608\uc678\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 ''{0}'' \uc785\ub2c8\ub2e4. +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \uac12 '{0}' \uc740(\ub294) 0 \uc774\uc0c1\uc774\uc5b4\uc57c \ud568 +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionPolicy \ub9e4\uac1c\ubcc0\uc218\uac00 BoundedRetry\ub85c \uc124\uc815\ub41c \uacbd\uc6b0\uc5d0\ub9cc reconnectionBound '{0}' \uc774(\uac00) \ud45c\uc2dc\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \uc5f0\uacb0\uc774 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 '{0}' \uc785\ub2c8\ub2e4. +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W SQL \uc608\uc678\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \uc608\uc678\ub294 '{0}' \uc785\ub2c8\ub2e4. JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I JDBC \uc5f0\uacb0 \uc7ac\uc791\uc131\uc744 \uc2dc\ub3c4\ud558\ub294 \uc911\uc785\ub2c8\ub2e4. JDBC_CR_CLOSE=CDIST2823I StateHandler\uac00 \ub2eb\ud799\ub2c8\ub2e4. -JDBC_CR_CHECKPOINT=CDIST2824I \uccb4\ud06c\ud3ec\uc778\ud2b8. \uccb4\ud06c\ud3ec\uc778\ud2b8 ID\ub294 ''{0}'' \uc785\ub2c8\ub2e4. +JDBC_CR_CHECKPOINT=CDIST2824I \uccb4\ud06c\ud3ec\uc778\ud2b8. \uccb4\ud06c\ud3ec\uc778\ud2b8 ID\ub294 '{0}' \uc785\ub2c8\ub2e4. JDBC_CR_DRAIN=CDIST2825I \ub4dc\ub808\uc778. -JDBC_CR_RESET=CDIST2826I checkpoint\ub85c \uc7ac\uc124\uc815: ''{0}'' +JDBC_CR_RESET=CDIST2826I checkpoint\ub85c \uc7ac\uc124\uc815: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I \ucd08\uae30 \uc0c1\ud0dc\ub85c \uc7ac\uc124\uc815\ud569\ub2c8\ub2e4. JDBC_CR_RETIRE=CDIST2828I checkpoint\ub97c \ud3d0\uae30\ud569\ub2c8\ub2e4. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_pt_BR.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_pt_BR.properties index 2749e3f..82d8924 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_pt_BR.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_pt_BR.properties @@ -3,38 +3,38 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E O arquivo de propriedades JDBC especificado n\u00e3o existe. O arquivo especificado \u00e9 ''{0}'' . -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E A conex\u00e3o JDBC falhou. A exce\u00e7\u00e3o \u00e9 ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E O arquivo de propriedades JDBC especificado n\u00e3o existe. O arquivo especificado \u00e9 '{0}' . +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E A conex\u00e3o JDBC falhou. A exce\u00e7\u00e3o \u00e9 '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E jdbcClassName \u00e9 necess\u00e1rio para criar uma conex\u00e3o JDBC. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E ''jdbcUrl'' \u00e9 necess\u00e1rio para criar uma conex\u00e3o JDBC. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E A reconfigura\u00e7\u00e3o da conex\u00e3o JDBC falhou. A exce\u00e7\u00e3o \u00e9 ''{0}'' . -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E O atributo especificado no Par\u00e2metro Statement n\u00e3o existe: ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E O operador n\u00e3o suporta esse tipo de SPL: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E A reconfigura\u00e7\u00e3o da conex\u00e3o JDBC falhou. A exce\u00e7\u00e3o \u00e9 '{0}' . +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E O atributo especificado no Par\u00e2metro Statement n\u00e3o existe: '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E O operador n\u00e3o suporta esse tipo de SPL: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E A instru\u00e7\u00e3o SQL est\u00e1 vazia. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Ocorreu uma exce\u00e7\u00e3o SQL. A exce\u00e7\u00e3o \u00e9 ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E Ocorreu uma exce\u00e7\u00e3o SQL. A exce\u00e7\u00e3o \u00e9 '{0}' JDBC_REC_BOUND_NEG=CDIST2809E O valor do par\u00e2metro reconnectionBound deve ser zero ou maior que zero. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E reconnectionBound aparece somente quando o par\u00e2metro reconnectionPolicy est\u00e1 configurado como BoundedRetry. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E A porta de controle deve ter um atributo do tipo ''rstring'', localizado ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E A porta de controle deve ter um atributo do tipo ''rstring'', localizado '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E A porta de sa\u00edda de erro opcional pode ter um m\u00e1ximo de dois atributos. JDBC_ATLEAST_ONE_ATTR=CDIST2813E A porta de sa\u00edda de erro opcional deve ter pelo menos um atributo. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E O primeiro atributo na porta de sa\u00edda de erro opcional deve ser uma tupla. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E O atributo especificado no par\u00e2metro hasResultSetAttr n\u00e3o existe: ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E O atributo especificado no par\u00e2metro sqlStatusAttr n\u00e3o existe: ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E O operador ''{0}'' n\u00e3o pode ser o in\u00edcio de uma regi\u00e3o consistente. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E O atributo especificado no par\u00e2metro hasResultSetAttr n\u00e3o existe: '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E O atributo especificado no par\u00e2metro sqlStatusAttr n\u00e3o existe: '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E O operador '{0}' n\u00e3o pode ser o in\u00edcio de uma regi\u00e3o consistente. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E O valor reconnectionBound ''{0}'' deve ser zero ou maior que zero -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' pode aparecer somente quando o par\u00e2metro reconnectionPolicy est\u00e1 configurado como BoundedRetry; caso contr\u00e1rio, n\u00e3o pode aparecer. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W A conex\u00e3o JDBC falhou. A exce\u00e7\u00e3o \u00e9 ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Ocorreu uma exce\u00e7\u00e3o SQL. A exce\u00e7\u00e3o \u00e9 ''{0}'' . +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E O valor reconnectionBound '{0}' deve ser zero ou maior que zero +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' pode aparecer somente quando o par\u00e2metro reconnectionPolicy est\u00e1 configurado como BoundedRetry; caso contr\u00e1rio, n\u00e3o pode aparecer. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W A conex\u00e3o JDBC falhou. A exce\u00e7\u00e3o \u00e9 '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W Ocorreu uma exce\u00e7\u00e3o SQL. A exce\u00e7\u00e3o \u00e9 '{0}' . JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I Tentando recriar conex\u00e3o JDBC. JDBC_CR_CLOSE=CDIST2823I Fechamento de StateHandler. -JDBC_CR_CHECKPOINT=CDIST2824I Ponto de verifica\u00e7\u00e3o. O ID do ponto de verifica\u00e7\u00e3o \u00e9 ''{0}'' . +JDBC_CR_CHECKPOINT=CDIST2824I Ponto de verifica\u00e7\u00e3o. O ID do ponto de verifica\u00e7\u00e3o \u00e9 '{0}' . JDBC_CR_DRAIN=CDIST2825I Drenar. -JDBC_CR_RESET=CDIST2826I Reconfigurar para o ponto de verifica\u00e7\u00e3o : ''{0}'' +JDBC_CR_RESET=CDIST2826I Reconfigurar para o ponto de verifica\u00e7\u00e3o : '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I Reconfigurar para estado inicial. JDBC_CR_RETIRE=CDIST2828I Desativar ponto de verifica\u00e7\u00e3o. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ru_RU.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ru_RU.properties index b6ab4e7..b70d1fb 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ru_RU.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_ru_RU.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0432\u043e\u0439\u0441\u0442\u0432 JDBC \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0423\u043a\u0430\u0437\u0430\u043d \u0444\u0430\u0439\u043b ''{0}'' . -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f JDBC. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - ''{0}'' . +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0432\u043e\u0439\u0441\u0442\u0432 JDBC \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0423\u043a\u0430\u0437\u0430\u043d \u0444\u0430\u0439\u043b '{0}' . +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f JDBC. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - '{0}' . JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f jdbcClassName, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 JDBC. # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f ''jdbcUrl'', \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 JDBC. -JDBC_RESET_CONNECTION_FAILED=CDIST2804E \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0431\u0440\u043e\u0441\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f JDBC. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - ''{0}'' . -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E \u0410\u0442\u0440\u0438\u0431\u0443\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442: ''{0}'' . -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f SPL: ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0431\u0440\u043e\u0441\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f JDBC. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - '{0}' . +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E \u0410\u0442\u0440\u0438\u0431\u0443\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442: '{0}' . +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f SPL: '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E \u041f\u0443\u0441\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 SQL. -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E \u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f SQL. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - ''{0}'' . +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E \u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f SQL. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - '{0}' . JDBC_REC_BOUND_NEG=CDIST2809E \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 reconnectionBound \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u043b\u044f. JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E reconnectionBound \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 reconnectionPolicy \u0437\u0430\u0434\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 BoundedRetry. # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u0423 \u043f\u043e\u0440\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0442\u0438\u043f\u0430 ''rstring'', \u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043e ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u0423 \u043f\u043e\u0440\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0442\u0438\u043f\u0430 ''rstring'', \u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043e '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E \u0423 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432. JDBC_ATLEAST_ONE_ATTR=CDIST2813E \u0423 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0430\u0442\u0440\u0438\u0431\u0443\u0442. JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E \u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0440\u0442\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u043c. -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E \u0410\u0442\u0440\u0438\u0431\u0443\u0442, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 hasResultSetAttr, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442: ''{0}'' . -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E \u0410\u0442\u0440\u0438\u0431\u0443\u0442, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 sqlStatusAttr, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442: ''{0}'' . -JDBC_NO_CONSISTENT_REGION=CDIST2817E \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ''{0}'' \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043d\u0435\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E \u0410\u0442\u0440\u0438\u0431\u0443\u0442, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 hasResultSetAttr, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442: '{0}' . +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E \u0410\u0442\u0440\u0438\u0431\u0443\u0442, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 sqlStatusAttr, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442: '{0}' . +JDBC_NO_CONSISTENT_REGION=CDIST2817E \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 '{0}' \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043d\u0435\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 reconnectionBound ''{0}'' \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u043b\u044e. -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound ''{0}'' \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 reconnectionPolicy \u0437\u0430\u0434\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 BoundedRetry, \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f JDBC. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - ''{0}'' . -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W \u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f SQL. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - ''{0}'' . +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 reconnectionBound '{0}' \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u043b\u044e. +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E reconnectionBound '{0}' \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 reconnectionPolicy \u0437\u0430\u0434\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 BoundedRetry, \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W \u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f JDBC. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - '{0}' . +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W \u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f SQL. \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f - '{0}' . JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 JDBC. JDBC_CR_CLOSE=CDIST2823I \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 StateHandler. -JDBC_CR_CHECKPOINT=CDIST2824I \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430. ID \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 ''{0}'' . +JDBC_CR_CHECKPOINT=CDIST2824I \u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430. ID \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 '{0}' . JDBC_CR_DRAIN=CDIST2825I \u041e\u043f\u0443\u0441\u0442\u043e\u0448\u0435\u043d\u0438\u0435. -JDBC_CR_RESET=CDIST2826I \u0421\u0431\u0440\u043e\u0441 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435: ''{0}'' +JDBC_CR_RESET=CDIST2826I \u0421\u0431\u0440\u043e\u0441 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435: '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I \u0421\u0431\u0440\u043e\u0441 \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. JDBC_CR_RETIRE=CDIST2828I \u0410\u043d\u043d\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_CN.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_CN.properties index 6ce12a2..83e2188 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_CN.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_CN.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u6307\u5b9a\u7684 JDBC \u5c5e\u6027\u6587\u4ef6\u4e0d\u5b58\u5728\u3002\u6307\u5b9a\u7684\u6587\u4ef6\u4e3a\u201c ''{0}'' \u201d\u3002 -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \u8fde\u63a5\u5931\u8d25\u3002\u5f02\u5e38\u4e3a\u201c ''{0}'' \u201d +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u6307\u5b9a\u7684 JDBC \u5c5e\u6027\u6587\u4ef6\u4e0d\u5b58\u5728\u3002\u6307\u5b9a\u7684\u6587\u4ef6\u4e3a\u201c '{0}' \u201d\u3002 +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \u8fde\u63a5\u5931\u8d25\u3002\u5f02\u5e38\u4e3a\u201c '{0}' \u201d JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E \u521b\u5efa JDBC \u8fde\u63a5\u9700\u8981 jdbcClassName\u3002 # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E \u521b\u5efa JDBC \u8fde\u63a5\u9700\u8981 ''jdbcUrl''\u3002 -JDBC_RESET_CONNECTION_FAILED=CDIST2804E \u91cd\u7f6e JDBC \u8fde\u63a5\u5931\u8d25\u3002\u5f02\u5e38\u4e3a\u201c ''{0}'' \u201d\u3002 -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E Statement \u53c2\u6570\u4e2d\u6307\u5b9a\u7684\u5c5e\u6027\u4e0d\u5b58\u5728\uff1a\u201c ''{0}'' \u201d\u3002 -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u8fd0\u7b97\u7b26\u4e0d\u652f\u6301\u6b64 SPL \u7c7b\u578b\uff1a\u201c ''{0}'' \u201d +JDBC_RESET_CONNECTION_FAILED=CDIST2804E \u91cd\u7f6e JDBC \u8fde\u63a5\u5931\u8d25\u3002\u5f02\u5e38\u4e3a\u201c '{0}' \u201d\u3002 +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E Statement \u53c2\u6570\u4e2d\u6307\u5b9a\u7684\u5c5e\u6027\u4e0d\u5b58\u5728\uff1a\u201c '{0}' \u201d\u3002 +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u8fd0\u7b97\u7b26\u4e0d\u652f\u6301\u6b64 SPL \u7c7b\u578b\uff1a\u201c '{0}' \u201d JDBC_SQL_STATEMENT_NULL=CDIST2807E SQL \u8bed\u53e5\u4e3a\u7a7a\u3002 -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E \u53d1\u751f SQL \u5f02\u5e38\u3002\u5f02\u5e38\u4e3a\u201c ''{0}'' \u201d +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E \u53d1\u751f SQL \u5f02\u5e38\u3002\u5f02\u5e38\u4e3a\u201c '{0}' \u201d JDBC_REC_BOUND_NEG=CDIST2809E reconnectionBound \u53c2\u6570\u7684\u503c\u5fc5\u987b\u5927\u4e8e\u6216\u7b49\u4e8e 0\u3002 JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E \u4ec5\u5f53 reconnectionPolicy \u53c2\u6570\u8bbe\u7f6e\u4e3a BoundedRetry \u65f6\uff0creconnectionBound \u624d\u80fd\u51fa\u73b0\u3002 # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u63a7\u5236\u7aef\u53e3\u5fc5\u987b\u5177\u6709\u7c7b\u578b\u4e3a\u201crstring\u201d\u7684\u5c5e\u6027\uff0c\u4f46\u627e\u5230\u201c ''{0}'' \u201d +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u63a7\u5236\u7aef\u53e3\u5fc5\u987b\u5177\u6709\u7c7b\u578b\u4e3a\u201crstring\u201d\u7684\u5c5e\u6027\uff0c\u4f46\u627e\u5230\u201c '{0}' \u201d # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E \u53ef\u9009\u9519\u8bef\u8f93\u51fa\u7aef\u53e3\u6700\u591a\u53ea\u80fd\u6709\u4e24\u4e2a\u5c5e\u6027\u3002 JDBC_ATLEAST_ONE_ATTR=CDIST2813E \u53ef\u9009\u9519\u8bef\u8f93\u51fa\u7aef\u53e3\u81f3\u5c11\u5fc5\u987b\u5177\u6709\u4e00\u4e2a\u5c5e\u6027\u3002 JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E \u53ef\u9009\u9519\u8bef\u8f93\u51fa\u7aef\u53e3\u4e2d\u7684\u7b2c\u4e00\u4e2a\u5c5e\u6027\u5fc5\u987b\u4e3a\u5143\u7ec4\u3002 -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \u53c2\u6570\u4e2d\u6307\u5b9a\u7684\u5c5e\u6027\u4e0d\u5b58\u5728\uff1a\u201c ''{0}'' \u201d\u3002 -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \u53c2\u6570\u4e2d\u6307\u5b9a\u7684\u5c5e\u6027\u4e0d\u5b58\u5728\uff1a\u201c ''{0}'' \u201d -JDBC_NO_CONSISTENT_REGION=CDIST2817E \u8fd0\u7b97\u7b26\u201c ''{0}'' \u201d\u4e0d\u80fd\u662f\u4e00\u81f4\u533a\u57df\u7684\u5f00\u5934\u3002 +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \u53c2\u6570\u4e2d\u6307\u5b9a\u7684\u5c5e\u6027\u4e0d\u5b58\u5728\uff1a\u201c '{0}' \u201d\u3002 +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \u53c2\u6570\u4e2d\u6307\u5b9a\u7684\u5c5e\u6027\u4e0d\u5b58\u5728\uff1a\u201c '{0}' \u201d +JDBC_NO_CONSISTENT_REGION=CDIST2817E \u8fd0\u7b97\u7b26\u201c '{0}' \u201d\u4e0d\u80fd\u662f\u4e00\u81f4\u533a\u57df\u7684\u5f00\u5934\u3002 # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \u503c ''{0}'' \u5e94\u5927\u4e8e\u6216\u7b49\u4e8e 0 -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E \u4ec5\u5f53 reconnectionPolicy \u53c2\u6570\u8bbe\u7f6e\u4e3a BoundedRetry \u65f6\uff0creconnectionBound ''{0}'' \u624d\u80fd\u51fa\u73b0\uff0c\u5426\u5219\u4e0d\u80fd\u51fa\u73b0\u3002 -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \u8fde\u63a5\u5931\u8d25\u3002\u5f02\u5e38\u4e3a\u201c ''{0}'' \u201d -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W \u53d1\u751f SQL \u5f02\u5e38\u3002\u5f02\u5e38\u4e3a\u201c ''{0}'' \u201d\u3002 +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \u503c '{0}' \u5e94\u5927\u4e8e\u6216\u7b49\u4e8e 0 +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E \u4ec5\u5f53 reconnectionPolicy \u53c2\u6570\u8bbe\u7f6e\u4e3a BoundedRetry \u65f6\uff0creconnectionBound '{0}' \u624d\u80fd\u51fa\u73b0\uff0c\u5426\u5219\u4e0d\u80fd\u51fa\u73b0\u3002 +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \u8fde\u63a5\u5931\u8d25\u3002\u5f02\u5e38\u4e3a\u201c '{0}' \u201d +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W \u53d1\u751f SQL \u5f02\u5e38\u3002\u5f02\u5e38\u4e3a\u201c '{0}' \u201d\u3002 JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I \u6b63\u5728\u5c1d\u8bd5\u91cd\u65b0\u521b\u5efa JDBC \u8fde\u63a5\u3002 JDBC_CR_CLOSE=CDIST2823I StateHandler \u5173\u95ed\u3002 -JDBC_CR_CHECKPOINT=CDIST2824I \u68c0\u67e5\u70b9\u3002\u68c0\u67e5\u70b9\u6807\u8bc6\u4e3a\u201c ''{0}'' \u201d\u3002 +JDBC_CR_CHECKPOINT=CDIST2824I \u68c0\u67e5\u70b9\u3002\u68c0\u67e5\u70b9\u6807\u8bc6\u4e3a\u201c '{0}' \u201d\u3002 JDBC_CR_DRAIN=CDIST2825I \u6392\u51fa\u3002 -JDBC_CR_RESET=CDIST2826I \u91cd\u7f6e\u4e3a\u68c0\u67e5\u70b9\uff1a\u201c ''{0}'' \u201d +JDBC_CR_RESET=CDIST2826I \u91cd\u7f6e\u4e3a\u68c0\u67e5\u70b9\uff1a\u201c '{0}' \u201d # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I \u91cd\u7f6e\u4e3a\u521d\u59cb\u72b6\u6001\u3002 JDBC_CR_RETIRE=CDIST2828I \u64a4\u9500\u68c0\u67e5\u70b9\u3002 diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_TW.properties b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_TW.properties index cf5719c..f5417c6 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_TW.properties +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/messages/messages_zh_TW.properties @@ -3,37 +3,37 @@ # JDBC Toolkit Messages Range CDIST2800 to CDIST2899 # TRNOTE - Do not translate: JDBC, SQL, SPL -JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u6307\u5b9a\u7684 JDBC \u5167\u5bb9\u6a94\u4e0d\u5b58\u5728\u3002\u6307\u5b9a\u7684\u6a94\u6848\u662f ''{0}'' \u3002 -JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \u9023\u7dda\u5931\u6557\u3002\u7570\u5e38\u72c0\u6cc1\u70ba ''{0}'' +JDBC_PROPERTIES_NOT_EXIST=CDIST2800E \u6307\u5b9a\u7684 JDBC \u5167\u5bb9\u6a94\u4e0d\u5b58\u5728\u3002\u6307\u5b9a\u7684\u6a94\u6848\u662f '{0}' \u3002 +JDBC_CONNECTION_FAILED_ERROR=CDIST2801E JDBC \u9023\u7dda\u5931\u6557\u3002\u7570\u5e38\u72c0\u6cc1\u70ba '{0}' JDBC_CLASS_NAME_NOT_EXIST=CDIST2802E \u9700\u8981 jdbcClassName \u624d\u80fd\u5efa\u7acb JDBC \u9023\u7dda\u3002 # TRNOTE - JDBC_CLASS_NAME_NOT_EXIST - Do not translate: jdbcClassName JDBC_URL_NOT_EXIST=CDIST2803E \u9700\u8981 ''jdbcUrl'' \u624d\u80fd\u5efa\u7acb JDBC \u9023\u7dda\u3002 -JDBC_RESET_CONNECTION_FAILED=CDIST2804E \u91cd\u8a2d JDBC \u9023\u7dda\u5931\u6557\u3002\u7570\u5e38\u72c0\u6cc1\u70ba ''{0}'' \u3002 -JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E Statement \u53c3\u6578\u4e2d\u6240\u6307\u5b9a\u7684\u5c6c\u6027\u4e0d\u5b58\u5728\uff1a ''{0}'' \u3002 -JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u904b\u7b97\u5b50\u4e0d\u652f\u63f4\u6b64 SPL \u985e\u578b\uff1a ''{0}'' +JDBC_RESET_CONNECTION_FAILED=CDIST2804E \u91cd\u8a2d JDBC \u9023\u7dda\u5931\u6557\u3002\u7570\u5e38\u72c0\u6cc1\u70ba '{0}' \u3002 +JDBC_STATEMENT_PARAMETER_NOT_EXIST=CDIST2805E Statement \u53c3\u6578\u4e2d\u6240\u6307\u5b9a\u7684\u5c6c\u6027\u4e0d\u5b58\u5728\uff1a '{0}' \u3002 +JDBC_SPL_TYPE_NOT_SUPPORT=CDIST2806E \u904b\u7b97\u5b50\u4e0d\u652f\u63f4\u6b64 SPL \u985e\u578b\uff1a '{0}' JDBC_SQL_STATEMENT_NULL=CDIST2807E SQL \u9673\u8ff0\u5f0f\u662f\u7a7a\u7684\u3002 -JDBC_SQL_EXCEPTION_ERROR=CDIST2808E \u767c\u751f SQL \u7570\u5e38\u72c0\u6cc1\u3002\u7570\u5e38\u72c0\u6cc1\u70ba ''{0}'' +JDBC_SQL_EXCEPTION_ERROR=CDIST2808E \u767c\u751f SQL \u7570\u5e38\u72c0\u6cc1\u3002\u7570\u5e38\u72c0\u6cc1\u70ba '{0}' JDBC_REC_BOUND_NEG=CDIST2809E reconnectionBound \u53c3\u6578\u7684\u503c\u5fc5\u9808\u662f\u96f6\u6216\u5927\u65bc\u96f6\u3002 JDBC_REC_BOUND_NOT_ALLOWED=CDIST2810E \u552f\u6709\u7576 reconnectionPolicy \u53c3\u6578\u8a2d\u70ba BoundedRetry \u6642\uff0creconnectionBound \u624d\u6703\u51fa\u73fe\u3002 # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: reconnectionBound, reconnectionPolicy, BoundedRetry -JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u63a7\u5236\u57e0\u5fc5\u9808\u5177\u6709\u985e\u578b\u70ba ''rstring'' \u7684\u5c6c\u6027\uff0c\u4f46\u627e\u5230 ''{0}'' +JDBC_WRONG_CONTROLPORT_TYPE=CDIST2811E \u63a7\u5236\u57e0\u5fc5\u9808\u5177\u6709\u985e\u578b\u70ba ''rstring'' \u7684\u5c6c\u6027\uff0c\u4f46\u627e\u5230 '{0}' # TRNOTE - JDBC_REC_BOUND_NOT_ALLOWED - Do not translate: rstring JDBC_ATMOST_TWO_ATTR=CDIST2812E \u9078\u7528\u932f\u8aa4\u8f38\u51fa\u57e0\u6240\u5177\u6709\u7684\u5c6c\u6027\u6578\u76ee\u4e0d\u80fd\u8d85\u904e\u5169\u500b\u3002 JDBC_ATLEAST_ONE_ATTR=CDIST2813E \u9078\u7528\u932f\u8aa4\u8f38\u51fa\u57e0\u5fc5\u9808\u6709\u81f3\u5c11 1 \u500b\u5c6c\u6027\u3002 JDBC_ERROR_PORT_FIRST_ATTR_TUPLE=CDIST2814E \u9078\u7528\u932f\u8aa4\u8f38\u51fa\u57e0\u4e2d\u7684\u7b2c\u4e00\u500b\u5c6c\u6027\u5fc5\u9808\u662f\u503c\u7d44\u3002 -JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \u53c3\u6578\u4e2d\u6240\u6307\u5b9a\u7684\u5c6c\u6027\u4e0d\u5b58\u5728\uff1a ''{0}'' \u3002 -JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \u53c3\u6578\u4e2d\u6240\u6307\u5b9a\u7684\u5c6c\u6027\u4e0d\u5b58\u5728\uff1a ''{0}'' -JDBC_NO_CONSISTENT_REGION=CDIST2817E \u904b\u7b97\u5b50 ''{0}'' \u4e0d\u80fd\u662f\u4e00\u81f4\u5340\u57df\u7684\u958b\u982d\u3002 +JDBC_HASRSATTR_NOT_EXIST=CDIST2815E hasResultSetAttr \u53c3\u6578\u4e2d\u6240\u6307\u5b9a\u7684\u5c6c\u6027\u4e0d\u5b58\u5728\uff1a '{0}' \u3002 +JDBC_SQLSTATUSATTR_NOT_EXIST=CDIST2816E sqlStatusAttr \u53c3\u6578\u4e2d\u6240\u6307\u5b9a\u7684\u5c6c\u6027\u4e0d\u5b58\u5728\uff1a '{0}' +JDBC_NO_CONSISTENT_REGION=CDIST2817E \u904b\u7b97\u5b50 '{0}' \u4e0d\u80fd\u662f\u4e00\u81f4\u5340\u57df\u7684\u958b\u982d\u3002 # TRNOTE - JDBC_NO_CONSISTENT_REGION - Do not translate: consistent region -JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \u503c ''{0}'' \u61c9\u8a72\u662f\u96f6\u6216\u5927\u65bc\u96f6 -JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E \u552f\u6709\u7576 reconnectionPolicy \u53c3\u6578\u8a2d\u70ba BoundedRetry \u6642\uff0creconnectionBound ''{0}'' \u624d\u80fd\u51fa\u73fe\uff0c\u5426\u5247\u4e0d\u80fd\u51fa\u73fe\u3002 -JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \u9023\u7dda\u5931\u6557\u3002\u7570\u5e38\u72c0\u6cc1\u70ba ''{0}'' -JDBC_SQL_EXCEPTION_WARNING=CDIST2821W \u767c\u751f SQL \u7570\u5e38\u72c0\u6cc1\u3002\u7570\u5e38\u72c0\u6cc1\u70ba ''{0}'' \u3002 +JDBC_REC_BOUND_NOT_ZERO=CDIST2818E reconnectionBound \u503c '{0}' \u61c9\u8a72\u662f\u96f6\u6216\u5927\u65bc\u96f6 +JDBC_REC_BOUND_NOT_SET_RETRY=CDIST2819E \u552f\u6709\u7576 reconnectionPolicy \u53c3\u6578\u8a2d\u70ba BoundedRetry \u6642\uff0creconnectionBound '{0}' \u624d\u80fd\u51fa\u73fe\uff0c\u5426\u5247\u4e0d\u80fd\u51fa\u73fe\u3002 +JDBC_CONNECTION_FAILED_WARNING=CDIST2820W JDBC \u9023\u7dda\u5931\u6557\u3002\u7570\u5e38\u72c0\u6cc1\u70ba '{0}' +JDBC_SQL_EXCEPTION_WARNING=CDIST2821W \u767c\u751f SQL \u7570\u5e38\u72c0\u6cc1\u3002\u7570\u5e38\u72c0\u6cc1\u70ba '{0}' \u3002 JDBC_ATTEMPT_TO_RECONNECT=CDIST2822I \u6b63\u5728\u5617\u8a66\u91cd\u5efa JDBC \u9023\u7dda\u3002 JDBC_CR_CLOSE=CDIST2823I StateHandler \u95dc\u9589\u3002 -JDBC_CR_CHECKPOINT=CDIST2824I \u6aa2\u67e5\u9ede\u3002\u6aa2\u67e5\u9ede ID \u70ba ''{0}'' \u3002 +JDBC_CR_CHECKPOINT=CDIST2824I \u6aa2\u67e5\u9ede\u3002\u6aa2\u67e5\u9ede ID \u70ba '{0}' \u3002 JDBC_CR_DRAIN=CDIST2825I \u6392\u9664\u3002 -JDBC_CR_RESET=CDIST2826I \u91cd\u8a2d\u70ba\u6aa2\u67e5\u9ede\uff1a ''{0}'' +JDBC_CR_RESET=CDIST2826I \u91cd\u8a2d\u70ba\u6aa2\u67e5\u9ede\uff1a '{0}' # TRNOTE - JDBC_CR_RESET - Do not translate: checkpoint JDBC_RESET_TO_INITIAL=CDIST2827I \u91cd\u8a2d\u70ba\u8d77\u59cb\u72c0\u614b\u3002 JDBC_CR_RETIRE=CDIST2828I \u6dd8\u6c70\u6aa2\u67e5\u9ede\u3002 diff --git a/com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar b/com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar new file mode 100644 index 0000000000000000000000000000000000000000..7c85e8d14f2c1494ca99bb71dc88c5db093c79d2 GIT binary patch literal 59930 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 bmcLvzssT}8nIiyz6n3MAoxC=dzrXt*mOqHj literal 0 HcmV?d00001 diff --git a/samples/JDBCSample/toolkit.xml b/samples/JDBCSample/toolkit.xml index f20bd32..00fc5d3 100644 --- a/samples/JDBCSample/toolkit.xml +++ b/samples/JDBCSample/toolkit.xml @@ -4,31 +4,31 @@ JDBCSample - - + + - + ***************************************************************************** - - - - - + + + + + + - + ***************************************************************************** - - - - - - + + + + + ***************************************************************************** From 748ca570f1e00dd2d9d5199709ae468b6a2acdb1 Mon Sep 17 00:00:00 2001 From: anouri Date: Wed, 23 Jan 2019 03:23:39 -0800 Subject: [PATCH 21/48] merge master to develop --- .gitignore | 1 + com.ibm.streamsx.jdbc/doc/.gitignore | 1 + .../doc/spldoc/html/dita.list | 14 +- .../doc/spldoc/html/dita.xml.properties | 12 +- .../ix$Namespace.html | 8 +- .../tk$com.ibm.streamsx.jdbc/ix$Operator.html | 10 +- .../tk$com.ibm.streamsx.jdbc/ix$Type.html | 8 +- .../ns$com.ibm.streamsx.jdbc.html | 4 +- .../ns$com.ibm.streamsx.jdbc.types.html | 2 +- .../op$com.ibm.streamsx.jdbc$JDBCRun.html | 138 ++++++++++++++++-- ....ibm.streamsx.jdbc.types$JDBCRunTypes.html | 2 +- .../tk$com.ibm.streamsx.jdbc.html | 23 ++- .../doc/spldoc/html/toc.html | 3 +- .../doc/spldoc/html/toolkits/ix$Operator.html | 2 +- .../doc/spldoc/html/toolkits/toolkits.html | 2 +- .../op$com.ibm.streamsx.jdbc$JDBCRun.svg | 96 ++++++------ com.ibm.streamsx.jdbc/impl/.gitignore | 1 + .../streamsx/jdbc/AbstractJDBCOperator.java | 19 ++- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 5 +- .../impl/lib/com.ibm.streamsx.jdbc.jar | Bin 59930 -> 60124 bytes com.ibm.streamsx.jdbc/info.xml | 4 +- samples/JDBCSample/.gitignore | 4 + samples/JDBCSample/doc/spldoc/html/dita.list | 4 +- .../doc/spldoc/html/dita.xml.properties | 2 +- samples/JDBCSample/opt/db2jcc4.jar | Bin 25 files changed, 256 insertions(+), 109 deletions(-) create mode 100644 .gitignore create mode 100644 com.ibm.streamsx.jdbc/doc/.gitignore create mode 100644 com.ibm.streamsx.jdbc/impl/.gitignore mode change 100644 => 100755 samples/JDBCSample/opt/db2jcc4.jar diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82520ca --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/tmp/ diff --git a/com.ibm.streamsx.jdbc/doc/.gitignore b/com.ibm.streamsx.jdbc/doc/.gitignore new file mode 100644 index 0000000..eef6fa0 --- /dev/null +++ b/com.ibm.streamsx.jdbc/doc/.gitignore @@ -0,0 +1 @@ +/spldoc/ diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list b/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list index b993deb..6e537e3 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list @@ -1,12 +1,12 @@ -#Wed May 23 12:00:05 CEST 2018 +#Wed Jan 23 03:05:29 PST 2019 copytosourcelist= -hreftargetslist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml +hreftargetslist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml fullditatopicfile=fullditatopic.list fullditamapandtopicfile=fullditamapandtopic.list -fullditatopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml -fullditamapandtopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/toolkits.ditamap,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml +fullditatopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml +fullditamapandtopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/toolkits.ditamap,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml hrefditatopicfile=hrefditatopic.list -hrefditatopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml +hrefditatopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml user.input.file=dita/toolkits.ditamap subtargetsfile=subtargets.list fullditamapfile=fullditamap.list @@ -27,7 +27,7 @@ imagelist=image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg htmlfile=html.list htmllist= canditopicsfile=canditopics.list -canditopicslist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml +canditopicslist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml keyreffile=keyref.list subjectschemefile=subjectscheme.list keyreflist= @@ -37,7 +37,7 @@ codereffile=coderef.list keylist= codereflist= user.input.file.listfile=usr.input.file.list -user.input.dir=/home/nouriahm/workspace2/jdbc-master/streamsx.jdbc/com.ibm.streamsx.jdbc/doc/spldoc +user.input.dir=/home/anouri/workspace/streamsx.jdbc/com.ibm.streamsx.jdbc/doc/spldoc uplevels=../ tempdirToinputmapdir.relative.value=dita/ conrefpushfile=conrefpush.list diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties b/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties index 9254736..e91673c 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties @@ -3,13 +3,13 @@ SYSTEM "http://java.sun.com/dtd/properties.dtd"> - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml + dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml fullditatopic.list fullditamapandtopic.list - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/toolkits.ditamap,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml + dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml + dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/toolkits.ditamap,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml hrefditatopic.list - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml + dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml dita/toolkits.ditamap subtargets.list fullditamap.list @@ -30,7 +30,7 @@ html.list canditopics.list - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml + dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml keyref.list subjectscheme.list @@ -40,7 +40,7 @@ usr.input.file.list - /home/nouriahm/workspace2/jdbc-master/streamsx.jdbc/com.ibm.streamsx.jdbc/doc/spldoc + /home/anouri/workspace/streamsx.jdbc/com.ibm.streamsx.jdbc/doc/spldoc ../ dita/ conrefpush.list diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html index 5406083..2cda359 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html @@ -7,22 +7,22 @@ - + -Namespaces: com.ibm.streamsx.jdbc 1.3.0 +Namespaces: com.ibm.streamsx.jdbc 1.4.3 -

Namespaces: com.ibm.streamsx.jdbc 1.3.0

+

Namespaces: com.ibm.streamsx.jdbc 1.4.3

diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html index ff94c1f..682d2f7 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html @@ -7,22 +7,22 @@ - + -Operators: com.ibm.streamsx.jdbc 1.3.0 +Operators: com.ibm.streamsx.jdbc 1.4.3 -

Operators: com.ibm.streamsx.jdbc 1.3.0

+

Operators: com.ibm.streamsx.jdbc 1.4.3

@@ -32,7 +32,7 @@

Operators: com.ibm.streamsx.jdbc 1.3.0

JDBCRun
-
The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
+
The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html index 462a3ed..c205f59 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html @@ -7,22 +7,22 @@ - + -Types: com.ibm.streamsx.jdbc 1.3.0 +Types: com.ibm.streamsx.jdbc 1.4.3 -

Types: com.ibm.streamsx.jdbc 1.3.0

+

Types: com.ibm.streamsx.jdbc 1.4.3

diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html index e2b1e71..2a3c8f7 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html @@ -22,14 +22,14 @@

Namespace com.ibm.streamsx.jdbc<

Operators

    -
  • JDBCRun: The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple. +
  • JDBCRun: The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html index b166896..588c8f3 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html @@ -22,7 +22,7 @@

Namespace com.ibm.streamsx.jdbc.
diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html index ed71053..83757f7 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html @@ -22,7 +22,7 @@

Operator JDBCRun

@@ -32,7 +32,28 @@

Operator JDBCRun

-

The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple. The statement is run once for each input tuple received. Result sets that are produced by the statement are emitted as output stream tuples. The JDBCRun operator is commonly used to update, merge, and delete database management system (DBMS) records. This operator is also used to retrieve records, create and drop tables, and to call stored procedures. # Behavior in a consistent region The JDBCRun operator can be used in a consistent region. It cannot be the start operator of a consistent region. In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets. On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port. On checkpoint: A database commit is performed. On reset: Any pending statements are discarded. A rollback is performed. The new version of toolkit 1.3.x. supports also optional type. The SPL applications based on new JDBC toolkit and created with a new Streams that supports optional type are able to write/read 'null' to/from a nullable column in a table. +

The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple. +

+ +

The statement is run once for each input tuple received. +

+ +

Result sets that are produced by the statement are emitted as output stream tuples. +

+ +

The JDBCRun operator is commonly used to update, merge, and delete database management system (DBMS) records. This operator is also used to retrieve records, create and drop tables, and to call stored procedures. +

+ +

Behavior in a consistent region: +

+ +

The JDBCRun operator can be used in a consistent region. It cannot be the start operator of a consistent region. In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets. On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port. On checkpoint: A database commit is performed. On reset: Any pending statements are discarded. A rollback is performed. +

+ +

The new version of toolkit 1.3.x. supports also optional type. +

+ +

The SPL applications based on new JDBC toolkit and created with a new Streams that supports optional type are able to write/read 'null' to/from a nullable column in a table.

@@ -55,14 +76,14 @@

Operator JDBCRun

Parameters
-
This operator supports 25 parameters. +
This operator supports 28 parameters.

Required: -jdbcClassName, jdbcDriverLib, jdbcUrl +jdbcClassName, jdbcDriverLib

Optional: -batchSize, commitInterval, commitPolicy, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePassword +appConfigName, batchSize, checkConnection, commitInterval, commitPolicy, credentials, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUrl, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePassword

@@ -202,7 +223,7 @@

Operator JDBCRun

@@ -260,18 +281,49 @@

Operator JDBCRun

Parameters

-This operator supports 25 parameters. +This operator supports 28 parameters.

Required: -jdbcClassName, jdbcDriverLib, jdbcUrl +jdbcClassName, jdbcDriverLib

Optional: -batchSize, commitInterval, commitPolicy, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePassword +appConfigName, batchSize, checkConnection, commitInterval, commitPolicy, credentials, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUrl, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePassword

+
appConfigName
+ +
+

Specifies the name of the application configuration that contains JDBC connection related configuration parameters. The keys in the application configuration have the same name as the operator parameters. The 'credentials' is supported as application configuration If a value is specified in the application configuration and as operator parameter, the application configuration parameter value takes precedence. +

+
+ +
Properties
+ +
+ + +
+ + +
+ +
+ + +
batchSize
@@ -303,6 +355,37 @@

Operator JDBCRun

+
checkConnection
+ +
+

This optional parameter specifies whether a checkConnection thread should be start. The thread checks periodically the status of JDBC connection. The JDBCRun sends in case of any connection failure a SqlCode and a message to SPL application.The default value is false. +

+
+ +
Properties
+ +
+ + +
+ + +
+ +
+ + +
commitInterval
@@ -368,6 +451,37 @@

Operator JDBCRun

+
credentials
+ +
+

This optional parameter specifies the path name of the JSON file that contains the jdbc credentials: username, password and jdbcUrl +

+
+ +
Properties
+ +
+ + +
+ + +
+ +
+ + +
hasResultSetAttr
@@ -464,7 +578,7 @@

Operator JDBCRun

jdbcDriverLib
-

This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string. +

This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string. It is recommended to set the value of this parameter without slash at begin, like 'opt/db2jcc4.jar'. In this case the SAB file will contain the driver libraries.

@@ -526,7 +640,7 @@

Operator JDBCRun

jdbcProperties
-

This optional parameter specifies the path name of the file that contains the jdbc connection properties. +

This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user' and 'password'

@@ -583,7 +697,7 @@

Operator JDBCRun

  • Cardinality: 1
  • -
  • Optional: false +
  • Optional: true
  • diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html index 7f11c9b..c6e3e4c 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html @@ -22,7 +22,7 @@

    SPL File JDBCRunTypes.spl diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html index 819e143..85e90ee 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html @@ -7,22 +7,22 @@ - + -Toolkit com.ibm.streamsx.jdbc 1.3.0 +Toolkit com.ibm.streamsx.jdbc 1.4.3 -

    Toolkit com.ibm.streamsx.jdbc 1.3.0

    +

    Toolkit com.ibm.streamsx.jdbc 1.4.3

    -IBMStreams com.ibm.streamsx.jdbc Toolkit > com.ibm.streamsx.jdbc 1.3.0

    +IBMStreams com.ibm.streamsx.jdbc Toolkit > com.ibm.streamsx.jdbc 1.4.3

    @@ -35,7 +35,7 @@

    Toolkit com.ibm.s

    The statement is run once for each input tuple received. Result sets that are produced by the statement are emitted as output stream tuples.

    -

    The JDBCRun operator is commonly used to update, merge, and delete database management system (DBMS) records. +

    The JDBCRun operator is commonly used to update, merge, and delete database management system (DBMS) records.

    This operator is also used to retrieve records, create and drop tables, and to call stored procedures. @@ -65,17 +65,26 @@

    Toolkit com.ibm.s

    It supports also phoenix jdbc to connect to the HBASE database.

    +

    The JDBCRun operator has been improved in version 1.4.0 with a new parameter checkConnection. This optional parameter specifies whether a checkConnection thread should be start. It checks periodically the status of JDBC connection. The JDBCRun sends in case of any failure a SqlCode and a message to SPL application. +

    + +
    What is new in version 1.4.3 +
    +
    +
    +
    +
    Version
    -
    1.3.0
    +
    1.4.3
    Required Product Version
    -
    4.1.0.0
    +
    4.2.0.0
    diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html index 17e8c3d..979caac 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html @@ -17,8 +17,9 @@
  • Namespaces
  • Operators
  • Types
  • -
  • com.ibm.streamsx.jdbc 1.3.0 +
  • com.ibm.streamsx.jdbc 1.4.3
      +
    • What is new in version 1.4.3
    • Namespaces
    • Operators
    • Types
    • diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html index af5dc8f..1e8ba36 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html @@ -32,7 +32,7 @@

      Operators: IBMStreams com.ibm.streamsx.jdbc Toolki
      JDBCRun
      -
      The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
      +
      The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.

  • diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html index 95af604..1d716e4 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html +++ b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html @@ -43,7 +43,7 @@

    IBMStreams com.ibm.streamsx.jdbc Toolkit

    -
    com.ibm.streamsx.jdbc 1.3.0
    +
    com.ibm.streamsx.jdbc 1.4.3
    The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
    diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg b/com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg index 890f28d..8720a32 100644 --- a/com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg +++ b/com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg @@ -18,13 +18,13 @@ />Operator never provides a single threaded execution context.Required: jdbcClassName, jdbcDriverLib, jdbcUrl / Optional: batchSize, commitInterval, commitPolicy, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePasswordRequired: jdbcClassName, jdbcDriverLib / Optional: appConfigName, batchSize, checkConnection, commitInterval, commitPolicy, credentials, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUrl, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePasswordimmutableimmutableimmutableThis port is generating punctuationsimmutable appConfig = null; + Map appConfig = null; - // SSL parameters + // SSL parameters private String keyStore; private String trustStore; private String keyStorePassword; @@ -162,7 +162,7 @@ public void setJdbcProperties(String jdbcProperties){ //Parameter credentials @Parameter(name = "credentials", optional = true, - description = "This optional parameter specifies the path name of the JSON file that contains the jdbc credentials: username, password and jdbcUrl") + description = "This optional parameter specifies the JSON string that contains the jdbc credentials: username, password and jdbcUrl") public void setcredentials(String credentials){ this.credentials = credentials; } @@ -574,11 +574,14 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr * @param mark The punctuation mark * @throws Exception Operator failure, will cause the enclosing PE to terminate. */ - @Override - public void processPunctuation(StreamingInput stream, + public void processPunctuation(StreamingInput stream, Punctuation mark) throws Exception { - // For window markers, punctuate all output ports - super.processPunctuation(stream, mark); + // Window markers are not forwarded + // Window markers are generated on data port (port 0) after a statement + // error port (port 1) is punctuation free + if (mark == Punctuation.FINAL_MARKER) { + super.processPunctuation(stream, mark); + } } /** diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 192a12b..cea50c7 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -48,6 +48,7 @@ import com.ibm.streams.operator.types.RString; import com.ibm.streams.operator.types.Timestamp; import com.ibm.streams.operator.types.XML; +import com.ibm.streams.operator.model.OutputPortSet.WindowPunctuationOutputMode; /** * The JDBCRun operator runs a user-defined SQL statement that is based on an @@ -73,8 +74,10 @@ @InputPortSet(cardinality = 1, description = "The `JDBCRun` operator has one required input port. When a tuple is received on the required input port, the operator runs an SQL statement."), @InputPortSet(cardinality = 1, optional = true, controlPort = true, description = "The `JDBCRun` operator has one optional input port. This port allows operator to change jdbc connection information at run time.") }) @OutputPorts({ - @OutputPortSet(cardinality = 1, description = "The `JDBCRun` operator has one required output port. The output port submits a tuple for each row in the result set of the SQL statement if the statement produces a result set. The output tuple values are assigned in the following order: 1. Columns that are returned in the result set that have same name from the output tuple 2. Auto-assigned attributes of the same name from the input tuple"), + @OutputPortSet(cardinality = 1, description = "The `JDBCRun` operator has one required output port. The output port submits a tuple for each row in the result set of the SQL statement if the statement produces a result set. The output tuple values are assigned in the following order: 1. Columns that are returned in the result set that have same name from the output tuple 2. Auto-assigned attributes of the same name from the input tuple", windowPunctuationOutputMode=WindowPunctuationOutputMode.Generating), @OutputPortSet(cardinality = 1, optional = true, description = "The `JDBCRun` operator has one optional output port. This port submits tuples when an error occurs while the operator is running the SQL statement. The tuples deliver sqlCode, sqlStatus and sqlMessage. ") }) + + public class JDBCRun extends AbstractJDBCOperator { private static final String CLASS_NAME = "com.ibm.streamsx.jdbc.jdbcrun.JDBCRun"; diff --git a/com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar b/com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar index 7c85e8d14f2c1494ca99bb71dc88c5db093c79d2..71e21636ce887d795658617be5007df7160efa49 100644 GIT binary patch delta 34264 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 L39v1H2nr+smndO( delta 34073 zcmZ5{V~pT!@Z=afwr$(CZCg9G=Qp-(+qP|U$KJ7bynF9Im)zy<+mlMCl72o^S31=@ zYv9?d;0Vfc;1EARKww}%jO93z5NZ)kHSU>f( zwKtwug-1im1bfjzh(yq!P;&C%=wuLF(ZHa@QS#seu#_n|?9ACwolX6kHVs>?o+w+a zn7Vb^G!WH{pE34z20K5mmb=^9+Hy4Oq95~I_gNh&*+@R_UcUqW$?o~S_WLdbEV$g| z{JjqGy#)_MOJii}4MVDVLjw>1U5JL`1$MvCJE4txmHvOhOat`%_E3}moUgQK|Neq2 zxo2_UpU4m}IB@(>@c5poV zJP5tThu>Ad#UeP|UHNsWjigi-SE7!*c{DpY1KvWt-S zlJ@%1XoeZW&x}=?vgpRrV496}njWH2NSO9guZ=>8GEzQ1n@Oh^&%!mtxb({}H_D@> zygUCeihqf&8g4iwR{-RX|F|K{a5&=&%`ZANQ(8VA)0@hxqescI=wWCW!W@odSC;ow z9=^Nw7Hh6Lw+)d12=#bw&Hn00=V@_qiSH-dR7Y>?iwJmKqoGqKQsn)S#T1K~GPw)eHwb1a`o05{C`|ewRuZu?- z{jnZCIPBZ`tu{uZ%~aaNA!Gl&}3tE2DLox*5XJ|>Axy%dbgqhnuxQ2YI2eHkr;GagQl z>BnX`9$*#xR57%?U}w_&x@6G`mPgmJ-`G0@OQIHj9=U$Kc`Nvdpl#eAW4((;f1rYY zu)_VN%YLh-tX~^tRM4-8zRDWJ!@i31>ykm^vOTh${RYyq-?}OLi=rG|t}p{W85FM9 zN9)FpwvYG>opU<#_y%gC_}Cu=6n3hjdU{P0-U6CB_4LOgUmq=$F+SCsjL@L9V_&V0 z3TXohqkU1H|BRPw#LeVzwQ|-wNZz;EAvz$eO9U_Vch8&ig70GKgQ~Lh_SZ*h!$2?adVER}FBUuNxG} z&SaYfn}!o1mzs{g_4 z(m*Jh4DOQ2Gm1!Qerc0Hl#?vy5pTLOGfs?}6tm4L$7%i)FCrqmat+sx)z6|y8?snu zl@4BR;gT5M5&tFQ~)m1?xkZ;ULMTFPHyEAi)Q4a4~^I2wYQ`mUx4#* zuX^TsI53!hm+oQ$5<8 zR+K;;doG_cA8b-zE+F0zMyL4R10o45Ly><_ z!ozm9I7dwlwmXrFl1ruxIjQ$gnGZ{^maqMG5ufq{n?=`-w8|8{j2mMs9W{lg`u;ZW z{i`rk7rwu#2!*~y5|(ndT?St~YO5m3nD`P+E!)jXkrFjPl?m^`wov623h+uR+ZA!b zRzV=eyfeIxB@8{MCI}Y}#5hrUBr6TR9G7ftrd)dd_Eqn>o~HSYiNi`{uJ_@W%mTogAmeZ z>5N%a7)>qpbuHsINpRBkK*K}95-xX(WOHA7;aEGxPX&BRSdMaGvu``<@~w&QAP=Ci zg32K=xhyFg^_9xB%4@Q*obB-Jq`v$QZ??&B%J<*OXMV~#adI6v9wk?VlW@x?rO@&l zT3hNmk8MTsKz?HTQ4bh0=5z?(;7VY-9J{SMPGLye5i!aG@0#QT2oZo{V0H~8NHyTz z>27$x#}pbrBEQ)l;AVBmjKX5-O5X_QVGEJQ+W`_5ojHr@XOEAPl4y6UZ)6BIXzhm| z*a^;&Xaiq_D z^R2*sTRZ4?AI7eix3ATJ8yL*V$uv-i|FrT5kK}to>7mJFRuK1rkae^DdeA0cCV;nR zA*(>SLsIiGugCfE=ulE}n2sg=f>%CdNmcP>C~CnO>&1@=bohK=2NLAWVU?EVHww_8 zvjjhw1pZP#3(95iAyi}xq&x}x-S|-?!t1x`t%!>`ajdE;GqDK2`}754uZQUA$GBAu zFPrsdS~_K|GBAGtx`U^(#V(D z5!W2R>@zC}usQs}?i*4kx8cDirT0aS+6v0SQN=NL;+FkxLS93N%9f|}H5F&dAr_gP z24_7IX-r7(9;;#FX`)G!M~<{tF%)bqJepb!EKt)1Hr;S$Il92PctmuAzrkf>(!1!{ zvc4J`(_$kcPB_HgAK2P*(Vn3@B0kl=J*X`KDS2{0z6{=eMF^`f|;x&e9 zt=GC*IgXXY4E(#RU199>DrgSo)zUhog=RQxin9l}nJ8?9nMAZt0Q#piLl z++eFOy*^Bn@HOf?HU?Tqi_L)?Ok z-#TMx1*U*sz~LxqnCqN?VZt)LN9e)EfPvT(A`|1S-3m?DbL16py+l zY8zcJ>~4Dbg&RXG)%9@wmaO`sq1DfJ=JS3N*nHK~On95F-E$c{8FRE2@$|jI2X#h^ zDgr*%D#*{M%+eczue8!}h>#nZSw$`U_~s7C5gE?C6V8w~Lc{rgbjzl5<_tP&fjp-` zhE$+y!oIb}Kwj21P5$%?eYb=Z7J)OV7G0K~l~qj6Hw4B#%8%Y~{ktu}?)8Cm3*)Es z*oxRVj&$j3fx_x)T&Gb7B@ z+YHj~+o#i4=fXK?_=$|uLm`nvOs6=CFrVC^ zYZmU~(6fzW6$Fb2FFs5%QxmquH-5w?Ute9#>aodcr@F4ND_QJIqM?d5F z)YKXs^vcB^`1?JQ6TFT8?;l&ZihmXu^&GOauCmaZQ??Quh2ASp!0|u%&ock6Ez^zd z%%<0PE;makSFNbqb!AK0WS!<22H^~<^lVO_=Ce|Pk|}|@=+L~+lL>O~lqo7S$|^WY zR6AR_LWJc+FbI8%=~ztj*y32%yeT>~QGq#CNmPQ#IHwHF8=;%QcH8E83v z`iI9cCXe5Ahi%76{(~X{ov-C2)~WXT5cWa4G!LE{nLwHXF9n^gTTLcgHM0=qTO>64 z>y6JsssexVTsa4=i8@3$GYLoz39KfTD4Lq$GoTLa$_O_@!GdM(|PVqXE|-irB<2{Knmce2aZJGzCVG~(^y$1orPrCHx6DtA{#jvht*vI&aC25$nKQh9A7lHy;2LfLeqyFbKY zsd5FJW&3|K!nVTRL_^LxElsgeAI9LxplYYYFe;tOj#CbQbxp}86FTp2=0!?S?`8Vr zrCp^2>uaQp|6o2p09n&K%cQ;tGFpAWb1@bw3W5_uxiW)wtl(E=Z!<{0;)~D?FFsZ; zy|$9PT_6L%(nU`qL`xf|{`2^Cd2tE`LG9}ZTULy`)%S=r9H>_-D#ud0eQiZ%D7_^m zSTXLa&gjECCPE2C=U$0IHqQQ3Bco7m_%X+B_zQ!w&cX46N|RVaSYb?r{pj~)iA-wu z+5|IiHmF9^@2og`Dq~9S4{Q%GL529zSVC9{)kgqU_gmRp8e;$hq1xDSx0fjY6cL1l zjRcmG2_FNst&tJd0E&{@?}g2-r9=NWVT^&bvAa<=^neHl*eNxtYWihJX(*6A_-5q$ z620tdFU<+5QP*xS!!JV&U~vrYNWx{RmU&rzC7ik+;Ix{q@Ds!q?B*tF$(SU;7lcB76}Ijf!M+*8-+pEDTDM$v7{$FGJBf78Lr#Z<}kN zqQP}ec|n@QxlA#5pVD6gfs&$AX5@m%D+4GQj)mH9|pa&e~V)V zqBp3|2~F%)$M#3}H6D-*zSO?tFdD9o5FQ*gdaGhOMgjGQc*Z@9I}-Wi^p^ILI`{YR z^7i%m`1bTa?eX;p23NmwwhEC_L`sY%o|x;+l9_56!E(JGbOqIMX!>yt2F`LoLBKSA-fZ+$}hpX|Brp}6sjKeU9klu=r< zoBKwS)w!2P+V-uz&+hO)uA+;*+{%P$)G;))*vGZaKP`OpMhVISD##D-IHad;=J?lY z&}*XW=}J}5M-A7vG%J(Ye7t?Nr zplI83=6Vj$Di*{-Vx%;c)6U(jVp&zRE!?cj%Uxhhi)lYF2dXaC3SsW zC3K5BS>d8`d{!4}@iq8z5tG6bOov)BW{;^VxV_%1)}LW1S*>cDVD;w}kVg^*Ra&@{ z&t6RlQ?<0xR<&Haa}X6;7~Rc@V|tRdOObz=(`VzXP-8oW_dLraoh5v$vfX_p{$cUlE zq68)GKU5r{80b)9fvIs!>uV9Tw*KPHxp5!4!I)F1`LzvJXHea&ucb*1s-aUwSA+hT zTEk|^cw-IU+WpG~a*@@UA)>w=A!uD#t1u~5fLEZNZgHuWw(go{yAs0GW-2uB$Vy=k zCiR^SY8@Y_6?g=gMp4pN4s>z#Z4v6*Og2!jf7NDe+v2F&GfH>6bT5md zgQQnbeNh3cuT|HYbSycd>>w*eDRL>@Ml#nXvWduyr6gbnm%(eGQ*^VBo@meFE1p0c zfE6=z>+ECExDd~LJ@mAx9c_+h75#CQw5Q#>|GVhm;BgP=FS6hno+5HyDHwdgnId_t ztHQTrbN>xG$Q^um-KG~VI4_u;wp@M^1<)ifiPR4Zx=nu^hO`Y#_Q(rzS-+E!;_{RI zOAm+G6LlB}0xnaQLJFT*)|aOTuZt$%r0^e{gwn!KiYhH(CmV>egL~0ZpR{nUBJ{ZH z+Z_D|bcq4*vBpo)trXl^Fw%{N;*)sw_zV}r+x^7JhMy&@1up0YSs^VgF4m@Tc^lJ) zjO7#vCs)U?WXK98B?-mUa}&#aP`_<{Iki3^gYj5wf}TYX)Wn%D z+Sy!8RF{Ajm?YR^XFr|b$c%crdALL9{giv&$+640Td+`- zQUI~(9TEF!8n_tGo{%GgX>96_q0t&7@F?70b5Rd!;LKHt{S zNRh&jc+JT?T3W}fW9RY`_hNT#Tc6EdrTmzlL82newE%!k^3S4mNb;NO?0UwH1pMCddk04)c$KN zYC+uL)^`}{PbkI9=}B(=GxT<57F=mMH3HuoGaT(K3%9PGP_FnmSU_MIwsliT(4w^q z702}W@n3f4dP1eGwUTjFtfytt9p+Ics82!aKGf78t3F|#zxq$fB*m)=xNCr$=1JG4 z;se!RPJSHv9Rbs}s??=SkL4>H62Do|S1vqVjeH{d(fXD!PinvUC)+E4QYGJ-6^hV>m6e3C$SM=1ywip1YzQnLDf>{wb z|s0hkWj$Vh>%^Ekv%))O#PCd zfeV)bZ>}%&te@XH`af2eMRwJ5R6E>YOH`ghJ9Z&bcA@!@@Vwv1?1s>Ds+V@-7Kpfz z=uzdt`1+jLQZRE1PlYB#0uXVxg*u9Pbj*n{In8$L2`JeU|KS+|5Oe6zbF!EEVGQX^ zR11u|KSkDd0cDS#kTPWt!PCbc$oPGOJiVsVEp|aEcEN&(@n-#K23KplvUyIs1rf9N zJRSD_#FX(B*A;G>oN*zvxQ4SLXH`aADjs$ZWh*O1Tq=u|H(f>C9+wqvo}6*6$Z_Dj zsEHpd?i4Z3O8GoHmtAqb{NW~-y?##NIMohUh!{5kI4N>=`HzB+Jzpm8%4M0GB1ZCu zMVGaHLC$!S4tueptK?~svmYbw#D5i#5?-A7X2nCEA{I!2G1Z8JO)w1oRW&t8AVeaH zd>|{3kZrCt?+@Id)1a9o2cVfeFfE!JZ?sTFE?Bvm$7-h|Qyl$Uk3}9x>Ni0@jpm4F zs~&+huiLP!t5gzZUL@fQ*>Ta#WT)7R+Ery2df&Qk5WfjROyvj1w{$`XAb1g%D(4Hwwi111PpZZQrc8m}s?$vn2cacsZG(;lv zFQ?jvWO&mUODxx<;@0xI=DQ+i)@z>V4x@6Q&t+XcRE5=HBBAeWF^So-Kup9leKX*L z$tQpyHlF+QMZP3|#azkEBf(}i{R2zpc5uZ+!21-&V_2dSN-*N;;Hs1GmhuIE)Rl(T zG0@71tXIC;AI+C~jLkaiRn>e){0u-TZ?$F%YiBrNDzTvwL0n`{3Nd$B7B4mN65)Yo zN-@cGk!_clC5wsN!~|7Rwm2^G_0;X2gMs7{qY_{cyVs5}eFrTj(%e`ig@v)sbA>sZ z;}K3rf;Pq&CbaH?EZ32~k<=UBsP>UCPDKUidI*N0)TM?kZFxouwsk5^=^gCL0|W~S3)$)>^QrohkSM-MZTu($X03R|Gr~L~)dlH{=Jlqh#^zqgVO8HIMdObB$sAk73xkE`m~kI2 zmR7|d;0hv08Tj$r8`uHuM4xghpDA-sHr*Ccq?-&}~*+9Rw0!wD``vn!i@nU+OB_3sn) z188qf`itSCZ-}y}qBG_m_|rXcZv3kV*j>fZ6KE#_QK;`d3GnDCzYWX2Ue?2 zUQhTDcIZ_z3m{+lYVMKdZHK?X2jbv_=3P>w6#UyEj}3;4D44b%VR*v# znqR41(X+Pr&yza!51HJIn)b$@ z8wCU+_lwsYT5QGxq#*$q^}_?hS`QqZ@wXjI--us$_=A9o<_px}SK#m&%J7Hdn?OJ8 zztIlrn1G1%CtvXiXzd`W$Ydny3Etosh=U(R+)Jmg$_ZGiqlfx*2lSU9hOrrweuBbD zzg43NfOgRAJH{5wFXzHL<%eT4sXhd`-?vYyxE}8&m1S2w$~%lb%k_i5R=z?fM)s?h zR}#6%E9vmz{zAg`W+HnyPkv)Y?0h%&?5UkS?DE3wm$zvd2`|Ldos0U^cjRmM7+MS1 zKJOR{U@bk7UTx`VI>AV0U?^Af!|Zoq$};qH0StMR85jh?5;gWs!gBAX63L*SAMrhiLl=Ev#xuO_ktH;~{H%0HN*HG){WIvqGCaB?94#O% z!YqDfjSCM9;AyV<)*kw@(dULMn!{CaoWyQsuoTa-!F<+{cqU^=tYqd4MT z0G8BLTM1wav0+Q5_^EJ2v#1ozO0f}R#ps&Ru#J+bA`R3LH>N-I$;yXCSO^GF*bX*| zQ4Nt>4iQwK@1nc3=@o~TObO#Ls1ER*NeP)0hrNSYMVwhZq9K=Igb+(66Z#Ugjx@~S zPVbqz(Da0D7U*1BS`&LO9Zv(wWyg+70GAn+kTiAG`+8%P+Mqs{$5)ee-=7ewMD=%LP78v%YVbl z@K)&k32MRiS|0Q55-)GcfgZ_ejY6xuCXj~)}Q(vrEvn70b~OAju^ z@01dkCHepoCc}}#=!CZSPBL>4K%m%VgL!R8zZOW$=_AV42}>v-DwT^%fnIGT42@V% zG7T6-v_=l-jghpZ|N9YqNKDjR_)ci~syrC{8AX?qs%GACAxuAtdVw#gJIDld!zto3 z3Vq{LFn`@gg6nqeLb1RIQ4#5Q?W-8`{~UP>g9~RhVxS{es@~-qkj}aT7+%sb{RtT9 zS7iI1E@Nh*p${`QhAH6)mD+oW``*${VP05wU#~>Gu64QR*o*|S5vSdtz1wuaGA`6J z_!$q54R`!cmQ~%cRuLw~&@iz$!AG{9Q*6p|Mg%(eZ0}Tc?TI-Pi=c+6x=qS|2enj& z^GZF76l_AUpoGVaS#B}`?Sp2dPz%vd2Np?#s7a%$O#~G&1llwnN4m~}^=KIfTSsP{ z8v4;#Q8V{G&O8BfeqaL(f>BD5boUfKuhpHn{}=@s;!z4vPLG~UyO@!@ps0}z;qy}S z_vNR)UmEcTBpu``rkjWc6#d8S{lub%>JWBLF3C|Fj?RuK%V7d0<;6qxlj!WCYyuMexk7w8@NZ$0u%c z3YaC_Ko5}p+YSGcx;+=zd?%vj-ZO0X;y%=!uM z6u+nl!3;mqZm4^JL_Ckm`Wjq8%^WnGO~Xv-I5Wf{7QdDt46Up>KAbBOY+KR=qE4jY zm8;AELMfo^dBUMG_5m4opp4I|5BD2msh}SzpaZM_XZMtqhnU(-<5J(p-}Kyf`!ltqEDaDuI1`MSwDl#@0c3W_Tq6~uTnCiEgTf|*LmBm7doT5!ctU4r ziQ7K(u7L=%(L8Ok+hN@%=&RA!CW)Q6I@3i&ac-#c>C6~ys)G7-mex6T2^(>W!hYz2 zY<1RKd+s>VL#Q8NY6kK6@6aOY5`JUVhy`_q24Yo)wrlwNEtc)=TGLId=s*?2U!8R7 ze7Tr^#5=9Pyv<$6`5hJZK!-^qA!Q~rrTNI47-p=H`LNeeIE!Ee&MfXvDAaKSM(iGu zW7X5Ko=98Jgb}sT9z6yj5RzMH4Sta0F{C0@ewddd5^V~^p{yg5$jE|0iK7a2*T4An z6{By84{~10U(x(WX!ogJ@Bw6m5muuqsti=B-0D?8>lYz~`j4;hIJl{Mi>+Ovr;7h0?u8V7k|=9FUEXh5q|R zjY}WEkK)nVZ-1r=j8uhdqp5+Og+STn$X(gMyYl8e2zeBda_R}4K%*uQHT8G0;ea=^ zyLXwYFP^wb^P>W0nO?+|F}!;Db8ab?36$iaSb1n?Bf|j0xrK%8(FGv$VP?VT z@zIqzr(k4s0eW;H3FXOk@UUX+sA5O-bK@ESqsGfARut$8zh3MTJlZ+aXg#8P0H)lLDG7#G?|B5-|IM)!6S$vVV7HV=9@P_9o`km)# z_@nyngr1%aMB^?5Xq0+8&x=n}+bNq+IZ%-lD`LeQr#?Qw9)mue_R6eD<>mO)A07r+ za<{VY7P*Ot5^a6p)en#!L~IqXf~fi7DQE@7ukNI*0U~xO+4yP9eZ0@Z{rw2q{hUWa z^Q^+FRVP9Wy(if9gtA)1L&}3)Tckfnbemi?F!ks&&bB5f0XkpU11`E**i3#$H!IP9 zq5p3p^naqDEmJ9plwcq&tF$Iy;Qs+F+zjmh`{BrhhW0;5N|>lD%Kwxy_#UHPLV$n- zz=D8Kq&yViq}(1OrND?G0Man9DkBuqqMSq5lwP0+g_bhpBsm~>Wa1K*R@>&o*R$s3 z&>>vCh2=j8E5Txxg%Yh8noCQki4KtNho~6jYM#fIq1&j*^YiB{Tun?m&fH!vR`$D| zFIK*HcOCm7@6pR^79$-n_>yXc-?sVdj+lL_7h^Ke@l}e5aU=@tfKLh@+Nr>3bSMmX znJu$q{DxsT?jq8-Lux}!8|LBzjIDfiCs_%BWDRl25-*MRhN-L#3ZA-RL`Q1w5@D@G z6=P=gXy+BjOXE!zWA3idtSJh=LuY|=B?`)B9I_>#lh2#9u}Atj&?e^ydE~h1bFw|2 zIh87p-fENE_?I6uFlo`rRcl3mvI3$nU5RP(80;6}|T zM6V&-Zp7bjolw<}<k&VdR&y*lwDog{9EUUO zZ>0PraKuoK$}ZdQvvW?Wufkq&89wA+-9kWsq$&t2RYcCHuAJsWqg$I0Hs+f5##rnr z`&{xWG2lsw*&Z$&0d@!#Tv+o>oWdrNaL%*mbTEx}kS2Y)2J)H?KeRsEpyy*jYv%@6 zCFbtFxq_gmWka@GiZ0)H`BR7JLNIP|BX)NburJyp!Ig{u)oz7ZdqYWT6voO@oJJ1* zM?kk~po}<-lOJVo`e&qM8vacrR^ui|>IzY(p+_O6g=^&-ZdylSZg-Tmf(GHw5sC3f zFKQ%)1Ozr^HP_8dDfexJM!d~bsksbp8M&XFE3M{dDtsY(>JMK5JeecuOvnRaKB58U zK%)R_jMTO*VU9#dEsNc`Vl_kDrxEYmk z$3N;#p{GSBq^1lSiI7c%NT<(LOO4uB}Elnbd^P)@W=pEBmT-ZZ70r4@HTKpSs!+11qo$z>M#Y6id3^d=o;a)k34q+eB%26AP zK9X7tcEVvFkx%tp6=zKm8)oZw4TK-OdQqvj(1cv7e=7yq6PaJsCVmz7;Z%gF zCuqlGw9;i$-xLemFGbQ{Af?t|Q%tjZ#;o1p>2yBTsym=e-odesp2xiv! zy0M1rM`SMFJ4K^3M!`q$Z`qewRdm{1)%A3S467@Gm3QX6D1{uNT&=rSNr%bu`gd9E zH#&07sgR&{K{4*Ef!|VX;aW`+Bbq~b6FszhEBF1#f`bvbg26>3plTx^)F%_T$)=9T zYqazTV%VA{w$ed}{p|~E`1{Nf)7vEuv=)#_(&Aw?Byn)K{D(7GXQ0(G{!72CCym8N zB#N4Rl5pn=pXkKd)CvWD47+;lMv*u`t^VVQOwG0X_w@CO0QlUF(RW+u{9DBzY4_D< zy7%p3af;G4$)tS!t{#WN{oNj{mTm7#*=V=xM!!i0*h(u+(xK_!9Z%zPmChOF8`NDG`my#no z!G#U&o-m;T0Z2evlta5mr)k9r;*mDX*fxsXU?e=S4mQuWL8;6E!w!-Yk^S&Vkle}z$#U5ROX$vNDbOgx8b4tX9JY7yuI;;-g@t^9vu)1Bk=SZfhjK$h zDI`{H(N13Gy=#twCOmxX&b7G_VL>P>_e+YJ;(nUA0uq1w0Y&pn{@MNVzs?xsb`nVw zG;CyP5;OAoS=v`RY|zl{!ch@pY-0psM5}&+Op~Gi1Cvx+Cd!$grnrV)g=>F9 zkzKH00bYDVAzwi(kW>QTFj_=^3u^8}XzDy5)4594%+KA1U*+$K>R9cr^eI_}^c5dq z){lnPt_loazT+9>`4XAV`PJ$eU!9rtK(?C*YHp=5Z7{)fm1muT<87t*RtjV1GWsvF z(N}doPW<*2jEB`$~ct0WR!!(%ev2l7D<+iBH_?FJrx_Et_st z+g289mKCuenVgxi!6}ciMmD0fHmbC?usk<9Kes3uH!CHX?*Auj(JX&(#<$Khjg5|R zKcP0ZusVnOM-`F*@^{XjSUx*2PniJuNAjLvnm-ujGJoSvti%DTkKC_sk-vt>-w_67 zK+X#v52peRUu#X|&{Uk3fIvjicN`{0(qrh4Zzkps zx}R@Ic*>=wL`}-pQ8m`3R)BtWEjfmOJcdm&nI8yr6zfM4FMYKbncQ5`NX$Rb|JOvO zx=Jk#I7t z=u(+^7rO+;j5D`5`l*weN2AWD=M+>--jikl!uc*dJnx`?QM@N@8HGrwG}baMvhs!) z-LG>~uo^2mdipP`FT35ifCr&}Uk&lcy@y|?-siPX=LtN(L*|p~2H^edlPdX+u))*Q z`ZJ5;0o7lH4%-jDT#gFv;@O>^Xx5+n6cDKBk8NJWHMf(ZgZaWc& zD!l#S*Zgfp1fC`yK<1S`SS-Knrc_d7U|k#goQqIGGrIQGs?L>_+W0sB@i)ZQ#ogPE zlJ-0|GH-_HihF;$f^$1j0i-ui{ge2l_#oM(+wO*^$sC~-Qgmd?V$S8eA?M>`3e8g| z@i;$=g$R3e=KUjVi1YjC(@LVCq{=Km#E49%I8!Nyk2CuTKy1p`TLLo;K=qGiGe@9j0|;x6FU!kyqEx2oWR?>DL$-|s!3lrK>#!-S4g;~0o=RXfL=m{8obD?{?&5kt z%9@D(CQeY2J}P5oKp1(Pr<)f%X}aQXXVSCgtoJ>O+O0mQ$qfy-MN%n+Oeg|>4(yR& zQ-i@zFLG1EJlTAnp)m^5aKvIBgZ+KExrt8-9+BMuEaK&-Vn-M&<6sHg86=`DDwVTb zE%$0PCaeYg>o&&M?rZY#&wlul{MViDbNuz5j{`%ACkcw(kQhTwF)1nx zbIyd4vaB;&0{dW|IjTI_rw(iK)vzLdN)C_#ypZ$x~T}7Py zO?_N+#ouN0{&h8m8DabJ%JdJ)GbUH(P$%URIDPoeJfiVqME4p z?{dC1=bz^K(SoWcr3T)1$xsB6J~^7v3X>j4Vax{NIZoXB&eHfSetJb^lr*#*(&MRk z-Yl*|v3qb`uY&l{)zC*c?V@JRBC*5ZFF6xLv`opf(n8kBTtjS7hd zL}%O+8?(d-PP{z?(OaT7ik3bxaYqY^g_2G{>E+WF8v|jK+EgM9BfQ^c>?_k#F$s{#d zKD%0c<5L++W0_~G_ZgQKK1X|mRyM~5E@VVz{Q`cd%vr#lc5^y$b7N#K$}Z8r6vs+bjZu2j}JzZhI+RyZ@KVNeYuf}*7aH0C-n!{{C-3cOyLz5{!W01kcn&KggIp-; zAkAJ(v~kUI$wE9b*F_p+2G+T)1M?W2PRxf<7!H(6eS`K54O(T#==?#D4Us6Z3H1@?lCBp>Uf2_2wXC(?~b)yCX6SY9VR11qVbh{ zXxOUj?}9G=l2k~|(M}r1PCbK?eS+M3tLZuH-q)8e3;^>x`&HyMQ|KMUF4m-qDLyV3 z|3xk3yO4k#dE$ogB?}QHTXW+=vn{#QKKW<5L#0!@6-m6;VNAaMbO% zfJIds&na-7J7heA8I@@+0soMbv|ZWrk^jmvEz!Vr4!M0r%RUV;ULZCMJ{HWxCPnCd|H{9`iHSxd5wNDb#kyZ>jCDAOU%a1 z`@KIK?({Us=I^-}fDS9`v zt*Y2w*hBl@TKxk}X1lHYi2MBc`UD`<+i%bI`LE(32E!&5_|ebYBV%xGM5uU05!Jm% zr+D~J{^_^cM)`{SG{>q)rO~^`KM!Su-Iv27T z7rj;ZQ0t;l)y!i%pCmY7euYLost&$5kD}_Bv5dL$(j$)2D4S1@Ys{ZG+@MvRAS1xL zpUcy?QJJ{@13*@p!{P$ZX+Z6myv^J5DP&TwSUqgIPCrHoB|Auzpwglm7+DttK8Y%R z^^)sUMa($Kg3g*_cqkxOr78)RiAXWn!J{TxfiJi6d9J*`!XcLHq@EF=8dNWa_VO0y zN}MH{h-gs;Wf9+T*_rm7E)D78YD#NWwWErc5wc((0cxyC&0^zo9-N~aEG8iWa97uE zY00n}xlKY`z$)jzrCaCKkk&A5IYdM_3;a^@0@`65;XqF#?O~^@lk9Ecj9%*;BjdoA;{n&mqLv^Kd7wI z+{-+1ls<5%qYV*TOwkPG7g_J0TUMb~)!^|Jg3aYmLN2Eib@>XkHAi|D8)w2|0_^UF z5@|X!5*V4cB5yL(GdD*(Hu|C1$j;)4Va83TaS5t2DSRP^9r56jvIbQjhB77)66>eT zxFIjQ13j)+h<_Dt6^dg|l8Oa~sd_QI!MhA)R`t&>3fCXBUIb>DZI=HR09in$zqTH! zai;PEkyer&+^=PdMO#`3bv=Ln{(oIen2lP-ih_3`P(MVQ}%`8{1`^{~uxAN`&z_7yai4Cb7lE}rS?{4!m2uzH%I z0{|K_p5Ds)0Nju{hN9m2^R?7U-owDiK<)#&rLksUQq5ouAx^zl`jXOgm8UWHoF#4i zl}WEmg|GAsDl8Fop&8m!tKF+)vbc+XsG8F!p2akzi{OOuF_YJwAZd(^X7?t33W_Iu zaRSM2;w^97+#ak@b-+VF)cIeDLq&wf09OU|%OTSfy7+FvS57zN*;JKF>Y5zl8eSaL zgEFn`roLgKbR5gRT0-9GtSSLC>f1i=ZLN$cJyvCml0VO_E38q=yheImeg8y%#}6#D zpZl>HuVWwDZ$e238@_Absmk)1jD&IY^gwW#imCFfMOls1kv#gSvSbz8O6CSZKQ^di zG?JlG3f$w}6toDH#HxA=gx-V81F=WpVK=u-wL&} zFAwlRM;Xc0J2Bb~d$QGVh&KW}m0XoQ#-nzyqus7RamSl;c*2qTZND9CtO zs%(E|QvJ%CLSb4Be|TYkh35od5y-CVd^v|XqX3&ZnbFaHiR0|Z3Ki(=Cs4-CzPhs# zS$t4|A(b9eG(2LjOZP5q7Ojll;=@TB?#~vLe`QndR(*)t$inEvqyjuU(nkxHdsFeC zcG%EbgV?UIf-S+y*G=W4ScN&tPzC4#=s08*Hm3zrAdDZEk7?vHl$j&ZB27_9 zGfGjpxFiVXL$APvOqIKyDe$B-e-LlWv>AQKn+w0NA58o(JEBMPV8AamX0<&fl_#BZ z&LghVS^PhCxXwy{D@UIL1KGOLI$NhU~ zoN*q5zmHPqlg`)ZFAZ=Wch1ZIodG>(X!4sh-kF{F98LVX{83HB)>F>Y@b?*LBR|gq zN6!i9yzq(hyz_!^F2WSo`NpS?i@mP%Yx9vVwjf<KdfW7E%{lz4=I2 zT9EopNPUBU^lb|XH~N+NNN=_vU2Q_TYLLETAzg*m8$f6d(sx^s-g16>7U?a6^g9;P zThRKhvuYuoZ9;mx1?ie|eHQ7OL3-Olx(2Nq&iCf6X{`n69r$Gi=^cY~(?WU&TI=)m zbgKnvqe)L22I-cCv;nPm=Ob;lAidXw^qxWbzJ>IE9<(;+BW<@J-EKm zNW0Mbc>bDx*n)JwX-)SH(hn@8`_TGiK9b*p^l1~)rv~YFEhP8@4F4VsL8SL=q_Y+h zYeD*d%-Ms#zN6D1>>0w}fCz*}v(imFNe59lW zX}<|+-yj`WNc+%==WFmm3sTag!Nee?7E%JOY(7%af;4SHni`}B7Sa@2e7^KfT98DO z^n^jmEhGW0VtzdNq6O)&DV`h}q$3OI5C$Ay6WJ4*a0to&=kWFW!ubOn`-Sr(Irhvu z&X1x0%S}n+5ApMy{3N=6q=^5-`C~KTPpk<)#m}?W1nB!y=Vv%pIDhuPP)h>@3IG5I z2moPAHBRz44Q|;v003T%001MC@u3-$?&AlOpkN1od}nX2AsLy>gqaD8yNIHqwyqUa+@-EnlwhRp8rQm8>r(5|TD#b4 ztyU4`JLkSPZ{AF1lGy+I|KH`!yW2VEo_n@??tOXT$A=#UfFtB5PPU4ln1+v&=y5VV zn&`2AnjUU?tf5Dfqwe)D!c$*Uj8P#5ToI;Ov^zhN6ogRLA1nAL0kM;Bj z(j(;HVJFPyof_ZZgfYB@9vi7;Q##+wPfh2i@zd#XMmj%}pQZ7$(_s=nC!KHM=Tfh& zY5Y8XzJqVm_ytaWA-~AUxATh~{1WPMX*&OZ8UJ}Yzl>j=#;@R4I`~x@znY-^A{}P( zYaD!sgYVS%wS?+A2fvSg>fm=e_+2!YyXkQc@$_B?{}s`DpM&2|m3tig0s4KA7`c~vbkSoU&Ez3^>!!zl z!-R3a#((XERs4~3{wROU$sgxW(4Z%&>r-j`Y5q()@8Qo<@i`jwypzAcU!=!N^!QCW zf0@5Rt*@r>*ZAuW{svXQNsqVa@mmLfn@InigTF)I-gWTzsQ&$Q{(Js`ga3gVKP1Q> zrSXsXCp3*eQrn*h@2497v&KJj!kNT>g){hH=wP9^!smu{5AFchOqvJDE(IB-#PdJV$k;vevlgPpu!I{gC8CI5HeqYLokQn4k2&} zg~Y)kg&wI6p*e&D!HP78a8gyeL+JE7$RP%6BEt#0d5c2~!Cx`dAu=5zi(ZF+(IXor zMGQwF5hK#YNRi_dqr_+`j-ldMrx+*3Q_)4m2~IIl97e@SR6N`%CW|Rl%%#UvdgRd~ zpB@F&rI6l==&jf(ritlPoI%Bz^mYV2j-*Ek)y;B>+2SZF&Y@zdQ_K}dQ*j;@kD<3? z=}|_-a;K;e^Ql-##RVwr;y7e~nmFDes;Fk6Lo9NLYE&yxgJph>L)22CjvkANT_@06 zy+bt6ZzC?dSb~c!mTF>II(#OUFpOJch}Hk2THcsnJ%ss*P#-N>*=uzHCd#gl|`c8AzaLw`wyI~?LpD%|A|cTbD~Gs`e(%@B9%_8RAs*Dk zUV80vh z?+I4;+@X*s#K2imUDnXhR9jY4$sn`(6!!*qvCr*qEp7-0z5dox27@XB{!rNM4=;85 zIz0~Y41?_Xl?%$2R5vzN)Ya5fH8w4-tFEe8!C+E#bD+K0yQaN36b^da?V(M@r?jkT zF0Kf)w|m2j13qtm^JavYT3vVCah3H9Mj7}z!(LypFVNbG2#c%n*Av8EgInBTcU@<= zqZ3C4!wmA`p%(`_JVAFj5F}!;0*4#@adcXPx7F_scLqHS>IXbo_3EP>oYvm$3BgJv{1A)%X(kz4!YaR!r>sU z$*{QEV9>o8tMgYSVQ)iBcTZTcZ;%CqpfZ@6d}?Y^)XTf3Gwi{!Ck?c3AN(>n)mxy5 zcWGjRNXE2DIC~jzO^R#sOJS_`4Ni<4{Ed%K|H;>468aS#0&FdIU zNIcMojiF-df&+%2jMRHVoxX5`$6SV?_9~@Ov{dVTw1%A_qfe$)o{uVE3PskcM9P_E zbyc!x_RT=*o7bV<`aOz+sIhT15kA>9-l!|JcxmW=E2`^UuiqP<$3WyxUCKaK1X_^j zjB2mnQ`_0T#uIFGukm>ZR-oDKTj~yasccrtaGMt?8lOaT7tSxQsPFV6(u|NNToHqJ zO71|+36Ye8Ai~~u&r)y5i&)G2{s8GA+O0mVMmtW#S8P`r>Bmr?17e#^dS? zd0Jc>+dO{NHA09B!Fl~IH;(m(yrD44kt^tFMPx;;s)<<B0zO(iq!;a+x0&8>SdgT^tpp+Dv5AO*yWPDR$D#}vxUkKR5LX3>vyhn- z+GQk&K*JFRxP763tIgZmhHIXf8HpAlN)oC_gc*q0ZIalEYY|qfh;y7C6;)H5X*mLY zNsgL3_97Pf(3%kJP#|`q2Id&fdJQapC_pIsfwf4EIoCK0-Gt)gNnPArTvXv5R)4zBZ%%^z;3(;iJQZ?8C`76)U?Anf0~uEyP=Y_-OJ&S%VE zc*OkmKc6UhR@YD*;fv$6!0k6CpI~TYHcI(0Kn*l|-KKc>Je$1Df!3hAqs`lljBD`( zi(Ctkfu2q7c8oNXJ#?-021C8!MZ_x>E9p=a#YS(q%?2VF^(YWS?2I-Xc0n&sl{B~_ zSs5PdC^vURoaO2P!}+fQFT#C){=noEp(B*Ar++au3=YCv8w|9&3~F5N2%WB6f1vmJ zPA#G!#}jUh5Bp?p6%l#cz@*Txq7Ne1FeK#g$>2m>FxjyvhFBY5YjA}SH_c$Wl1*ES zDTtlnKs$x?ZXeoO12~F|X&cI;p=|q4CELctK*Si533af4wgzI3Oj9h9pW4LljIB%>j(N zg5DNWysW)dyfmviyO}nWu-9He=B`8~WSRX-GlmBw1~?6j>|()xV5|{V`w3h0i}MMZ zZp~~{gF>XK-aw0~U=iuVMMf2&4Fb766Ra`X+%+H%{VghVZYJ)V?lsyOCDQ97W94?C zK+?8FvBd2{?-z2ndPo2p7FWC69YzR8@DqlhtCeW4CacwoD;v)++!x{Qf0&v~W&C!3 zZXY(CtgP4PDXuerD-dYdv&le!`w=pQTC-7LaMXVdhoBfWeQt;1Mwe=$N8@K};#o9w zc8CmS4H(EI`#>bbWr~TSw-L8&6;`NLuOc-DBbwu?Dk8McPL5WoN^v|eYbN|^#RG*E z--5<=k#=`LxdftVzK8r>nGaQUq^htyzvXl>WO9(M8w;C%8p3YvZrrE#mtJa69cg2Y z9W2wxAk7oaAEkw&^+W942)o9w)x>jXSJry{EpfKh+lPF`r^S9k&)z|96%t@&e zF9!S+9~Aa~F_C!XBi(mezA2=M7mU1Mu($ciG`#^04F-IMJXH^bX;uEdrNWpSk&`geHBrC0iFQYtctR5yXs^)4 zH+1-a%-rnqKDZe*cKynT4Po7yQ;-jo1$Rd!K?`;GXd{>)Q)+{S9Z0Rv33xVX;$;S- zTjMwV%3+xY2Agt!!ihn@Q}{`z4_Tpbdptp!c!fga&NZkbHrt7N(*G3~7BAaTWg3w9 zDudgifEWwWho!?wxr?o?6koMOT$)CU+V1XupagkT@@m{2rhXXM8d1z}#Yun+$LDMg z_&VGDMnMKc?I`hM63nFrF_RV$w16$jL_ZVdXL`WS-N^&(>r?#|sELj>9sW7Q>dTb{|D~}IzLCKtux#b*yty5w{oluiuxehjO(r53Q+z}=#S=7xuA$EY7A5v z5t%YuJ!#ssX$&SNJAsNEThYFcZ<-bzHl2no>UY>rImwQI zo6y6PpZSjDPAPlT;tKdFMW-yeONGuwC;CtH#~lNI&^b`2 zANw{N=_finvyY*}AP-X5Vhpa2Chek0Br~Pg;##vgF4;$|9wWa=iAXagXJ&O3{7{sr z)#jX6$DG1YMoXPUs>9B3z}4A-+dNN!tKAc9#UDz+w5ZK?G;!AM_G8efCK4#k&}riB6R{b7C{p9(Baz#Ph>=at63do8R&w64)d(fz)wkHRQz6P zZF6$vo;LReZy;!#Cef*7+<8)7-W-#Q_A6hxOJ za{jAi#S^4VD+0__r-7l)jt;b!QQGt~P&_OmO9z8~W-oF_k_*MQlnle@V*le6HcNz!jv7+AU@v9Tuka5~*YKavg z9`=L9HcH4_nRA+ZfvE`!cmzy~lXGz-DnG)EUWw`Ig;Vi6x`K0DW$^++Qe-Wi>aJD_ zdnQ~FMOBM8)a(wnQ2#QM!EqIT9b%ncG_z<^QA7|;JFwbHREIGnUmXP!m*BP8S^}@q z%MrlD7sG0pM+9!w$8gD}`LwX+<;7q$uQHI0A&zbgdNB@BIqoU`PM>cIRu-#uaJyDh z1$A8QGNOLNLMZ!0N%=m)8^a5!h))GA6y9twHmZdK9%bYg(rFpINWM3JjA75kN$fcZ zB%RR&J?lHY>e$^Mm5*g)58S5PG45n2&qK^L^q|+Ef>?PsJfuI?D;5!P_FUH4{Sap@ zgq=9!xJBuX&llKea~)*-+i(x#aZ!w6KQFKyD!Fj2$6LO|1k>M7;8^Vr4CttYhuL*!NA7IA-K)dnZ6Y^nxRWtQKJ?^#0)emo#8;CMS<-! z(VT7q5Vr7%!3zVGwz#E;h+AY4OjE3!X4IzBWh$!l`aHew_jLMy{luhRi(;Oc830jy zymZkjWE^P~xU8&#Vc4x4T#-v>-?0NaJC$wHnV+@m>@<4YNRPAGIXVk4ug-kba51|? zXF(Ry*=A}zoo!-}+s96#-b1&Y+E-qFRo;yq2g zuZ!P{4|+pPy2H}NAH;{6cwQGDArQ8fwQAyHU3?<`$Y2;rK~q^{OxKG(#{y7-6q zLK9!=;$Pw`2Fe>XRo2(n)i*7!t8Z*tP*snkX=GF5lEu}P3`+jH6EI!;TYRmHZ&){j z9EGK}uBoD~wxOz_v9h+YslM{Ks=8VRnkn`%b2O4ay7-Uy7Wd1vF!O^Xfz{qMy7*2U zV34UmE~&47MzD=dmCF&TF1{BBHSvQkeiVmv36kODC1)^F^*z3s4ZN7prUY&51Ao{Fc{zGzID=c)GRqv zlbO2AlEXBat;^x0X@6#)>8yu6tH}|%9LYSI%+cj2f;w7`(Rn7%(&SiOj+5hc>7wch za-t>=)8!<2xGpE7jLIpx%#~BoRa#0i$EC|W)DD?XBMM|8gDl$(8<)BRNS&lak2WI0 z!zN;XN@Wd+LG6<2YF!r7(L;9ZNDB9gijXnW*d>~HQJ2$6l!hFSHqqQ+Hh4_fGju+j zkI>{1x-5~ibU9ldrOP=)QYpIx0Vmw5GdOGjX(V0Fr8PYo6;;k-cj@vNDjrL7E@RiD zY?0NpU@99*CX(nX7w@3x_ik6*qYf1$1fzR@cQB19b(xRYcp*nFRLTXqJPt)m9#3{` zQexVx%ySR*^+bq)@C90RStS>uWg*ZD%WDW$RC%#~ zIFJo(=;9rQ6iU$2-zsmz z!V((8Aa#lAZ@$c&VZM|cf$$ep*OjT^x69p;A_4fNyaNr;{K|@|nzCwYzf;~7t)QV! z^L_dZL?O$o>&i(f?(Xe5;yF_83#`%QJ@Q_J*H~3kiPBcHn56wz^tex#_sczKoR`<2 zSU(^iWH7NGfU4(S*@g6fm)F%{h*zu2ePna88&vFXS`8zGOD1?+?|K!st4oAre#R&3 z5Hj2og9*ucv`78Z74ji^pjUcW?$_n7$+|y6;l>&4Oiezj%g5y7x_pA%)|1rs6venk z>{e0VRB?P|#iGS^xKNsWT9?nr9t;wqCn>Jz=U0U5S^1nMpV#Go3k;WOjICQoycO5w zi}EF1{)V)6n5|HZeQn9&EIU)tD9AAOl5+jXLGeV>xi z=FNV1CB5Ga|8XQ}L5L!Lz+n%a~7j-f$$Pp=++86n8mp+HK z8aMM5OU%!ISEmj{@vA)>JU(0p6RDva5)teJj z6D|74WS?-WgZ%`JionDlQR#M8k>pkN!DjnaQw;|iiZY?El`(JY&32_wwRk8#-g;87-YT+P+GE>I441E)v8ICoxu^rw7AzYa>^! z={togzxp1{!jd~cSy&pmCq3UoM?Ep&cmGf#i@ws(4{NCD>4wH=t#M#6D5e6}&HNZH z6!%eHgus;s8!gakOMsmxC9-F|ZN%(^-3BC$$Nm(#Pt4j>cL#A*-5E|sZSNcz;&y}s z5v?A7mYYyvCBC$y%6LPS?HzRXL&{^A>d`S0*5(d2c-D7%{LLQ4%~UM7eWvL!3@p*t zmyY(n%`${ERek)i00W6Y5b;mWO>$`^reEnmuBssCCiV{sXW;j2jC=wgBdQ3+PkuUv z$JU4OL*nbmOOi_UcF+kvRY&_~|F{&R#(u7U>fl=W)XxxtRpIku^YI>E2iexXSYhv( zz)&UWiQ9R1OG~dHT7BO}w)`jD|D<&oYktp`4B*IQ?F`C(60XG8r;~5PV?U%sjcK+1 z5X0m|b|g_mkkVLRR)Hoxzh9T!i1D%~;>qV%mM=N3&!gJj!zhBlb%|$Rw#mNu`XTXu z^@(k960VJjjez2f%c$hv*Q0r8HgCU6zj7pFa#tpYrOA&O%;?{4P$)WSai_mI+-c@l z(ql@4mQ~fxuUpnsQ&zu-{-Vqg1F%K$FzG6Ghgn1+m^F|)l)Ye(flO)k1?UUN)K0&l zw@wvksEEr5Zqyx9Fg1U2mZhl!vSA(rDDAivFQ6&ow0gW9P?b;gKm5eRj z=eKP%a&m1;A9Gnw{r#GyW-MS`)gOZW%rtOWq{{FERqFmwg_~xa@T+)o89tA{HH>1Z znYn8uAgOO8#s3M8Gf7Y~Jdze)<_))1_&n~QsTmpSa!Sm1d#G3RnUeZAM+*mkR9czz zB@yTZb%yPzqTBd}7cJi$Ha}u6k8Cnjf1_SgC**Z&ajTMBZdVOzHi0#?sT&Ujq5(;^ zP1HtLyGz znmgiZoLMKD8Do=^9u6$QkTq!70~H}EB{BEqy|Mxsak+v-f9@wybWJLr(HcK?a$g%a zduW~>vVYu@aNn>rK619Sy|AC~pjRwTQKpf3Ni{B{B)UAE=zB794mMTjElMlZ2LmKc zG$xXk5Go{}oq)^%#x;(A2t)?c?Y5Y{U+M1;h>_BSqRXBrZIqbXk?pvVb{dzPC^oTu z_d>HaE)SW>ltEU7AzIo-cc`|LKIBacMROee&|}L&XrYKDPsI6h<5LF9R43}wV0XZQ|K}tEHV}V6ut&tewi~9%K03DkCs|DT3mrBac+7u6s15T{Gi`Q4wX&DPVkkFi zOO1tB?TONA1F^4$^r-V5G8las<%s6>{w}2VCy4z5Az?GMe^PGMKISgV|6!Dc>b=X2F?7A!$yX^5 z5qqk)#{3{NjT{(Ld&pF!WoUv?Q24Y zt|uZ|NfJ#jA_J9b4;u(Jc!C?e&B__|_jelOhTy!$CQbyQHZSq3kF;y5s;jFSDl6)0 z=Qq%Iw|({}_y3b9pyLp;sVuy}yUEj1ul8ssB}_LhT-Xo#f&HCIGjNShz$Z&}_WGNv z$#dEUW#@dx6=0A-hQZZddawK$sVQvrF)KDVAOZ0StfFTnf2yTYOa4Rf<-LMkwWIsnpx-kQG8M|El)ypf`m57OEHxD@e3rJ>u3U4`%2_65q1lC%H&|#MK#ocLJ(|$u_!wz`ol9vTl62TL>&zhOlLQt&~bLNS`PjLjL_IE>;O!PpWAwCZnt9PZR~b` ztfsjwwzF`2lt_bxFCme?Ny0)yyLMZ0Ks6gIz4>K40bz@PJFxOjc2}=89E}1WzlLuh z0dFQDfYi9x8g91G+>Mp@Bu0}GkLF!O^Ij4(8xx_~XrZ|mD}R+(A~WLAe1vE|PJ(7j zB8l8$p}7w$?@x?oXgr$F5Y1nbpxK+dXt%^s|LATiVQcr^b+G+!h^b9y4Coo=Cd z5G(hxu0&{t#iRKK(flU~8nU##&|F}l*@u-6v2N4k7NeMwpr)X54!hgJlBy~X*eqI# zi6MrT8l>C^m*d++3@f|gFpdg6sivSCbr!mRVKO$~ z3fX&L${xtgoGKoHyoVsa3kqx<g2o&$l%*lPIu0BJB&Bo0v|a`rq)%nK`j*^5Z*OBS)K zOegKi%ba77P%6+TX60qhH5tz0s2WT{!j6CpRs!SMY@1NI3~Ce&2z9(dpRUj|g&r~g zCW2XH;q1^$u>GdE89z$qcEMGK$cZ?StHtW0k)`vx;TVog^cUvS`?1{Wi4!Q}@GLZ% zVpDF;BDP-_RA8VnAN^Q=rPZSg7W4v!bzN|r!2uKX@dj#^noqCx&NT(k5>AD-$^@FZ zkWg7g15!Z`JQp{=S~f@87$9$jVR1?~M;0irJSRnzq-Lk)q@Y9Il9Q61ivD-e94$xd zg6bUu!>{`8gn5NIGDmv|YWR&X!yH#jZBgD-MR`LFQD$sSMTdWXdQ=flg>kr)N24Mh z1KI3YT&prDU=^q(^I<8ggbi!~>}J)lkJZ5QtQI|P9el(V!nv#N5E?1K5uhD}-DoZjLY2ne`hgVk3H@@{^&B{rwvW(janGyil|-BLs|i&qZEuOGT1}Nk!~1^;y;N!3RBsW zFoQjRgWl&kn8Tj8d7x4&R4Fx8gytfFk48SIBu zE0B^CyWu1bw5NLzvb*5qXpCeyoZrF-uERJ!$cB8pg?zk$9NGM5_L&*?H{&>pXVUZX z3-&=%>}(ZKJ_=I#Sa9-jR%C$PEuiV_FYK>>YF*RW-`L-goak17+CIk_S#vZO=pRVJ zKdpF-WPy55!bz>}fkF5)Vh^})!;S2NkS=e*jqrn@?;>@PcgN9o7`XTpn8>HvJnSTc zHpSx<5JLykjK7G?SbTz&sW|imgqqro+g4z;_$qclEB>UQ9Vp9N@gPXKnzq{yLUSH} zZQ=^Lprs2u_)2vtH^Bj8JB~d$_2ksE3)b$2k7Da=qg!it!&6usk9yvwyx|;4w&eO8 zseH{vW_;ZQK3Gl`oMOB{9ZMX72@NLBl8SQJ}F!~C_e_yULu+jtjr z7#Me3apn4GTxl%QFym*Iu~xy`p-`=V)va(iL7?}WV3YwqGeo0=MNGJ`2X+>ALnj4z zD@Y56#L}_BpkqiEY&2(%rDX+$xKG#=88_5cxBJlFsjvq&cf+Y1mhFZaDj_l;sLX_V z8iUoX0ESa=rk5#gBu1{CIeRSHTN>A-u&G!MnT~{>W?KAAB)<%THjO*Rx4{2`k|% znVX-?e7uRR=d0N!-po$t7%1?6wd^9^%I@G^_8>onJ;HtLMc%>Q<3aWz53xhMlRNn) zp2g4LBl%f4uWh`5Uw|{)!l&`AIKOTD7%Z3LZw>w~<`*hmoQFzw9@_OU$*$upN3wsh zuR!o=7+n0DeXX?jgoqWvH`9vXTbvb9ZJ(Pqb21D$2+KA0&Devm5q-dakq2Pth^eK+ zGm0DsAY+ln{!_29ZwDo?IGny{H>2uC^gUz(#_fkQQ8>=3Mg2T`jx5BVbGl#){hr$e zTMJ1`&WjbJ^HGcnyI`B8B(cpG7|j=2S{vJZk!}^PT8quSI>m9xC`Q)Xf{<9DXxgz;8vp+zr?8U&8hL4!E7) zi8^{0JcQBQll%dAiSLD%`99Rqhu}~AVfcpcXIcDFHjh8as`yi^mOssw^B&g1pJf65 z9J`o5&#vGvu^ae*%WOA)mEFrEkt!$G%71OCi~}bZ?x}IHul6Gda$4I6KIGKph>-hp-=2 zWJcOI2J|1`NsS#s%}f6t=8q`&9u^Ew)xL-0QXNX?9LTYMKfxIocSz1K?u;aMjEswJ zu=tiplwk{9_?MvZuh35X+vdr2)00PIBu-z@n^3n?9sZUh)R8@?MCeLHtiIi982yoU zeQP!MzpOTYYp7anSZhUz%$9|?U46SSTdLh^3Mo5A1&_y0 z=?;ntQtT62M#dl~1^1}5=iN!o=Kf|RzNrn4mY<^$)H~5RI`e7xoy%gu-W3ZrJ5}D8 z5Kw^)P(dO%r3ZhS%KM95NXPyIb~5( zbmx2~jK>wiErSq{Ata0tsW3rkkS`o?gh+$AA{|x;9oj?&w2L9IQDnl|A`31Q!{B0( z4OfT}aG%J5E-?xo7h~XgF&17I+U{t$1CG44!DU?1o*8$u�|U3QU6c)IM6`CSfwFB;^)IuyI`D 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 MVGk*E(#&oC1EgfNE&u=k diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index d810539..1ad661b 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -31,8 +31,8 @@ ++ What is new in version 1.4.3 * The JDBCRun operators provides a new parameter **credentials**. - This optional parameter specifies the path name of the JSON file that contains the JDBC credentials. - The JDBC credentials file must contain valid JSON format and a set of name/value pairs for + This optional parameter specifies the path name of the JSON string that contains the JDBC credentials. + The JDBC credentials string must contain valid JSON format and a set of name/value pairs for **username**, **password** and **jdbcurl**. * support **Streams application configuration** diff --git a/samples/JDBCSample/.gitignore b/samples/JDBCSample/.gitignore index 5f49f22..53647f5 100644 --- a/samples/JDBCSample/.gitignore +++ b/samples/JDBCSample/.gitignore @@ -1,3 +1,7 @@ /.toolkitList /output/ /.apt_generated/ +toolkit.xml +/doc/ + + diff --git a/samples/JDBCSample/doc/spldoc/html/dita.list b/samples/JDBCSample/doc/spldoc/html/dita.list index fa84c05..71767cc 100644 --- a/samples/JDBCSample/doc/spldoc/html/dita.list +++ b/samples/JDBCSample/doc/spldoc/html/dita.list @@ -1,4 +1,4 @@ -#Wed May 23 12:00:15 CEST 2018 +#Wed Jan 23 03:05:35 PST 2019 copytosourcelist= hreftargetslist=tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml fullditatopicfile=fullditatopic.list @@ -37,7 +37,7 @@ codereffile=coderef.list keylist= codereflist= user.input.file.listfile=usr.input.file.list -user.input.dir=/home/nouriahm/workspace2/jdbc-master/streamsx.jdbc/samples/JDBCSample/doc/spldoc/dita +user.input.dir=/home/anouri/workspace/streamsx.jdbc/samples/JDBCSample/doc/spldoc/dita uplevels= tempdirToinputmapdir.relative.value= conrefpushfile=conrefpush.list diff --git a/samples/JDBCSample/doc/spldoc/html/dita.xml.properties b/samples/JDBCSample/doc/spldoc/html/dita.xml.properties index c935666..5386541 100644 --- a/samples/JDBCSample/doc/spldoc/html/dita.xml.properties +++ b/samples/JDBCSample/doc/spldoc/html/dita.xml.properties @@ -40,7 +40,7 @@ usr.input.file.list - /home/nouriahm/workspace2/jdbc-master/streamsx.jdbc/samples/JDBCSample/doc/spldoc/dita + /home/anouri/workspace/streamsx.jdbc/samples/JDBCSample/doc/spldoc/dita conrefpush.list diff --git a/samples/JDBCSample/opt/db2jcc4.jar b/samples/JDBCSample/opt/db2jcc4.jar old mode 100644 new mode 100755 From e2c79698596de4ccfc34bf4d98f17045fbf2994a Mon Sep 17 00:00:00 2001 From: anouri Date: Wed, 23 Jan 2019 04:32:49 -0800 Subject: [PATCH 22/48] remove spldocs from develop branch --- .../doc/spldoc/html/commonltr.css | 135 -- .../doc/spldoc/html/commonrtl.css | 128 -- .../doc/spldoc/html/dita.list | 52 - .../doc/spldoc/html/dita.xml.properties | 56 - .../doc/spldoc/html/index.html | 31 - .../spldoc/html/references/OperatorModel.html | 799 ----------- .../doc/spldoc/html/spldoc.css | 585 -------- .../ix$Namespace.html | 52 - .../tk$com.ibm.streamsx.jdbc/ix$Operator.html | 46 - .../tk$com.ibm.streamsx.jdbc/ix$Type.html | 46 - .../ns$com.ibm.streamsx.jdbc.html | 43 - .../ns$com.ibm.streamsx.jdbc.types.html | 43 - .../op$com.ibm.streamsx.jdbc$JDBCRun.html | 1206 ----------------- ....ibm.streamsx.jdbc.types$JDBCRunTypes.html | 83 -- .../tk$com.ibm.streamsx.jdbc.html | 168 --- .../doc/spldoc/html/toc.html | 43 - .../spldoc/html/toolkits/ix$Namespace.html | 52 - .../doc/spldoc/html/toolkits/ix$Operator.html | 46 - .../doc/spldoc/html/toolkits/ix$Type.html | 46 - .../doc/spldoc/html/toolkits/toolkits.html | 69 - .../op$com.ibm.streamsx.jdbc$JDBCRun.svg | 128 -- .../JDBCSample/doc/spldoc/html/commonltr.css | 135 -- .../JDBCSample/doc/spldoc/html/commonrtl.css | 128 -- samples/JDBCSample/doc/spldoc/html/dita.list | 52 - .../doc/spldoc/html/dita.xml.properties | 56 - samples/JDBCSample/doc/spldoc/html/index.html | 31 - samples/JDBCSample/doc/spldoc/html/spldoc.css | 585 -------- .../html/tk$JDBCSample/ix$Namespace.html | 46 - ...$com.ibm.streamsx.jdbc.sample.jdbcrun.html | 33 - .../html/tk$JDBCSample/tk$JDBCSample.html | 87 -- samples/JDBCSample/doc/spldoc/html/toc.html | 28 - .../spldoc/html/toolkits/ix$Namespace.html | 46 - .../doc/spldoc/html/toolkits/toolkits.html | 53 - 33 files changed, 5137 deletions(-) delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/commonltr.css delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/commonrtl.css delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/index.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/references/OperatorModel.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/spldoc.css delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Namespace.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Type.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html delete mode 100644 com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg delete mode 100644 samples/JDBCSample/doc/spldoc/html/commonltr.css delete mode 100644 samples/JDBCSample/doc/spldoc/html/commonrtl.css delete mode 100644 samples/JDBCSample/doc/spldoc/html/dita.list delete mode 100644 samples/JDBCSample/doc/spldoc/html/dita.xml.properties delete mode 100644 samples/JDBCSample/doc/spldoc/html/index.html delete mode 100644 samples/JDBCSample/doc/spldoc/html/spldoc.css delete mode 100644 samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ix$Namespace.html delete mode 100644 samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.html delete mode 100644 samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/tk$JDBCSample.html delete mode 100644 samples/JDBCSample/doc/spldoc/html/toc.html delete mode 100644 samples/JDBCSample/doc/spldoc/html/toolkits/ix$Namespace.html delete mode 100644 samples/JDBCSample/doc/spldoc/html/toolkits/toolkits.html diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/commonltr.css b/com.ibm.streamsx.jdbc/doc/spldoc/html/commonltr.css deleted file mode 100644 index 70a1572..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/commonltr.css +++ /dev/null @@ -1,135 +0,0 @@ -/* - | This file is part of the DITA Open Toolkit project hosted on - | Sourceforge.net. See the accompanying license.txt file for - | applicable licenses. -*/ - -/* - | (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved. - */ - -.unresolved { background-color: skyblue; } -.noTemplate { background-color: yellow; } - -.base { background-color: #ffffff; } - -/* Add space for top level topics */ -.nested0 { margin-top : 1em;} - -/* div with class=p is used for paragraphs that contain blocks, to keep the XHTML valid */ -.p {margin-top: 1em} - -/* Default of italics to set apart figure captions */ -.figcap { font-style: italic } -.figdesc { font-style: normal } - -/* Use @frame to create frames on figures */ -.figborder { border-style: solid; padding-left : 3px; border-width : 2px; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figsides { border-left : 2px solid; padding-left : 3px; border-right : 2px solid; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figtop { border-top : 2px solid; margin-top: 1em; border-color : Silver;} -.figbottom { border-bottom : 2px solid; border-color : Silver;} -.figtopbot { border-top : 2px solid; border-bottom : 2px solid; margin-top: 1em; border-color : Silver;} - -/* Most link groups are created with
    . Ensure they have space before and after. */ -.ullinks { list-style-type: none } -.ulchildlink { margin-top: 1em; margin-bottom: 1em } -.olchildlink { margin-top: 1em; margin-bottom: 1em } -.linklist { margin-bottom: 1em } -.linklistwithchild { margin-left: 1.5em; margin-bottom: 1em } -.sublinklist { margin-left: 1.5em; margin-bottom: 1em } -.relconcepts { margin-top: 1em; margin-bottom: 1em } -.reltasks { margin-top: 1em; margin-bottom: 1em } -.relref { margin-top: 1em; margin-bottom: 1em } -.relinfo { margin-top: 1em; margin-bottom: 1em } -.breadcrumb { font-size : smaller; margin-bottom: 1em } -dt.prereq { margin-left : 20px;} - -/* Set heading sizes, getting smaller for deeper nesting */ -.topictitle1 { margin-top: 0pc; margin-bottom: .1em; font-size: 1.34em; } -.topictitle2 { margin-top: 1pc; margin-bottom: .45em; font-size: 1.17em; } -.topictitle3 { margin-top: 1pc; margin-bottom: .17em; font-size: 1.17em; font-weight: bold; } -.topictitle4 { margin-top: .83em; font-size: 1.17em; font-weight: bold; } -.topictitle5 { font-size: 1.17em; font-weight: bold; } -.topictitle6 { font-size: 1.17em; font-style: italic; } -.sectiontitle { margin-top: 1em; margin-bottom: 0em; color: black; font-size: 1.17em; font-weight: bold;} -.section { margin-top: 1em; margin-bottom: 1em } -.example { margin-top: 1em; margin-bottom: 1em } -div.tasklabel { margin-top: 1em; margin-bottom: 1em; } -h2.tasklabel, h3.tasklabel, h4.tasklabel, h5.tasklabel, h6.tasklabel { font-size: 100%; } - -/* All note formats have the same default presentation */ -.note { margin-top: 1em; margin-bottom : 1em;} -.notetitle { font-weight: bold } -.notelisttitle { font-weight: bold } -.tip { margin-top: 1em; margin-bottom : 1em;} -.tiptitle { font-weight: bold } -.fastpath { margin-top: 1em; margin-bottom : 1em;} -.fastpathtitle { font-weight: bold } -.important { margin-top: 1em; margin-bottom : 1em;} -.importanttitle { font-weight: bold } -.remember { margin-top: 1em; margin-bottom : 1em;} -.remembertitle { font-weight: bold } -.restriction { margin-top: 1em; margin-bottom : 1em;} -.restrictiontitle { font-weight: bold } -.attention { margin-top: 1em; margin-bottom : 1em;} -.attentiontitle { font-weight: bold } -.dangertitle { font-weight: bold } -.danger { margin-top: 1em; margin-bottom : 1em;} -.cautiontitle { font-weight: bold } -.caution { font-weight: bold; margin-bottom : 1em; } -.warning { margin-top: 1em; margin-bottom : 1em;} -.warningtitle { font-weight: bold } - -/* Simple lists do not get a bullet */ -ul.simple { list-style-type: none } - -/* Used on the first column of a table, when rowheader="firstcol" is used */ -.firstcol { font-weight : bold;} - -/* Various basic phrase styles */ -.bold { font-weight: bold; } -.boldItalic { font-weight: bold; font-style: italic; } -.italic { font-style: italic; } -.underlined { text-decoration: underline; } -.uicontrol { font-weight: bold; } -.parmname { font-weight: bold; } -.kwd { font-weight: bold; } -.defkwd { font-weight: bold; text-decoration: underline; } -.var { font-style : italic;} -.shortcut { text-decoration: underline; } - -/* Default of bold for definition list terms */ -.dlterm { font-weight: bold; } - -/* Use CSS to expand lists with @compact="no" */ -.dltermexpand { font-weight: bold; margin-top: 1em; } -*[compact="yes"]>li { margin-top: 0em;} -*[compact="no"]>li { margin-top: .53em;} -.liexpand { margin-top: 1em; margin-bottom: 1em } -.sliexpand { margin-top: 1em; margin-bottom: 1em } -.dlexpand { margin-top: 1em; margin-bottom: 1em } -.ddexpand { margin-top: 1em; margin-bottom: 1em } -.stepexpand { margin-top: 1em; margin-bottom: 1em } -.substepexpand { margin-top: 1em; margin-bottom: 1em } - -/* Align images based on @align on topic/image */ -div.imageleft { text-align: left } -div.imagecenter { text-align: center } -div.imageright { text-align: right } -div.imagejustify { text-align: justify } - -/* The cell border can be turned on with - {border-right:solid} - This value creates a very thick border in Firefox (does not match other tables) - - Firefox works with - {border-right:solid 1pt} - but this causes a barely visible line in IE */ -.cellrowborder { border-left:none; border-top:none; border-right:solid 1px; border-bottom:solid 1px } -.row-nocellborder { border-left:none; border-right:none; border-top:none; border-right: hidden; border-bottom:solid 1px} -.cell-norowborder { border-top:none; border-bottom:none; border-left:none; border-bottom: hidden; border-right:solid 1px} -.nocellnorowborder { border:none; border-right: hidden;border-bottom: hidden } - -pre.screen { padding: 5px 5px 5px 5px; border: outset; background-color: #CCCCCC; margin-top: 2px; margin-bottom : 2px; white-space: pre} - -span.filepath { font-family:monospace } \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/commonrtl.css b/com.ibm.streamsx.jdbc/doc/spldoc/html/commonrtl.css deleted file mode 100644 index ded36ea..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/commonrtl.css +++ /dev/null @@ -1,128 +0,0 @@ -/* - | This file is part of the DITA Open Toolkit project hosted on - | Sourceforge.net. See the accompanying license.txt file for - | applicable licenses. -*/ - -/* - | (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved. - */ - -.unresolved { background-color: skyblue; } -.noTemplate { background-color: yellow; } - -.base { background-color: #ffffff; } - -/* Add space for top level topics */ -.nested0 { margin-top : 1em;} - -/* div with class=p is used for paragraphs that contain blocks, to keep the XHTML valid */ -.p {margin-top: 1em} - -/* Default of italics to set apart figure captions */ -.figcap { font-style: italic } -.figdesc { font-style: normal } - -/* Use @frame to create frames on figures */ -.figborder { border-style: solid; padding-left : 3px; border-width : 2px; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figsides { border-left : 2px solid; padding-left : 3px; border-right : 2px solid; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figtop { border-top : 2px solid; margin-top: 1em; border-color : Silver;} -.figbottom { border-bottom : 2px solid; border-color : Silver;} -.figtopbot { border-top : 2px solid; border-bottom : 2px solid; margin-top: 1em; border-color : Silver;} - -/* Most link groups are created with
    . Ensure they have space before and after. */ -.ullinks { list-style-type: none } -.ulchildlink { margin-top: 1em; margin-bottom: 1em } -.olchildlink { margin-top: 1em; margin-bottom: 1em } -.linklist { margin-top: 1em; margin-bottom: 1em } -.linklistwithchild { margin-top: 1em; margin-right: 1.5em; margin-bottom: 1em } -.sublinklist { margin-top: 1em; margin-right: 1.5em; margin-bottom: 1em } -.relconcepts { margin-top: 1em; margin-bottom: 1em } -.reltasks { margin-top: 1em; margin-bottom: 1em } -.relref { margin-top: 1em; margin-bottom: 1em } -.relinfo { margin-top: 1em; margin-bottom: 1em } -.breadcrumb { font-size : smaller; margin-bottom: 1em } -dt.prereq { margin-right : 20px;} - -/* Set heading sizes, getting smaller for deeper nesting */ -.topictitle1 { margin-top: 0pc; margin-bottom: .1em; font-size: 1.34em; } -.topictitle2 { margin-top: 1pc; margin-bottom: .45em; font-size: 1.17em; } -.topictitle3 { margin-top: 1pc; margin-bottom: .17em; font-size: 1.17em; font-weight: bold; } -.topictitle4 { margin-top: .83em; font-size: 1.17em; font-weight: bold; } -.topictitle5 { font-size: 1.17em; font-weight: bold; } -.topictitle6 { font-size: 1.17em; font-style: italic; } -.sectiontitle { margin-top: 1em; margin-bottom: 0em; color: black; font-size: 1.17em; font-weight: bold;} -.section { margin-top: 1em; margin-bottom: 1em } -.example { margin-top: 1em; margin-bottom: 1em } -div.tasklabel { margin-top: 1em; margin-bottom: 1em; } -h2.tasklabel, h3.tasklabel, h4.tasklabel, h5.tasklabel, h6.tasklabel { font-size: 100%; } - -/* All note formats have the same default presentation */ -.note { margin-top: 1em; margin-bottom : 1em;} -.notetitle { font-weight: bold } -.notelisttitle { font-weight: bold } -.tip { margin-top: 1em; margin-bottom : 1em;} -.tiptitle { font-weight: bold } -.fastpath { margin-top: 1em; margin-bottom : 1em;} -.fastpathtitle { font-weight: bold } -.important { margin-top: 1em; margin-bottom : 1em;} -.importanttitle { font-weight: bold } -.remember { margin-top: 1em; margin-bottom : 1em;} -.remembertitle { font-weight: bold } -.restriction { margin-top: 1em; margin-bottom : 1em;} -.restrictiontitle { font-weight: bold } -.attention { margin-top: 1em; margin-bottom : 1em;} -.attentiontitle { font-weight: bold } -.dangertitle { font-weight: bold } -.danger { margin-top: 1em; margin-bottom : 1em;} -.cautiontitle { font-weight: bold } -.caution { font-weight: bold; margin-bottom : 1em; } -.warning { margin-top: 1em; margin-bottom : 1em;} -.warningtitle { font-weight: bold } - -/* Simple lists do not get a bullet */ -ul.simple { list-style-type: none } - -/* Used on the first column of a table, when rowheader="firstcol" is used */ -.firstcol { font-weight : bold;} - -/* Various basic phrase styles */ -.bold { font-weight: bold; } -.boldItalic { font-weight: bold; font-style: italic; } -.italic { font-style: italic; } -.underlined { text-decoration: underline; } -.uicontrol { font-weight: bold; } -.parmname { font-weight: bold; } -.kwd { font-weight: bold; } -.defkwd { font-weight: bold; text-decoration: underline; } -.var { font-style : italic;} -.shortcut { text-decoration: underline; } - -/* Default of bold for definition list terms */ -.dlterm { font-weight: bold; } - -/* Use CSS to expand lists with @compact="no" */ -.dltermexpand { font-weight: bold; margin-top: 1em; } -*[compact="yes"]>li { margin-top: 0em;} -*[compact="no"]>li { margin-top: .53em;} -.liexpand { margin-top: 1em; margin-bottom: 1em } -.sliexpand { margin-top: 1em; margin-bottom: 1em } -.dlexpand { margin-top: 1em; margin-bottom: 1em } -.ddexpand { margin-top: 1em; margin-bottom: 1em } -.stepexpand { margin-top: 1em; margin-bottom: 1em } -.substepexpand { margin-top: 1em; margin-bottom: 1em } - -/* Align images based on @align on topic/image */ -div.imageleft { text-align: left } -div.imagecenter { text-align: center } -div.imageright { text-align: right } -div.imagejustify { text-align: justify } - -.cellrowborder { border-right:none; border-top:none; border-left:solid 1px; border-bottom:solid 1px } -.row-nocellborder { border-left:none; border-right:none; border-top:none; border-left: hidden; border-bottom:solid 1px} -.cell-norowborder { border-top:none; border-bottom:none; border-right:none; border-bottom: hidden; border-left:solid 1px} -.nocellnorowborder { border:none; border-left: hidden;border-bottom: hidden } - -pre.screen { padding: 5px 5px 5px 5px; border: outset; background-color: #CCCCCC; margin-top: 2px; margin-bottom : 2px; white-space: pre} - - diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list b/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list deleted file mode 100644 index 6e537e3..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.list +++ /dev/null @@ -1,52 +0,0 @@ -#Wed Jan 23 03:05:29 PST 2019 -copytosourcelist= -hreftargetslist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml -fullditatopicfile=fullditatopic.list -fullditamapandtopicfile=fullditamapandtopic.list -fullditatopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml -fullditamapandtopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/toolkits.ditamap,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml -hrefditatopicfile=hrefditatopic.list -hrefditatopiclist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml -user.input.file=dita/toolkits.ditamap -subtargetsfile=subtargets.list -fullditamapfile=fullditamap.list -copytotarget2sourcemapfile=copytotarget2sourcemap.list -subtargetslist= -fullditamaplist=dita/toolkits.ditamap -copytotarget2sourcemaplist= -outditafilesfile=outditafiles.list -outditafileslist= -conreftargetsfile=conreftargets.list -conreffile=conref.list -conreftargetslist= -conreflist= -resourceonlyfile=resourceonly.list -imagefile=image.list -resourceonlylist= -imagelist=image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg -htmlfile=html.list -htmllist= -canditopicsfile=canditopics.list -canditopicslist=dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml -keyreffile=keyref.list -subjectschemefile=subjectscheme.list -keyreflist= -subjectschemelist= -keyfile=key.list -codereffile=coderef.list -keylist= -codereflist= -user.input.file.listfile=usr.input.file.list -user.input.dir=/home/anouri/workspace/streamsx.jdbc/com.ibm.streamsx.jdbc/doc/spldoc -uplevels=../ -tempdirToinputmapdir.relative.value=dita/ -conrefpushfile=conrefpush.list -flagimagefile=flagimage.list -skipchunkfile=skipchunk.list -conrefpushlist= -flagimagelist= -skipchunklist= -relflagimagefile=relflagimage.list -relflagimagelist= -copytosourcefile=copytosource.list -hreftargetsfile=hreftargets.list diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties b/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties deleted file mode 100644 index e91673c..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/dita.xml.properties +++ /dev/null @@ -1,56 +0,0 @@ - - - - - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml - fullditatopic.list - fullditamapandtopic.list - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/toolkits.ditamap,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml - hrefditatopic.list - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml - dita/toolkits.ditamap - subtargets.list - fullditamap.list - copytotarget2sourcemap.list - - dita/toolkits.ditamap - - outditafiles.list - - conreftargets.list - conref.list - - - resourceonly.list - image.list - - image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg - html.list - - canditopics.list - dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc$1.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.xml,dita/toolkits/ix$Namespace.xml,dita/toolkits/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.xml,dita/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.xml,dita/toolkits/ix$Type.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Operator.xml,dita/tk$com.ibm.streamsx.jdbc/ix$Namespace.xml,dita/toolkits/toolkits.xml,dita/references/OperatorModel.xml,dita/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.xml - keyref.list - subjectscheme.list - - - key.list - coderef.list - - - usr.input.file.list - /home/anouri/workspace/streamsx.jdbc/com.ibm.streamsx.jdbc/doc/spldoc - ../ - dita/ - conrefpush.list - flagimage.list - skipchunk.list - - - - relflagimage.list - - copytosource.list - hreftargets.list - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/index.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/index.html deleted file mode 100644 index 1fde5ab..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/references/OperatorModel.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/references/OperatorModel.html deleted file mode 100644 index dc805a7..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/references/OperatorModel.html +++ /dev/null @@ -1,799 +0,0 @@ - - - - - - - - - - - - - -SPL Operator Model - - - - -

    SPL Operator Model

    - -
    -
    -

    -An operator model can be used to describe a C++ primitive operator or a Java primitive operator. The set of elements that can -be present in a Java operator model is a strict subset of the ones that can be present in a C++ operator model, with the -exception of a special element used for JVM related configurations. -

    - -
    - -

    Context

    - -

    -The context element describes the properties that apply to the operator as a whole and are not associated -with particular parameters or ports of the operator. It also includes common definitions that are referenced in -other places in the operator model. -

    - -
    - -
    Description
    - -
    The description element, which is optional, provides an overview of the operator.
    - - - -
    Metrics
    - -
    The metrics element, which is optional, contains the list of metrics exposed by the operator. -It is structured as a list of metric elements, where each metric element contains a name, a description, and a kind. -
    - -
    Kind: Counter
    - -
    Represents metrics whose values are either non-decreasing or non-increasing. -
    - - - -
    Kind: Gauge
    - -
    Represent metrics that can change their values freely, that is, they can go up or down. -
    - - - -
    Kind: Time
    - -
    Represents metrics that denote a point in time. -
    - - -
    - -
    - - - -
    Custom Literals
    - -
    The customLiterals element, which is optional, captures the identifiers that may appear in parameter -configurations of an operator. It is structured as a list of enumeration elements. For instance, a Source -operator may support different source formats, in which case we can have an enumeration called FileFormat -that will contain values {csv, xml, bin}. -
    - - - -
    Custom Output Functions (C++ only)
    - -
    The customOutputFunctions element, which is optional, captures the output function prototypes used by an operator -in its output attribute assignments. It is structured as a list of customOutputFunction elements, where each enumeration -contains a name and a list of output function prototypes. For instance, an Aggregate operator may support relational -aggregations, in which case we can have an enumeration called RelationalAggs that will contain output functions -{Min, Max, Avg, Sum, and so on}. -
    - - - -
    Dependencies (Optional)
    - -
    A sequence of one or more library elements, each representing a library dependency. -The library element format is exactly the same as the one used for operator models. -
    - -
    Description (Optional)
    - -
    A description of the library -
    - - - -
    Managed Library
    - -
    Specifies the details of the individual library artifacts. The paths can -contain environment variables embedded between @ signs (for example: @FOO_FFT_HOME@/lib), -which will be fully resolved by the SPL compiler at compile time. -
    - -
    lib (Optional)
    - -
    Specifies a name to be passed to C++ compiler's -l argument -(such as fft which will be translated into -lfft when passed to the linker) -
    - - - -
    libPath (Optional)
    - -
    Specifies a path to be passed to C++ compiler's -L argument. -
    - - - -
    includePath (Optional)
    - -
    Specifies a path to be passed to C++ compiler's -I argument. -
    - - - -
    command (Optional)
    - -
    A path to a program that will be executed to retrieve includePath, libPath, and lib -information. If the path to the program is relative, it is assumed to be rooted at the directory of the -operator model. The program is executed three times, each time with a different argument, namely lib, -libPath, and includePath. 1 The standard output from these executions will be read and each line -(trimmed of white spaces) will be added to one of the lib, libPath, and includePath elements, depending -on the type of the execution. A line that begins with # will be ignored. Relative paths are assumed to -be rooted at the directory where the operator model XML document resides. -
    - - -
    - -
    - - -
    - -
    - - - -
    Provides Single Threaded Execution Context (C++ only)
    - -
    The providesSingleThreadedContext element describes the threading semantics of the -operator with respect to the flow of execution. An operator provides a single threaded execution context, -if and only if: -
      -
    • It does not perform concurrent submit calls unless its process method(s) are called concurrently.
    • - -
    • Its submit calls complete before the process call that triggered the submission completes.
    • - -
    - -
    - -

    Both source and non-source operators have process methods, and the definition above applies -globally. Based on this definition, if an operator has submit calls that are not triggered by a process -call, such as those triggered by a time-based event, then that operator does not provide a single threaded -execution context. Note that this definition does not require a submit call to execute under the same -thread that executes the process call which triggered the submission (even though in the common case -they execute under the same thread). -

    - -
    There are several valid values for this property: -
      -
    • Never: Instances of this operator never provide a single threaded execution context.
    • - -
    • Always: Instances of this operator always provide a single threaded execution context.
    • - -
    • WindowBound: Instances of this operator that do not specify time-based window eviction -policies or time-based window trigger policies provide a single threaded execution context.
    • - -
    • WindowEvictionBound: Instances of this operator that do not specify time-based window -eviction policies provide a single threaded execution context.
    • - -
    • WindowTriggerBound: Instances of this operator that do not specify time-based window trigger -policies provide a single threaded execution context.
    • - -
    • WindowPartitionEvictionBound: Instances of this operator use a thread to implement -partition eviction. Use this setting if tuples are submitted from the onWindowPartitionEvictionSelection event.
    • - -
    - -
    - -

    -As an example, consider a Filter operator. Unless its process method is being called concurrently, -the Filter operator does not make concurrent submit calls. Its submit calls are triggered by incoming -tuples. When it receives a tuple via a process call, it makes a submit call if the received tuple passes the -filter condition, and that submit call completes before the process call that triggered it is complete. As a -result, all instances of a Filter operator provide a single threaded context and the setting -Always is appropriate. -

    - -

    -Implementation note: The providesSingleThreadedContext element is used to enable the SPL runtime -to avoid unnecessary thread synchronization. While setting it to the value Never is safe for all operators, -it would prevent optimizations that reduce synchronization overhead when the operator does provide a single -threaded context. Specifying a value other than Never that is inconsistent with the threading semantics -implemented by the operator will result in undefined behavior. -

    - -
    - - - -
    Incremental Compilation Strategy (C++ only)
    - -
    Specifies how the compiler should manage incremental compilation of operators. The choices are: -
      -
    • SourceDependent: In this mode the compiler will only regenerate the operator source - if it is out-of-date with the SPL source or the code generator - for that operator. This is the default mode.
    • - -
    • ResultDependent: In this mode the compiler always generates the operator source, but - only updates the source files if they differ from what exists prior to the compile. Use this - mode if the operator code generator relies on external configurations that are not captured by the parameterization given in the SPL source. -
    • - -
    - -
    -
    - - - -
    Allow Custom Logic (C++ only)
    - -

    This optional element specifies whether or not the use of an operator is permitted to -have a logic clause specifying either state, onTuple or onPunct processing. When set to false no -logic clause may be specified for the given operator. The default, in the absence of this element, -is true. -

    -
    - - - -
    Code Template
    - -

    This optional element specifies one or more code templates for the operator. -These will show up in IDE's context sensitive content assist menus and SPLDOC documents. -Each code template has a name attribute that names it, a description element that describes it, -and a value element, which is a string that contains the boilerplate code for the template. -When the template is used in the IDE, the boilerplate code is embedded into the source code. -The parts of the code that are in the form ${name} are used to indicate the pieces that must be -customized by the user. The IDE will use the identifier specified within the ${} to indicate the customizable -portions. One example for the Barrier operator is as follows: -

    - -
    - -
    -<codeTemplates>
    -  <codeTemplate name="Barrier">
    -    <description>Basic Barrier template</description>
    -    <template>
    -      <![CDATA[ 
    -        stream<${schema}> ${outputStream} = Barrier(${inputStream1};${inputStream2}) 
    -        {
    -          param
    -            ${parameter}: ${parameterExpression};
    -          output
    -            ${outputStream}: ${outputExpression};
    -          ${cursor} 
    -        }
    -      ]]>
    -    <template>
    -  </codeTemplate>
    -</codeTemplates>
    -
    - - -
    -
    - - - -
    SPL Expression Tree (C++ only)
    - -

    An optional element that controls the generation of SPL expression trees for use in generic C++ - primitive operators.

    - -
      -
    • param - If set to true, the SPL Expression Trees are generated for parameters.
    • - -
    • output - If set to true, the SPL Expression Trees are generated for output.
    • - -
    • cppCode - If set to true, each node in the generated operator instance XML is enhanced with C++ code using templates. -This C++ code can be used to generate the C++ code for an SPL expression. For example, for the SPL code: -
      -
      -param predicates : {a = "a" == In.letter, b = "b" == In.letter};
      -
      - -
      - -

      -The generated SPL expression tree includes: -

      - -
      - -
      -<expressionTree cppCode="SPL::BeJwrMUoyTEwyTAIAC7UCCQ({attr:0}, {attr:1})">
      -  <literal cppCode="SPL::BeJwrMUoyTEwyTAIAC7UCCQ({attr:0}, {attr:1})" type="1">
      -    <tuple count="2" cppCode="SPL::BeJwrMUoyTEwyTAIAC7UCCQ({attr:0}, {attr:1})" type="1">
      -      <attr id="a">
      -        <value cppCode="({Lhs} == {Rhs})" type="2">
      -          <expn cppCode="({Lhs} == {Rhs})">
      -            <binary cppCode="({Lhs} == {Rhs})" op="==" type="2">
      -              <lhs cppCode="SPL::rstring("a")">
      -                <literal cppCode="SPL::rstring("a")" type="0">"a"</literal>
      -              </lhs>
      -              <rhs cppCode="iport$0.get_letter()">
      -                <attribute attribute="letter" cppCode="iport$0.get_letter()" type="0">
      -                  <lhs cppCode="iport$0">
      -                    <stream cppCode="iport$0" name="In" port="0" type="3"/>
      -                  </lhs>
      -                </attribute>
      -              </rhs>
      -            </binary>
      -          </expn>
      -        </value>
      -      </attr>
      -
      - - -
      - -

      -The templates (for example, {Lhs}, {attr:0}) are used to ensure that code replacement is well defined. -

      - -

      -These expressions represent the SPL expression, but are available in a form that can easily be walked. -Perl objects are derived from SPL::Operator::Instance::ExpressionTree, and have a kind, type, -and methods to access the fields of the expression. ExpressionTreeVisitor is a visitor pattern -provided to allow easy walking of the expression tree. For more information, see the -IBM Streams Processing Language Code Generation API Documentation. -

      - -
    • - -
    - -
    - - - -
    Operating System Capabilities (C++ only)
    - -

    This optional list of elements specifies special privileges for the -operator. IBM Streams supports the Linux capabilities model via the -capability element. You can include any number of elements to specify -the exact privileges your operator requires. For example, -<capability>CAP_NET_RAW+eip</capability> -indicates that the operator -needs permission to access raw sockets. Note that the IBM Streams -instance must be configured to allow PE processes to run with special -operating system capabilities. -

    -
    - - -
    - -
    - - -

    Input Port Set

    - -

    -Input ports are defined in terms of port sets. A port set is a fixed number of ports that share the same configuration. -This avoids repetition of the same configuration for different ports. A port set can be open, in which case it can -contain zero or more ports with the same configuration. An inputPorts element contains zero or more inputPortSet elements, -followed by an optional inputPortOpenSet element. -

    - -
    - -
    Cardinality
    - -
    Defines the number of ports that the port set represents. This property applies to non-open port sets. -
    - - - -
    Optional
    - -
    A boolean which specifies whether the input port set is optional. -
    - - - -
    Control Port
    - -
    The optional controlPort element tells the compiler that tuples received on this port will be -used only to control the operator, and no tuples will be submitted when tuples are processed on this port. -If not specified, the value is false. The SPL compiler will emit warnings when loops are found in the -operator graph, as this can lead to deadlock or infinite recursion. Setting controlPort to true will tell -the compiler that this port will not submit further tuples, and that this is an expected (and harmless) -feedback loop, so no warning will be emitted for this port. -
    - - - -
    Windowing Mode
    - -
    The windowingMode element specifies the valid windowing configurations for the port. Options include NonWindowed, -Windowed, and OptionallyWindowed. -
    - - - -
    Window Punctuation Input Mode
    - -
    -The windowPunctuationInputMode element specifies the punctuation semantics of the input port. The valid options are: -
      -
    • Expecting - This port expects window punctuations in order for the operator to function correctly and thus must be fed a punctuated stream.
    • - -
    • Oblivious - This port does not require punctuations in order for the operator to work correctly and thus has no restrictions on the connections that can be attached to it.
    • - -
    • WindowBound - This port is an Expecting port if it has a punctuation based window, and an Oblivious port otherwise.
    • - -
    - -
    - - - -
    Window Expression Mode
    - -
    This element tells the compiler what type of windowing expressions are valid. If not specified, the default is Constant. -
      -
    • Constant - Expressions in count, time, and delta must be constants that can - be evaluated at compile time, or if runtime expressions that do not reference - input tuple attributes are valid.
    • - -
    • AttributeFree - Expressions cannot reference input tuple attributes. An expression such as time -((int32) getSubmissionTimeValue("timeParam")) can be used. For delta, only the second argument is allowed to be a runtime -attribute-free expression. The first argument is still an attribute from the input stream.
    • - -
    - -
    - - - -
    Rewrite Allowed for Window Expression (C++ only)
    - -
    If set to true, this boolean element tells the compiler that it may rewrite the window expression the same way -the rewriteAllowed element rewrites the expressions that appear in the parameter values. For more information -about the rewriteAllowed element, see Parameters. If the rewriteAllowedForWindowExpression element is not specified, -by default the value is set to false. rewriteAllowedForWindowExpression must be false (or omitted) if the -C++ primitive operator wants to examine the value as a literal. -
    - - - -
    Tuple Mutation Allowed
    - -
    The tupleMutationAllowed element defines whether the processing logic attached to the input port (this includes both -the logic associated with the operator's process functions and the processing done as part of the onTuple clauses specified -in the SPL code) can mutate an incoming tuple. It can be set to true for operators that desire to modify the tuples they receive. -
    - - -
    - - -
    - -

    Output Port Set

    - -

    -Output ports are defined in terms of port sets, just like input ports. A port set is a fixed number of ports that share -the same configuration. This avoids repetition of the same configuration for different ports. A port set can be open, in -which case it can contain zero or more ports with the same configuration. An outputPorts element contains zero or more -outputPortSet elements, followed by an optional outputPortOpenSet element. -

    - -
    - -
    Cardinality
    - -
    Defines the number of ports that the port set represents. This property applies to non-open port sets. -
    - - - -
    Optional
    - -
    A boolean which specifies whether the output port set is optional. -
    - - - -
    Expression Mode (C++ only)
    - -
    -The expressionMode element describes the valid syntax of the attribute assignments made on this port. -Note that an expressionMode value of CustomLiteral is not valid for output ports and will result in -a compilation error. Valid values for the expression mode are: -
      -
    • Attribute: This means that the assignments made to output attributes of this -port need to be stream attributes. For example: output Out : x = In.y;, but not x = In.y.z.
    • - -
    • AttributeFree: This means that the assignments made to output attributes of this port cannot reference -any input stream attributes. For example: output Out : x = 3 + random(3);, but not x = In.x + 3.
    • - -
    • Constant: This means that the assignments made to output attributes of this port need to be -compile-time evaluatable to a constant. For example: output Out : x = 3 + pow(2, 3);, but not x = random(3).
    • - -
    • Expression: This is the most flexible expression mode, any SPL expression of correct type can appear as an assignment to the output attributes of this port. For example: output Out : x = A.y + B.z;.
    • - -
    • Nonexistent: This means that output attribute assignments cannot be specified in the SPL source for this port.
    • - -
    - -
    - - - -
    Auto Assignment
    - -
    -The autoAssignment element defines whether unassigned attributes will be automatically assigned from the attributes of the input ports. -If set to true, the SPL compiler will rewrite (at compile-time) the operator invocation as if the unassigned output attributes have -explicit assignments in the output section. For each output attribute that is missing an assignment, an input attribute that has -the same name and type, -or that has the same name and type T, -where the output attribute type is optional<T>, -will be assigned to it. -If there is no such input attribute or if there are more than one, an error is -reported at compile-time. Note that an expressionMode value of Constant is incompatible with an autoAssignment value of true. -This combination will result in a compilation error. -
    - - - -
    Complete Assignment
    - -
    -The completeAssignment element defines if all the output port attributes need to be assigned in order to have a valid -invocation of the operator. This is checked at compile-time. If an operator has this element set to true in its operator model -and if not all output attributes have assignments after the auto-assignment step (if requested) for a given instance of this -operator, an error will be reported. -
    - - - -
    Rewrite Allowed (C++ only)
    - -
    -The rewriteAllowed element specifies whether the compiler is allowed to rewrite the expressions that appear in the output -attribute assignments for this port. -
    - - - -
    Output Functions
    - -
    -The outputFunctions element defines the valid custom output functions that can appear in output attribute assignments. -It is optional. When present, it contains two sub-elements: the type element, which defines the name of the custom output -function type, as in RelationalAggs; and the default element, which defines the default output function to be used when -performing auto-assignment of output attributes. This value should be a valid function name for the custom output function -type that is being used (as in Last for RelationalAggs). Note that if the user code specifies an output attribute assignment -without an output function for a port that expects an output function, -the default output function will be inserted automatically. -
    - - - -
    Final Punctuation Port Scope
    - -
    -The finalPunctuationPortScope element, which is optional, specifies the set of input ports to be used by the SPL language -runtime for final punctuation forwarding. By default, operators that have both input and output ports will automatically -forward final punctuations from their input ports to their output ports. This is achieved by generating a final punctuation -on an output port when a final punctuation is received on all input ports. The finalPunctuationPortScope can be used to -limit the set of input ports to be used for forwarding the final punctuation. This element can also be used to turn off -auto-forwarding of final punctuations, by setting the set of input ports to use for forwarding to the empty set. In this case, -the operator developer is responsible for ensuring that the output port gets a final punctuation. -
    - - - -
    Window Punctuation Output Mode
    - -
    -The windowPunctuationOutputMode specifies the window punctuation semantics of the output port. The options are: -
      -
    • Generating - This port generates window punctuations.
    • - -
    • Free - This port is free of window punctuations.
    • - -
    • Preserving - This port preserves the received window punctuations. If an operator has more than one -input port, then the windowPunctuationInputPort element must be specified in order to identify which input port's -punctuation is being preserved.
    • - -
    - -
    - - - -
    Tuple Mutation Allowed
    - -
    -The tupleMutationAllowed element defines whether this operator permits the downstream operators to mutate the output -tuples submitted to this port via the submit call. If set to true, then the processing logic of the operator should expect -that the tuples it submits to this port are modified as a result of the submit call. -
    - - - -
    Window Punctuation Input Port
    - -
    -As mentioned above, the windowPunctuationInputPort element associates an input port with a punctuation -preserving output port. This element may only be specified if the output port's window punctuation mode is Preserving. -The windowPunctuationInputPort can be set to -1, which has the same semantics as a missing windowPunctuationInputPort element. -It is important to note that punctuation forwarding for window punctuations is not performed automatically by the SPL -language runtime (unlike final punctuations) and the operator model is used to inform the SPL compiler about the behavior -that is being implemented by the operator. For more information, see the -IBM Streams Processing Language Toolkit Development Reference. -
    - - - -
    Output Assignment Port Scope
    - -
    - The outputAssignmentPortScope optionally limits which input port attributes may appear in output assignments on this port. - If a scope is specified, only attributes from the ports specified by the scope - may appear in the output assignments for that port. -
    - - -
    - -
    - - -

    Parameters

    - -

    -The parameters element describes the valid parameters an operator can be configured with. -It also describes the valid syntax for such parameter configurations. -

    - -
    - -
    Allow Any
    - -
    This element is a boolean flag that determines whether an operator can take arbitrary parameters, with no restrictions. -An operator can take arbitrary parameters, yet still specify additional parameters and associated restrictions. -
    - - - -
    Parameter
    - -

    Each parameter element contains several subelements. -

    - -
    - -
    Name
    - -
    The name element is the name of the parameter as it will appear in the SPL source code. -For example, a Functor operator may have a filter parameter.
    - - - -
    Description
    - -
    An optional description of this parameter.
    - - - -
    Optional
    - -
    A boolean which specifies whether this parameter is optional. A value of false implies that the parameter - must be specified in the SPL source code.
    - - - -
    Rewrite Allowed (C++ only)
    - -
    This boolean parameter allows the compiler to rewrite the expressions that appear in this parameter's -values by substituting literals (including those resulting from compile-time evaluation step) with variables whose -values are loaded at runtime. This enables the compiler to generate less code for operators that differ slightly -in their parameter configurations. In certain cases, the operator code generators may want to look into the parameter -value, in order to generate different code based on the particular value found or perform compile-time validation. -For example, format: csv may result in generating specialized code for a Source operator. In such cases, expression -rewrite should be turned off.
    - - - -
    Expression Mode
    - -
    -
      -
    • Attribute - Restricts the parameter values to stream attributes.
    • - -
    • AttributeFree - The parameter value is an expression that does not -contain a reference to a stream attribute.
    • - -
    • Constant (C++ only) - The parameter values need to be compile-time evaluatable to a constant.
    • - -
    • CustomLiteral - Restricts the parameter values to valid values from one of the custom -literal enumerations defined in the context section of the model
    • - -
    • Expression (C++ only) - The most flexible expression mode, where any SPL expression of correct type -can appear as a parameter value.
    • - -
    - -
    - - - -
    Type
    - -
    The type of a parameter is either the SPL type of its values (such as list<ustring>) -or a custom literal name (such as SourceFormat). The type can also be omitted, in which case any SPL type -will match. The type subelement of a parameter can have an empty value, which has the same semantics as a missing -type element. -
    - - - -
    Cardinality
    - -
    The maximum number of values the parameter accepts. If omitted or the value is -1, the number of values is -assumed to be unbounded. The number of parameter values must match the cardinality. The cardinality subelement can take a -value of -1, which has the same semantics as a missing cardinality element. -
    - - - -
    Port Scope (C++ only)
    - -
    This element is used to limit the stream attributes that appear in a parameter value to a specific -input port or to a list of input ports. Port indices start from 0. When omitted, there are no restrictions on stream attributes. -
    - - - -
    Custom Output Function (C++ only)
    - -
    This optional element of a parameter specifies the name of a custom output function set defined in the context -element, and makes the functions defined in that set visible during the compilation of a parameter. It is the responsibility -of the operator to generate correct C++ code that involves custom output functions with the parameter, in the same manner as -it would be for a use in an output clause. -
    - - -
    - -
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/spldoc.css b/com.ibm.streamsx.jdbc/doc/spldoc/html/spldoc.css deleted file mode 100644 index 79a80ba..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/spldoc.css +++ /dev/null @@ -1,585 +0,0 @@ -/* begin_generated_IBM_copyright_prolog */ -/* */ -/* This is an automatically generated copyright prolog. */ -/* After initializing, DO NOT MODIFY OR MOVE */ -/* **************************************************************** */ -/* Licensed Materials - Property of IBM */ -/* 5724-Y95 */ -/* (C) Copyright IBM Corp. 2013, 2013 All Rights Reserved. */ -/* US Government Users Restricted Rights - Use, duplication or */ -/* disclosure restricted by GSA ADP Schedule Contract with */ -/* IBM Corp. */ -/* */ -/* end_generated_IBM_copyright_prolog */ -/*last updated 02/02/07*/ -body { font-family: Arial, sans-serif; font-size: 0.8em; background-color: #ffffff; color: Black; margin-right: 5em; margin-bottom: 1em; } - -/* splpart is a class generated by spl-make-doc. Represents an SPL artifact. */ -.splpart -{border-top-style: ridge; - border-top-width: 2px; - border-top-color: #696969; -} -/* .splhead-1 is a class generated by spl-make-doc. Represents a sub header in doc. */ -.splhead-1 -{background-color: #87CEFA; -border-top-style: solid; -border-top-width: 3px; -border-top-color: #696969; -} -/* .splhead-2 is a class generated by spl-make-doc. Represents a sub header in doc. */ -.splhead-2 -{font-size: 1.10em} - -/* .spltoolkitname formats a toolkit name */ -.spltoolkitname -{font-size: 1.30em; -font-weight: bold; -} - -/* Create scrollbars if graph image overflows */ -.splgraph { -max-height: 400px; -overflow: auto; -overflow-style: scrollbar; -} - -/* Enable tooltips to overflow prim operator image */ -.splprimop { -overflow: visible; -} - -.ibmfilepath { font-family: monospace; font-size: 100%; } -.ibmcommand { font-weight: bold; } -.ibmemphasis { font-style: italic; } -.mv, .pk, .pkdef, .pv { font-family: monospace; font-size: 100%; padding-top: 0em; padding-right: .3em; padding-bottom: 0em; padding-left: .3em; } - -tt, samp, kbd, var, pre, -.filepath { font-family: "Courier New", Courier, monospace; font-size: 100%; } -span.cmdname { font-weight: bold; } -span.apiname { font-family: Courier, monospace; } /* DB2 #72488 */ -BODY.nav { - background-color: #FFFFFF; - border-right: 0.2em ridge black; - font-size: 0.95em; -} - -.base { font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; background-color: #ffffff; } - -TABLE { - color: black; - width: 90%; - border-collapse: collapse; - border-color: Black; - background: white; - margin-top: 0.5em; - margin-bottom: 0.5em; - margin-left: 0em; - margin-right: 0em; -} - -.tbldesc { font-style: italic; } - -TH { - font-weight: bold; - font-size: 1.0em; - color: black; - background-color: #dadada; - padding-top: 0.1em; - padding-bottom: 0.3em; - padding-left: 1em; - padding-right: 1em; -} - -TH.base { - font-weight: bold; - color: black; - border: 1 solid #606060; - background-color: #dcdada; - padding-top: 0.65em; - padding-bottom: 0.65em; - padding-left: 1em; - padding-right: 1em; -} - -TD { - font-size: 1.0em; - color: black; - background-color: white; - padding-top: 0.1em; - padding-bottom: 0.3em; - padding-left: 1em; - padding-right: 1em; -} - -/*font size in tables for IE6 - add. Jan'07*/ -* html table th, -* html table td { -font-size: 0.8em; -} - - -CITE { font-style: italic; } -EM { font-style: italic; } -STRONG { font-weight: bold; } - -caption { text-align: left; font-style: italic; } -/*font size of table caption for IE6 - add. Jan'07*/ -* html table caption { font-size: .8em } - -DT { margin-top: 0.5em; margin-bottom: 0.5em; font-weight: bold; } -DD { margin-left: 1.0em; } - -PRE, -pre.cgraphic { -background-color: #dadada; -padding: 5px; -/* DB2 #58001 */ -/* white-space: pre-wrap; /* css-3 */ -/* white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ -/* white-space: -pre-wrap; /* Opera 4-6 */ -/* white-space: -o-pre-wrap; /* Opera 7 */ -/* word-wrap: break-word; /* Internet Explorer 5.5+ */ -overflow:auto; -max-height:500px; -} - - - -.italic { font-style: italic; } -.bold { font-weight: bold; } -.underlined { text-decoration: underline; } -.bold-italic, .boldItalic { font-weight: bold; font-style: italic; } -.smallCaps, .smallcaps { text-transform: uppercase; font-size: smaller; font-variant: small-caps; } -.italic-underlined { font-style: italic; text-decoration: underline; } -.bold-underlined { font-weight: bold; text-decoration: underline; } -.bold-italic-underlined { font-weight: bold; font-style: italic; text-decoration: underline; } -.smallcaps-underlined { font-variant: small-caps; text-decoration: underline; } -.emphasis { font-style: italic; } -.inlinedef { font-style: italic; } - -.sidebar { background: #cccccc; } - -A:link { color: #006699; text-decoration: underline; } -A:visited { color: #996699; text-decoration: underline; } -A:active { color: #006699; text-decoration: underline; } -A:hover { color: #996699;text-decoration: underline; } - -a.toclink:link { text-decoration: none; } -a.toclink:active { text-decoration: none; } -a.toclink:visited { text-decoration: none; } -a.toclink:hover { text-decoration: underline; } - -a.ptoclink:link { text-decoration: none; } -a.ptoclink:active { text-decoration: none; } -a.ptoclink:visited { text-decoration: none; } -a.ptoclink:hover { text-decoration: underline; } - -a.indexlink:link { text-decoration: none; } -a.indexlink:active { text-decoration: none; } -a.indexlink:visited { text-decoration: none; } -a.indexlink:hover { text-decoration: underline; } - -a.figurelist:link { text-decoration: none; } -a.figurelist:active { text-decoration: none; } -a.figurelist:visited { text-decoration: none; } -a.figurelist:hover { text-decoration: underline; } - -a.tablelist:link { text-decoration: none; } -a.tablelist:active { text-decoration: none; } -a.tablelist:visited { text-decoration: none; } -a.tablelist:hover { text-decoration: underline; } - -a.boldgreylink:link { text-decoration: none; color: #333333; font-family: Verdana, Arial, sans-serif; font-weight: bold; font-size: 0.9em; } -a.boldgreylink:visited { text-decoration: none; color: #333333; font-family: Verdana, Arial, sans-serif; font-weight: bold; font-size: 0.9em; } -a.boldgreylink:hover { text-decoration: underline; color: #333333; font-family: Verdana, Arial, sans-serif; font-weight: bold; font-size: 0.9em; } - - -.rharrow { color:#ccc; font-family:verdana,arial,sans-serif; font-size: 0.75em; } -.runningheader { color:#000; font-family:verdana,arial,sans-serif; font-size: 0.75em;} -a.rhlink:link, -a.rhlink:visited{ text-decoration:none; color:#999; font-family:verdana,arial,sans-serif; font-size: 0.75em;} -a.rhlink:hover{ text-decoration:underline; color:#999; font-family:verdana,arial,sans-serif; font-size: 0.75em;} - -.runningfooter { font-family: Verdana, Arial, sans-serif; font-size: 0.7em; } -/*updated Jan 11,2007 - link color removed*/ -.runningfooter a:link, -.runningfooter a:active, -.runningfooter a:visited { font-weight: bold; text-decoration: none; } -.runningfooter a:hover { font-weight: bold; text-decoration: underline; } - -#breadcrumb, .breadcrumb, span.breadcrumbs { font-size: 0.75em; } - - -.fastpath { margin-top: 1em; margin-bottom: 1em; } -.fastpathtitle { font-weight: bold; } -.toc { font-size: small; } - -.nested0 { margin-top: 0em; } -.p { margin-top: 1em; } - -span.figcap { font-style: italic; } -span.figdesc { font-style: italic; } -div.figbox {} -div.figrules {} -div.fignone {} - -.fignone {} -.figborder {} -.figsides {} -.figtop {} -.figbottom {} -.figtopbot {} - -.parentlink {} -.prevlink {} -.nextlink {} -.relconceptshd {} -.reltaskshd {} -.relrefhd {} - -.synnone {} -.synborder {} -.synsides {} -.syntop {} -.synbottom {} -.syntopbot {} - -.skip { margin-top: 1em; } -.skipspace { margin-top: 1em; margin-bottom: 1em; } -.ulchildlink { margin-top: 1em; margin-bottom: 1em; } -.olchildlink { margin-top: 1em; margin-bottom: 1em; } - -ul,ol { - margin-top: 0.1em; - padding-top: 0.1em; -} -ul.simple { list-style-type: none; } - -ul.indexlist { list-style-type: none; } - -OL LI { - margin-top: 0.0em; - margin-bottom: 0.0em; - margin-left: 0.0em; -} -UL LI { - margin-top: 0.0em; - margin-bottom: 0.0em; - margin-left: 0.0em; -} -OL LI DIV P { - list-style-type: decimal; - margin-top: 0.2em; - margin-bottom: 0.2em; -} -UL LI DIV P { - list-style-type: disc; - margin-top: 0.2em; - margin-bottom: 0.2em; -} - -*[compact="yes"]>li { - margin-top: 0 em; -} -*[compact="no"]>li { - margin-top: 0.5em; -} - -hr /* For Internet Explorer */ -{ -height: 1px; -color: #ccc; -background-color: #ccc; -text-align: left; -width: 95%; -height: 1px; -color: #ccc; -border: none; } - -html>body hr /* For Gecko-based browsers */ -{ -margin-left: 0; -width: 95%; -height: 1px; -background-color: #ccc; -border: none; -margin-top:5px;} - - - -H1, .title, .pagetitle, .topictitle1 { - font-size: 1.5em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.5em; - word-spacing: 0.1em; -} -H2, .subtitle, .pagesubtitle, .topictitle2 { - font-size: 1.25em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.0em; - padding-bottom: 0.0em; -} -H3, .boldtitle, .topictitle3 { - font-size: 1.0em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.2em; - padding-bottom: 0.1em; -} -H4, .topictitle4 { - font-size: 0.9em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.1em; - padding-bottom: 0.1em; -} -h5, .topictitle5 { - font-size: 0.8em; - font-style: normal; - font-weight: bold; - margin-bottom: 0em; - padding-bottom: 0em; -} -h6, .topictitle6 { - font-size: 0.7em; - font-style: normal; - font-weight: bold; - margin-bottom: 0em; - padding-bottom: 0em; -} -div.headtitle { font-size: 1em; font-weight: bold; margin-left: 0em; } -div.head0 { font-size: 0.9em; font-weight: bold; margin-left: 0em; margin-top: 0.5em; } -div.head1 { font-weight: bold; margin-left: 1em; padding-top: 0.5em; } -div.head2 { font-weight: normal; margin-left: 2em; } -div.head3 { font-weight: normal; margin-left: 3em; } -div.head4 { font-weight: normal; margin-left: 4em; } -div.head5 { font-weight: normal; margin-left: 5em; } -div.head6 { font-weight: normal; margin-left: 6em; } -div.head7 { font-weight: normal; margin-left: 7em; } -div.head8 { font-weight: normal; margin-left: 8em; } -div.head9 { font-weight: normal; margin-left: 9em; } - -div.head1, -div.head2, -div.head3, -div.head4, -div.head5, -div.head6, -div.head7, -div.head8, -div.head9 {font-size: 1em;} - - -.tip { margin-top: 1em; margin-bottom: 1em; } -.tiptitle { font-weight: bold; } -.firstcol { font-weight: bold; } -.ptocH1 { font-size: x-small; } -.ptocH2 { font-size: x-small; } -.stitle { font-style: italic; text-decoration: underline; } -.nte {} -.xxlines { white-space: pre; font-size: 0.95em; } -.sectiontitle { - margin-top: 1em; - margin-bottom: 0em; - color: black; - font-size: 1.2em; - font-weight: bold; -} - -div.imageleft { text-align: left; } -div.imagecenter { text-align: center; } -div.imageright { text-align: right; } -div.imagejustify { text-align: justify; } - -div.mmobj { margin-top: 1em; margin-bottom: 1em; text-align: center; } -div.mmobjleft { margin-top: 1em; margin-bottom: 1em; text-align: left; } -div.mmobjcenter { margin-top: 1em; margin-bottom: 1em; text-align: center; } -div.mmobjright { margin-top: 1em; margin-bottom: 1em; text-align: right; } - -pre.screen { - padding: 1em 1em 1em 1em; - margin-top: 0.4em; - margin-bottom: 0.4em; - border: thin solid Black; - font-size: 100%; -} - -.prereq {margin-left:0;} - -.defListHead { font-weight: bold; text-decoration: underline; } - -span.mv { font-style: italic; } -span.md { text-decoration: line-through; } - -.pk, span.pk { font-weight: bold; } - -span.pkdef { font-weight: bold; text-decoration: underline; } -span.pv { font-style: italic; } -span.pvdef { font-style: italic; text-decoration: underline; } -span.kwd { font-weight: bold; } -span.kdwdef { font-weight: bold; text-decoration: underline; } - -.parmListKwd { font-weight: bold; } -.parmListVar { font-style: italic; } - -span.oper { font-style: normal; } -span.operdef { text-decoration: underline; } - -VAR, span.var { font-style: italic; } -span.vardef { font-style: italic; text-decoration: underline; } - -div.msg { padding: 0.2em 1em 1em 1em; margin-top: 0.4em; margin-bottom: 0.4em; } -div.msgnum { float: left; font-weight: bold; margin-bottom: 1em; margin-right: 1em; } -div.msgtext { font-weight: bold; margin-bottom: 1em; } -div.msgitemtitle { font-weight: bold; } -p.msgitem { margin-top: 0em; } - -.attention, div.attention { margin-top: 1em; margin-bottom: 1em; } -.attentiontitle, span.attentiontitle { font-weight: bold; } -.cautiontitle, div.cautiontitle { margin-top: 1em; font-weight: bold; } -.caution, div.caution { margin-top: 1em; margin-bottom: 1em; } -.danger, div.danger { padding: 0.5em 0.5em 0.5em 0.5em; border: solid; border-width: thin; font-weight: bold; margin-top: 0.2em; margin-bottom: 1em; } -.dangertitle, div.dangertitle { margin-top: 1em; font-weight: bold; } - -.important { margin-top: 1em; margin-bottom: 1em; } -.importanttitle { font-weight: bold; } -.remember { margin-top: 1em; margin-bottom: 1em; } -.remembertitle { font-weight: bold; } -.restriction { margin-top: 1em; margin-bottom: 1em; } -.restrictiontitle { font-weight: bold; } - -div.warningtitle { font-weight: bold; } -div.warningbody { margin-left: 2em } - -.note { margin-top: 1em; margin-bottom: 1em; } - -.notetitle, div.notetitle { font-weight: bold; } - -div.notebody { margin-left: 2em; } -div.notelisttitle { font-weight: bold; } - -div.fnnum { float: left; } -div.fntext { margin-left: 2em; } - -div.stepl { margin-left: 2em; } -div.steplnum { font-weight: bold; float: left; margin-left: 0.5em; } -div.stepltext { margin-left: 5em; } -div.steplnum { font-style: italic; font-weight: bold; float: left; margin-left: 0.5em; } -div.stepltext { margin-bottom: 0.5em; margin-left: 3em; } - -div.ledi { margin-left: 3em; } -div.ledesc { margin-left: 3em; } - -span.pblktitle { font-weight: bold; } -div.pblklblbox { padding: 0.5em 0.5em 0.5em 0.5em; border: solid; border-width: thin; margin-top: 0.2em; } -span.ednoticestitle { font-weight: bold; } - -span.term { font-weight: bold; } -span.idxshow { color: green; } - -div.code { font-weight: bold; margin-bottom: 1em; } - -span.refkey { font-weight: bold; color: white; background-color: black; } -tt.apl { font-style: italic; } - -div.qualifstart { - padding: 0.1em 0.5em 0.5em 0.5em; - border-top: solid; - border-left: solid; - border-right: solid; - border-width: thin; - font-weight: bold; - margin-top: 0.2em; - margin-bottom: 0.2em; - text-align: center; -} -div.qualifend { - padding: 0.5em 0.5em 0.1em 0.5em; - border-bottom: solid; - border-left: solid; - border-right: solid; - border-width: thin; - font-weight: bold; - margin-bottom: 0.2em; - text-align: center; -} - -.noshade { background-color: transparent; } -.xlight { background-color: #DADADA; } -.light { background-color: #B0B0B0; } -.medium { background-color: #8C8C8C; } -.dark { background-color: #6E6E6E; } -.xdark { background-color: #585858; } -.light-yellow { background-color: #FFFFCC; } -.khaki { background-color: #CCCC99; } -.medium-blue { background-color: #6699CC; } -.light-blue { background-color: #CCCCFF; } -.mid-grey { background-color: #CCCCCC; } -.light-grey { background-color: #DADADA; } -.lightest-grey { background-color: #E6E6E6; } - -#changed { - position: absolute; - left: 0.2em; - color: #7B68EE; - background-color: #FFFFFF; - font-style: normal; - font-weight: bold; - -} - -INPUT.buttons { font-size: 0.75em; border-top: 0.2em outset #B1B1B1; border-right: 0.2em outset #000000; border-bottom: 0.2em outset #000000; border-left: 0.2em outset #B1B1B1; background-color:#E2E2E2; margin-bottom: 0.2em; } - -.cgraphic { font-size: 90%; color: black; } - -.accentgraphic { - float: left; -} - -dl.linklist { -margin-left:110px; -clear: both; -} - -* html dl.linklist { -margin-left:116px; -clear: both; -} - - - - -.aix, .hpux, .sun, .unix, .win2, .winnt, .win, .zos, .linux, .os390, .os400, .c, .cplusplus, .cobol, .fortran, .java, .macosx, .os2, .pl1, .rpg { - background-repeat: no-repeat; - background-position: top left; - margin-top: 0.5em; - text-indent: 55px; -} -.aix { background-image: url(ngaix.gif); } -.hpux { background-image: url(nghpux.gif); } -.sun { background-image: url(ngsolaris.gif); } -.unix { background-image: url(ngunix.gif); } -.win2 { background-image: url(ng2000.gif); } -.winxp { background-image: url(ngxp.gif); } -.winnt { background-image: url(ngnt.gif); } -.win { background-image: url(ngwin.gif); } -.zos { background-image: url(ngzos.gif); } -.linux { background-image: url(nglinux.gif); } -.os390 { background-image: url(ng390.gif); } -.os400 { background-image: url(ng400.gif); } -.c { background-image: url(ngc.gif); } -.cplusplus { background-image: url(ngcpp.gif); } -.cobol { background-image: url(ngcobol.gif); } -.fortran { background-image: url(ngfortran.gif); } -.java { background-image: url(ngjava.gif); } -.macosx { background-image: url(ngmacosx.gif); } -.os2 { background-image: url(ngos2.gif); } -.pl1 { background-image: url(ngpl1.gif); } -.rpg { background-image: url(ngrpg.gif); } - - - - diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html deleted file mode 100644 index 2cda359..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Namespace.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - -Namespaces: com.ibm.streamsx.jdbc 1.4.3 - - - - -

    Namespaces: com.ibm.streamsx.jdbc 1.4.3

    - -
    - - -

    Namespaces

    - -
    - -
    com.ibm.streamsx.jdbc
    - -
    - - - -
    com.ibm.streamsx.jdbc.types
    - -
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html deleted file mode 100644 index 682d2f7..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Operator.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - -Operators: com.ibm.streamsx.jdbc 1.4.3 - - - - -

    Operators: com.ibm.streamsx.jdbc 1.4.3

    - -
    - - -

    Operators

    - -
    - -
    JDBCRun
    - -
    The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html deleted file mode 100644 index c205f59..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ix$Type.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - -Types: com.ibm.streamsx.jdbc 1.4.3 - - - - -

    Types: com.ibm.streamsx.jdbc 1.4.3

    - -
    - - -

    Types

    - -
    - -
    JdbcSqlStatus_T
    - -
    SQL Status sqlCode: The error number associated with the SQLException, 0: successful
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html deleted file mode 100644 index 2a3c8f7..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - -Namespace com.ibm.streamsx.jdbc - - - - -

    Namespace com.ibm.streamsx.jdbc

    - -
    - - -

    Operators

    - -
      -
    • JDBCRun: The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple. -
    • - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html deleted file mode 100644 index 588c8f3..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/ns$com.ibm.streamsx.jdbc.types.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - -Namespace com.ibm.streamsx.jdbc.types - - - - -

    Namespace com.ibm.streamsx.jdbc.types

    - -
    - - -

    Types

    - -
      -
    • JdbcSqlStatus_T: SQL Status sqlCode: The error number associated with the SQLException, 0: successful -
    • - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html deleted file mode 100644 index 83757f7..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.html +++ /dev/null @@ -1,1206 +0,0 @@ - - - - - - - - - - - - - -Operator JDBCRun - - - - -

    Operator JDBCRun

    - -
    - - -
    - -
    - -
    - -

    The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple. -

    - -

    The statement is run once for each input tuple received. -

    - -

    Result sets that are produced by the statement are emitted as output stream tuples. -

    - -

    The JDBCRun operator is commonly used to update, merge, and delete database management system (DBMS) records. This operator is also used to retrieve records, create and drop tables, and to call stored procedures. -

    - -

    Behavior in a consistent region: -

    - -

    The JDBCRun operator can be used in a consistent region. It cannot be the start operator of a consistent region. In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets. On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port. On checkpoint: A database commit is performed. On reset: Any pending statements are discarded. A rollback is performed. -

    - -

    The new version of toolkit 1.3.x. supports also optional type. -

    - -

    The SPL applications based on new JDBC toolkit and created with a new Streams that supports optional type are able to write/read 'null' to/from a nullable column in a table. -

    - -
    - -

    Summary

    - -
    - -
    Ports
    - -
    This operator has 2 input ports and 2 output ports.
    - - - -
    Windowing
    - -
    This operator does not accept any windowing configurations.
    - - - -
    Parameters
    - -
    This operator supports 28 parameters. -

    Required: -jdbcClassName, jdbcDriverLib - -

    - -

    Optional: -appConfigName, batchSize, checkConnection, commitInterval, commitPolicy, credentials, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUrl, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePassword - -

    -
    - - - -
    Metrics
    - -
    This operator does not report any metrics.
    - - -
    -
    - -

    Properties

    - -
    - -
    Implementation
    - -
    Java
    - - -
    - -
    - -
    -

    Input Ports

    -
    - -
    Ports (0)
    - -
    - -

    The JDBCRun operator has one required input port. When a tuple is received on the required input port, the operator runs an SQL statement. -

    -
    - - - -
    Properties
    - -
    - - - - -
    - - - -
    Ports (1)
    - -
    - -

    The JDBCRun operator has one optional input port. This port allows operator to change jdbc connection information at run time. -

    -
    - - - -
    Properties
    - -
    - - - - -
    - - -
    - -
    - -
    -

    Output Ports

    -
    - -
    Assignments
    - -
    Java operators do not support output assignments. -
    - - -
    - -
    - -
    Ports (0)
    - -
    - -

    The JDBCRun operator has one required output port. The output port submits a tuple for each row in the result set of the SQL statement if the statement produces a result set. The output tuple values are assigned in the following order: 1. Columns that are returned in the result set that have same name from the output tuple 2. Auto-assigned attributes of the same name from the input tuple -

    - -

    - -

    - -
    Properties
    - -
    - - - - -
    - - -
    - -

    - -

    - - - -
    Ports (1)
    - -
    - -

    The JDBCRun operator has one optional output port. This port submits tuples when an error occurs while the operator is running the SQL statement. The tuples deliver sqlCode, sqlStatus and sqlMessage. -

    - -

    - -

    - -
    Properties
    - -
    - - - - -
    - - -
    - -

    - -

    - - -
    - -
    - -
    -

    Parameters

    -This operator supports 28 parameters. -

    Required: -jdbcClassName, jdbcDriverLib - -

    - -

    Optional: -appConfigName, batchSize, checkConnection, commitInterval, commitPolicy, credentials, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUrl, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePassword - -

    -
    - -
    appConfigName
    - -
    -

    Specifies the name of the application configuration that contains JDBC connection related configuration parameters. The keys in the application configuration have the same name as the operator parameters. The 'credentials' is supported as application configuration If a value is specified in the application configuration and as operator parameter, the application configuration parameter value takes precedence. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    batchSize
    - -
    -

    This optional parameter specifies the number of statement to execute as a batch. The default batch size is 1. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    checkConnection
    - -
    -

    This optional parameter specifies whether a checkConnection thread should be start. The thread checks periodically the status of JDBC connection. The JDBCRun sends in case of any connection failure a SqlCode and a message to SPL application.The default value is false. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    commitInterval
    - -
    -

    This parameter sets a commit interval for the sql statements that are being processed and overrides the batchSize and transactionSize parameters. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    commitPolicy
    - -
    -

    This parameter specifies the commit policy that should be used when the operator is in a consistent region. If set to OnCheckpoint, then commits will only occur during checkpointing. If set to OnTransactionAndCheckpoint, commits will occur during checkpointing as well as whenever the transactionCount or commitInterval are reached. The default value is OnCheckpoint. It is recommended that the OnTransactionAndCheckpoint value be set if the tables that the statements are being executed against can tolerate duplicate entries as these parameter value may cause the same statements to be executed if the operator is reset. It is also highly recommended that the transactionCount parameter not be set to a value greater than 1 when the policy is onTransactionAndCheckpoint, as this can lead to some statements not being executed in the event of a reset. This parameter is ignored if the operator is not in a consistent region. The default value for this parameter is OnCheckpoint. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    credentials
    - -
    -

    This optional parameter specifies the path name of the JSON file that contains the jdbc credentials: username, password and jdbcUrl -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    hasResultSetAttr
    - -
    -

    This parameter points to an output attribute and returns true if the statement produces result sets, otherwise, returns false -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    isolationLevel
    - -
    -

    This optional parameter specifies the transaction isolation level at which statement runs. If omitted, the statement runs at level READ_UNCOMMITTED. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    jdbcClassName
    - -
    -

    This required parameter specifies the class name for jdbc driver and it must have exactly one value of type rstring. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    jdbcDriverLib
    - -
    -

    This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string. It is recommended to set the value of this parameter without slash at begin, like 'opt/db2jcc4.jar'. In this case the SAB file will contain the driver libraries. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    jdbcPassword
    - -
    -

    This optional parameter specifies the user’s password. If the jdbcPassword parameter is specified, it must have exactly one value of type rstring. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    jdbcProperties
    - -
    -

    This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user' and 'password' -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    jdbcUrl
    - -
    -

    This parameter specifies the database url that JDBC driver uses to connect to a database and it must have exactly one value of type rstring. The syntax of jdbc url is specified by database vendors. For example, jdbc:db2://<server>:<port>/<database> -

    - -

    . jdbc:db2 indicates that the connection is to a DB2 for z/OS, DB2 for Linux, UNIX, and Windows. -

    - -

    . server, the domain name or IP address of the data source. -

    - -

    . port, the TCP/IP server port number that is assigned to the data source. -

    - -

    . database, a name for the data source -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    jdbcUser
    - -
    -

    This optional parameter specifies the database user on whose behalf the connection is being made. If the jdbcUser parameter is specified, it must have exactly one value of type rstring. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    keyStore
    - -
    -

    This optional parameter specifies the path to the keyStore. If a relative path is specified, the path is relative to the application directory. The sslConnection parameter must be set to true for this parameter to have any effect. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    keyStorePassword
    - -
    -

    This parameter specifies the password for the keyStore given by the keyStore parameter. The sslConnection parameter must be set to true for this parameter to have any effect. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    reconnectionBound
    - -
    -

    This optional parameter specifies the number of successive connection attempts that occur when a connection fails or a disconnect occurs. It is used only when the reconnectionPolicy parameter is set to BoundedRetry; otherwise, it is ignored. The default value is 5. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    reconnectionInterval
    - -
    -

    This optional parameter specifies the amount of time (in seconds) that the operator waits between successive connection attempts. It is used only when the reconnectionPolicy parameter is set to BoundedRetry or InfiniteRetry; othewise, it is ignored. The default value is 10. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    reconnectionPolicy
    - -
    -

    This optional parameter specifies the policy that is used by the operator to handle database connection failures. The valid values are: NoRetry, InfiniteRetry, and BoundedRetry. The default value is BoundedRetry. If NoRetry is specified and a database connection failure occurs, the operator does not try to connect to the database again. The operator shuts down at startup time if the initial connection attempt fails. If BoundedRetry is specified and a database connection failure occurs, the operator tries to connect to the database again up to a maximum number of times. The maximum number of connection attempts is specified in the reconnectionBound parameter. The sequence of connection attempts occurs at startup time. If a connection does not exist, the sequence of connection attempts also occurs before each operator is run. If InfiniteRetry is specified, the operator continues to try and connect indefinitely until a connection is made. This behavior blocks all other operator operations while a connection is not successful. For example, if an incorrect connection password is specified in the connection configuration document, the operator remains in an infinite startup loop until a shutdown is requested. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    sqlFailureAction
    - -
    -

    This optional parameter has values of log, rollback and terminate. If not specified, log is assumed. If sqlFailureAction is log, the error is logged, and the error condition is cleared. If sqlFailureAction is rollback, the error is logged, the transaction rolls back. If sqlFailureAction is terminate, the error is logged, the transaction rolls back and the operator terminates. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    sqlStatusAttr
    - -
    -

    This parameter points to one or more output attributes and returns the SQL status information, including SQL code (the error number associated with the SQLException) and SQL state (the five-digit XOPEN SQLState code for a database error) -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    sslConnection
    - -
    -

    This optional parameter specifies whether an SSL connection should be made to the database. When set to true, the keyStore, keyStorePassword, trustStore and trustStorePassword parameters can be used to specify the locations and passwords of the keyStore and trustStore. The default value is false. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    statement
    - -
    -

    This parameter specifies the value of any valid SQL or stored procedure statement. The statement can contain parameter markers -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    statementAttr
    - -
    -

    This parameter specifies the value of complete SQL or stored procedure statement that is from stream attribute (no parameter markers). -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    statementParamAttrs
    - -
    -

    This optional parameter specifies the value of statement parameters. The statementParameter value and SQL statement parameter markers are associated in lexicographic order. For example, the first parameter marker in the SQL statement is associated with the first statementParameter value. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    transactionSize
    - -
    -

    This optional parameter specifies the number of executions to commit per transaction. The default transaction size is 1 and transactions are automatically committed. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    trustStore
    - -
    -

    This optional parameter specifies the path to the trustStore. If a relative path is specified, the path is relative to the application directory. The sslConnection parameter must be set to true for this parameter to have any effect. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - - -
    trustStorePassword
    - -
    -

    This parameter specifies the password for the trustStore given by the trustStore parameter. The sslConnection parameter must be set to true for this parameter to have any effect. -

    -
    - -
    Properties
    - -
    - - -
    - - -
    - -
    - - -
    - -
    - -
    -

    Libraries

    - -
    - -
    Operator class library -
    - -
    - -
    Library Path: ../../impl/lib/com.ibm.streamsx.jdbc.jar
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html deleted file mode 100644 index c6e3e4c..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/spl$com.ibm.streamsx.jdbc.types$JDBCRunTypes.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - -SPL File JDBCRunTypes.spl - - - - -

    SPL File JDBCRunTypes.spl

    - -
    - - -

    Content

    - -
    -
    -
    - - -
    Types
    - -
    -
      -
    • JdbcSqlStatus_T: SQL Status sqlCode: The error number associated with the SQLException, 0: successful -
    • - -
    - -
    - - -
    - -
    - -

    Types

    - -
    - -

    JdbcSqlStatus_T

    - -
    -
    - -

    SQL Status sqlCode: The error number associated with the SQLException, 0: successful -

    - -

    sqlState: The five-digit XOPEN SQLState code for a database error, 00000: Successful -

    - -

    sqlMessage: The SQL Message in case of any error -

    - -
    - -
    -

    -JdbcSqlStatus_T = int32 sqlCode, rstring sqlState, rstring sqlMessage; -

    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html deleted file mode 100644 index 85e90ee..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/tk$com.ibm.streamsx.jdbc/tk$com.ibm.streamsx.jdbc.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - - - - - - -Toolkit com.ibm.streamsx.jdbc 1.4.3 - - - - -

    Toolkit com.ibm.streamsx.jdbc 1.4.3

    - -
    -
    -

    -IBMStreams com.ibm.streamsx.jdbc Toolkit > com.ibm.streamsx.jdbc 1.4.3

    - -
    - -

    General Information

    - - -

    The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple. -

    - -

    The statement is run once for each input tuple received. Result sets that are produced by the statement are emitted as output stream tuples. -

    - -

    The JDBCRun operator is commonly used to update, merge, and delete database management system (DBMS) records. -

    - -

    This operator is also used to retrieve records, create and drop tables, and to call stored procedures. -

    - -

    Behavior in a consistent region: -

    - -

    The JDBCRun operator can be used in a consistent region. -

    - -

    It cannot be the start operator of a consistent region. In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets. -

    - -

    On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port. -

    - -

    On checkpoint: A database commit is performed. -

    - -

    On reset: Any pending statements are discarded. A rollback is performed. -

    - -

    The JDBCRun operator support optional type feature. -

    - -

    It supports also phoenix jdbc to connect to the HBASE database. -

    - -

    The JDBCRun operator has been improved in version 1.4.0 with a new parameter checkConnection. This optional parameter specifies whether a checkConnection thread should be start. It checks periodically the status of JDBC connection. The JDBCRun sends in case of any failure a SqlCode and a message to SPL application. -

    - -
    What is new in version 1.4.3 -
    -
    -
    -
    - -
    - -
    Version
    - -
    1.4.3
    - - - -
    Required Product Version
    - -
    4.2.0.0
    - - - -
    Author
    - -
    IBMStreams Open Source Community at GitHub - https://github.com/IBMStreams/streamsx.jdbc
    - - -
    - -
    - -

    Indexes

    - -
    -
    -
    - -
    Namespaces
    -
    - -
    Operators
    -
    - -
    Types
    -
    - -
    - -
    - -

    Namespaces

    - -
    - -
    com.ibm.streamsx.jdbc
    - -
    - -
    -
    Operators
    - -
    - - -
    - -
    -
    - - -
    com.ibm.streamsx.jdbc.types
    - -
    - -
    -
    Types
    - -
    - - -
    - -
    -
    - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html deleted file mode 100644 index 979caac..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toc.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - -IBMStreams com.ibm.streamsx.jdbc Toolkit - - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Namespace.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Namespace.html deleted file mode 100644 index 88024eb..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Namespace.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - -Namespaces: IBMStreams com.ibm.streamsx.jdbc Toolkit - - - - -

    Namespaces: IBMStreams com.ibm.streamsx.jdbc Toolkit

    - -
    - - -

    Namespaces

    - -
    - -
    com.ibm.streamsx.jdbc
    - -
    - - - -
    com.ibm.streamsx.jdbc.types
    - -
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html deleted file mode 100644 index 1e8ba36..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Operator.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - -Operators: IBMStreams com.ibm.streamsx.jdbc Toolkit - - - - -

    Operators: IBMStreams com.ibm.streamsx.jdbc Toolkit

    - -
    - - -

    Operators

    - -
    - -
    JDBCRun
    - -
    The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Type.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Type.html deleted file mode 100644 index 6dedb71..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/ix$Type.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - -Types: IBMStreams com.ibm.streamsx.jdbc Toolkit - - - - -

    Types: IBMStreams com.ibm.streamsx.jdbc Toolkit

    - -
    - - -

    Types

    - -
    - -
    JdbcSqlStatus_T
    - -
    SQL Status sqlCode: The error number associated with the SQLException, 0: successful
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html b/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html deleted file mode 100644 index 1d716e4..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/html/toolkits/toolkits.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - -IBMStreams com.ibm.streamsx.jdbc Toolkit - - - - -

    IBMStreams com.ibm.streamsx.jdbc Toolkit

    - -
    -

    Indexes

    - -
    -
    -
    - -
    Namespaces
    -
    - -
    Operators
    -
    - -
    Types
    -
    - -
    - -
    - -

    Toolkits

    - -
    - -
    com.ibm.streamsx.jdbc 1.4.3
    - -
    The JDBCRun operator runs a user-defined SQL statement that is based on an input tuple.
    - - -
    - -
    - -

    References

    - -
    -
    Operator Model
    -
    - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg b/com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg deleted file mode 100644 index 8720a32..0000000 --- a/com.ibm.streamsx.jdbc/doc/spldoc/image/tk$com.ibm.streamsx.jdbc/op$com.ibm.streamsx.jdbc$JDBCRun.svg +++ /dev/null @@ -1,128 +0,0 @@ - - -Operator never provides a single threaded execution context.Required: jdbcClassName, jdbcDriverLib / Optional: appConfigName, batchSize, checkConnection, commitInterval, commitPolicy, credentials, hasResultSetAttr, isolationLevel, jdbcPassword, jdbcProperties, jdbcUrl, jdbcUser, keyStore, keyStorePassword, reconnectionBound, reconnectionInterval, reconnectionPolicy, sqlFailureAction, sqlStatusAttr, sslConnection, statement, statementAttr, statementParamAttrs, transactionSize, trustStore, trustStorePasswordimmutableimmutableimmutableThis port is generating punctuationsimmutable diff --git a/samples/JDBCSample/doc/spldoc/html/commonltr.css b/samples/JDBCSample/doc/spldoc/html/commonltr.css deleted file mode 100644 index 70a1572..0000000 --- a/samples/JDBCSample/doc/spldoc/html/commonltr.css +++ /dev/null @@ -1,135 +0,0 @@ -/* - | This file is part of the DITA Open Toolkit project hosted on - | Sourceforge.net. See the accompanying license.txt file for - | applicable licenses. -*/ - -/* - | (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved. - */ - -.unresolved { background-color: skyblue; } -.noTemplate { background-color: yellow; } - -.base { background-color: #ffffff; } - -/* Add space for top level topics */ -.nested0 { margin-top : 1em;} - -/* div with class=p is used for paragraphs that contain blocks, to keep the XHTML valid */ -.p {margin-top: 1em} - -/* Default of italics to set apart figure captions */ -.figcap { font-style: italic } -.figdesc { font-style: normal } - -/* Use @frame to create frames on figures */ -.figborder { border-style: solid; padding-left : 3px; border-width : 2px; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figsides { border-left : 2px solid; padding-left : 3px; border-right : 2px solid; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figtop { border-top : 2px solid; margin-top: 1em; border-color : Silver;} -.figbottom { border-bottom : 2px solid; border-color : Silver;} -.figtopbot { border-top : 2px solid; border-bottom : 2px solid; margin-top: 1em; border-color : Silver;} - -/* Most link groups are created with
    . Ensure they have space before and after. */ -.ullinks { list-style-type: none } -.ulchildlink { margin-top: 1em; margin-bottom: 1em } -.olchildlink { margin-top: 1em; margin-bottom: 1em } -.linklist { margin-bottom: 1em } -.linklistwithchild { margin-left: 1.5em; margin-bottom: 1em } -.sublinklist { margin-left: 1.5em; margin-bottom: 1em } -.relconcepts { margin-top: 1em; margin-bottom: 1em } -.reltasks { margin-top: 1em; margin-bottom: 1em } -.relref { margin-top: 1em; margin-bottom: 1em } -.relinfo { margin-top: 1em; margin-bottom: 1em } -.breadcrumb { font-size : smaller; margin-bottom: 1em } -dt.prereq { margin-left : 20px;} - -/* Set heading sizes, getting smaller for deeper nesting */ -.topictitle1 { margin-top: 0pc; margin-bottom: .1em; font-size: 1.34em; } -.topictitle2 { margin-top: 1pc; margin-bottom: .45em; font-size: 1.17em; } -.topictitle3 { margin-top: 1pc; margin-bottom: .17em; font-size: 1.17em; font-weight: bold; } -.topictitle4 { margin-top: .83em; font-size: 1.17em; font-weight: bold; } -.topictitle5 { font-size: 1.17em; font-weight: bold; } -.topictitle6 { font-size: 1.17em; font-style: italic; } -.sectiontitle { margin-top: 1em; margin-bottom: 0em; color: black; font-size: 1.17em; font-weight: bold;} -.section { margin-top: 1em; margin-bottom: 1em } -.example { margin-top: 1em; margin-bottom: 1em } -div.tasklabel { margin-top: 1em; margin-bottom: 1em; } -h2.tasklabel, h3.tasklabel, h4.tasklabel, h5.tasklabel, h6.tasklabel { font-size: 100%; } - -/* All note formats have the same default presentation */ -.note { margin-top: 1em; margin-bottom : 1em;} -.notetitle { font-weight: bold } -.notelisttitle { font-weight: bold } -.tip { margin-top: 1em; margin-bottom : 1em;} -.tiptitle { font-weight: bold } -.fastpath { margin-top: 1em; margin-bottom : 1em;} -.fastpathtitle { font-weight: bold } -.important { margin-top: 1em; margin-bottom : 1em;} -.importanttitle { font-weight: bold } -.remember { margin-top: 1em; margin-bottom : 1em;} -.remembertitle { font-weight: bold } -.restriction { margin-top: 1em; margin-bottom : 1em;} -.restrictiontitle { font-weight: bold } -.attention { margin-top: 1em; margin-bottom : 1em;} -.attentiontitle { font-weight: bold } -.dangertitle { font-weight: bold } -.danger { margin-top: 1em; margin-bottom : 1em;} -.cautiontitle { font-weight: bold } -.caution { font-weight: bold; margin-bottom : 1em; } -.warning { margin-top: 1em; margin-bottom : 1em;} -.warningtitle { font-weight: bold } - -/* Simple lists do not get a bullet */ -ul.simple { list-style-type: none } - -/* Used on the first column of a table, when rowheader="firstcol" is used */ -.firstcol { font-weight : bold;} - -/* Various basic phrase styles */ -.bold { font-weight: bold; } -.boldItalic { font-weight: bold; font-style: italic; } -.italic { font-style: italic; } -.underlined { text-decoration: underline; } -.uicontrol { font-weight: bold; } -.parmname { font-weight: bold; } -.kwd { font-weight: bold; } -.defkwd { font-weight: bold; text-decoration: underline; } -.var { font-style : italic;} -.shortcut { text-decoration: underline; } - -/* Default of bold for definition list terms */ -.dlterm { font-weight: bold; } - -/* Use CSS to expand lists with @compact="no" */ -.dltermexpand { font-weight: bold; margin-top: 1em; } -*[compact="yes"]>li { margin-top: 0em;} -*[compact="no"]>li { margin-top: .53em;} -.liexpand { margin-top: 1em; margin-bottom: 1em } -.sliexpand { margin-top: 1em; margin-bottom: 1em } -.dlexpand { margin-top: 1em; margin-bottom: 1em } -.ddexpand { margin-top: 1em; margin-bottom: 1em } -.stepexpand { margin-top: 1em; margin-bottom: 1em } -.substepexpand { margin-top: 1em; margin-bottom: 1em } - -/* Align images based on @align on topic/image */ -div.imageleft { text-align: left } -div.imagecenter { text-align: center } -div.imageright { text-align: right } -div.imagejustify { text-align: justify } - -/* The cell border can be turned on with - {border-right:solid} - This value creates a very thick border in Firefox (does not match other tables) - - Firefox works with - {border-right:solid 1pt} - but this causes a barely visible line in IE */ -.cellrowborder { border-left:none; border-top:none; border-right:solid 1px; border-bottom:solid 1px } -.row-nocellborder { border-left:none; border-right:none; border-top:none; border-right: hidden; border-bottom:solid 1px} -.cell-norowborder { border-top:none; border-bottom:none; border-left:none; border-bottom: hidden; border-right:solid 1px} -.nocellnorowborder { border:none; border-right: hidden;border-bottom: hidden } - -pre.screen { padding: 5px 5px 5px 5px; border: outset; background-color: #CCCCCC; margin-top: 2px; margin-bottom : 2px; white-space: pre} - -span.filepath { font-family:monospace } \ No newline at end of file diff --git a/samples/JDBCSample/doc/spldoc/html/commonrtl.css b/samples/JDBCSample/doc/spldoc/html/commonrtl.css deleted file mode 100644 index ded36ea..0000000 --- a/samples/JDBCSample/doc/spldoc/html/commonrtl.css +++ /dev/null @@ -1,128 +0,0 @@ -/* - | This file is part of the DITA Open Toolkit project hosted on - | Sourceforge.net. See the accompanying license.txt file for - | applicable licenses. -*/ - -/* - | (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved. - */ - -.unresolved { background-color: skyblue; } -.noTemplate { background-color: yellow; } - -.base { background-color: #ffffff; } - -/* Add space for top level topics */ -.nested0 { margin-top : 1em;} - -/* div with class=p is used for paragraphs that contain blocks, to keep the XHTML valid */ -.p {margin-top: 1em} - -/* Default of italics to set apart figure captions */ -.figcap { font-style: italic } -.figdesc { font-style: normal } - -/* Use @frame to create frames on figures */ -.figborder { border-style: solid; padding-left : 3px; border-width : 2px; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figsides { border-left : 2px solid; padding-left : 3px; border-right : 2px solid; padding-right : 3px; margin-top: 1em; border-color : Silver;} -.figtop { border-top : 2px solid; margin-top: 1em; border-color : Silver;} -.figbottom { border-bottom : 2px solid; border-color : Silver;} -.figtopbot { border-top : 2px solid; border-bottom : 2px solid; margin-top: 1em; border-color : Silver;} - -/* Most link groups are created with
    . Ensure they have space before and after. */ -.ullinks { list-style-type: none } -.ulchildlink { margin-top: 1em; margin-bottom: 1em } -.olchildlink { margin-top: 1em; margin-bottom: 1em } -.linklist { margin-top: 1em; margin-bottom: 1em } -.linklistwithchild { margin-top: 1em; margin-right: 1.5em; margin-bottom: 1em } -.sublinklist { margin-top: 1em; margin-right: 1.5em; margin-bottom: 1em } -.relconcepts { margin-top: 1em; margin-bottom: 1em } -.reltasks { margin-top: 1em; margin-bottom: 1em } -.relref { margin-top: 1em; margin-bottom: 1em } -.relinfo { margin-top: 1em; margin-bottom: 1em } -.breadcrumb { font-size : smaller; margin-bottom: 1em } -dt.prereq { margin-right : 20px;} - -/* Set heading sizes, getting smaller for deeper nesting */ -.topictitle1 { margin-top: 0pc; margin-bottom: .1em; font-size: 1.34em; } -.topictitle2 { margin-top: 1pc; margin-bottom: .45em; font-size: 1.17em; } -.topictitle3 { margin-top: 1pc; margin-bottom: .17em; font-size: 1.17em; font-weight: bold; } -.topictitle4 { margin-top: .83em; font-size: 1.17em; font-weight: bold; } -.topictitle5 { font-size: 1.17em; font-weight: bold; } -.topictitle6 { font-size: 1.17em; font-style: italic; } -.sectiontitle { margin-top: 1em; margin-bottom: 0em; color: black; font-size: 1.17em; font-weight: bold;} -.section { margin-top: 1em; margin-bottom: 1em } -.example { margin-top: 1em; margin-bottom: 1em } -div.tasklabel { margin-top: 1em; margin-bottom: 1em; } -h2.tasklabel, h3.tasklabel, h4.tasklabel, h5.tasklabel, h6.tasklabel { font-size: 100%; } - -/* All note formats have the same default presentation */ -.note { margin-top: 1em; margin-bottom : 1em;} -.notetitle { font-weight: bold } -.notelisttitle { font-weight: bold } -.tip { margin-top: 1em; margin-bottom : 1em;} -.tiptitle { font-weight: bold } -.fastpath { margin-top: 1em; margin-bottom : 1em;} -.fastpathtitle { font-weight: bold } -.important { margin-top: 1em; margin-bottom : 1em;} -.importanttitle { font-weight: bold } -.remember { margin-top: 1em; margin-bottom : 1em;} -.remembertitle { font-weight: bold } -.restriction { margin-top: 1em; margin-bottom : 1em;} -.restrictiontitle { font-weight: bold } -.attention { margin-top: 1em; margin-bottom : 1em;} -.attentiontitle { font-weight: bold } -.dangertitle { font-weight: bold } -.danger { margin-top: 1em; margin-bottom : 1em;} -.cautiontitle { font-weight: bold } -.caution { font-weight: bold; margin-bottom : 1em; } -.warning { margin-top: 1em; margin-bottom : 1em;} -.warningtitle { font-weight: bold } - -/* Simple lists do not get a bullet */ -ul.simple { list-style-type: none } - -/* Used on the first column of a table, when rowheader="firstcol" is used */ -.firstcol { font-weight : bold;} - -/* Various basic phrase styles */ -.bold { font-weight: bold; } -.boldItalic { font-weight: bold; font-style: italic; } -.italic { font-style: italic; } -.underlined { text-decoration: underline; } -.uicontrol { font-weight: bold; } -.parmname { font-weight: bold; } -.kwd { font-weight: bold; } -.defkwd { font-weight: bold; text-decoration: underline; } -.var { font-style : italic;} -.shortcut { text-decoration: underline; } - -/* Default of bold for definition list terms */ -.dlterm { font-weight: bold; } - -/* Use CSS to expand lists with @compact="no" */ -.dltermexpand { font-weight: bold; margin-top: 1em; } -*[compact="yes"]>li { margin-top: 0em;} -*[compact="no"]>li { margin-top: .53em;} -.liexpand { margin-top: 1em; margin-bottom: 1em } -.sliexpand { margin-top: 1em; margin-bottom: 1em } -.dlexpand { margin-top: 1em; margin-bottom: 1em } -.ddexpand { margin-top: 1em; margin-bottom: 1em } -.stepexpand { margin-top: 1em; margin-bottom: 1em } -.substepexpand { margin-top: 1em; margin-bottom: 1em } - -/* Align images based on @align on topic/image */ -div.imageleft { text-align: left } -div.imagecenter { text-align: center } -div.imageright { text-align: right } -div.imagejustify { text-align: justify } - -.cellrowborder { border-right:none; border-top:none; border-left:solid 1px; border-bottom:solid 1px } -.row-nocellborder { border-left:none; border-right:none; border-top:none; border-left: hidden; border-bottom:solid 1px} -.cell-norowborder { border-top:none; border-bottom:none; border-right:none; border-bottom: hidden; border-left:solid 1px} -.nocellnorowborder { border:none; border-left: hidden;border-bottom: hidden } - -pre.screen { padding: 5px 5px 5px 5px; border: outset; background-color: #CCCCCC; margin-top: 2px; margin-bottom : 2px; white-space: pre} - - diff --git a/samples/JDBCSample/doc/spldoc/html/dita.list b/samples/JDBCSample/doc/spldoc/html/dita.list deleted file mode 100644 index 71767cc..0000000 --- a/samples/JDBCSample/doc/spldoc/html/dita.list +++ /dev/null @@ -1,52 +0,0 @@ -#Wed Jan 23 03:05:35 PST 2019 -copytosourcelist= -hreftargetslist=tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml -fullditatopicfile=fullditatopic.list -fullditamapandtopicfile=fullditamapandtopic.list -fullditatopiclist=tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml -fullditamapandtopiclist=toolkits.ditamap,tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml -hrefditatopicfile=hrefditatopic.list -hrefditatopiclist=tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml -user.input.file=toolkits.ditamap -subtargetsfile=subtargets.list -fullditamapfile=fullditamap.list -copytotarget2sourcemapfile=copytotarget2sourcemap.list -subtargetslist= -fullditamaplist=toolkits.ditamap -copytotarget2sourcemaplist= -outditafilesfile=outditafiles.list -outditafileslist= -conreftargetsfile=conreftargets.list -conreffile=conref.list -conreftargetslist= -conreflist= -resourceonlyfile=resourceonly.list -imagefile=image.list -resourceonlylist= -imagelist= -htmlfile=html.list -htmllist= -canditopicsfile=canditopics.list -canditopicslist=tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml -keyreffile=keyref.list -subjectschemefile=subjectscheme.list -keyreflist= -subjectschemelist= -keyfile=key.list -codereffile=coderef.list -keylist= -codereflist= -user.input.file.listfile=usr.input.file.list -user.input.dir=/home/anouri/workspace/streamsx.jdbc/samples/JDBCSample/doc/spldoc/dita -uplevels= -tempdirToinputmapdir.relative.value= -conrefpushfile=conrefpush.list -flagimagefile=flagimage.list -skipchunkfile=skipchunk.list -conrefpushlist= -flagimagelist= -skipchunklist= -relflagimagefile=relflagimage.list -relflagimagelist= -copytosourcefile=copytosource.list -hreftargetsfile=hreftargets.list diff --git a/samples/JDBCSample/doc/spldoc/html/dita.xml.properties b/samples/JDBCSample/doc/spldoc/html/dita.xml.properties deleted file mode 100644 index 5386541..0000000 --- a/samples/JDBCSample/doc/spldoc/html/dita.xml.properties +++ /dev/null @@ -1,56 +0,0 @@ - - - - - tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml - fullditatopic.list - fullditamapandtopic.list - tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml - toolkits.ditamap,tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml - hrefditatopic.list - tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml - toolkits.ditamap - subtargets.list - fullditamap.list - copytotarget2sourcemap.list - - toolkits.ditamap - - outditafiles.list - - conreftargets.list - conref.list - - - resourceonly.list - image.list - - - html.list - - canditopics.list - tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.xml,tk$JDBCSample/ix$Namespace.xml,toolkits/ix$Namespace.xml,tk$JDBCSample/tk$JDBCSample.xml,toolkits/toolkits.xml - keyref.list - subjectscheme.list - - - key.list - coderef.list - - - usr.input.file.list - /home/anouri/workspace/streamsx.jdbc/samples/JDBCSample/doc/spldoc/dita - - - conrefpush.list - flagimage.list - skipchunk.list - - - - relflagimage.list - - copytosource.list - hreftargets.list - \ No newline at end of file diff --git a/samples/JDBCSample/doc/spldoc/html/index.html b/samples/JDBCSample/doc/spldoc/html/index.html deleted file mode 100644 index 1fde5ab..0000000 --- a/samples/JDBCSample/doc/spldoc/html/index.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/JDBCSample/doc/spldoc/html/spldoc.css b/samples/JDBCSample/doc/spldoc/html/spldoc.css deleted file mode 100644 index 79a80ba..0000000 --- a/samples/JDBCSample/doc/spldoc/html/spldoc.css +++ /dev/null @@ -1,585 +0,0 @@ -/* begin_generated_IBM_copyright_prolog */ -/* */ -/* This is an automatically generated copyright prolog. */ -/* After initializing, DO NOT MODIFY OR MOVE */ -/* **************************************************************** */ -/* Licensed Materials - Property of IBM */ -/* 5724-Y95 */ -/* (C) Copyright IBM Corp. 2013, 2013 All Rights Reserved. */ -/* US Government Users Restricted Rights - Use, duplication or */ -/* disclosure restricted by GSA ADP Schedule Contract with */ -/* IBM Corp. */ -/* */ -/* end_generated_IBM_copyright_prolog */ -/*last updated 02/02/07*/ -body { font-family: Arial, sans-serif; font-size: 0.8em; background-color: #ffffff; color: Black; margin-right: 5em; margin-bottom: 1em; } - -/* splpart is a class generated by spl-make-doc. Represents an SPL artifact. */ -.splpart -{border-top-style: ridge; - border-top-width: 2px; - border-top-color: #696969; -} -/* .splhead-1 is a class generated by spl-make-doc. Represents a sub header in doc. */ -.splhead-1 -{background-color: #87CEFA; -border-top-style: solid; -border-top-width: 3px; -border-top-color: #696969; -} -/* .splhead-2 is a class generated by spl-make-doc. Represents a sub header in doc. */ -.splhead-2 -{font-size: 1.10em} - -/* .spltoolkitname formats a toolkit name */ -.spltoolkitname -{font-size: 1.30em; -font-weight: bold; -} - -/* Create scrollbars if graph image overflows */ -.splgraph { -max-height: 400px; -overflow: auto; -overflow-style: scrollbar; -} - -/* Enable tooltips to overflow prim operator image */ -.splprimop { -overflow: visible; -} - -.ibmfilepath { font-family: monospace; font-size: 100%; } -.ibmcommand { font-weight: bold; } -.ibmemphasis { font-style: italic; } -.mv, .pk, .pkdef, .pv { font-family: monospace; font-size: 100%; padding-top: 0em; padding-right: .3em; padding-bottom: 0em; padding-left: .3em; } - -tt, samp, kbd, var, pre, -.filepath { font-family: "Courier New", Courier, monospace; font-size: 100%; } -span.cmdname { font-weight: bold; } -span.apiname { font-family: Courier, monospace; } /* DB2 #72488 */ -BODY.nav { - background-color: #FFFFFF; - border-right: 0.2em ridge black; - font-size: 0.95em; -} - -.base { font-weight: normal; font-style: normal; font-variant: normal; text-decoration: none; background-color: #ffffff; } - -TABLE { - color: black; - width: 90%; - border-collapse: collapse; - border-color: Black; - background: white; - margin-top: 0.5em; - margin-bottom: 0.5em; - margin-left: 0em; - margin-right: 0em; -} - -.tbldesc { font-style: italic; } - -TH { - font-weight: bold; - font-size: 1.0em; - color: black; - background-color: #dadada; - padding-top: 0.1em; - padding-bottom: 0.3em; - padding-left: 1em; - padding-right: 1em; -} - -TH.base { - font-weight: bold; - color: black; - border: 1 solid #606060; - background-color: #dcdada; - padding-top: 0.65em; - padding-bottom: 0.65em; - padding-left: 1em; - padding-right: 1em; -} - -TD { - font-size: 1.0em; - color: black; - background-color: white; - padding-top: 0.1em; - padding-bottom: 0.3em; - padding-left: 1em; - padding-right: 1em; -} - -/*font size in tables for IE6 - add. Jan'07*/ -* html table th, -* html table td { -font-size: 0.8em; -} - - -CITE { font-style: italic; } -EM { font-style: italic; } -STRONG { font-weight: bold; } - -caption { text-align: left; font-style: italic; } -/*font size of table caption for IE6 - add. Jan'07*/ -* html table caption { font-size: .8em } - -DT { margin-top: 0.5em; margin-bottom: 0.5em; font-weight: bold; } -DD { margin-left: 1.0em; } - -PRE, -pre.cgraphic { -background-color: #dadada; -padding: 5px; -/* DB2 #58001 */ -/* white-space: pre-wrap; /* css-3 */ -/* white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ -/* white-space: -pre-wrap; /* Opera 4-6 */ -/* white-space: -o-pre-wrap; /* Opera 7 */ -/* word-wrap: break-word; /* Internet Explorer 5.5+ */ -overflow:auto; -max-height:500px; -} - - - -.italic { font-style: italic; } -.bold { font-weight: bold; } -.underlined { text-decoration: underline; } -.bold-italic, .boldItalic { font-weight: bold; font-style: italic; } -.smallCaps, .smallcaps { text-transform: uppercase; font-size: smaller; font-variant: small-caps; } -.italic-underlined { font-style: italic; text-decoration: underline; } -.bold-underlined { font-weight: bold; text-decoration: underline; } -.bold-italic-underlined { font-weight: bold; font-style: italic; text-decoration: underline; } -.smallcaps-underlined { font-variant: small-caps; text-decoration: underline; } -.emphasis { font-style: italic; } -.inlinedef { font-style: italic; } - -.sidebar { background: #cccccc; } - -A:link { color: #006699; text-decoration: underline; } -A:visited { color: #996699; text-decoration: underline; } -A:active { color: #006699; text-decoration: underline; } -A:hover { color: #996699;text-decoration: underline; } - -a.toclink:link { text-decoration: none; } -a.toclink:active { text-decoration: none; } -a.toclink:visited { text-decoration: none; } -a.toclink:hover { text-decoration: underline; } - -a.ptoclink:link { text-decoration: none; } -a.ptoclink:active { text-decoration: none; } -a.ptoclink:visited { text-decoration: none; } -a.ptoclink:hover { text-decoration: underline; } - -a.indexlink:link { text-decoration: none; } -a.indexlink:active { text-decoration: none; } -a.indexlink:visited { text-decoration: none; } -a.indexlink:hover { text-decoration: underline; } - -a.figurelist:link { text-decoration: none; } -a.figurelist:active { text-decoration: none; } -a.figurelist:visited { text-decoration: none; } -a.figurelist:hover { text-decoration: underline; } - -a.tablelist:link { text-decoration: none; } -a.tablelist:active { text-decoration: none; } -a.tablelist:visited { text-decoration: none; } -a.tablelist:hover { text-decoration: underline; } - -a.boldgreylink:link { text-decoration: none; color: #333333; font-family: Verdana, Arial, sans-serif; font-weight: bold; font-size: 0.9em; } -a.boldgreylink:visited { text-decoration: none; color: #333333; font-family: Verdana, Arial, sans-serif; font-weight: bold; font-size: 0.9em; } -a.boldgreylink:hover { text-decoration: underline; color: #333333; font-family: Verdana, Arial, sans-serif; font-weight: bold; font-size: 0.9em; } - - -.rharrow { color:#ccc; font-family:verdana,arial,sans-serif; font-size: 0.75em; } -.runningheader { color:#000; font-family:verdana,arial,sans-serif; font-size: 0.75em;} -a.rhlink:link, -a.rhlink:visited{ text-decoration:none; color:#999; font-family:verdana,arial,sans-serif; font-size: 0.75em;} -a.rhlink:hover{ text-decoration:underline; color:#999; font-family:verdana,arial,sans-serif; font-size: 0.75em;} - -.runningfooter { font-family: Verdana, Arial, sans-serif; font-size: 0.7em; } -/*updated Jan 11,2007 - link color removed*/ -.runningfooter a:link, -.runningfooter a:active, -.runningfooter a:visited { font-weight: bold; text-decoration: none; } -.runningfooter a:hover { font-weight: bold; text-decoration: underline; } - -#breadcrumb, .breadcrumb, span.breadcrumbs { font-size: 0.75em; } - - -.fastpath { margin-top: 1em; margin-bottom: 1em; } -.fastpathtitle { font-weight: bold; } -.toc { font-size: small; } - -.nested0 { margin-top: 0em; } -.p { margin-top: 1em; } - -span.figcap { font-style: italic; } -span.figdesc { font-style: italic; } -div.figbox {} -div.figrules {} -div.fignone {} - -.fignone {} -.figborder {} -.figsides {} -.figtop {} -.figbottom {} -.figtopbot {} - -.parentlink {} -.prevlink {} -.nextlink {} -.relconceptshd {} -.reltaskshd {} -.relrefhd {} - -.synnone {} -.synborder {} -.synsides {} -.syntop {} -.synbottom {} -.syntopbot {} - -.skip { margin-top: 1em; } -.skipspace { margin-top: 1em; margin-bottom: 1em; } -.ulchildlink { margin-top: 1em; margin-bottom: 1em; } -.olchildlink { margin-top: 1em; margin-bottom: 1em; } - -ul,ol { - margin-top: 0.1em; - padding-top: 0.1em; -} -ul.simple { list-style-type: none; } - -ul.indexlist { list-style-type: none; } - -OL LI { - margin-top: 0.0em; - margin-bottom: 0.0em; - margin-left: 0.0em; -} -UL LI { - margin-top: 0.0em; - margin-bottom: 0.0em; - margin-left: 0.0em; -} -OL LI DIV P { - list-style-type: decimal; - margin-top: 0.2em; - margin-bottom: 0.2em; -} -UL LI DIV P { - list-style-type: disc; - margin-top: 0.2em; - margin-bottom: 0.2em; -} - -*[compact="yes"]>li { - margin-top: 0 em; -} -*[compact="no"]>li { - margin-top: 0.5em; -} - -hr /* For Internet Explorer */ -{ -height: 1px; -color: #ccc; -background-color: #ccc; -text-align: left; -width: 95%; -height: 1px; -color: #ccc; -border: none; } - -html>body hr /* For Gecko-based browsers */ -{ -margin-left: 0; -width: 95%; -height: 1px; -background-color: #ccc; -border: none; -margin-top:5px;} - - - -H1, .title, .pagetitle, .topictitle1 { - font-size: 1.5em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.5em; - word-spacing: 0.1em; -} -H2, .subtitle, .pagesubtitle, .topictitle2 { - font-size: 1.25em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.0em; - padding-bottom: 0.0em; -} -H3, .boldtitle, .topictitle3 { - font-size: 1.0em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.2em; - padding-bottom: 0.1em; -} -H4, .topictitle4 { - font-size: 0.9em; - font-style: normal; - font-weight: bold; - margin-bottom: 0.1em; - padding-bottom: 0.1em; -} -h5, .topictitle5 { - font-size: 0.8em; - font-style: normal; - font-weight: bold; - margin-bottom: 0em; - padding-bottom: 0em; -} -h6, .topictitle6 { - font-size: 0.7em; - font-style: normal; - font-weight: bold; - margin-bottom: 0em; - padding-bottom: 0em; -} -div.headtitle { font-size: 1em; font-weight: bold; margin-left: 0em; } -div.head0 { font-size: 0.9em; font-weight: bold; margin-left: 0em; margin-top: 0.5em; } -div.head1 { font-weight: bold; margin-left: 1em; padding-top: 0.5em; } -div.head2 { font-weight: normal; margin-left: 2em; } -div.head3 { font-weight: normal; margin-left: 3em; } -div.head4 { font-weight: normal; margin-left: 4em; } -div.head5 { font-weight: normal; margin-left: 5em; } -div.head6 { font-weight: normal; margin-left: 6em; } -div.head7 { font-weight: normal; margin-left: 7em; } -div.head8 { font-weight: normal; margin-left: 8em; } -div.head9 { font-weight: normal; margin-left: 9em; } - -div.head1, -div.head2, -div.head3, -div.head4, -div.head5, -div.head6, -div.head7, -div.head8, -div.head9 {font-size: 1em;} - - -.tip { margin-top: 1em; margin-bottom: 1em; } -.tiptitle { font-weight: bold; } -.firstcol { font-weight: bold; } -.ptocH1 { font-size: x-small; } -.ptocH2 { font-size: x-small; } -.stitle { font-style: italic; text-decoration: underline; } -.nte {} -.xxlines { white-space: pre; font-size: 0.95em; } -.sectiontitle { - margin-top: 1em; - margin-bottom: 0em; - color: black; - font-size: 1.2em; - font-weight: bold; -} - -div.imageleft { text-align: left; } -div.imagecenter { text-align: center; } -div.imageright { text-align: right; } -div.imagejustify { text-align: justify; } - -div.mmobj { margin-top: 1em; margin-bottom: 1em; text-align: center; } -div.mmobjleft { margin-top: 1em; margin-bottom: 1em; text-align: left; } -div.mmobjcenter { margin-top: 1em; margin-bottom: 1em; text-align: center; } -div.mmobjright { margin-top: 1em; margin-bottom: 1em; text-align: right; } - -pre.screen { - padding: 1em 1em 1em 1em; - margin-top: 0.4em; - margin-bottom: 0.4em; - border: thin solid Black; - font-size: 100%; -} - -.prereq {margin-left:0;} - -.defListHead { font-weight: bold; text-decoration: underline; } - -span.mv { font-style: italic; } -span.md { text-decoration: line-through; } - -.pk, span.pk { font-weight: bold; } - -span.pkdef { font-weight: bold; text-decoration: underline; } -span.pv { font-style: italic; } -span.pvdef { font-style: italic; text-decoration: underline; } -span.kwd { font-weight: bold; } -span.kdwdef { font-weight: bold; text-decoration: underline; } - -.parmListKwd { font-weight: bold; } -.parmListVar { font-style: italic; } - -span.oper { font-style: normal; } -span.operdef { text-decoration: underline; } - -VAR, span.var { font-style: italic; } -span.vardef { font-style: italic; text-decoration: underline; } - -div.msg { padding: 0.2em 1em 1em 1em; margin-top: 0.4em; margin-bottom: 0.4em; } -div.msgnum { float: left; font-weight: bold; margin-bottom: 1em; margin-right: 1em; } -div.msgtext { font-weight: bold; margin-bottom: 1em; } -div.msgitemtitle { font-weight: bold; } -p.msgitem { margin-top: 0em; } - -.attention, div.attention { margin-top: 1em; margin-bottom: 1em; } -.attentiontitle, span.attentiontitle { font-weight: bold; } -.cautiontitle, div.cautiontitle { margin-top: 1em; font-weight: bold; } -.caution, div.caution { margin-top: 1em; margin-bottom: 1em; } -.danger, div.danger { padding: 0.5em 0.5em 0.5em 0.5em; border: solid; border-width: thin; font-weight: bold; margin-top: 0.2em; margin-bottom: 1em; } -.dangertitle, div.dangertitle { margin-top: 1em; font-weight: bold; } - -.important { margin-top: 1em; margin-bottom: 1em; } -.importanttitle { font-weight: bold; } -.remember { margin-top: 1em; margin-bottom: 1em; } -.remembertitle { font-weight: bold; } -.restriction { margin-top: 1em; margin-bottom: 1em; } -.restrictiontitle { font-weight: bold; } - -div.warningtitle { font-weight: bold; } -div.warningbody { margin-left: 2em } - -.note { margin-top: 1em; margin-bottom: 1em; } - -.notetitle, div.notetitle { font-weight: bold; } - -div.notebody { margin-left: 2em; } -div.notelisttitle { font-weight: bold; } - -div.fnnum { float: left; } -div.fntext { margin-left: 2em; } - -div.stepl { margin-left: 2em; } -div.steplnum { font-weight: bold; float: left; margin-left: 0.5em; } -div.stepltext { margin-left: 5em; } -div.steplnum { font-style: italic; font-weight: bold; float: left; margin-left: 0.5em; } -div.stepltext { margin-bottom: 0.5em; margin-left: 3em; } - -div.ledi { margin-left: 3em; } -div.ledesc { margin-left: 3em; } - -span.pblktitle { font-weight: bold; } -div.pblklblbox { padding: 0.5em 0.5em 0.5em 0.5em; border: solid; border-width: thin; margin-top: 0.2em; } -span.ednoticestitle { font-weight: bold; } - -span.term { font-weight: bold; } -span.idxshow { color: green; } - -div.code { font-weight: bold; margin-bottom: 1em; } - -span.refkey { font-weight: bold; color: white; background-color: black; } -tt.apl { font-style: italic; } - -div.qualifstart { - padding: 0.1em 0.5em 0.5em 0.5em; - border-top: solid; - border-left: solid; - border-right: solid; - border-width: thin; - font-weight: bold; - margin-top: 0.2em; - margin-bottom: 0.2em; - text-align: center; -} -div.qualifend { - padding: 0.5em 0.5em 0.1em 0.5em; - border-bottom: solid; - border-left: solid; - border-right: solid; - border-width: thin; - font-weight: bold; - margin-bottom: 0.2em; - text-align: center; -} - -.noshade { background-color: transparent; } -.xlight { background-color: #DADADA; } -.light { background-color: #B0B0B0; } -.medium { background-color: #8C8C8C; } -.dark { background-color: #6E6E6E; } -.xdark { background-color: #585858; } -.light-yellow { background-color: #FFFFCC; } -.khaki { background-color: #CCCC99; } -.medium-blue { background-color: #6699CC; } -.light-blue { background-color: #CCCCFF; } -.mid-grey { background-color: #CCCCCC; } -.light-grey { background-color: #DADADA; } -.lightest-grey { background-color: #E6E6E6; } - -#changed { - position: absolute; - left: 0.2em; - color: #7B68EE; - background-color: #FFFFFF; - font-style: normal; - font-weight: bold; - -} - -INPUT.buttons { font-size: 0.75em; border-top: 0.2em outset #B1B1B1; border-right: 0.2em outset #000000; border-bottom: 0.2em outset #000000; border-left: 0.2em outset #B1B1B1; background-color:#E2E2E2; margin-bottom: 0.2em; } - -.cgraphic { font-size: 90%; color: black; } - -.accentgraphic { - float: left; -} - -dl.linklist { -margin-left:110px; -clear: both; -} - -* html dl.linklist { -margin-left:116px; -clear: both; -} - - - - -.aix, .hpux, .sun, .unix, .win2, .winnt, .win, .zos, .linux, .os390, .os400, .c, .cplusplus, .cobol, .fortran, .java, .macosx, .os2, .pl1, .rpg { - background-repeat: no-repeat; - background-position: top left; - margin-top: 0.5em; - text-indent: 55px; -} -.aix { background-image: url(ngaix.gif); } -.hpux { background-image: url(nghpux.gif); } -.sun { background-image: url(ngsolaris.gif); } -.unix { background-image: url(ngunix.gif); } -.win2 { background-image: url(ng2000.gif); } -.winxp { background-image: url(ngxp.gif); } -.winnt { background-image: url(ngnt.gif); } -.win { background-image: url(ngwin.gif); } -.zos { background-image: url(ngzos.gif); } -.linux { background-image: url(nglinux.gif); } -.os390 { background-image: url(ng390.gif); } -.os400 { background-image: url(ng400.gif); } -.c { background-image: url(ngc.gif); } -.cplusplus { background-image: url(ngcpp.gif); } -.cobol { background-image: url(ngcobol.gif); } -.fortran { background-image: url(ngfortran.gif); } -.java { background-image: url(ngjava.gif); } -.macosx { background-image: url(ngmacosx.gif); } -.os2 { background-image: url(ngos2.gif); } -.pl1 { background-image: url(ngpl1.gif); } -.rpg { background-image: url(ngrpg.gif); } - - - - diff --git a/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ix$Namespace.html b/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ix$Namespace.html deleted file mode 100644 index b8dac5f..0000000 --- a/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ix$Namespace.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - -Namespaces: JDBCSample 1.0.0 - - - - -

    Namespaces: JDBCSample 1.0.0

    - -
    -
    -

    -Toolkits > JDBCSample 1.0.0 > Namespaces

    - -
    - -

    Namespaces

    - -
    - -
    com.ibm.streamsx.jdbc.sample.jdbcrun
    - -
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.html b/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.html deleted file mode 100644 index 30c8ea3..0000000 --- a/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/ns$com.ibm.streamsx.jdbc.sample.jdbcrun.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - -Namespace com.ibm.streamsx.jdbc.sample.jdbcrun - - - - -

    Namespace com.ibm.streamsx.jdbc.sample.jdbcrun

    - -
    -
    -

    -Toolkits > JDBCSample 1.0.0 > com.ibm.streamsx.jdbc.sample.jdbcrun

    - -
    - -
    - - - - \ No newline at end of file diff --git a/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/tk$JDBCSample.html b/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/tk$JDBCSample.html deleted file mode 100644 index f55b0da..0000000 --- a/samples/JDBCSample/doc/spldoc/html/tk$JDBCSample/tk$JDBCSample.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - -Toolkit JDBCSample 1.0.0 - - - - -

    Toolkit JDBCSample 1.0.0

    - -
    -
    -

    -Toolkits > JDBCSample 1.0.0

    - -
    - -

    General Information

    - - -

    JDBCSample -

    - -
    - -
    Version
    - -
    1.0.0
    - - - -
    Required Product Version
    - -
    4.2.1.0
    - - - -
    Author
    - -
    IBMStreams Open Source Community at GitHub - https://github.com/IBMStreams/streamsx.jdbc
    - - -
    - -
    - -

    Indexes

    - -
    -
    -
    - -
    Namespaces
    -
    - -
    - -
    - -

    Namespaces

    - -
    - -
    com.ibm.streamsx.jdbc.sample.jdbcrun
    - -
    - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/samples/JDBCSample/doc/spldoc/html/toc.html b/samples/JDBCSample/doc/spldoc/html/toc.html deleted file mode 100644 index cb2620f..0000000 --- a/samples/JDBCSample/doc/spldoc/html/toc.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - -Toolkits - - - - - \ No newline at end of file diff --git a/samples/JDBCSample/doc/spldoc/html/toolkits/ix$Namespace.html b/samples/JDBCSample/doc/spldoc/html/toolkits/ix$Namespace.html deleted file mode 100644 index 2b1e082..0000000 --- a/samples/JDBCSample/doc/spldoc/html/toolkits/ix$Namespace.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - -Namespaces: Toolkits - - - - -

    Namespaces: Toolkits

    - -
    -
    -

    -Toolkits > Namespaces

    - -
    - -

    Namespaces

    - -
    - -
    com.ibm.streamsx.jdbc.sample.jdbcrun
    - -
    - - -
    - -
    - -
    - - - - \ No newline at end of file diff --git a/samples/JDBCSample/doc/spldoc/html/toolkits/toolkits.html b/samples/JDBCSample/doc/spldoc/html/toolkits/toolkits.html deleted file mode 100644 index 9fcb47f..0000000 --- a/samples/JDBCSample/doc/spldoc/html/toolkits/toolkits.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - -Toolkits - - - - -

    Toolkits

    - -
    -

    Indexes

    - -
    -
    -
    - -
    Namespaces
    -
    - -
    - -
    - -

    Toolkits

    - -
    - -
    JDBCSample 1.0.0
    - -
    JDBCSample
    - - -
    - -
    - -
    - - - - \ No newline at end of file From b0bdebed745106dbde83f13f4e5895db00a5895d Mon Sep 17 00:00:00 2001 From: anouri Date: Wed, 23 Jan 2019 04:46:30 -0800 Subject: [PATCH 23/48] removed lib from develop branch --- README.md | 4 ++-- .../impl/lib/com.ibm.streamsx.jdbc.jar | Bin 60124 -> 0 bytes 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar diff --git a/README.md b/README.md index 9791618..3257c8a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,6 @@ This toolkit implements the NLS feature. Use the guidelines for the message bund To learn more about Streams: * [IBM Streams on Github](http://ibmstreams.github.io) -* [Introduction to Streams Quick Start Edition](http://ibmstreams.github.io/streamsx.documentation/docs/4.1/qse-intro/) -* [Streams Getting Started Guide](http://ibmstreams.github.io/streamsx.documentation/docs/4.1/qse-getting-started/) +* [Introduction to Streams Quick Start Edition](http://ibmstreams.github.io/streamsx.documentation/docs/4.2/qse-intro/) +* [Streams Getting Started Guide](http://ibmstreams.github.io/streamsx.documentation/docs/4.2/qse-getting-started/) * [StreamsDev](https://developer.ibm.com/streamsdev/) diff --git a/com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar b/com.ibm.streamsx.jdbc/impl/lib/com.ibm.streamsx.jdbc.jar deleted file mode 100644 index 71e21636ce887d795658617be5007df7160efa49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60124 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�~Lki@~Ns*u)mxBU$hiK5i#t4)|%qX z&|(!N2(0BA{R`X0T1iMBU~8?d)}Gm1~^~ns3+7k97!kNslgPMy1v(l`g%;vhiNA|7~Yc!UM(`_PP8#D zR3Wm*%3yDYHUEOr8o%{|0*dCo=?wU4mWpw}WHgdK?y`5NnNjwkq1#$f+;|w}idGcaz<58VQ`#?(MNd5U=@$Ash z6S}A+1NAQUChoTkRjeQ13crB=^a}v-9tOhw{ssK_PB;E{j)!a=4Q2m%s4%6u^F35R z@}DtmP$Aru>40HcRjNQ7+$P&JE`Uwjpg{@#S=RGYP23Nr||15i|)zhTxn-A4XV&9+j0MKU-JHjtUW5s@=g5*Ki zko)xqUmkgCQ)1Oo_s;OK8peL@Vb>aQii<#5(N#LSjVod9`Q0h27~8lPDzcqe@W`te z4<>7+zm|!2V>DHjL~m7gMSKGh0DS$wFpMx-G;|AKR0zGT64MP&Atg^BrwkFKQY=y2 zcf7lZ)Yx#l=Pw@YSY2dZZsS&R$#*$4PZp9KbJ`F`MYw>TEPtEegF*R|7zk;c4!Qbl zrDfq%aQ^V`brTI1)q<0xOENfZqNOgL^QLk60y}yADMOG8vG#Z(Ae;|n4kL}z2uC36VOI4~Pt)_vEBJ<=DJQgA^ zW}=r0Qx4Qz@Df|*Aw6GiVNFlRH#Q^yr&!aiXKDu~meD#9-7zAies!}Wz?GH4ux6&? zj_VIm(1;~vbJbniIC?d(DKmd^YpK46Z1PbGHoa>pxrwDYiLo3lL_^zN$oV>c8?DwogzbrG*Z&tJ#;q$4k0mgrzkDm zjUXwVN=r(o#Lz7%AfkY9#`m0Ecjw*R$lpYCkv=M_&M<)%tWRS-Gvc>;C?!so^_DoxtS&Nn z#!;sqeE8w~%k%#2F25)JXv4+cR16Q<$^&(svu9fNb`TT1p5pZ|5{;Ta;_{&_%0#4< zDd5b$?U&e0d4;mEBb2edxhxhPfRnnm$f$PIhnl6E~Uzq8HqpCP;hS z;CzhnBg!;RAnxYawCRx3iiorFLg5hifdGlh9OKsVH*u_fv25}507YHWv-p;)E++LtpyMP!2W%7ab_-T|F!fvwp zFTR>y$VNJp-ax3l)mlH^9qVMx=9<;Y0P9n-U~^g6xfDa1s5ZLP{6$XDZVgW%fsmB_ zw+=;#S~;4-b*>Q0D*2eCt#0n(fo7mr#7+_kQZSQ#Z^Fq5ChrxK3_nQh!`bEUBq_B;`Iy94USFs1qJRGxq+F+F&eBgH_3K9 zV5JG+BE0-w3h9jqvfhHaE`V(?pW4pOF5sxQ2iGDxK=N)dMt*!sy}IDc0pfgG7}Mo$ zm;5e8T0b3~WVqtNI#X~I`VDfI*ff9`C44X}p$d7B*ifk^DGSVl#GXQ<1xh(J%9+Ia zbi;~@mBXBQjriJ3m1%k~comG=hKR$IpBxFVT ze%P(<5}cx~nWUsj&jNJI)edaI8hhuFS|XdbE<$UHI!_zzBkJnIaAtbEqSb(hEHALk zA&Ko_-;;_}xpLZ~IoUXBAivrKv{Ipo%qCW=`4QHVC?QUadA$M+olXd3K3CPchxlB3 zVY~okN;6L(qzF@Ycd4&+E*J-vw@I$s5MgCb9CzoWhdPozF^DEpqRbehlv!OJ%eK9K z10k5*@bFGSV{)4KS*y@dX?zk;X{eSBXEC_sZ5fT>1f%Me3eUA|w6xL7FJ4&)Biah@ zm5g@%N7ha=i=VAJyO0cDE3R+slddl^)w~oOh?^f>_^`l->Xy6xvY8MZA58fmlrV8O zqU-jh4Cdh4p7i?zj_;x+okA9zkV{9jn>wmAM4oy<&3Dr&k}`&Xd?54l`#T?-*i80y zLo-YD(H>jYMR(3Xu8wKSHpiy~n3fiyfXbvl`nq|^NE3T$f)~guUnPXQ!5whV$ zLlfM7onXMty)yDhLbH+4R}>w)FRI1#7;o$TE5Sf6lB%fhX0@-^b%(RPNM$5EDLZGI z9S7G+WDRs0Vy@t8LAX$N_uz2|uHTGwBM}v!@CU z`=SJF$k5dW`Kk)|&7*tDt>v)1(@x(Hx0Sd1mO&HnIofU{r(5hBzWsR|87=z^sPkSW zRoa(WK+ha~*X*h*@2>4oc)6WB4^&)E8X?C}5qpoc;zdcq(#eP-F*!J{OYlp7Ym|iN zEx)V5*oA0?($2jhnX51MruuW7FW&Everz4$eSlm(wIH!|yPMbX zGKodwjdt4$@}p_H?t<7HBZM8ClM%z#QG1@W+i3dg@03fu#G`?One}`uUf;r2Uj#E7 zB|pOEb)IE# zK}GUCc&YxHqav-o06N&idUVv&zGWsd+cuE+Sc<%fa&f{Js6zK(mx#Fq@&Q%VSSDjh zQx~*fJ_j6Y>*YJiC0X=M2{6Gh-94NE4sQHNRXTslCv<3matOK128wL)tf(@1C~9SL zE2J}*eH%3PGuU^$VOT6jC%=YERN6aWfCBFT0F|)c1pGHUQ5SbJO`ShDBMuE0-OR6QAfoqso-w_0Bf8UG$4vU7W#f{GKYd=Sj{HvI913I zjeOANJN72`0Jq1r+e@{3ygd)%$JbOa=dqMXHF!0hdCA@1;??kp{3hxYDn4qerdSVk z5L?=OoMSbADl~#-4yUzsfm6ai&mN7 zoOZfb!&(IGuHWdL)FL~aJFkOk2lCB_fqkDvfnUmWCEjy1Wq{LqXN*(yDq3UKF3R2* z>TMmLxuk=;Ks#IKN+RP!;&R?9nf>eS^hacfh~u13dv)K?gA^!AqcS}=wJg6<+jXha)L&!2EwN_EWUoR^NkfC+pvooxIgmR%b z;%{fNPWyV2ky>GZJ)-*A%|ljhi7YQhgozA7?Da?K$l9%L9~Oq9ko=5=H*vsYwqbfC zljYBpvH6gvb?Xrt>`wRhSkfI+47S+-!_{&+kuC-kP_f!f z(cX5~f|ENTU5hxY!}3V{#Dq#jS0j%;C3op&4B05q@|Ha5uGr{SM2*&LzCG+SCZ5O7 z*5Zgn%5-juV%q|i^VVm8=!<{$e8`0D^@5pK-CO~XcXEdS_RA2?SS?R>-1Dy1Xe#6V zGY%S|JntbM(AgGfg-vhaRB`7P$*yuQsMalb8kutSNpSYe!anjdweVW7^h^_?{qwm7 zi~=){uQy<=ez#?{i!}5J#|p{Ady5~L4vLB2N2X8KY!=asHAE-lnFZ5|#CEpons!OJDb0h(Um)9mMgSaW|IROc#cB*QVF&21Hh|A;B_+r4)k&9@C!lBX zLE!_azlCf!rDh1Hoh;Y(-GdJ5@v~Q^ltJOcE+CnsO0eI{#%dE{PkxD3gAvDC zk)`cc*S2j@yIHJLZg7Cg#3ue(mQW4A_BQ^6m4aXrMfGGpej?nz1YhWwbfRF*Byy^j7D!ZPw5*SA9}sd8Bt!fuqGCgwR33Y^ACow~b5DRB|0vzxMN zb=cf{RdR1RZ3ov&_ruQJEYfg@MA2MHrfd}Ht89uUn}!abBpyi~83}!7{zOrQFp%)> zA*2)NdBA+Mffr0hTPeLhoV0w4#x|Gy`AIr?)@rR+pMCMsQFMHPo2S3oP5EWT=`-`9p59{Ua_M0#VeltP;xaMZw0}eyMiA6ZWht8wVy{l z8tuyN)ic#hcTHTzQ7qFT2*-D4pk)YfUey-?ZE6b%=@7;Wg>cYwrZR%|2`xn51fh#pU=a6}o;p1!8i|$YB zFBYvQSaVP(4xzGyog8T{Wr9kq{nkW2t(_io;wH zwU(e`F3Mh#ses9CJBNm&dPl9-3*d=}Twd?(Moq- zpv!_38X7cCij6&QqEQ$Ie-a;7|^tQh?=zE~t@V`Uy9IW}!x z%y%G)*AidOxujSp9Fm_arGG8VM?i*TX-Vc2Aw>`gjDkR4 zoK-;Ikv=RaI7TByvO#;apbQd5o3O6g8+WdI*ILIcNhT+n64Gzrm-9xYpd*|W{p>*c zr2q)1NN|Qk9abs<02ulZ>J@O{_w$jWqf2ch#XOfquYz6nnoP4X9v-ua_(T*W>pM z#6tc9TH=`LxHjwI*b`|hA$>Dsi&bv^8I0<*r|!y{_gvD6_z_T@&{)Ta6ulJi_kCBH zb#w&*llm$lf_JJC-hW^d2#y>S3cVav^JZDgZa}42=T^5McXZ4)*(PYwHa5V z45&4pr%@lsUgPZmy(LSPBJ9;aVovKn>Y8U82*eGGxv0PgCeN5e3eSxbhQxV=k0mKj zy#0vJUnZh#Cw188^kSBC*YIl5V{V^+9evY5c{k8fu-krcZ=d6~_~>jTIiJd8K0 zkOjV$hKyXri-K_j%j%eP8rTZ)??^!g77cJSh?}YWDAz>6J1-?EO}#fMRcVX2KZogM z%7-Rka%&@EQ_HC)PqnGgj&FKd9hGDB5N_yx_!6+^ZXXSu?LR0eaY_5UQLm@kjWs=e zS*bq*q5+u|GhmdIsEPaaTXirv<57GvAjmbsPjV$cV`6T*8Fg@28 z#PtDl+S`tPj`p9#T29t`eq+K&Y>f5g&X}YM`pi7Gt+lxnu2|&W6xIHYj;9|4K{JGD z0I?%C23sfw6Rk({6H8t^DSZqTvh~?r+`1sDW>>Jl>vvLb)#v-ti7$}Vd?u2k0s(Lf zYRo+69neCq=77q9BWwjPS)Q8J^}dU9Jq# zuvI)BasaBhJbe5#;~3^frt}GU$vJYYpK-~5AhhinkaA`2buO1(XG2o;ba#762xIeZ zV!wFBGKWSZZ0|1axvN_5a6)I;6Lpv%!o#Lz zU%iQ=@vvyOCstwJFKY5i{f2Js-u1{`O2%kw1d!`Di%~HJ%i}wMP)gjMcb`vIlT1&% z@_HJ0dA%+0+)aH>RoCWYQH@qfRmt^kG_`IFi8FVIF0W2CmT7wI$Jf=aXAwUFd1}Dq zvi9jH&Pirhk^{Pe8zS3C{2}KuBKC%pP9~tU7;BQr!i{mtEFr=nS93+CC%UKU+R3fb z&IaV>u|fH{gVbL=?HLFdWZo6%w;%ab1_x9OJ$b{tz{k>#hL&Ipnl)LJ0LUQ45a|f^ zt9uI!PRSm8BUcULJ>kW*CN^S>24Z@-x2>=eRqd2J34jbda#9f{bi?IPLNV)Zo_r*6 zRp1u4^kf}8?b+cnCfVR_7sh&(9X$)IIg}{X1tYMyOBPsFEcUy;bz{+d?`l6O$jkrY z;Se)ym9>1Sm0Fodx6Pp)j)Bn#Lf7!Y80~6vUQfdwx5*<`vXC}-=RS)c^fBe`FztfB zK%`VXPB%gn7n38WM2Xv+11XwA2${*_I7^{sp>+{Nug@_Fv?}pI0hG(NB$}` z;mcs;hJAWR?Cb3nB>a$NWIFK=5lX# zX|}>d-W@Gpt_<~U-$w8-WG?0u_ ziNrn+NE9(*T#I5jm_3=O(3g))v3j-sbjK!Zwz<;Z5Spm!v0p5r(=%%Il*am9F>JLJ zwSW6#wLR?UwrR%A*Q?@)PngR8?vGTrHy$7?mjNP_<}D^5zJqGbUkk;R*=wp?Gz8pAo|Bo?XiLKL-cb-*i@>;?9c7zGsBQ#n)B)r;>DyZs`r zSnO)u=I+Y~s`k@SQ4>+swdgQNt)H@Qxp5(ZAcDm}6;5XmZnGw6woB~i{2t`DCHxe!TPQAJRghPMIGp^Qz~+ziCM@nK3P+KT~$uO3}*7J zqIPZ|R20&3vJs)};5TH5R?a(^V$!3d_Dmn-jJU2@Fr007S4{v7sP7+eK=w1hZt*jhMnxVpK3 z%^h65IG#MVu;h@mfW0@jbW@U%l2&s9yO_H{T-g89Fa@4o_dYR>0oHVd9Ja@1`V+l_ z-w!fn){xDV=;^^vT?&$V^ z{eIxBJ=fXt9EJrzWnoa(->E<5!h+-Pxc|Z0+rm0)D1hx@bMe;}|A4`!;Xear;_ss{ z*h}i4$iKIv`B{JmZ*df20!|L=zk4_Zz1&?u`swjF}q@amTN#z^5R>tH9^A{8TyZ{dE=iEEjkc_+ai&70aPtSAh@h!mGeX zMt-XJjsLm|e4GSc1>Pn0Q|04_Usr*5ko}hm+;!ql6`{p{rShk%Ms*MhEOG<@kic$K Mu#;Eu+K+et11-odkpKVy From 5866b739e27db4c368323a2bb09fd9e39e75f569 Mon Sep 17 00:00:00 2001 From: anouri Date: Tue, 5 Feb 2019 07:26:40 -0800 Subject: [PATCH 24/48] copy from master to develop --- README.md | 4 ++-- com.ibm.streamsx.jdbc/info.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3257c8a..1c6bb1d 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,6 @@ This toolkit implements the NLS feature. Use the guidelines for the message bund To learn more about Streams: * [IBM Streams on Github](http://ibmstreams.github.io) -* [Introduction to Streams Quick Start Edition](http://ibmstreams.github.io/streamsx.documentation/docs/4.2/qse-intro/) -* [Streams Getting Started Guide](http://ibmstreams.github.io/streamsx.documentation/docs/4.2/qse-getting-started/) +* [Introduction to Streams Quick Start Edition](http://ibmstreams.github.io/streamsx.documentation/docs/4.3/qse-intro/) +* [Streams Getting Started Guide](http://ibmstreams.github.io/streamsx.documentation/docs/4.3/qse-getting-started/) * [StreamsDev](https://developer.ibm.com/streamsdev/) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 1ad661b..01be4a7 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -31,7 +31,7 @@ ++ What is new in version 1.4.3 * The JDBCRun operators provides a new parameter **credentials**. - This optional parameter specifies the path name of the JSON string that contains the JDBC credentials. + This optional parameter specifies a JSON string that contains the JDBC credentials. The JDBC credentials string must contain valid JSON format and a set of name/value pairs for **username**, **password** and **jdbcurl**. From 6c0690cf25ebdd9b138f3882cf294de7bbe95c03 Mon Sep 17 00:00:00 2001 From: Ahmad Nouri Date: Tue, 5 Feb 2019 07:27:27 -0800 Subject: [PATCH 25/48] merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 --- .../ibm/streamsx/jdbc/JDBCClientHelper.java | 37 +++++++++++++------ .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 3 +- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index 2e717df..d40a112 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -15,9 +15,12 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +import com.ibm.streams.operator.Attribute; +import com.ibm.streams.operator.Type.MetaType; import com.ibm.streams.operator.logging.LogLevel; import com.ibm.streams.operator.logging.LoggerNames; import com.ibm.streams.operator.logging.TraceLevel; +import com.ibm.streams.operator.types.Blob; /* This class contains all the JDBC connection related information, * creating maintaining and closing a connection to the JDBC driver @@ -409,15 +412,9 @@ public void clearStatementBatch() throws SQLException{ // Execute the preparedStatement public ResultSet executePreparedStatement(StatementParameter[] stmtParameters) throws SQLException{ - ResultSet rs = null; - if (stmtParameters != null){ - for (int i=0; i< stmtParameters.length; i++){ - preparedStmt.setObject(i+1, stmtParameters[i].getSplValue()); - } - } - + addParametersToStatement(stmtParameters); if (preparedStmt.execute()){ rs = preparedStmt.getResultSet(); } @@ -427,15 +424,31 @@ public ResultSet executePreparedStatement(StatementParameter[] stmtParameters) t // Add batch for preparedStatement public void addPreparedStatementBatch (StatementParameter[] stmtParameters) throws SQLException{ + addParametersToStatement(stmtParameters); + preparedStmt.addBatch(); + } + + // add parameters to the statement + public void addParametersToStatement(StatementParameter[] stmtParameters) throws SQLException{ + if (stmtParameters != null){ for (int i=0; i< stmtParameters.length; i++){ - preparedStmt.setObject(i+1, stmtParameters[i].getSplValue()); + Attribute attr = stmtParameters[i].getSplAttribute(); + + // special handling for type Blob + if (MetaType.BLOB == attr.getType().getMetaType()) { + if (LOGGER.isLoggable(TraceLevel.DEBUG)) { + LOGGER.log(TraceLevel.DEBUG, "Converting SPL:Blob to java.sql.Blob"); + } + com.ibm.streams.operator.types.Blob splBlob = (com.ibm.streams.operator.types.Blob) stmtParameters[i].getSplValue(); + preparedStmt.setBlob(i+1, splBlob.getInputStream()); + } else { + preparedStmt.setObject(i+1, stmtParameters[i].getSplValue()); + } } - } - - preparedStmt.addBatch(); + } } - + // Execute batch for preparedStatement public void executePreparedStatementBatch () throws SQLException{ diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index cea50c7..e0a44e7 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -47,6 +47,7 @@ import com.ibm.streams.operator.types.Blob; import com.ibm.streams.operator.types.RString; import com.ibm.streams.operator.types.Timestamp; +import com.ibm.streams.operator.types.ValueFactory; import com.ibm.streams.operator.types.XML; import com.ibm.streams.operator.model.OutputPortSet.WindowPunctuationOutputMode; @@ -984,7 +985,7 @@ protected void submitOutputTuple(StreamingOutput outputPort, Tuple else if (splType.contains("DECIMAL32")) outputTuple.setBigDecimal(splAttrName, rs.getBigDecimal(i)); else if (splType.contains("DECIMAL64")) outputTuple.setBigDecimal(splAttrName, rs.getBigDecimal(i)); else if (splType.contains("DECIMAL128")) outputTuple.setBigDecimal(splAttrName, rs.getBigDecimal(i)); - else if (splType.contains("BLOB")) outputTuple.setBlob(splAttrName, (Blob)rs.getBlob(i)); + else if (splType.contains("BLOB")) outputTuple.setBlob(splAttrName, ValueFactory.readBlob(rs.getBlob(i).getBinaryStream())); else if (splType.contains("TIMESTAMP")) outputTuple.setTimestamp(splAttrName, Timestamp.getTimestamp(rs.getTimestamp(i))); else if (splType.contains("XML")) outputTuple.setXML(splAttrName, (XML)rs.getSQLXML(i)); else if (splType.contains("BOOLEAN")) outputTuple.setBoolean(splAttrName, rs.getBoolean(i)); From e19f3fa72910b69ddb0121e0fb92e0e0a43e51d0 Mon Sep 17 00:00:00 2001 From: anouri Date: Tue, 5 Feb 2019 07:41:13 -0800 Subject: [PATCH 26/48] release number increased #82 --- com.ibm.streamsx.jdbc/info.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 01be4a7..a3ef694 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -36,9 +36,13 @@ **username**, **password** and **jdbcurl**. * support **Streams application configuration** + + ++ What is new in version 1.4.4 + + * Insert BLOB bug fixed #82 - 1.4.3 + 1.4.4 4.2.0.0 From ba0c78abf2963b9ef7a7c52da9a8677fa3d4d2c4 Mon Sep 17 00:00:00 2001 From: anouri Date: Tue, 5 Feb 2019 07:42:14 -0800 Subject: [PATCH 27/48] check sqlFailureAction before rollback --- .../java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index aa59946..a3b8d76 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -594,8 +594,9 @@ public synchronized void shutdown() throws Exception { TRACE.log(TraceLevel.DEBUG, "Operator " + context.getName() + " shutting down in PE: " + context.getPE().getPEId() + " in Job: " + context.getPE().getJobId()); //$NON-NLS-3$ // Roll back the transaction - jdbcClientHelper.rollback(); - + if (sqlFailureAction == "rollback"){ + jdbcClientHelper.rollback(); + } // close JDBC connection jdbcClientHelper.closeConnection(); From 55499af21a19f16af6924912bbaeeb6d376beb05 Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 15 Apr 2019 16:01:37 +0200 Subject: [PATCH 28/48] Corrections for issues #86 #87 #88 --- .../streamsx/jdbc/AbstractJDBCOperator.java | 49 ++++++++++++++++--- .../ibm/streamsx/jdbc/JDBCClientHelper.java | 37 +++----------- com.ibm.streamsx.jdbc/info.xml | 7 ++- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index eeacf77..b79efef 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -5,6 +5,7 @@ package com.ibm.streamsx.jdbc; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; @@ -13,6 +14,7 @@ import java.sql.SQLException; import java.util.HashMap; import java.util.Map; +import java.util.Properties; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Logger; @@ -161,7 +163,7 @@ public void setJdbcPassword(String jdbcPassword){ //Parameter jdbcProperties @Parameter(name = "jdbcProperties", optional = true, - description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user' and 'password'") + description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user', 'password' and jdbcUrl") public void setJdbcProperties(String jdbcProperties){ this.jdbcProperties = jdbcProperties; } @@ -335,9 +337,10 @@ public static void checkParametersRuntime(OperatorContextChecker checker) { public static void checkParameters(OperatorContextChecker checker) { // If statement is set as parameter, statementAttr can not be set checker.checkExcludedParameters("statement", "statementAttr"); - // If jdbcProperties is set as parameter, jdbcUser and jdbcPassword can not be set + // If jdbcProperties is set as parameter, jdbcUser, jdbcPassword and jdbcUrl can not be set checker.checkExcludedParameters("jdbcUser", "jdbcProperties"); checker.checkExcludedParameters("jdbcPassword", "jdbcProperties"); + checker.checkExcludedParameters("jdbcUrl", "jdbcProperties"); // If credentials is set as parameter, jdbcUser, jdbcPassword and jdbcUrl can not be set. checker.checkExcludedParameters("jdbcUser", "credentials"); @@ -345,7 +348,7 @@ public static void checkParameters(OperatorContextChecker checker) { checker.checkExcludedParameters("jdbcUrl", "credentials"); checker.checkExcludedParameters("credentials", "jdbcUrl"); - // If credentials is set as parameter, credentials can not be set + // If credentials is set as parameter, jdbcProperties can not be set checker.checkExcludedParameters("jdbcProperties", "credentials"); // check reconnection related parameters @@ -356,8 +359,8 @@ public static void checkParameters(OperatorContextChecker checker) { OperatorContext context = checker.getOperatorContext(); if ((!context.getParameterNames().contains("credentials")) && (!context.getParameterNames().contains("appConfigName")) - && (!context.getParameterNames().contains("jdbcUrl"))) { - checker.setInvalidContext("The parameter 'jdbcUrl' is not defined. It must be set in one of these parameters: 'jdbcUrl' or 'credentials' or via the credentials parameter in an application configuration.", null); + && (!context.getParameterNames().contains("jdbcProperties"))) { + checker.setInvalidContext("The parameter 'jdbcUrl' is not defined. It must be set in one of these parameters: 'jdbcUrl' or 'credentials' or via the credentials parameter in an application configuration or via properties file.", null); } if ((!context.getParameterNames().contains("credentials")) @@ -551,6 +554,7 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr if (jdbcProperties != null && !jdbcProperties.trim().isEmpty() && !jdbcProperties.startsWith(File.separator)) { jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; + getProperties(jdbcProperties); } if (credentials != null && !credentials.trim().isEmpty()) @@ -684,6 +688,7 @@ private synchronized void setupJDBCConnection() throws Exception{ if (jdbcProperties != null && !jdbcProperties.trim().isEmpty() && !jdbcProperties.startsWith(File.separator)) { jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; + getProperties(jdbcProperties); } if (credentials != null && !credentials.trim().isEmpty()) { @@ -707,7 +712,36 @@ private synchronized void setupJDBCConnection() throws Exception{ } } - + + // read properties file and set user name, password and jdbcUrl. + public void getProperties(String jdbcProperties) throws IOException { + try { + Properties jdbcConnectionProps = new Properties(); + FileInputStream fileInput = new FileInputStream(jdbcProperties); + jdbcConnectionProps.load(fileInput); + fileInput.close(); + jdbcUser = jdbcConnectionProps.getProperty("user"); + if (null == jdbcUser){ + LOGGER.log(LogLevel.ERROR, "'user' is not defined in property file: " + jdbcProperties); + throw new Exception(Messages.getString("'jdbcUser' is required to create JDBC connection.")); + } + jdbcPassword = jdbcConnectionProps.getProperty("password"); + if (null == jdbcPassword){ + LOGGER.log(LogLevel.ERROR, "'password' is not defined in property file: " + jdbcProperties); + throw new Exception(Messages.getString("'jdbcPassword' is required to create JDBC connection.")); + } + + jdbcUrl = jdbcConnectionProps.getProperty("jdbcUrl"); + if (null == jdbcUrl){ + LOGGER.log(LogLevel.ERROR, "'jdbcUrl' is not defined in property file: " + jdbcProperties); + throw new Exception(Messages.getString("JDBC_URL_NOT_EXIST")); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + // read credentials and set user name, password and jdbcUrl. public void getCredentials(String credentials) throws IOException { @@ -728,6 +762,9 @@ public void getCredentials(String credentials) throws IOException { } jdbcUrl = (String)obj.get("jdbcurl"); + if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ + jdbcUrl = (String)obj.get("jdbcUrl"); + } // jdbcUrl is required if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index d40a112..be8678d 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -52,8 +52,6 @@ public class JDBCClientHelper { // the user's password. private String jdbcPassword = null; private boolean sslConnection = false; - // the jdbc properties file. - private String jdbcProperties = null; // the transaction isolation level at which statement runs. private String isolationLevel = IJDBCConstants.TRANSACTION_READ_UNCOMMITTED; // transactions are automatically committed or not. @@ -87,7 +85,6 @@ public JDBCClientHelper(String jdbcClassName, String jdbcUrl, this.jdbcUser = jdbcUser; this.jdbcPassword = jdbcPassword; this.sslConnection = sslConnection; - this.jdbcProperties = jdbcProperties; this.autoCommit = autoCommit; this.isolationLevel = isolationLevel; this.reconnectionPolicy = reconnectionPolicy; @@ -108,33 +105,16 @@ public synchronized void createConnection() throws Exception, SQLException{ //Load class into memory Class.forName(jdbcClassName); - // Load jdbc properties Properties jdbcConnectionProps = new Properties(); - if (jdbcProperties != null){ - FileInputStream fileInput = new FileInputStream(jdbcProperties); - jdbcConnectionProps.load(fileInput); - fileInput.close(); - String user = jdbcConnectionProps.getProperty("user"); - if (null == user){ - LOGGER.log(LogLevel.ERROR, "'user' is not defined in property file: " + jdbcProperties); - return; - } - String password = jdbcConnectionProps.getProperty("password"); - if (null == password){ - LOGGER.log(LogLevel.ERROR, "'password' is not defined in property file: " + jdbcProperties); - return; - } - - } else { - // pick up user and password if they are parameters - if (jdbcUser != null && jdbcPassword != null) { - jdbcConnectionProps.put("user", jdbcUser); - jdbcConnectionProps.put("password", jdbcPassword); - jdbcConnectionProps.put("avatica_user", jdbcUser); - jdbcConnectionProps.put("avatica_password", jdbcPassword); - } + // pick up user and password if they are parameters + if (jdbcUser != null && jdbcPassword != null) { + jdbcConnectionProps.put("user", jdbcUser); + jdbcConnectionProps.put("password", jdbcPassword); + // properties for phoenix jdbc properties. + jdbcConnectionProps.put("avatica_user", jdbcUser); + jdbcConnectionProps.put("avatica_password", jdbcPassword); + } - } // add sslConnection to properties if (sslConnection) @@ -257,7 +237,6 @@ public synchronized void resetConnection(String jdbcClassName, String jdbcUrl, this.jdbcUrl = jdbcUrl; this.jdbcUser = jdbcUser; this.jdbcPassword = jdbcPassword; - this.jdbcProperties = jdbcProperties; // Set JDBC Connection Status as false connected = false; diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index a3ef694..91d2799 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -41,8 +41,13 @@ * Insert BLOB bug fixed #82 +++ What is new in version 1.5.0 + + * Add jdbcUrl to jdbc properties. + * Support jdbcUrl and jdbcurl in credentials. + - 1.4.4 + 1.5.0 4.2.0.0 From d4e69020c9ec90a0b6a288295be4f2bece237362 Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 15 Apr 2019 17:09:23 +0200 Subject: [PATCH 29/48] correction for #88 --- .../java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index b79efef..b732603 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -359,6 +359,7 @@ public static void checkParameters(OperatorContextChecker checker) { OperatorContext context = checker.getOperatorContext(); if ((!context.getParameterNames().contains("credentials")) && (!context.getParameterNames().contains("appConfigName")) + && (!context.getParameterNames().contains("jdbcUrl")) && (!context.getParameterNames().contains("jdbcProperties"))) { checker.setInvalidContext("The parameter 'jdbcUrl' is not defined. It must be set in one of these parameters: 'jdbcUrl' or 'credentials' or via the credentials parameter in an application configuration or via properties file.", null); } From 7cd4ded666c6a317718f51637c28f81069892c18 Mon Sep 17 00:00:00 2001 From: anouri Date: Wed, 24 Apr 2019 15:22:58 +0200 Subject: [PATCH 30/48] correction for #88 --- .../streamsx/jdbc/AbstractJDBCOperator.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index b732603..5243ae9 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -552,9 +552,8 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_CLASS_NAME_NOT_EXIST")); } // if jdbcProperties is relative path, convert to absolute path - if (jdbcProperties != null && !jdbcProperties.trim().isEmpty() && !jdbcProperties.startsWith(File.separator)) + if (jdbcProperties != null && !jdbcProperties.trim().isEmpty()) { - jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; getProperties(jdbcProperties); } @@ -567,8 +566,6 @@ protected void processControlPort(StreamingInput stream, Tuple tuple) thr if (jdbcUrl == null || jdbcUrl.trim().isEmpty()){ LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); } - - // System.out.println("credentials : " + credentials); // Roll back the transaction jdbcClientHelper.rollbackWithClearBatch(); @@ -686,9 +683,8 @@ private synchronized void setupJDBCConnection() throws Exception{ TRACE.log(TraceLevel.DEBUG, "Create JDBC Connection, jdbcUrl: " + jdbcUrl); try{ // if jdbcProperties is relative path, convert to absolute path - if (jdbcProperties != null && !jdbcProperties.trim().isEmpty() && !jdbcProperties.startsWith(File.separator)) + if (jdbcProperties != null && !jdbcProperties.trim().isEmpty()) { - jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; getProperties(jdbcProperties); } @@ -717,7 +713,15 @@ private synchronized void setupJDBCConnection() throws Exception{ // read properties file and set user name, password and jdbcUrl. public void getProperties(String jdbcProperties) throws IOException { try { - Properties jdbcConnectionProps = new Properties(); + // if jdbcProperties is relative path, convert to absolute path + if (!jdbcProperties.startsWith(File.separator)) + { + jdbcProperties = getOperatorContext().getPE().getApplicationDirectory() + File.separator + jdbcProperties; + } + + System.out.println("JDBC Properties file from Operator '" + getOperatorContext().getName() + "' : " + jdbcProperties); + + Properties jdbcConnectionProps = new Properties(); FileInputStream fileInput = new FileInputStream(jdbcProperties); jdbcConnectionProps.load(fileInput); fileInput.close(); @@ -731,11 +735,14 @@ public void getProperties(String jdbcProperties) throws IOException { LOGGER.log(LogLevel.ERROR, "'password' is not defined in property file: " + jdbcProperties); throw new Exception(Messages.getString("'jdbcPassword' is required to create JDBC connection.")); } - + // It supports jdbcUrl and jdbcurl jdbcUrl = jdbcConnectionProps.getProperty("jdbcUrl"); if (null == jdbcUrl){ - LOGGER.log(LogLevel.ERROR, "'jdbcUrl' is not defined in property file: " + jdbcProperties); - throw new Exception(Messages.getString("JDBC_URL_NOT_EXIST")); + jdbcUrl = jdbcConnectionProps.getProperty("jdbcurl"); + if (null == jdbcUrl){ + LOGGER.log(LogLevel.ERROR, "'jdbcUrl' is not defined in property file: " + jdbcProperties); + throw new Exception(Messages.getString("JDBC_URL_NOT_EXIST")); + } } } catch (Exception ex) { @@ -743,7 +750,7 @@ public void getProperties(String jdbcProperties) throws IOException { } } - + // read credentials and set user name, password and jdbcUrl. public void getCredentials(String credentials) throws IOException { String jsonString = credentials; @@ -771,6 +778,8 @@ public void getCredentials(String credentials) throws IOException { LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); throw new Exception(Messages.getString("JDBC_URL_NOT_EXIST")); } + System.out.println("jdbcUrl from credentials in Operator '" + getOperatorContext().getName() + "' :" + jdbcUrl); + } catch (Exception ex) { ex.printStackTrace(); } From e413a639fa2ab461dca7b5150d661f3bf3e9c2c2 Mon Sep 17 00:00:00 2001 From: Ahmad Nouri Date: Thu, 25 Apr 2019 14:28:20 +0200 Subject: [PATCH 31/48] update JDNC info.xml file version 1.5.0 --- com.ibm.streamsx.jdbc/info.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 91d2799..aaa09df 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -43,8 +43,8 @@ ++ What is new in version 1.5.0 - * Add jdbcUrl to jdbc properties. - * Support jdbcUrl and jdbcurl in credentials. + * Add **jdbcUrl** to the jdbc properties. + * Support both **jdbcUrl** and **jdbcurl** in credentials and in properties file. 1.5.0 From dcec1ad705929aa315f4677e216014c4f23d6011 Mon Sep 17 00:00:00 2001 From: Ahmad Nouri Date: Mon, 6 May 2019 14:06:46 +0200 Subject: [PATCH 32/48] JDBC: Update info.xml file: what is new in 1.5.0 --- com.ibm.streamsx.jdbc/info.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index aaa09df..9b6479b 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -44,7 +44,12 @@ ++ What is new in version 1.5.0 * Add **jdbcUrl** to the jdbc properties. - * Support both **jdbcUrl** and **jdbcurl** in credentials and in properties file. + * Supports both **jdbcUrl** and **jdbcurl** in credentials and in properties file. + * Now it is poosible to connect to a database with the following parameters: + 1- **jdbcUser**, **JdbcPassword**, and **jdbcUrl**. + 2- **jdbcProperties**: specifies the path name of the file that contains **jdbcUser**, **JdbcPassword**, **jdbcUrl** (jdbcurl) + 3- **jdbcCredentials**: A JSON string that cotains **username**, **password**, **jdbcUrl**(jdcburl) + 4- **appConfigName**: Streams application configuration that defines **username**, **password**, **jdbcUrl**(jdcburl) 1.5.0 From 6402d1291f10aeedd65bbb17a6920f6b2cdecf60 Mon Sep 17 00:00:00 2001 From: Ahmad Nouri Date: Mon, 6 May 2019 14:12:11 +0200 Subject: [PATCH 33/48] Update AbstractJDBCOperator.java --- .../java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 5243ae9..710e942 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -70,7 +70,7 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S private String jdbcPassword; // This parameter specifies the path name of the file that contains the jdbc connection properties. private String jdbcProperties; - // This parameter specifies the path name of the json file that contains the jdbc credentials . + // This parameter specifies the json string that contains the jdbc credentials username, password, jdbcurl. private String credentials; // This parameter specifies the transaction isolation level at which statement runs. // If omitted, the statement runs at level READ_UNCOMMITTED From 3985813d7f95c1e3aa04845795d0dad4c0d2785c Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 6 May 2019 15:28:19 +0200 Subject: [PATCH 34/48] jdbc properties supports jdbcurl #88 --- .../streamsx/jdbc/AbstractJDBCOperator.java | 34 +++++++++++++------ com.ibm.streamsx.jdbc/info.xml | 3 +- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 710e942..2273cfc 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -137,7 +137,7 @@ public void setJdbcClassName(String jdbcClassName){ + ". server, the domain name or IP address of the data source.\\n\\n" + ". port, the TCP/IP server port number that is assigned to the data source.\\n\\n" + ". database, a name for the data source" - + ". This parameter can be overwritten by the credentials parameter." + + ". This parameter can be overwritten by the 'credentials' and 'jdbcProperties' parameters." ) public void setJdbcUrl(String jdbcUrl){ this.jdbcUrl = jdbcUrl; @@ -146,7 +146,7 @@ public void setJdbcUrl(String jdbcUrl){ //Parameter jdbcUser @Parameter(name = "jdbcUser", optional = true, description = "This optional parameter specifies the database user on whose behalf the connection is being made. If the jdbcUser parameter is specified, it must have exactly one value of type rstring. " - + "This parameter can be overwritten by the credentials parameter." + + ". This parameter can be overwritten by the 'credentials' and 'jdbcProperties' parameters." ) public void setJdbcUser(String jdbcUser){ this.jdbcUser = jdbcUser; @@ -155,7 +155,7 @@ public void setJdbcUser(String jdbcUser){ //Parameter jdbcPassword @Parameter(name = "jdbcPassword", optional = true, description = "This optional parameter specifies the user’s password. If the jdbcPassword parameter is specified, it must have exactly one value of type rstring. " - + "This parameter can be overwritten by the credentials parameter." + + ". This parameter can be overwritten by the 'credentials' and 'jdbcProperties' parameters." ) public void setJdbcPassword(String jdbcPassword){ this.jdbcPassword = jdbcPassword; @@ -163,14 +163,15 @@ public void setJdbcPassword(String jdbcPassword){ //Parameter jdbcProperties @Parameter(name = "jdbcProperties", optional = true, - description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user', 'password' and jdbcUrl") + description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user', 'password' and jdbcUrl. " + + "It supports also 'username' or 'jdbcUser' as 'user' and 'jdbcPassword' as 'password' and 'jdbcurl' as 'jdbcUrl'.") public void setJdbcProperties(String jdbcProperties){ this.jdbcProperties = jdbcProperties; } //Parameter credentials @Parameter(name = "credentials", optional = true, - description = "This optional parameter specifies the JSON string that contains the jdbc credentials: username, password and jdbcurl. " + description = "This optional parameter specifies the JSON string that contains the jdbc credentials: 'username', 'password' and 'jdbcurl' or 'jdbcUrl'. " + "This parameter can also be specified in an application configuration.") public void setcredentials(String credentials){ this.credentials = credentials; @@ -725,22 +726,35 @@ public void getProperties(String jdbcProperties) throws IOException { FileInputStream fileInput = new FileInputStream(jdbcProperties); jdbcConnectionProps.load(fileInput); fileInput.close(); + + // It supports 'user' or 'username' or 'jdbcUser' jdbcUser = jdbcConnectionProps.getProperty("user"); if (null == jdbcUser){ - LOGGER.log(LogLevel.ERROR, "'user' is not defined in property file: " + jdbcProperties); - throw new Exception(Messages.getString("'jdbcUser' is required to create JDBC connection.")); + jdbcUser = jdbcConnectionProps.getProperty("username"); + } + if (null == jdbcUser){ + jdbcUser = jdbcConnectionProps.getProperty("jdbcUser"); + if (null == jdbcUser){ + LOGGER.log(LogLevel.ERROR, "'user' or 'username' is not defined in property file: " + jdbcProperties); + throw new Exception(Messages.getString("'jdbcUser' is required to create JDBC connection.")); + } } + + // It supports password or jdbcPassword jdbcPassword = jdbcConnectionProps.getProperty("password"); if (null == jdbcPassword){ - LOGGER.log(LogLevel.ERROR, "'password' is not defined in property file: " + jdbcProperties); - throw new Exception(Messages.getString("'jdbcPassword' is required to create JDBC connection.")); + jdbcPassword = jdbcConnectionProps.getProperty("jdbcPassword"); + if (null == jdbcPassword){ + LOGGER.log(LogLevel.ERROR, "'password' or jdbcPassword' is not defined in property file: " + jdbcProperties); + throw new Exception(Messages.getString("'jdbcPassword' is required to create JDBC connection.")); + } } // It supports jdbcUrl and jdbcurl jdbcUrl = jdbcConnectionProps.getProperty("jdbcUrl"); if (null == jdbcUrl){ jdbcUrl = jdbcConnectionProps.getProperty("jdbcurl"); if (null == jdbcUrl){ - LOGGER.log(LogLevel.ERROR, "'jdbcUrl' is not defined in property file: " + jdbcProperties); + LOGGER.log(LogLevel.ERROR, "'jdbcUrl' or 'jdbcurl' is not defined in property file: " + jdbcProperties); throw new Exception(Messages.getString("JDBC_URL_NOT_EXIST")); } } diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 9b6479b..aafdae8 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -47,7 +47,8 @@ * Supports both **jdbcUrl** and **jdbcurl** in credentials and in properties file. * Now it is poosible to connect to a database with the following parameters: 1- **jdbcUser**, **JdbcPassword**, and **jdbcUrl**. - 2- **jdbcProperties**: specifies the path name of the file that contains **jdbcUser**, **JdbcPassword**, **jdbcUrl** (jdbcurl) + 2- **jdbcProperties**: specifies the path name of the file that contains **user**, **password**, **jdbcUrl**. + It supports also 'username' or 'jdbcUser' as 'user' and 'jdbcPassword' as 'password' and 'jdbcurl' as 'jdbcUrl'. 3- **jdbcCredentials**: A JSON string that cotains **username**, **password**, **jdbcUrl**(jdcburl) 4- **appConfigName**: Streams application configuration that defines **username**, **password**, **jdbcUrl**(jdcburl) From 5fa159268136950b864bd90a4eb4cb02398630fc Mon Sep 17 00:00:00 2001 From: anouri Date: Tue, 7 May 2019 13:30:31 +0200 Subject: [PATCH 35/48] JDBC spldoc improved --- .../streamsx/jdbc/AbstractJDBCOperator.java | 47 ++++++++++++------- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 18 ++++--- com.ibm.streamsx.jdbc/info.xml | 20 ++++---- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 2273cfc..e7461b8 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -118,14 +118,20 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S //Parameter jdbcDriverLib @Parameter(name = "jdbcDriverLib", optional = false, - description = "This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string. It is recommended to set the value of this parameter without slash at begin, like 'opt/db2jcc4.jar'. In this case the SAB file will contain the driver libraries.") + description = "This required parameter of type rstring specifies the path and the file name of jdbc driver librarirs with comma separated in one string. It is recommended to set the value of this parameter without slash at begin, like 'opt/db2jcc4.jar'. In this case the SAB file will contain the driver libraries.\\n\\n" + + "Please check the documentation of database vendors and download the latest version of jdbc drivers. ") public void setJdbcDriverLib(String jdbcDriverLib){ this.jdbcDriverLib = jdbcDriverLib; } //Parameter jdbcClassName @Parameter(name = "jdbcClassName", optional = false, - description = "This required parameter specifies the class name for jdbc driver and it must have exactly one value of type rstring.") + description = "This required parameter specifies the class name for jdbc driver and it must have exactly one value of type rstring.\\n\\n" + + "The jdbc class names are defined by database vendors: \\n\\n" + + "For example: \\n\\n " + + "**DB2** com.ibm.db2.jcc.DB2Driver \\n\\n" + + "**ORACLE** oracle.jdbc.driver.OracleDriver\\n\\n" + + "**PostgreSQL** org.postgresql.Driver") public void setJdbcClassName(String jdbcClassName){ this.jdbcClassName = jdbcClassName; } @@ -133,11 +139,12 @@ public void setJdbcClassName(String jdbcClassName){ //Parameter jdbcUrl @Parameter(name = "jdbcUrl", optional = true, description = "This parameter specifies the database url that JDBC driver uses to connect to a database and it must have exactly one value of type rstring. The syntax of jdbc url is specified by database vendors. For example, jdbc:db2://:/\\n\\n" - + ". jdbc:db2 indicates that the connection is to a DB2 for z/OS, DB2 for Linux, UNIX, and Windows.\\n\\n" - + ". server, the domain name or IP address of the data source.\\n\\n" - + ". port, the TCP/IP server port number that is assigned to the data source.\\n\\n" - + ". database, a name for the data source" - + ". This parameter can be overwritten by the 'credentials' and 'jdbcProperties' parameters." + + " **jdbc:db2** indicates that the connection is to a DB2 for z/OS, DB2 for Linux, UNIX, and Windows.\\n\\n" + + " **server**, the domain name or IP address of the data source.\\n\\n" + + " **port**, the TCP/IP server port number that is assigned to the data source.\\n\\n" + + " **database**, a name for the data source.\\n\\n" + + " For details about the jdbcUrl string please check the documentation of database vendors\\n\\n" + + " This parameter can be overwritten by the **credentials** and **jdbcProperties** parameters." ) public void setJdbcUrl(String jdbcUrl){ this.jdbcUrl = jdbcUrl; @@ -145,8 +152,8 @@ public void setJdbcUrl(String jdbcUrl){ //Parameter jdbcUser @Parameter(name = "jdbcUser", optional = true, - description = "This optional parameter specifies the database user on whose behalf the connection is being made. If the jdbcUser parameter is specified, it must have exactly one value of type rstring. " - + ". This parameter can be overwritten by the 'credentials' and 'jdbcProperties' parameters." + description = "This optional parameter specifies the database user on whose behalf the connection is being made. If the **jdbcUser** parameter is specified, it must have exactly one value of type rstring.\\n\\n" + + "This parameter can be overwritten by the **credentials** and **jdbcProperties** parameters." ) public void setJdbcUser(String jdbcUser){ this.jdbcUser = jdbcUser; @@ -155,7 +162,7 @@ public void setJdbcUser(String jdbcUser){ //Parameter jdbcPassword @Parameter(name = "jdbcPassword", optional = true, description = "This optional parameter specifies the user’s password. If the jdbcPassword parameter is specified, it must have exactly one value of type rstring. " - + ". This parameter can be overwritten by the 'credentials' and 'jdbcProperties' parameters." + + ". This parameter can be overwritten by the **credentials** and **jdbcProperties** parameters." ) public void setJdbcPassword(String jdbcPassword){ this.jdbcPassword = jdbcPassword; @@ -163,7 +170,7 @@ public void setJdbcPassword(String jdbcPassword){ //Parameter jdbcProperties @Parameter(name = "jdbcProperties", optional = true, - description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: 'user', 'password' and jdbcUrl. " + description = "This optional parameter specifies the path name of the file that contains the jdbc connection properties: **user**, **password** and **jdbcUrl**. \\n\\n " + "It supports also 'username' or 'jdbcUser' as 'user' and 'jdbcPassword' as 'password' and 'jdbcurl' as 'jdbcUrl'.") public void setJdbcProperties(String jdbcProperties){ this.jdbcProperties = jdbcProperties; @@ -171,7 +178,7 @@ public void setJdbcProperties(String jdbcProperties){ //Parameter credentials @Parameter(name = "credentials", optional = true, - description = "This optional parameter specifies the JSON string that contains the jdbc credentials: 'username', 'password' and 'jdbcurl' or 'jdbcUrl'. " + description = "This optional parameter specifies the JSON string that contains the jdbc credentials: **username**, **password** and **jdbcurl** or **jdbcUrl**. \\n\\n" + "This parameter can also be specified in an application configuration.") public void setcredentials(String credentials){ this.credentials = credentials; @@ -180,28 +187,36 @@ public void setcredentials(String credentials){ //Parameter isolationLevel @Parameter(name = "isolationLevel", optional = true, - description = "This optional parameter specifies the transaction isolation level at which statement runs. If omitted, the statement runs at level READ_UNCOMMITTED.") + description = "This optional parameter specifies the transaction isolation level at which statement runs. If omitted, the statement runs at level **READ_UNCOMMITTED**.") public void setIsolationLevel(String isolationLevel){ this.isolationLevel = isolationLevel; } //Parameter sqlFailureAction @Parameter(name = "sqlFailureAction", optional = true, - description = "This optional parameter has values of log, rollback and terminate. If not specified, log is assumed. If sqlFailureAction is log, the error is logged, and the error condition is cleared. If sqlFailureAction is rollback, the error is logged, the transaction rolls back. If sqlFailureAction is terminate, the error is logged, the transaction rolls back and the operator terminates.") + description = "This optional parameter has values of log, rollback and terminate. If not specified, log is assumed. \\n\\n" + + "If sqlFailureAction is **log**, the error is logged, and the error condition is cleared. \\n\\n" + + "If sqlFailureAction is **rollback**, the error is logged, the transaction rolls back. \\n\\n" + + "If sqlFailureAction is **terminate**, the error is logged, the transaction rolls back and the operator terminates.") public void setSqlFailureAction(String sqlFailureAction){ this.sqlFailureAction = sqlFailureAction; } //Parameter reconnectionPolicy @Parameter(name = "reconnectionPolicy", optional = true, - description = "This optional parameter specifies the policy that is used by the operator to handle database connection failures. The valid values are: `NoRetry`, `InfiniteRetry`, and `BoundedRetry`. The default value is `BoundedRetry`. If `NoRetry` is specified and a database connection failure occurs, the operator does not try to connect to the database again. The operator shuts down at startup time if the initial connection attempt fails. If `BoundedRetry` is specified and a database connection failure occurs, the operator tries to connect to the database again up to a maximum number of times. The maximum number of connection attempts is specified in the **reconnectionBound** parameter. The sequence of connection attempts occurs at startup time. If a connection does not exist, the sequence of connection attempts also occurs before each operator is run. If `InfiniteRetry` is specified, the operator continues to try and connect indefinitely until a connection is made. This behavior blocks all other operator operations while a connection is not successful. For example, if an incorrect connection password is specified in the connection configuration document, the operator remains in an infinite startup loop until a shutdown is requested.") + description = "This optional parameter specifies the policy that is used by the operator to handle database connection failures. The valid values are: **NoRetry**, **InfiniteRetry**, and **BoundedRetry**. \\n\\n" + + "The default value is **BoundedRetry**. If **NoRetry** is specified and a database connection failure occurs, the operator does not try to connect to the database again. \\n\\n" + + "The operator shuts down at startup time if the initial connection attempt fails. If **BoundedRetry** is specified and a database connection failure occurs, the operator tries to connect to the database again up to a maximum number of times. \\n\\n" + + "The maximum number of connection attempts is specified in the **reconnectionBound** parameter. The sequence of connection attempts occurs at startup time. If a connection does not exist, the sequence of connection attempts also occurs before each operator is run. \\n\\n" + + "If **InfiniteRetry** is specified, the operator continues to try and connect indefinitely until a connection is made. This behavior blocks all other operator operations while a connection is not successful. \\n\\n" + + "For example, if an incorrect connection password is specified in the connection configuration document, the operator remains in an infinite startup loop until a shutdown is requested.") public void setReconnectionPolicy(String reconnectionPolicy){ this.reconnectionPolicy = reconnectionPolicy; } //Parameter reconnectionBound @Parameter(name = "reconnectionBound", optional = true, - description = "This optional parameter specifies the number of successive connection attempts that occur when a connection fails or a disconnect occurs. It is used only when the **reconnectionPolicy** parameter is set to `BoundedRetry`; otherwise, it is ignored. The default value is `5`.") + description = "This optional parameter specifies the number of successive connection attempts that occur when a connection fails or a disconnect occurs. It is used only when the **reconnectionPolicy** parameter is set to **BoundedRetry**; otherwise, it is ignored. The default value is **5**.") public void setReconnectionBound(int reconnectionBound){ this.reconnectionBound = reconnectionBound; } diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index e0a44e7..cb15500 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -59,13 +59,13 @@ @PrimitiveOperator(description = "The **JDBCRun** operator runs a user-defined SQL statement that is based on an input tuple.\\n\\n" + " The statement is run once for each input tuple received.\\n\\n" + " Result sets that are produced by the statement are emitted as output stream tuples.\\n\\n" - + " The `JDBCRun` operator is commonly used to update, merge, and delete database management system (DBMS) records.\\n" + + " The `JDBCRun` operator is commonly used to update, merge, and delete database management system (DBMS) records.\\n\\n" + " This operator is also used to retrieve records, create and drop tables, and to call stored procedures.\\n\\n" + " Behavior in a **consistent region**:\\n\\n" - + " The **JDBCRun** operator can be used in a consistent region. It cannot be the start operator of a consistent region." - + " In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets." - + " On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port." - + " On checkpoint: A database commit is performed." + + " The **JDBCRun** operator can be used in a consistent region. It cannot be the start operator of a consistent region.\\n\\n" + + " In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets.\\n\\n" + + " On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port.\\n\\n" + + " On checkpoint: A database commit is performed.\\n\\n" + " On reset: Any pending statements are discarded. A rollback is performed.\\n\\n" + " The new version of toolkit 1.3.x. supports also `optional type`.\\n\\n" + " The SPL applications based on new JDBC toolkit and created with a new Streams that supports **optional type**" @@ -175,7 +175,13 @@ public class JDBCRun extends AbstractJDBCOperator { // Parameter commitPolicy @Parameter(name = "commitPolicy", optional = true, - description = "This parameter specifies the commit policy that should be used when the operator is in a consistent region. If set to *OnCheckpoint*, then commits will only occur during checkpointing. If set to *OnTransactionAndCheckpoint*, commits will occur during checkpointing as well as whenever the **transactionCount** or **commitInterval** are reached. The default value is *OnCheckpoint*. It is recommended that the *OnTransactionAndCheckpoint* value be set if the tables that the statements are being executed against can tolerate duplicate entries as these parameter value may cause the same statements to be executed if the operator is reset. It is also highly recommended that the **transactionCount** parameter not be set to a value greater than 1 when the policy is *onTransactionAndCheckpoint*, as this can lead to some statements not being executed in the event of a reset. This parameter is ignored if the operator is not in a consistent region. The default value for this parameter is *OnCheckpoint*.") + description = "This parameter specifies the commit policy that should be used when the operator is in a consistent region. \\n\\n" + + "If set to *OnCheckpoint*, then commits will only occur during checkpointing. \\n\\n" + + "If set to *OnTransactionAndCheckpoint*, commits will occur during checkpointing as well as whenever the **transactionCount** or **commitInterval** are reached. \\n\\n" + + "The default value is *OnCheckpoint*.\\n\\n" + + "It is recommended that the *OnTransactionAndCheckpoint* value be set if the tables that the statements are being executed against can tolerate duplicate entries as these parameter value may cause the same statements to be executed if the operator is reset. \\n\\n" + + "It is also highly recommended that the **transactionCount** parameter not be set to a value greater than 1 when the policy is *onTransactionAndCheckpoint*, as this can lead to some statements not being executed in the event of a reset. \\n\\n" + + "This parameter is ignored if the operator is not in a consistent region. The default value for this parameter is *OnCheckpoint*.") public void setCommitPolicy(CommitPolicy commitPolicy) { this.commitPolicy = commitPolicy; } diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index aafdae8..d7d8278 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -27,6 +27,8 @@ It supports also **phoenix jdbc** to connect to the HBASE database. The **JDBCRun** operator has been improved in version 1.4.0 with a new parameter **checkConnection**. This optional parameter specifies whether a **checkConnection** thread should be start. It checks periodically the status of JDBC connection. The JDBCRun sends in case of any failure a SqlCode and a message to SPL application. + + ++ What is new: ++ What is new in version 1.4.3 @@ -37,20 +39,22 @@ * support **Streams application configuration** - ++ What is new in version 1.4.4 + ++ What is new in version 1.4.4 + * Insert BLOB bug fixed #82 -++ What is new in version 1.5.0 - + ++ What is new in version 1.5.0 + * Add **jdbcUrl** to the jdbc properties. * Supports both **jdbcUrl** and **jdbcurl** in credentials and in properties file. * Now it is poosible to connect to a database with the following parameters: - 1- **jdbcUser**, **JdbcPassword**, and **jdbcUrl**. - 2- **jdbcProperties**: specifies the path name of the file that contains **user**, **password**, **jdbcUrl**. - It supports also 'username' or 'jdbcUser' as 'user' and 'jdbcPassword' as 'password' and 'jdbcurl' as 'jdbcUrl'. - 3- **jdbcCredentials**: A JSON string that cotains **username**, **password**, **jdbcUrl**(jdcburl) - 4- **appConfigName**: Streams application configuration that defines **username**, **password**, **jdbcUrl**(jdcburl) + + * 1- **jdbcUser**, **JdbcPassword**, and **jdbcUrl**. + * 2- **jdbcProperties**: specifies the path name of the file that contains **user**, **password**, **jdbcUrl**. + It supports also 'username' or 'jdbcUser' as 'user' and 'jdbcPassword' as 'password' and 'jdbcurl' as 'jdbcUrl'. + * 3- **jdbcCredentials**: A JSON string that cotains **username**, **password**, **jdbcUrl**(jdcburl) + * 4- **appConfigName**: Streams application configuration that defines **username**, **password**, **jdbcUrl**(jdcburl) 1.5.0 From 7364a4434fac0163bf1c53982107327962ad5bd4 Mon Sep 17 00:00:00 2001 From: anouri Date: Tue, 7 May 2019 14:04:03 +0200 Subject: [PATCH 36/48] JDBC spldoc updated. --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 10 ++++++---- com.ibm.streamsx.jdbc/info.xml | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index cb15500..4952e8b 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -59,14 +59,16 @@ @PrimitiveOperator(description = "The **JDBCRun** operator runs a user-defined SQL statement that is based on an input tuple.\\n\\n" + " The statement is run once for each input tuple received.\\n\\n" + " Result sets that are produced by the statement are emitted as output stream tuples.\\n\\n" - + " The `JDBCRun` operator is commonly used to update, merge, and delete database management system (DBMS) records.\\n\\n" + + " The **JDBCRun** operator is commonly used to update, merge, and delete database management system (DBMS) records.\\n\\n" + " This operator is also used to retrieve records, create and drop tables, and to call stored procedures.\\n\\n" + + " it is strongly recommended before you begin with the implementation of a SPL application on JDBCRun operator, read the **documentation of database vendors**.\\n\\n" + + " Every database vendor delivers one or more JAR libraries as jdbc driver. Please check the version of your database server and the version of JDBC driver libraries.\\n\\n" + " Behavior in a **consistent region**:\\n\\n" + " The **JDBCRun** operator can be used in a consistent region. It cannot be the start operator of a consistent region.\\n\\n" + " In a consistent region, the configured value of the transactionSize is ignored. Instead, database commits are performed (when supported by the DBMS) on consistent region checkpoints, and database rollbacks are performed on consistent region resets.\\n\\n" - + " On drain: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port.\\n\\n" - + " On checkpoint: A database commit is performed.\\n\\n" - + " On reset: Any pending statements are discarded. A rollback is performed.\\n\\n" + + " On **drain**: If there are any pending statements, they are run. If the statement generates a result set and the operator has an output port, tuples are generated from the results and submitted to the output port. If the operator has an error output port and the statement generates any errors, tuples are generated from the errors and submitted to the error output port.\\n\\n" + + " On **checkpoint**: A database commit is performed.\\n\\n" + + " On **reset**: Any pending statements are discarded. A rollback is performed.\\n\\n" + " The new version of toolkit 1.3.x. supports also `optional type`.\\n\\n" + " The SPL applications based on new JDBC toolkit and created with a new Streams that supports **optional type**" + " are able to write/read 'null' to/from a `nullable` column in a table. ") diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index d7d8278..5c1a1f6 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -9,6 +9,11 @@ The **JDBCRun** operator is commonly used to update, merge, and delete database management system (DBMS) records. This operator is also used to retrieve records, create and drop tables, and to call stored procedures. + + it is strongly recommended before you begin with the implementation of a SPL application on JDBCRun operator, read the **documentation of database vendors**. + + Every database vendor delivers one or more JAR libraries as jdbc driver. Please check the version of your database server and the version of JDBC driver libraries. + Behavior in a consistent region: From d357f8cbc834e3e2d3fbd105dcb00491e3b440cc Mon Sep 17 00:00:00 2001 From: Ahmad Nouri Date: Tue, 7 May 2019 14:34:35 +0200 Subject: [PATCH 37/48] JDBC merge master to develop (#94) * JDBC: Merge develop to master (#90) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * develop to master #88 * JDBC merge develop to master (#91) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * JDBC: Update info.xml file: what is new in 1.5.0 * Update AbstractJDBCOperator.java * jdbc properties supports jdbcurl #88 * JDBC spldoc updated. * JDCB merge develop to master (#92) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * JDBC: Update info.xml file: what is new in 1.5.0 * Update AbstractJDBCOperator.java * jdbc properties supports jdbcurl #88 * JDBC spldoc improved * JDBC spldoc updated. * JDBC merge develop to master (#93) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * JDBC: Update info.xml file: what is new in 1.5.0 * Update AbstractJDBCOperator.java * jdbc properties supports jdbcurl #88 * JDBC spldoc improved * JDBC spldoc updated. From d52a315768b53988f43d3e8198762e2f3a88d2d9 Mon Sep 17 00:00:00 2001 From: anouri Date: Tue, 28 May 2019 11:52:08 +0200 Subject: [PATCH 38/48] merge master to develop --- .../streamsx/jdbc/AbstractJDBCOperator.java | 52 +++++++++++++++++-- .../ibm/streamsx/jdbc/JDBCClientHelper.java | 19 +++++-- com.ibm.streamsx.jdbc/info.xml | 6 ++- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index e7461b8..49e341e 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -92,6 +92,8 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S // the operator will be wait before trying to reconnect. // If not specified, the default value is 10.0. private double reconnectionInterval = IJDBCConstants.RECONN_INTERVAL_DEFAULT; + private String pluginName = null; + private int securityMechanism = -1; // Create an instance of JDBCConnectionhelper protected JDBCClientHelper jdbcClientHelper; @@ -112,6 +114,8 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S // SSL parameters private String keyStore; private String trustStore; + private String keyStoreType = null; + private String trustStoreType = null; private String keyStorePassword; private String trustStorePassword; private boolean sslConnection; @@ -250,6 +254,28 @@ public String getKeyStore() { return keyStore; } + // Parameter keyStoreType + @Parameter(name = "keyStoreType" , optional = true, + description = "This optional parameter specifies the type of the keyStore file, for example 'PKCS12'. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setKeyStoreType(String keyStoreType) { + this.keyStoreType = keyStoreType; + } + + public String getKeyStoreType() { + return keyStoreType; + } + + // Parameter trustStoreType + @Parameter(name = "trustStoreType" , optional = true, + description = "This optional parameter specifies the type of the trustStore file, for example 'PKCS12'. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setTrustStoreType(String trustStoreType) { + this.trustStoreType = trustStoreType; + } + + public String getTrustStoreType() { + return trustStoreType; + } + // Parameter keyStorePassword @Parameter(name = "keyStorePassword", optional = true, description = "This parameter specifies the password for the keyStore given by the **keyStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") @@ -293,7 +319,17 @@ public void setAppConfigName(String appConfigName) { this.appConfigName = appConfigName; } - + // Parameter pluginName + @Parameter(name = "pluginName", optional = true, description = "Specifies the name of security plugin. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setPluginName(String pluginName) { + this.pluginName = pluginName; + } + + // Parameter securityMechanism + @Parameter(name = "securityMechanism", optional = true, description = "Specifies the value of securityMechanism as Integer. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + public void setSecurityMechanism(int securityMechanism) { + this.securityMechanism = securityMechanism; + } /* * The method checkParametersRuntime @@ -427,12 +463,20 @@ public synchronized void initialize(OperatorContext context) loadAppConfig(context); if (isSslConnection()) { - if (context.getParameterNames().contains("keyStore")) + if (context.getParameterNames().contains("keyStore")) { System.setProperty("javax.net.ssl.keyStore", getAbsolutePath(getKeyStore())); + if (null != getKeyStoreType()) { + System.setProperty("javax.net.ssl.keyStoreType", getKeyStoreType()); + } + } if (context.getParameterNames().contains("keyStorePassword")) System.setProperty("javax.net.ssl.keyStorePassword", getKeyStorePassword()); - if (context.getParameterNames().contains("trustStore")) + if (context.getParameterNames().contains("trustStore")) { System.setProperty("javax.net.ssl.trustStore", getAbsolutePath(getTrustStore())); + if (null != getTrustStoreType()) { + System.setProperty("javax.net.ssl.trustStoreType", getTrustStoreType()); + } + } if (context.getParameterNames().contains("trustStorePassword")) System.setProperty("javax.net.ssl.trustStorePassword", getTrustStorePassword()); } @@ -713,7 +757,7 @@ private synchronized void setupJDBCConnection() throws Exception{ LOGGER.log(LogLevel.ERROR, Messages.getString("JDBC_URL_NOT_EXIST")); } - jdbcClientHelper = new JDBCClientHelper(jdbcClassName, jdbcUrl, jdbcUser, jdbcPassword, sslConnection, jdbcProperties, isAutoCommit(), isolationLevel, reconnectionPolicy, reconnectionBound, reconnectionInterval); + jdbcClientHelper = new JDBCClientHelper(jdbcClassName, jdbcUrl, jdbcUser, jdbcPassword, sslConnection, jdbcProperties, isAutoCommit(), isolationLevel, reconnectionPolicy, reconnectionBound, reconnectionInterval, pluginName, securityMechanism); jdbcClientHelper.createConnection(); }catch (FileNotFoundException e){ diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java index be8678d..3bca69c 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCClientHelper.java @@ -66,6 +66,8 @@ public class JDBCClientHelper { // The time period in seconds which it will be wait before trying to reconnect. // If not specified, the default value is 10.0. private double reconnectionInterval = IJDBCConstants.RECONN_INTERVAL_DEFAULT; + private String pluginName = null; + private int securityMechanism = -1; //The time in seconds to wait for the database operation used to validate the connection to complete. private int checkConnectionTimeOut = 2; @@ -79,7 +81,8 @@ public class JDBCClientHelper { // This constructor sets the jdbc connection information with reconnection policy public JDBCClientHelper(String jdbcClassName, String jdbcUrl, String jdbcUser, String jdbcPassword, boolean sslConnection, String jdbcProperties, boolean autoCommit, String isolationLevel, - String reconnectionPolicy, int reconnectionBound, double reconnectionInterval) { + String reconnectionPolicy, int reconnectionBound, double reconnectionInterval, + String pluginName, int securityMechanism) { this.jdbcClassName = jdbcClassName; this.jdbcUrl = jdbcUrl; this.jdbcUser = jdbcUser; @@ -90,6 +93,8 @@ public JDBCClientHelper(String jdbcClassName, String jdbcUrl, this.reconnectionPolicy = reconnectionPolicy; this.reconnectionBound = reconnectionBound; this.reconnectionInterval = reconnectionInterval; + this.pluginName = pluginName; + this.securityMechanism = securityMechanism; } // getter for connect @@ -117,9 +122,17 @@ public synchronized void createConnection() throws Exception, SQLException{ // add sslConnection to properties - if (sslConnection) + if (sslConnection) { jdbcConnectionProps.put("sslConnection","true"); - + if (null != pluginName) { + TRACE.log(TraceLevel.INFO, "pluginName = " + pluginName); + jdbcConnectionProps.put("pluginName", pluginName); + } + if (-1 != securityMechanism) { + TRACE.log(TraceLevel.INFO,"securityMechanism = " + securityMechanism); + jdbcConnectionProps.put("securityMechanism", new String(""+securityMechanism+"")); + } + } //Establish connection int nConnectionAttempts = 0; diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 5c1a1f6..ed48d91 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -61,8 +61,12 @@ * 3- **jdbcCredentials**: A JSON string that cotains **username**, **password**, **jdbcUrl**(jdcburl) * 4- **appConfigName**: Streams application configuration that defines **username**, **password**, **jdbcUrl**(jdcburl) + ++ What is new in version 1.6.0 + + * The JDBCRun operators provides new parameters for SSL configuration: **keyStoreType**, **trustStoreType**, **securityMechanism**, **pluginName**. + - 1.5.0 + 1.6.0 4.2.0.0 From 13ce5dabb4f645973f19fa6fa2e785c7e3ae80d1 Mon Sep 17 00:00:00 2001 From: Ahmad Nouri Date: Tue, 28 May 2019 11:53:45 +0200 Subject: [PATCH 39/48] JDBC merge master to develop (#97) * JDBC: Merge develop to master (#90) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * develop to master #88 * JDBC merge develop to master (#91) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * JDBC: Update info.xml file: what is new in 1.5.0 * Update AbstractJDBCOperator.java * jdbc properties supports jdbcurl #88 * JDBC spldoc updated. * JDCB merge develop to master (#92) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * JDBC: Update info.xml file: what is new in 1.5.0 * Update AbstractJDBCOperator.java * jdbc properties supports jdbcurl #88 * JDBC spldoc improved * JDBC spldoc updated. * JDBC merge develop to master (#93) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * Fix SPLDOC typo in checkConnection parameter #74 * Add new parameter jdbcCredentials * Add new parameter jdbcCredentials * info.xml updated parameter jdbcCredentials * JDBC SPLDOC improved #76 * java.net.ConnectException not catched #57 * support application configuration * exception handling improved. * loop in exception handling fixed * credentials is a string and not a file * Document JDBC driver setup. #77 * corrections for #79 #78 * merge master to develop * remove spldocs from develop branch * removed lib from develop branch * copy from master to develop * merge jdbc master branche to develop (#83) * Update links in JDBC README.md file * JDBC checkConnection (#70) * check JDBC connection #69 * check JDBC connection #69 * Add getDBMajorVersion only for test * added checkConnectionTimeOut * JDBC info.xml updated. * JDBC info.xml file updated. * streamsx.jdbc 1.4.0 SPLDOC upgraded * if (checkConnectionThread != null) -> stop Thread * db2 jdbc driver upgraded * JDBC version number incremented * resolves #71 * resolve #71 * https://github.com/IBMStreams/streamsx.jdbc/issues/71 * corrections for #79 #78 * #43 * add jar file to .gitignor * add toolkit.xml to gitignor * spldoc and lib removed from repository. * remove spldoc from samples * add tmp to .gitignor * credentioals is a JSON string * README.md updated for 4.3 documentation * credentials parameter is JSON string * Add conversion for SPL blobs, issue #8 * Add conversion from sqlblob to splblob (on select), issue #82 * release number increased #82 * check sqlFailureAction before rollback * Corrections for issues #86 #87 #88 * correction for #88 * correction for #88 * update JDNC info.xml file version 1.5.0 * JDBC: Update info.xml file: what is new in 1.5.0 * Update AbstractJDBCOperator.java * jdbc properties supports jdbcurl #88 * JDBC spldoc improved * JDBC spldoc updated. * resolves #95 (#96) From a8de0f337e2889f4c9d6303872afd1bbcfd610fc Mon Sep 17 00:00:00 2001 From: anouri Date: Wed, 29 May 2019 13:40:09 +0200 Subject: [PATCH 40/48] new parameter idleSessionTimeOut added #55 --- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 97 ++++++++++++++++++- com.ibm.streamsx.jdbc/info.xml | 6 +- 2 files changed, 98 insertions(+), 5 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index 4952e8b..a1536bc 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -168,9 +168,13 @@ public class JDBCRun extends AbstractJDBCOperator { private String[] sqlStatusErrorAttrs = null; // check connection private boolean checkConnection = false; - + private int idleSessionTimeOutSec = 0; + private int idleSessionTimeOutTimer = 0; + private Thread checkConnectionThread = null; + private Thread idleSessionTimeOutSecThread = null; + private CommitPolicy commitPolicy = DEFAULT_COMMIT_POLICY; @@ -262,7 +266,19 @@ public boolean getCheckConnection() { return checkConnection; } - + // Parameter idleSessionTimeOut + @Parameter(name = "idleSessionTimeOut", optional = true, + description = "This optional parameter specifies the Idle Session Timeout in seconds. Once the idle time value is reached, teh opearotor close teh database connection. Th timer restarts after a new query.") + public void setidleSessionTimeOut(int idleSessionTimeOut) { + this.idleSessionTimeOutSec = idleSessionTimeOut; + } + + public int getidleSessionTimeOut() { + return idleSessionTimeOutSec; + } + + + /* * The method checkErrorOutputPort validates that the stream on error output * port contains the optional attribute of type which is the incoming tuple, @@ -321,6 +337,10 @@ public static void checkDeleteAll(OperatorContextChecker checker) { // if (!checker.checkDependentParameters("jdbcDriverLib", "jdbcUrl")){ checker.setInvalidContext(Messages.getString("JDBC_URL_NOT_EXIST"), null); } + + // If checkConnection is set as parameter, idleSessionTimeOut can not be set + checker.checkExcludedParameters("checkConnection", "idleSessionTimeOut"); + } @ContextCheck(compile = false, runtime = true) @@ -457,6 +477,10 @@ public synchronized void initialize(OperatorContext context) throws Exception { if (checkConnection) { startCheckConnection(context); } + + if (idleSessionTimeOutSec > 1) { + startidleSessionTimeOutThread(context); + } // set the data output port dataOutputPort = getOutput(0); @@ -536,7 +560,63 @@ public void run() { checkConnectionThread.start(); } - + + /** + * startidleSessionTimeOutThread starts a thread to check the JDBC connection. + * @param context + */ + public void startidleSessionTimeOutThread(OperatorContext context) { + idleSessionTimeOutSecThread = context.getThreadFactory().newThread(new Runnable() { + + + @Override + public void run() { + while(true) + { + // check the JDBC connection every 1 seconds + try + { + Thread.sleep(1000); + idleSessionTimeOutTimer ++; + // System.out.println("idleSessionTimeOut " + idleSessionTimeOutSec + " idleSessionTimeOutTimer " + idleSessionTimeOutTimer); + } + catch(InterruptedException ex) + { + Thread.currentThread().interrupt(); + } + + try + { + if (idleSessionTimeOutTimer > idleSessionTimeOutSec){ + + if (jdbcClientHelper.isValidConnection()) { + try + { + // if connection is valid + // close the connection + Thread.sleep(1000); + jdbcClientHelper.closeConnection(); + System.out.println("close connection idleSessionTimeOut " + idleSessionTimeOutSec + " idleSessionTimeOutTimer " + idleSessionTimeOutTimer); + } + catch (Exception e2) { + e2.printStackTrace(); + + } + } + } + } catch (SQLException e3) { + e3.printStackTrace(); + } + } // end while + } // end of run() + + }); + + // start idleSessionTimeOutSecThread + idleSessionTimeOutSecThread.start(); + } + + /** * Process control port * he port allows operator to change JDBC connection information at runtime @@ -548,7 +628,6 @@ public void run() { @Override protected void processControlPort(StreamingInput stream, Tuple tuple) throws Exception { super.processControlPort(stream, tuple); - // Initiate PreparedStatement initPreparedStatement(); } @@ -568,6 +647,7 @@ protected boolean isAutoCommit() { // Process input tuple protected void processTuple(StreamingInput stream, Tuple tuple) throws Exception { + idleSessionTimeOutTimer = 0; commitLock.lock(); try { @@ -1073,6 +1153,15 @@ public synchronized void shutdown() throws Exception { checkConnectionThread.interrupt(); } } + + // stop idleSessionTimeOutThread + if (idleSessionTimeOutSecThread != null) { + if (idleSessionTimeOutSecThread.isAlive()) { + idleSessionTimeOutSecThread.interrupt(); + } + } + + super.shutdown(); } diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index ed48d91..1c9b55a 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -63,7 +63,11 @@ ++ What is new in version 1.6.0 - * The JDBCRun operators provides new parameters for SSL configuration: **keyStoreType**, **trustStoreType**, **securityMechanism**, **pluginName**. + * The JDBCRun operator provides new parameters for SSL configuration: **keyStoreType**, **trustStoreType**, **securityMechanism**, **pluginName**. + + ++ What is new in version 1.7.0 + + * The JDBCRun operator provides a new parameter **idleSessionTimeOut**. Once the idle time value is reached, it close the database connection . 1.6.0 From c0f0a3cc7259d037b461a7da29eaf1e7f2681eab Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 3 Jun 2019 16:21:15 +0200 Subject: [PATCH 41/48] add toolkit.xml to .gitignore --- samples/JDBCSample/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/JDBCSample/.gitignore b/samples/JDBCSample/.gitignore index 53647f5..b6bef71 100644 --- a/samples/JDBCSample/.gitignore +++ b/samples/JDBCSample/.gitignore @@ -1,7 +1,7 @@ /.toolkitList /output/ /.apt_generated/ -toolkit.xml +/toolkit.xml /doc/ From 560ae92dbfb4d016015859ca2a3f5af49ca7a903 Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 3 Jun 2019 16:23:05 +0200 Subject: [PATCH 42/48] removed toolkit.xml from samples --- samples/JDBCSample/toolkit.xml | 59 ---------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 samples/JDBCSample/toolkit.xml diff --git a/samples/JDBCSample/toolkit.xml b/samples/JDBCSample/toolkit.xml deleted file mode 100644 index 00fc5d3..0000000 --- a/samples/JDBCSample/toolkit.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - JDBCSample - - - - - - - - ***************************************************************************** - - - - - - - - - - - ***************************************************************************** - - - - - - - - - - ***************************************************************************** - - - - - - - - - - - - - - - - - - - - - - - - - From 470eddb6a3c586db34e4fb9020e516eadda833df Mon Sep 17 00:00:00 2001 From: anouri Date: Mon, 3 Jun 2019 16:27:20 +0200 Subject: [PATCH 43/48] The version of streamsx.jdbc increased 1.7.0 --- com.ibm.streamsx.jdbc/info.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 1c9b55a..840a4d7 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -70,7 +70,7 @@ * The JDBCRun operator provides a new parameter **idleSessionTimeOut**. Once the idle time value is reached, it close the database connection . - 1.6.0 + 1.7.0 4.2.0.0 From fa2fc35ac39b109e3770a2fa0bf76b5a6cdf92af Mon Sep 17 00:00:00 2001 From: anouri Date: Thu, 6 Jun 2019 10:42:01 +0200 Subject: [PATCH 44/48] check idleSessionTimeOut parameter #55 --- .../src/com/ibm/streamsx/jdbc/JDBCRun.java | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index a1536bc..addd1da 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -168,12 +168,12 @@ public class JDBCRun extends AbstractJDBCOperator { private String[] sqlStatusErrorAttrs = null; // check connection private boolean checkConnection = false; - private int idleSessionTimeOutSec = 0; + private int idleSessionTimeOutMinute = 0; private int idleSessionTimeOutTimer = 0; private Thread checkConnectionThread = null; - private Thread idleSessionTimeOutSecThread = null; + private Thread idleSessionTimeOutThread = null; @@ -268,17 +268,16 @@ public boolean getCheckConnection() { // Parameter idleSessionTimeOut @Parameter(name = "idleSessionTimeOut", optional = true, - description = "This optional parameter specifies the Idle Session Timeout in seconds. Once the idle time value is reached, teh opearotor close teh database connection. Th timer restarts after a new query.") + description = "This optional parameter specifies the Idle Session Timeout in minute. Once the idle time value is reached, teh opearotor close teh database connection. Th timer restarts after a new query.") public void setidleSessionTimeOut(int idleSessionTimeOut) { - this.idleSessionTimeOutSec = idleSessionTimeOut; + this.idleSessionTimeOutMinute = idleSessionTimeOut; } public int getidleSessionTimeOut() { - return idleSessionTimeOutSec; + return idleSessionTimeOutMinute; } - /* * The method checkErrorOutputPort validates that the stream on error output * port contains the optional attribute of type which is the incoming tuple, @@ -397,6 +396,12 @@ public static void checkParameterAttributes(OperatorContextChecker checker) { } + if (!checker.getOperatorContext().getParameterValues("idleSessionTimeOut").isEmpty()) { + if (Integer.valueOf(checker.getOperatorContext().getParameterValues("idleSessionTimeOut").get(0)) < 1) { + LOGGER.log(LogLevel.ERROR, "The value of the idleSessionTimeOut parameter must be greater than zero"); + checker.setInvalidContext("The value of the idleSessionTimeOut parameter must be greater than zero", null); + } + } } // Find sqlStatusAttr on data port and error port @@ -478,7 +483,7 @@ public synchronized void initialize(OperatorContext context) throws Exception { startCheckConnection(context); } - if (idleSessionTimeOutSec > 1) { + if (idleSessionTimeOutMinute > 1) { startidleSessionTimeOutThread(context); } @@ -566,19 +571,19 @@ public void run() { * @param context */ public void startidleSessionTimeOutThread(OperatorContext context) { - idleSessionTimeOutSecThread = context.getThreadFactory().newThread(new Runnable() { + idleSessionTimeOutThread = context.getThreadFactory().newThread(new Runnable() { @Override public void run() { while(true) { - // check the JDBC connection every 1 seconds + // check the JDBC connection every minute try { - Thread.sleep(1000); + Thread.sleep(60000); idleSessionTimeOutTimer ++; - // System.out.println("idleSessionTimeOut " + idleSessionTimeOutSec + " idleSessionTimeOutTimer " + idleSessionTimeOutTimer); + // System.out.println("idleSessionTimeOut " + idleSessionTimeOutMinute + " idleSessionTimeOutTimer " + idleSessionTimeOutTimer); } catch(InterruptedException ex) { @@ -587,7 +592,7 @@ public void run() { try { - if (idleSessionTimeOutTimer > idleSessionTimeOutSec){ + if (idleSessionTimeOutTimer > idleSessionTimeOutMinute){ if (jdbcClientHelper.isValidConnection()) { try @@ -596,7 +601,7 @@ public void run() { // close the connection Thread.sleep(1000); jdbcClientHelper.closeConnection(); - System.out.println("close connection idleSessionTimeOut " + idleSessionTimeOutSec + " idleSessionTimeOutTimer " + idleSessionTimeOutTimer); + System.out.println("close connection idleSessionTimeOut " + idleSessionTimeOutMinute + " idleSessionTimeOutTimer " + idleSessionTimeOutTimer); } catch (Exception e2) { e2.printStackTrace(); @@ -612,8 +617,8 @@ public void run() { }); - // start idleSessionTimeOutSecThread - idleSessionTimeOutSecThread.start(); + // start idleSessionTimeOutThread + idleSessionTimeOutThread.start(); } @@ -1155,9 +1160,9 @@ public synchronized void shutdown() throws Exception { } // stop idleSessionTimeOutThread - if (idleSessionTimeOutSecThread != null) { - if (idleSessionTimeOutSecThread.isAlive()) { - idleSessionTimeOutSecThread.interrupt(); + if (idleSessionTimeOutThread != null) { + if (idleSessionTimeOutThread.isAlive()) { + idleSessionTimeOutThread.interrupt(); } } From 8986e952365ee2a92158f6104ccf0a07347d9c22 Mon Sep 17 00:00:00 2001 From: anouri Date: Thu, 6 Jun 2019 10:49:57 +0200 Subject: [PATCH 45/48] check the parameter idleSessionTimeOut #55 --- .../impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java index addd1da..72d14a0 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/JDBCRun.java @@ -268,7 +268,7 @@ public boolean getCheckConnection() { // Parameter idleSessionTimeOut @Parameter(name = "idleSessionTimeOut", optional = true, - description = "This optional parameter specifies the Idle Session Timeout in minute. Once the idle time value is reached, teh opearotor close teh database connection. Th timer restarts after a new query.") + description = "This optional parameter specifies the Idle Session Timeout in minute. Once the idle time value is reached, the operator close the database connection. Th timer restarts after a new query.") public void setidleSessionTimeOut(int idleSessionTimeOut) { this.idleSessionTimeOutMinute = idleSessionTimeOut; } From d6ffd7e03506511840c3391e8f225f0ce0263346 Mon Sep 17 00:00:00 2001 From: anouri Date: Wed, 12 Jun 2019 13:22:16 +0200 Subject: [PATCH 46/48] Support properties for keystore and truststore password (#99) --- .../streamsx/jdbc/AbstractJDBCOperator.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java index 49e341e..1a113cf 100644 --- a/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java +++ b/com.ibm.streamsx.jdbc/impl/java/src/com/ibm/streamsx/jdbc/AbstractJDBCOperator.java @@ -116,8 +116,8 @@ public abstract class AbstractJDBCOperator extends AbstractOperator implements S private String trustStore; private String keyStoreType = null; private String trustStoreType = null; - private String keyStorePassword; - private String trustStorePassword; + private String keyStorePassword = null; + private String trustStorePassword = null; private boolean sslConnection; //Parameter jdbcDriverLib @@ -278,7 +278,7 @@ public String getTrustStoreType() { // Parameter keyStorePassword @Parameter(name = "keyStorePassword", optional = true, - description = "This parameter specifies the password for the keyStore given by the **keyStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + description = "This parameter specifies the password for the keyStore given by the **keyStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect. This parameter can also be specified in an application configuration.") public void setKeyStorePassword(String keyStorePassword) { this.keyStorePassword = keyStorePassword; } @@ -300,7 +300,7 @@ public String getTrustStore() { // Parameter trustStorePassword @Parameter(name = "trustStorePassword", optional = true, - description = "This parameter specifies the password for the trustStore given by the **trustStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect.") + description = "This parameter specifies the password for the trustStore given by the **trustStore** parameter. The **sslConnection** parameter must be set to `true` for this parameter to have any effect. This parameter can also be specified in an application configuration.") public void setTrustStorePassword(String trustStorePassword) { this.trustStorePassword = trustStorePassword; } @@ -312,7 +312,7 @@ public String getTrustStorePassword() { // Parameter appConfigName @Parameter(name = "appConfigName", optional = true, description = "Specifies the name of the application configuration that contains JDBC connection related configuration parameters. " - + " The 'credentials' parameter can be set in an application configuration. " + + " The 'credentials', 'keyStorePassword' and 'trustStorePassword' parameter can be set in an application configuration. " + " If a value is specified in the application configuration and as operator parameter, the application configuration parameter value takes precedence. " ) public void setAppConfigName(String appConfigName) { @@ -469,7 +469,7 @@ public synchronized void initialize(OperatorContext context) System.setProperty("javax.net.ssl.keyStoreType", getKeyStoreType()); } } - if (context.getParameterNames().contains("keyStorePassword")) + if (null != getKeyStorePassword()) System.setProperty("javax.net.ssl.keyStorePassword", getKeyStorePassword()); if (context.getParameterNames().contains("trustStore")) { System.setProperty("javax.net.ssl.trustStore", getAbsolutePath(getTrustStore())); @@ -477,7 +477,7 @@ public synchronized void initialize(OperatorContext context) System.setProperty("javax.net.ssl.trustStoreType", getTrustStoreType()); } } - if (context.getParameterNames().contains("trustStorePassword")) + if (null != getTrustStorePassword()) System.setProperty("javax.net.ssl.trustStorePassword", getTrustStorePassword()); } TRACE.log(TraceLevel.DEBUG," propperties: " + System.getProperties().toString()); @@ -524,6 +524,12 @@ protected void loadAppConfig(OperatorContext context) { if (null != appConfig.get("credentials")){ credentials = appConfig.get("credentials"); } + if (null != appConfig.get("keyStorePassword")){ + keyStorePassword = appConfig.get("keyStorePassword"); + } + if (null != appConfig.get("trustStorePassword")){ + trustStorePassword = appConfig.get("trustStorePassword"); + } } From 91ea66cecaac875b0de3b3b98d78eb77f69be1f2 Mon Sep 17 00:00:00 2001 From: anouri Date: Thu, 13 Jun 2019 17:05:51 +0200 Subject: [PATCH 47/48] Support properties for keystore and truststore password --- com.ibm.streamsx.jdbc/info.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 840a4d7..5f3d9e5 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -68,6 +68,7 @@ ++ What is new in version 1.7.0 * The JDBCRun operator provides a new parameter **idleSessionTimeOut**. Once the idle time value is reached, it close the database connection . + * Support properties for keystore and truststore password 1.7.0 From ac7dc21a444a3402d11ebaf4dd4c8482d621a6d8 Mon Sep 17 00:00:00 2001 From: Ahmad Nouri Date: Thu, 13 Jun 2019 17:15:05 +0200 Subject: [PATCH 48/48] What is new in version 1.7.0 #55 #99 --- com.ibm.streamsx.jdbc/info.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/com.ibm.streamsx.jdbc/info.xml b/com.ibm.streamsx.jdbc/info.xml index 5f3d9e5..822b7e7 100644 --- a/com.ibm.streamsx.jdbc/info.xml +++ b/com.ibm.streamsx.jdbc/info.xml @@ -63,12 +63,14 @@ ++ What is new in version 1.6.0 - * The JDBCRun operator provides new parameters for SSL configuration: **keyStoreType**, **trustStoreType**, **securityMechanism**, **pluginName**. + * The JDBCRun operators provides new parameters for SSL configuration: **keyStoreType**, **trustStoreType**, **securityMechanism**, **pluginName**. ++ What is new in version 1.7.0 - + * The JDBCRun operator provides a new parameter **idleSessionTimeOut**. Once the idle time value is reached, it close the database connection . - * Support properties for keystore and truststore password + + * Supports two new application configuration properties: **keyStorePassword** and **trustStorePassword** + 1.7.0