From eed0ce0e8e55f422692eed32cb0931f28e3c43a8 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 1 Aug 2025 22:18:44 +0200 Subject: [PATCH] working on hamonization of db implementations Signed-off-by: Stephan Richter --- .../de/srsoftware/umbrella/core/BaseDb.java | 64 +++++++++++++++ .../srsoftware/umbrella/core/Constants.java | 1 + .../srsoftware/umbrella/notes/Constants.java | 1 - .../umbrella/project/Constants.java | 1 - .../srsoftware/umbrella/project/SqliteDb.java | 44 +---------- .../srsoftware/umbrella/tags/Constants.java | 1 - .../de/srsoftware/umbrella/task/SqliteDb.java | 79 +++++++------------ .../srsoftware/umbrella/user/Constants.java | 2 - 8 files changed, 97 insertions(+), 96 deletions(-) create mode 100644 core/src/main/java/de/srsoftware/umbrella/core/BaseDb.java diff --git a/core/src/main/java/de/srsoftware/umbrella/core/BaseDb.java b/core/src/main/java/de/srsoftware/umbrella/core/BaseDb.java new file mode 100644 index 0000000..7bfba8b --- /dev/null +++ b/core/src/main/java/de/srsoftware/umbrella/core/BaseDb.java @@ -0,0 +1,64 @@ +package de.srsoftware.umbrella.core; + +import de.srsoftware.tools.jdbc.Query; + +import java.sql.Connection; +import java.sql.SQLException; + +import static de.srsoftware.tools.jdbc.Condition.equal; +import static de.srsoftware.tools.jdbc.Query.replaceInto; +import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.Constants.TABLE_SETTINGS; +import static java.lang.System.Logger.Level.ERROR; +import static java.lang.System.Logger.Level.INFO; +import static java.text.MessageFormat.format; + +public abstract class BaseDb { + private final System.Logger LOG = System.getLogger(getClass().getSimpleName()); + + protected final Connection db; + + public BaseDb(Connection connection) { + db = connection; + var version = createTables(); + LOG.log(INFO,"Updated db to version {0}",version); + + } + + protected abstract int createTables(); + + protected int createSettingsTable() { + var createTable = """ +CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) NOT NULL); +"""; + try { + var stmt = db.prepareStatement(format(createTable,TABLE_SETTINGS, KEY, VALUE)); + stmt.execute(); + stmt.close(); + } catch (SQLException e) { + LOG.log(ERROR,ERROR_FAILED_CREATE_TABLE,TABLE_SETTINGS,e); + throw new RuntimeException(e); + } + + var version = 0; + try { + var rs = Query.select(VALUE).from(TABLE_SETTINGS).where(KEY, equal(DB_VERSION)).exec(db); + if (rs.next()) version = rs.getInt(VALUE); + rs.close(); + + return version; + } catch (SQLException e) { + LOG.log(ERROR,ERROR_READ_TABLE,DB_VERSION,TABLE_SETTINGS,e); + throw new RuntimeException(e); + } + } + + protected int setCurrentVersion(int version) { + try { + replaceInto(TABLE_SETTINGS, KEY, VALUE).values(DB_VERSION,version).execute(db).close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return version; + } +} diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java index eeb501c..c79dd5a 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java @@ -23,6 +23,7 @@ public class Constants { public static final String CUSTOMER_NUMBER_PREFIX = "customer_number_prefix"; public static final String DATA = "data"; + public static final String DB_VERSION = "db_version"; public static final String DATE = "date"; public static final String DECIMALS = "decimals"; public static final String DECIMAL_SEPARATOR = "decimal_separator"; diff --git a/notes/src/main/java/de/srsoftware/umbrella/notes/Constants.java b/notes/src/main/java/de/srsoftware/umbrella/notes/Constants.java index 42c641f..7437acc 100644 --- a/notes/src/main/java/de/srsoftware/umbrella/notes/Constants.java +++ b/notes/src/main/java/de/srsoftware/umbrella/notes/Constants.java @@ -5,6 +5,5 @@ public class Constants { private Constants(){} public static final String CONFIG_DATABASE = "umbrella.modules.notes.database"; - public static final String DB_VERSION = "notes_db_version"; public static final String TABLE_NOTES = "notes"; } diff --git a/project/src/main/java/de/srsoftware/umbrella/project/Constants.java b/project/src/main/java/de/srsoftware/umbrella/project/Constants.java index 6934210..4163220 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/Constants.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/Constants.java @@ -5,7 +5,6 @@ public class Constants { private Constants(){} public static final String CONFIG_DATABASE = "umbrella.modules.project.database"; - public static final String DB_VERSION = "project_db_version"; public static final String PERMISSIONS = "permissions"; public static final String TABLE_CUSTOM_STATES = "custom_states"; public static final String TABLE_PROJECTS = "projects"; diff --git a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java index 15be4dc..d960b98 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java @@ -14,6 +14,7 @@ import static java.lang.System.Logger.Level.INFO; import static java.text.MessageFormat.format; import de.srsoftware.tools.jdbc.Query; +import de.srsoftware.umbrella.core.BaseDb; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.Permission; import de.srsoftware.umbrella.core.model.Project; @@ -26,15 +27,12 @@ import java.sql.SQLException; import java.util.HashMap; import java.util.Map; -public class SqliteDb implements ProjectDb { +public class SqliteDb extends BaseDb implements ProjectDb { private static final System.Logger LOG = System.getLogger("Sqlite4Project"); private static final int INITIAL_DB_VERSION = 1; - private final Connection db; - public SqliteDb(Connection connection) { - db = connection; - init(); + super(connection); } private void createProjectTable() { @@ -77,7 +75,7 @@ PRIMARY KEY (project_id, code) } - private int createTables() { + protected int createTables() { int currentVersion = createSettingsTable(); switch (currentVersion){ case 0: @@ -107,31 +105,6 @@ CREATE TABLE IF NOT EXISTS {0} ( } } - private int createSettingsTable() { - var createTable = """ -CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) NOT NULL); -"""; - try { - var stmt = db.prepareStatement(format(createTable,TABLE_SETTINGS, KEY, VALUE)); - stmt.execute(); - stmt.close(); - } catch (SQLException e) { - LOG.log(ERROR,ERROR_FAILED_CREATE_TABLE,TABLE_SETTINGS,e); - throw new RuntimeException(e); - } - - var version = 0; - try { - var rs = Query.select(VALUE).from(TABLE_SETTINGS).where(KEY, equal(DB_VERSION)).exec(db); - if (rs.next()) version = rs.getInt(VALUE); - rs.close(); - - return version; - } catch (SQLException e) { - LOG.log(ERROR,ERROR_READ_TABLE,DB_VERSION,TABLE_SETTINGS,e); - throw new RuntimeException(e); - } - } @Override public void dropMember(long projectId, long userId) { @@ -270,13 +243,4 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) throw new UmbrellaException("Failed to create custom state!"); } } - - private int setCurrentVersion(int version) { - try { - replaceInto(TABLE_SETTINGS, KEY, VALUE).values(DB_VERSION,version).execute(db).close(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - return version; - } } diff --git a/tags/src/main/java/de/srsoftware/umbrella/tags/Constants.java b/tags/src/main/java/de/srsoftware/umbrella/tags/Constants.java index 7bdf218..c456bc9 100644 --- a/tags/src/main/java/de/srsoftware/umbrella/tags/Constants.java +++ b/tags/src/main/java/de/srsoftware/umbrella/tags/Constants.java @@ -5,7 +5,6 @@ public class Constants { private Constants(){} public static final String CONFIG_DATABASE = "umbrella.modules.tags.database"; - public static final String DB_VERSION = "project_db_version"; public static final String TABLE_TAGS = "tags"; public static final String TAG = "tag"; } diff --git a/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java b/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java index cb57ff0..c52ec02 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java @@ -14,6 +14,7 @@ import static java.lang.System.Logger.Level.ERROR; import static java.text.MessageFormat.format; import de.srsoftware.tools.jdbc.Query; +import de.srsoftware.umbrella.core.BaseDb; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.*; import java.sql.Connection; @@ -23,76 +24,52 @@ import java.util.HashMap; import java.util.Map; -public class SqliteDb implements TaskDb { +public class SqliteDb extends BaseDb implements TaskDb { private static final System.Logger LOG = System.getLogger("TaskDb"); - private final Connection db; private static final int INITIAL_DB_VERSION = 1; public SqliteDb(Connection connection) { - db = connection; - init(); + super(connection); } - private int createSettingsTable() { - var createTable = """ -CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) NOT NULL); -"""; - try { - var stmt = db.prepareStatement(format(createTable,TABLE_SETTINGS, KEY, VALUE)); - stmt.execute(); - stmt.close(); - } catch (SQLException e) { - LOG.log(ERROR,ERROR_FAILED_CREATE_TABLE,TABLE_SETTINGS,e); - throw new RuntimeException(e); - } - - Integer version = null; - try { - var rs = Query.select(VALUE).from(TABLE_SETTINGS).where(KEY, equal(DB_VERSION)).exec(db); - if (rs.next()) version = rs.getInt(VALUE); - rs.close(); - if (version == null) { - version = INITIAL_DB_VERSION; - insertInto(TABLE_SETTINGS, KEY, VALUE).values(DB_VERSION,version).execute(db).close(); - } - - return version; - } catch (SQLException e) { - LOG.log(ERROR,ERROR_READ_TABLE,DB_VERSION,TABLE_SETTINGS,e); - throw new RuntimeException(e); + protected int createTables() { + int currentVersion = createSettingsTable(); + switch (currentVersion){ + case 0: + createTaskTables(); + createTasksUsersTable(); } - } - private int createTables() { - createTaskTables(); - return createSettingsTable(); + return setCurrentVersion(1); } private void createTaskTables() { var createTable = """ -CREATE TABLE IF NOT EXISTS "{0}" ( - {1} INTEGER PRIMARY KEY, - {2} INTEGER NOT NULL, - {3} INTEGER DEFAULT NULL, - {4} VARCHAR(255) NOT NULL, - {5} TEXT, - {6} INT DEFAULT {7}, - {8} DOUBLE DEFAULT NULL, - {9} DATE, - {10} DATE, - {11} BOOLEAN DEFAULT FALSE, - {12} BOOLEAN DEFAULT FALSE -)"""; + CREATE TABLE IF NOT EXISTS "{0}" ( + {1} INTEGER PRIMARY KEY, + {2} INTEGER NOT NULL, + {3} INTEGER DEFAULT NULL, + {4} VARCHAR(255) NOT NULL, + {5} TEXT, + {6} INT DEFAULT {7}, + {8} DOUBLE DEFAULT NULL, + {9} DATE, + {10} DATE, + {11} BOOLEAN DEFAULT FALSE, + {12} BOOLEAN DEFAULT FALSE + )"""; try { - var stmt = db.prepareStatement(format(createTable,TABLE_TASKS, ID, PROJECT_ID, PARENT_TASK_ID, NAME, DESCRIPTION,STATUS, OPEN.code(), EST_TIME, START_DATE,DUE_DATE,SHOW_CLOSED,NO_INDEX)); + var stmt = db.prepareStatement(format(createTable, TABLE_TASKS, ID, PROJECT_ID, PARENT_TASK_ID, NAME, DESCRIPTION, STATUS, OPEN.code(), EST_TIME, START_DATE, DUE_DATE, SHOW_CLOSED, NO_INDEX)); stmt.execute(); stmt.close(); } catch (SQLException e) { - LOG.log(ERROR,ERROR_FAILED_CREATE_TABLE,TABLE_PROJECTS ,e); + LOG.log(ERROR, ERROR_FAILED_CREATE_TABLE, TABLE_PROJECTS, e); throw new RuntimeException(e); } + } - createTable = """ + private void createTasksUsersTable(){ + var createTable = """ CREATE TABLE IF NOT EXISTS {0} ( {1} INT NOT NULL, {2} INT NOT NULL, diff --git a/user/src/main/java/de/srsoftware/umbrella/user/Constants.java b/user/src/main/java/de/srsoftware/umbrella/user/Constants.java index 797f37c..6662a2e 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/Constants.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/Constants.java @@ -13,8 +13,6 @@ public class Constants { public static final String CLIENT_SECRET = "client_secret"; public static final String CONFIG_DATABASE = "umbrella.modules.user.database"; - - public static final String DB_VERSION = "user_db_version"; public static final String DEFAULT_FIELD = "sub"; public static final Duration DEFAULT_SESSION_DURATION = Duration.ofMinutes(20);