From cbb9d621a73918ffa3982a81b15d61c7b743b2ac Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Wed, 16 Oct 2024 01:45:41 +0200 Subject: [PATCH 1/2] automaticaly set schema version based on app version --- .../install/SqlTsDatabaseSchemaService.java | 27 ++++++++++++++++--- .../main/resources/sql/schema-entities.sql | 12 --------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java index 66af786c83..48ae646480 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java @@ -15,8 +15,10 @@ */ package org.thingsboard.server.service.install; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.info.BuildProperties; import org.springframework.context.annotation.Profile; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.thingsboard.server.dao.util.SqlTsDao; @@ -25,8 +27,11 @@ import org.thingsboard.server.dao.util.SqlTsDao; @Profile("install") public class SqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService { - @Value("${sql.postgres.ts_key_value_partitioning:MONTHS}") - private String partitionType; + @Autowired + private BuildProperties buildProperties; + + @Autowired + private JdbcTemplate jdbcTemplate; public SqlTsDatabaseSchemaService() { super("schema-ts-psql.sql", null); @@ -36,5 +41,21 @@ public class SqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService public void createDatabaseSchema() throws Exception { super.createDatabaseSchema(); executeQuery("CREATE TABLE IF NOT EXISTS ts_kv_indefinite PARTITION OF ts_kv DEFAULT;"); + + Long schemaVersion = jdbcTemplate.queryForList("SELECT schema_version FROM tb_schema_settings", Long.class).stream().findFirst().orElse(null); + + if (schemaVersion == null) { + jdbcTemplate.execute("INSERT INTO tb_schema_settings (schema_version) VALUES (" + getSchemaVersion() + ")"); + } + } + + private int getSchemaVersion() { + String[] versionParts = buildProperties.getVersion().replaceAll("[^\\d.]", "").split("\\."); + + int major = Integer.parseInt(versionParts[0]); + int minor = Integer.parseInt(versionParts[1]); + int patch = versionParts.length > 2 ? Integer.parseInt(versionParts[2]) : 0; + + return major * 1000000 + minor * 1000 + patch; } } \ No newline at end of file diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index 9c95f385f8..13d50beaa1 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -20,18 +20,6 @@ CREATE TABLE IF NOT EXISTS tb_schema_settings CONSTRAINT tb_schema_settings_pkey PRIMARY KEY (schema_version) ); -CREATE OR REPLACE PROCEDURE insert_tb_schema_settings() - LANGUAGE plpgsql AS -$$ -BEGIN - IF (SELECT COUNT(*) FROM tb_schema_settings) = 0 THEN - INSERT INTO tb_schema_settings (schema_version) VALUES (3006004); - END IF; -END; -$$; - -call insert_tb_schema_settings(); - CREATE TABLE IF NOT EXISTS admin_settings ( id uuid NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY, tenant_id uuid NOT NULL, From 5093df9b62aaa9dc90c431fe0b95929308302929 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Thu, 17 Oct 2024 19:33:57 +0200 Subject: [PATCH 2/2] refactored --- .../install/ThingsboardInstallService.java | 1 + .../install/EntityDatabaseSchemaService.java | 2 ++ .../SqlEntityDatabaseSchemaService.java | 30 +++++++++++++++++++ .../install/SqlTsDatabaseSchemaService.java | 25 ---------------- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java index 029a27f510..f27f17ca96 100644 --- a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java +++ b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java @@ -170,6 +170,7 @@ public class ThingsboardInstallService { log.info("Installing DataBase schema for entities..."); entityDatabaseSchemaService.createDatabaseSchema(); + entityDatabaseSchemaService.createSchemaVersion(); entityDatabaseSchemaService.createOrUpdateViewsAndFunctions(); entityDatabaseSchemaService.createOrUpdateDeviceInfoView(persistToTelemetry); diff --git a/application/src/main/java/org/thingsboard/server/service/install/EntityDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/EntityDatabaseSchemaService.java index 68f19e7a02..02241367a1 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/EntityDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/EntityDatabaseSchemaService.java @@ -23,4 +23,6 @@ public interface EntityDatabaseSchemaService extends DatabaseSchemaService { void createCustomerTitleUniqueConstraintIfNotExists(); + void createSchemaVersion(); + } diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java index 5e1357a48e..3bb8b0e58f 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlEntityDatabaseSchemaService.java @@ -16,7 +16,10 @@ package org.thingsboard.server.service.install; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.info.BuildProperties; import org.springframework.context.annotation.Profile; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @Service @@ -29,6 +32,11 @@ public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaSer public static final String SCHEMA_ENTITIES_IDX_PSQL_ADDON_SQL = "schema-entities-idx-psql-addon.sql"; public static final String SCHEMA_VIEWS_AND_FUNCTIONS_SQL = "schema-views-and-functions.sql"; + @Autowired + private BuildProperties buildProperties; + @Autowired + private JdbcTemplate jdbcTemplate; + public SqlEntityDatabaseSchemaService() { super(SCHEMA_ENTITIES_SQL, SCHEMA_ENTITIES_IDX_SQL); } @@ -59,4 +67,26 @@ public class SqlEntityDatabaseSchemaService extends SqlAbstractDatabaseSchemaSer "ALTER TABLE customer ADD CONSTRAINT customer_title_unq_key UNIQUE(tenant_id, title); END IF; END; $$;", "create 'customer_title_unq_key' constraint if it doesn't already exist!"); } + + @Override + public void createSchemaVersion() { + try { + Long schemaVersion = jdbcTemplate.queryForList("SELECT schema_version FROM tb_schema_settings", Long.class).stream().findFirst().orElse(null); + if (schemaVersion == null) { + jdbcTemplate.execute("INSERT INTO tb_schema_settings (schema_version) VALUES (" + getSchemaVersion() + ")"); + } + } catch (Exception e) { + log.warn("Failed to create schema version [{}]!", buildProperties.getVersion(), e); + } + } + + private int getSchemaVersion() { + String[] versionParts = buildProperties.getVersion().replaceAll("[^\\d.]", "").split("\\."); + + int major = Integer.parseInt(versionParts[0]); + int minor = Integer.parseInt(versionParts[1]); + int patch = versionParts.length > 2 ? Integer.parseInt(versionParts[2]) : 0; + + return major * 1000000 + minor * 1000 + patch; + } } diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java index 48ae646480..428101ee05 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlTsDatabaseSchemaService.java @@ -15,10 +15,7 @@ */ package org.thingsboard.server.service.install; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.info.BuildProperties; import org.springframework.context.annotation.Profile; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.thingsboard.server.dao.util.SqlTsDao; @@ -27,12 +24,6 @@ import org.thingsboard.server.dao.util.SqlTsDao; @Profile("install") public class SqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService implements TsDatabaseSchemaService { - @Autowired - private BuildProperties buildProperties; - - @Autowired - private JdbcTemplate jdbcTemplate; - public SqlTsDatabaseSchemaService() { super("schema-ts-psql.sql", null); } @@ -41,21 +32,5 @@ public class SqlTsDatabaseSchemaService extends SqlAbstractDatabaseSchemaService public void createDatabaseSchema() throws Exception { super.createDatabaseSchema(); executeQuery("CREATE TABLE IF NOT EXISTS ts_kv_indefinite PARTITION OF ts_kv DEFAULT;"); - - Long schemaVersion = jdbcTemplate.queryForList("SELECT schema_version FROM tb_schema_settings", Long.class).stream().findFirst().orElse(null); - - if (schemaVersion == null) { - jdbcTemplate.execute("INSERT INTO tb_schema_settings (schema_version) VALUES (" + getSchemaVersion() + ")"); - } - } - - private int getSchemaVersion() { - String[] versionParts = buildProperties.getVersion().replaceAll("[^\\d.]", "").split("\\."); - - int major = Integer.parseInt(versionParts[0]); - int minor = Integer.parseInt(versionParts[1]); - int patch = versionParts.length > 2 ? Integer.parseInt(versionParts[2]) : 0; - - return major * 1000000 + minor * 1000 + patch; } } \ No newline at end of file