From 5712de5e630fd1e40990cf7625b62d95b1ff6b3a Mon Sep 17 00:00:00 2001 From: Dan Cunningham Date: Sat, 2 Apr 2022 09:11:32 -0700 Subject: [PATCH] [jdbc] Rework TimescaleDB code to actually work (#12525) Fixes #12513 Signed-off-by: Dan Cunningham --- .../org.openhab.persistence.jdbc/README.md | 2 +- .../jdbc/db/JdbcTimescaledbDAO.java | 36 +++++-------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/bundles/org.openhab.persistence.jdbc/README.md b/bundles/org.openhab.persistence.jdbc/README.md index 5750daae5..8e99a172e 100644 --- a/bundles/org.openhab.persistence.jdbc/README.md +++ b/bundles/org.openhab.persistence.jdbc/README.md @@ -40,7 +40,7 @@ This service can be configured in the file `services/jdbc.cfg`. | Property | Default | Required | Description | | ------------------------- | ------------------------------------------------------------ | :-------: | ------------------------------------------------------------ | -| url | | Yes | JDBC URL to establish a connection to your database. Examples:

`jdbc:derby:./testDerby;create=true`
`jdbc:h2:./testH2`
`jdbc:hsqldb:./testHsqlDb`
`jdbc:mariadb://192.168.0.1:3306/testMariadb`
`jdbc:mysql://192.168.0.1:3306/testMysql?serverTimezone=UTC`
`jdbc:postgresql://192.168.0.1:5432/testPostgresql`
`jdbc:sqlite:./testSqlite.db`.

If no database is available it will be created; for example the url `jdbc:h2:./testH2` creates a new H2 database in openHAB folder. Example to create your own MySQL database directly:

`CREATE DATABASE 'yourDB' CHARACTER SET utf8 COLLATE utf8_general_ci;` | +| url | | Yes | JDBC URL to establish a connection to your database. Examples:

`jdbc:derby:./testDerby;create=true`
`jdbc:h2:./testH2`
`jdbc:hsqldb:./testHsqlDb`
`jdbc:mariadb://192.168.0.1:3306/testMariadb`
`jdbc:mysql://192.168.0.1:3306/testMysql?serverTimezone=UTC`
`jdbc:postgresql://192.168.0.1:5432/testPostgresql`
`jdbc:timescaledb://192.168.0.1:5432/testPostgresql`
`jdbc:sqlite:./testSqlite.db`.

If no database is available it will be created; for example the url `jdbc:h2:./testH2` creates a new H2 database in openHAB folder. Example to create your own MySQL database directly:

`CREATE DATABASE 'yourDB' CHARACTER SET utf8 COLLATE utf8_general_ci;` | | user | | if needed | database user name | | password | | if needed | database user password | | errReconnectThreshold | 0 | No | when the service is deactivated (0 means ignore) | diff --git a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcTimescaledbDAO.java b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcTimescaledbDAO.java index cc8553bca..1a2c32a2d 100644 --- a/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcTimescaledbDAO.java +++ b/bundles/org.openhab.persistence.jdbc/src/main/java/org/openhab/persistence/jdbc/db/JdbcTimescaledbDAO.java @@ -25,47 +25,29 @@ import org.slf4j.LoggerFactory; * supplements the default settings from JdbcBaseDAO and JdbcPostgresqlDAO. * * @author Riccardo Nimser-Joseph - Initial contribution + * @author Dan Cunningham - Fixes and refactoring */ public class JdbcTimescaledbDAO extends JdbcPostgresqlDAO { private final Logger logger = LoggerFactory.getLogger(JdbcTimescaledbDAO.class); - protected String sqlCreateHypertable; - - public JdbcTimescaledbDAO() { - super(); - - initSqlQueries(); - } - - public Properties getDatabaseProperties() { - Properties properties = new Properties(this.databaseProps); + private final String sqlCreateHypertable = "SELECT created from create_hypertable('#tableName#', 'time')"; + @Override + public Properties getConnectionProperties() { + Properties properties = (Properties) this.databaseProps.clone(); // Adjust the jdbc url since the service name 'timescaledb' is only used to differentiate the DAOs if (properties.containsKey("jdbcUrl")) { properties.put("jdbcUrl", properties.getProperty("jdbcUrl").replace("timescaledb", "postgresql")); } - return properties; } + @Override public void doCreateItemTable(ItemVO vo) { - String sql; - - sql = StringUtilsExt.replaceArrayMerge(this.sqlCreateItemTable, - new String[] { "#tableName#", "#dbType#", "#tablePrimaryKey#" }, - new String[] { vo.getTableName(), vo.getDbType(), sqlTypes.get("tablePrimaryKey") }); - this.logger.debug("JDBC::doCreateItemTable sql={}", sql); - Yank.execute(sql, null); - - sql = StringUtilsExt.replaceArrayMerge(this.sqlCreateHypertable, new String[] { "#tableName#" }, + super.doCreateItemTable(vo); + String sql = StringUtilsExt.replaceArrayMerge(this.sqlCreateHypertable, new String[] { "#tableName#" }, new String[] { vo.getTableName() }); this.logger.debug("JDBC::doCreateItemTable sql={}", sql); - Yank.execute(sql, null); - } - - private void initSqlQueries() { - this.logger.debug("JDBC::initSqlQueries: '{}'", this.getClass().getSimpleName()); - - this.sqlCreateHypertable = "SELECT create_hypertable('#tableName#', 'time')"; + Yank.queryScalar(sql, Boolean.class, null); } }