diff --git a/pom.xml b/pom.xml index 222100829e..9dacc890b4 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ 1.11.2 2.14 - 1.16.1 + 1.19.1 3.1.2 4.0.0 2.12.7 @@ -200,7 +200,7 @@ /WebAPI - 1.17.3 + 1.17.4 2.25.1 600000 12 @@ -1859,6 +1859,20 @@ + + webapi-iris + + true + 3.10.2 + + + + com.intersystems + intersystems-jdbc + ${iris.driver.version} + + + webapi-gis diff --git a/src/main/extras/iris/README.md b/src/main/extras/iris/README.md new file mode 100644 index 0000000000..f59f307144 --- /dev/null +++ b/src/main/extras/iris/README.md @@ -0,0 +1,46 @@ +# Using WebAPI with InterSystems IRIS support + +## Building WebAPI + +To build WebAPI with InterSystems IRIS support, you can simply use the `webapi-iris` profile +when building WebAPI with Maven: + +```Shell +mvn -Pwebapi-postgresql,webapi-iris clean package +``` + +or on Windows PowerShell: +```Shell +mvn "-Pwebapi-postgresql,webapi-iris" clean package +``` + +This will automatically download and package a recent version of the InterSystems IRIS JDBC +driver from Maven Central. + +Alternatively, the JDBC driver for InterSystems IRIS can be found in the `dev/java/lib/1.8/` +subfolder of your IRIS installation, or as a download from InterSystems Cloud Services portal. + + +## Sample configuration + +When configuring Atlas / WebAPI to access CDM on IRIS over a secure connection, your source +registration looks like this: +```SQL +INSERT INTO webapi.source (source_id, source_name, source_key, source_connection, source_dialect, username, password) + VALUES (<#>, 'OHDSI IRIS Database', 'IRIS', 'jdbc:IRIS://.elb.us-west-2.amazonaws.com:443/USER/:::true', + 'iris', '',''); +``` + +For a non-encrypted, local connection, this may look like: +```SQL +INSERT INTO webapi.source (source_id, source_name, source_key, source_connection, source_dialect, username, password) + VALUES (<#>, 'OHDSI IRIS Database', 'IRIS', 'jdbc:IRIS://localhost:1972/USER/', 'iris', '_SYSTEM_','SYS'); +``` + + +## References + +For more information on how to connect to InterSystems IRIS or InterSystems IRIS Cloud SQL, please see: +* [Connecting your applications to Cloud SQL](https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=GDRIVE_cloudsql) +* [Troubleshooting connection issues](https://docs.intersystems.com/services/csp/docbook/DocBook.UI.Page.cls?KEY=ACTS) +* [InterSystems fork for OHDSI Broadsea](https://github.com/isc-krakshith/InterSystems-Broadsea/) \ No newline at end of file diff --git a/src/main/java/org/ohdsi/webapi/DataAccessConfig.java b/src/main/java/org/ohdsi/webapi/DataAccessConfig.java index 8bc4e438dc..aac8f7a7e0 100644 --- a/src/main/java/org/ohdsi/webapi/DataAccessConfig.java +++ b/src/main/java/org/ohdsi/webapi/DataAccessConfig.java @@ -82,7 +82,7 @@ public DataSource primaryDataSource() { //note autocommit defaults vary across vendors. use provided @Autowired TransactionTemplate String[] supportedDrivers; - supportedDrivers = new String[]{"org.postgresql.Driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "oracle.jdbc.driver.OracleDriver", "com.amazon.redshift.jdbc.Driver", "com.cloudera.impala.jdbc.Driver", "net.starschema.clouddb.jdbc.BQDriver", "org.netezza.Driver", "com.simba.googlebigquery.jdbc42.Driver", "org.apache.hive.jdbc.HiveDriver", "com.simba.spark.jdbc.Driver", "net.snowflake.client.jdbc.SnowflakeDriver", "com.databricks.client.jdbc.Driver"}; + supportedDrivers = new String[]{"org.postgresql.Driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "oracle.jdbc.driver.OracleDriver", "com.amazon.redshift.jdbc.Driver", "com.cloudera.impala.jdbc.Driver", "net.starschema.clouddb.jdbc.BQDriver", "org.netezza.Driver", "com.simba.googlebigquery.jdbc42.Driver", "org.apache.hive.jdbc.HiveDriver", "com.simba.spark.jdbc.Driver", "net.snowflake.client.jdbc.SnowflakeDriver", "com.databricks.client.jdbc.Driver", "com.intersystems.jdbc.IRISDriver"}; for (String driverName : supportedDrivers) { try { Class.forName(driverName); diff --git a/src/main/java/org/ohdsi/webapi/util/CancelableJdbcTemplate.java b/src/main/java/org/ohdsi/webapi/util/CancelableJdbcTemplate.java index a7ebb3d39e..f7d85d7e29 100644 --- a/src/main/java/org/ohdsi/webapi/util/CancelableJdbcTemplate.java +++ b/src/main/java/org/ohdsi/webapi/util/CancelableJdbcTemplate.java @@ -156,6 +156,8 @@ private boolean supportsBatchUpdates(Connection connection) throws SQLException // NOTE: // com.cloudera.impala.hivecommon.dataengine.HiveJDBCDataEngine.prepareBatch throws NOT_IMPLEMENTED exception - return JdbcUtils.supportsBatchUpdates(connection) && !connection.getMetaData().getURL().startsWith("jdbc:impala"); + return JdbcUtils.supportsBatchUpdates(connection) + && !connection.getMetaData().getURL().startsWith("jdbc:impala") + && !connection.getMetaData().getURL().startsWith("jdbc:IRIS"); } } diff --git a/src/main/resources/i18n/messages_en.json b/src/main/resources/i18n/messages_en.json index e4ea6edf60..d7907df868 100644 --- a/src/main/resources/i18n/messages_en.json +++ b/src/main/resources/i18n/messages_en.json @@ -2601,7 +2601,8 @@ "sqlserver": "SQL server", "synapse": "Azure Synapse", "snowflake": "Snowflake", - "spark": "Apache Spark" + "spark": "Apache Spark", + "iris": "InterSystems IRIS" }, "title": "Source dialect" }, diff --git a/src/main/resources/i18n/messages_ko.json b/src/main/resources/i18n/messages_ko.json index 9ec9712441..dfdae985f6 100644 --- a/src/main/resources/i18n/messages_ko.json +++ b/src/main/resources/i18n/messages_ko.json @@ -2600,7 +2600,8 @@ "sqlserver": "SQL server", "synapse": "Azure Synapse", "snowflake": "Snowflake", - "spark": "Apache Spark" + "spark": "Apache Spark", + "iris": "InterSystems IRIS" }, "title": "소스 dialect" }, diff --git a/src/main/resources/i18n/messages_ru.json b/src/main/resources/i18n/messages_ru.json index aae125875e..988c2210f2 100644 --- a/src/main/resources/i18n/messages_ru.json +++ b/src/main/resources/i18n/messages_ru.json @@ -2514,7 +2514,8 @@ "hive": "Hive LLAP", "synapse": "Azure Synapse", "snowflake": "Snowflake", - "spark": "Apache Spark" + "spark": "Apache Spark", + "iris": "InterSystems IRIS" } }, "connectionString": { diff --git a/src/main/resources/i18n/messages_zh.json b/src/main/resources/i18n/messages_zh.json index 207cfcd706..1236c946a0 100644 --- a/src/main/resources/i18n/messages_zh.json +++ b/src/main/resources/i18n/messages_zh.json @@ -2600,7 +2600,8 @@ "sqlserver": "SQL服务器", "synapse": "Azure Synapse", "snowflake": "Snowflake", - "spark": "Apache Spark" + "spark": "Apache Spark", + "iris": "InterSystems IRIS" }, "title": "源语言" }, diff --git a/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java b/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java index 40fa1b3a70..54954b3365 100644 --- a/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java +++ b/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java @@ -29,6 +29,7 @@ public class DataSourceDTOParserTest { public static final String ORACLE_WO_PWD_CONN_STR = "jdbc:oracle:thin:@myhost:1521:orcl"; public static final String ORACLE_WITH_PWD_CONN_STR = "jdbc:oracle:thin:scott/tiger@myhost:1521:orcl"; public static final String HIVE_CONN_STR = "jdbc:hive2://sandbox-hdp.hortonworks.com:2181/synpuf_531_orc;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"; + public static final String IRIS_CONN_STR = "jdbc:IRIS://localhost:1972/USER"; @Test public void parseDTO() { @@ -110,6 +111,12 @@ public void parseDTO() { assertThat(dto.getConnectionString(), is(HIVE_CONN_STR)); assertThat(dto.getUsername(), is(nullValue())); assertThat(dto.getPassword(), is(nullValue())); + + dto = DataSourceDTOParser.parseDTO(getIRISSource()); + assertThat(dto.getType(), is(DBMSType.IRIS)); + assertThat(dto.getConnectionString(), is(IRIS_CONN_STR)); + assertThat(dto.getUsername(), is(nullValue())); + assertThat(dto.getPassword(), is(nullValue())); } private Source getPostgreSQLPasswordSource() { @@ -204,4 +211,11 @@ private Source getHiveSource() { source.setSourceConnection(HIVE_CONN_STR); return source; } + + private Source getIRISSource() { + Source source = new Source(); + source.setSourceDialect("iris"); + source.setSourceConnection(IRIS_CONN_STR); + return source; + } } \ No newline at end of file