Creating codegen & updating Database Configuration

This commit is contained in:
Molzonas 2025-08-30 05:41:57 +02:00
parent 9e20f15e71
commit ffb6f5d254
3 changed files with 186 additions and 4 deletions

View File

@ -24,8 +24,8 @@
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version> <version>3.13.0</version>
<configuration> <configuration>
<source>${java.version}</source> <source>21</source>
<target>${java.version}</target> <target>21</target>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>

View File

@ -1,5 +1,162 @@
package fr.molzonas.mzcore.database; package fr.molzonas.mzcore.database;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import fr.molzonas.mzcore.database.provider.MZDatabaseProvider;
import fr.molzonas.mzcore.database.provider.MZDatabaseProviderMariaDB;
import fr.molzonas.mzcore.database.provider.MZDatabaseProviderPostgreSQL;
import fr.molzonas.mzcore.database.provider.MZDatabaseProviderSQLite;
import org.flywaydb.core.Flyway;
import org.jooq.SQLDialect;
import org.jooq.codegen.GenerationTool;
import org.jooq.meta.jaxb.*;
import java.util.Locale;
public final class MZCodegen { public final class MZCodegen {
// TODO private MZCodegen() {}
public static void migrate(MZDatabaseConfiguration config) {
MZDatabaseProvider provider = chooseProvider(config);
try (HikariDataSource dataSource = buildDataSource(config, provider)) {
Flyway.configure()
.dataSource(dataSource)
.locations(provider.migrationLocation())
.baselineOnMigrate(true)
.cleanDisabled(true)
.load()
.migrate();
}
}
public static void generate(MZDatabaseConfiguration config,
String targetFolder,
String targetPackage) {
MZDatabaseProvider provider = chooseProvider(config);
try {
GenerationTool.generate(buildJooqConfiguration(config, provider, targetFolder, targetPackage));
} catch (Exception e) {
throw new RuntimeException("jOOQ codegen failed", e);
}
}
private static MZDatabaseProvider chooseProvider(MZDatabaseConfiguration config) {
return switch (config.getType().trim().toUpperCase(Locale.ROOT)) {
case "MARIADB", "MYSQL" -> new MZDatabaseProviderMariaDB();
case "POSTGRES", "POSTGRESQL" -> new MZDatabaseProviderPostgreSQL();
default -> new MZDatabaseProviderSQLite();
};
}
private static HikariDataSource buildDataSource(MZDatabaseConfiguration config, MZDatabaseProvider provider) {
HikariConfig hc = new HikariConfig();
hc.setJdbcUrl(provider.jdbcUrl(config));
if (!config.isSQLite()) {
hc.setUsername(config.getUsername());
hc.setPassword(config.getPassword());
}
hc.setMaximumPoolSize(config.getMaximumPoolSize());
hc.setMinimumIdle(config.getMinimumIdle());
hc.setConnectionTimeout(config.getConnectionTimeout());
hc.setIdleTimeout(config.getIdleTimeout());
hc.setMaxLifetime(config.getMaximumLifetime());
hc.setPoolName("MZ-Codegen-" + config.getType());
provider.tune(hc, config);
return new HikariDataSource(hc);
}
private static Configuration buildJooqConfiguration(MZDatabaseConfiguration config,
MZDatabaseProvider provider,
String targetFolder,
String targetPackage) {
String metaDbName = metaDatabaseName(provider.dialect());
String inputSchema = defaultInputSchema(provider.dialect(), config);
Database db = new Database()
.withName(metaDbName)
.withIncludes(".*")
.withExcludes("(?i)flyway_schema_history")
.withInputSchema(inputSchema);
Generator generator = new Generator()
.withDatabase(db)
.withTarget(new Target()
.withDirectory(targetFolder)
.withPackageName(targetPackage))
.withGenerate(new Generate()
.withPojos(true)
.withDaos(false)
.withFluentSetters(true)
.withRecords(true)
.withJavaTimeTypes(true));
Jdbc jdbc = new Jdbc()
.withUrl(provider.jdbcUrl(config))
.withUser(config.isSQLite() ? null : config.getUsername())
.withPassword(config.isSQLite() ? null : config.getPassword())
.withDriver(jdbcDriverName(provider.dialect()));
return new Configuration()
.withJdbc(jdbc)
.withGenerator(generator);
}
private static String metaDatabaseName(SQLDialect dialect) {
return switch (dialect.family()) {
case MARIADB, MYSQL -> "org.jooq.meta.mariadb.MariaDBDatabase";
case POSTGRES -> "org.jooq.meta.postgres.PostgresDatabase";
default -> "org.jooq.meta.sqlite.SQLiteDatabase";
};
}
private static String jdbcDriverName(SQLDialect dialect) {
return switch (dialect.family()) {
case MARIADB, MYSQL -> "org.mariadb.jdbc.Driver";
case POSTGRES -> "org.postgresql.Driver";
default -> "org.sqlite.JDBC";
};
}
private static String defaultInputSchema(SQLDialect dialect, MZDatabaseConfiguration config) {
return switch (dialect.family()) {
case MARIADB, MYSQL -> config.getDatabase();
case POSTGRES -> "public";
default -> null;
};
}
/*
* Example codegen
* public static void main(String[] args) {
* long t1 = System.currentTimeMillis();
* String type = System.getProperty("db.type", "sqlite");
* String host = System.getProperty("db.host", "127.0.0.1");
* int port = Integer.parseInt(System.getProperty("db.port",
* switch (type.toLowerCase(Locale.ROOT)) {
* case "postgres", "postgresql" -> "5432";
* case "mariadb", "mysql" -> "3306";
* default -> "0";
* }));
* String name = System.getProperty("db.name", "myplugin");
* String user = System.getProperty("db.user", "");
* String pass = System.getProperty("db.pass", "");
* boolean ssl = Boolean.parseBoolean(System.getProperty("db.ssl", "false"));
* String sslMode = System.getProperty("db.sslmode", "");
* String pkg = System.getProperty("jooq.pkg", "fr.molzonas.example.database.generated");
* String out = System.getProperty("jooq.out", "target/generated-sources/jooq");
*
* var config = MZDatabaseConfiguration.builder()
* .setType(type)
* .setHost(host)
* .setPort(port)
* .setDatabase(name)
* .setUsername(user)
* .setPassword(pass)
* .setSslEnabled(ssl)
* .setSslMode(sslMode)
* .build();
*
* migrate(config);
* generate(config, out, pkg);
* System.out.println("Codegen ended in " + (System.currentTimeMillis() - t1) + "ms");
* }
*/
} }

View File

@ -1,5 +1,6 @@
package fr.molzonas.mzcore.database; package fr.molzonas.mzcore.database;
import fr.molzonas.mzcore.MZConfig;
import lombok.Getter; import lombok.Getter;
public class MZDatabaseConfiguration { public class MZDatabaseConfiguration {
@ -46,6 +47,30 @@ public class MZDatabaseConfiguration {
public boolean isPostgreSQL() { public boolean isPostgreSQL() {
return "postgresql".equalsIgnoreCase(type); return "postgresql".equalsIgnoreCase(type);
} }
public static MZDatabaseConfiguration getDefault() {
return new MZDatabaseConfiguration();
}
public static MZDatabaseConfiguration getFromConfiguration(MZConfig config) {
MZDatabaseConfiguration.Builder builder = MZDatabaseConfiguration.builder();
if (config.exists("database.type")) builder.setType(config.get("database.type"));
if (config.exists("database.host")) builder.setHost(config.get("database.host"));
if (config.exists("database.port")) builder.setPort(config.get("database.port", Integer.class));
if (config.exists("database.database")) builder.setDatabase(config.get("database.database"));
if (config.exists("database.username")) builder.setUsername(config.get("database.username"));
if (config.exists("database.password")) builder.setPassword(config.get("database.password"));
if (config.exists("database.file")) builder.setFile(config.get("database.file"));
if (config.exists("database.maximumPoolSize")) builder.setMaximumPoolSize(config.get("database.maximumPoolSize", Integer.class));
if (config.exists("database.minimumIdle")) builder.setMinimumIdle(config.get("database.minimumIdle", Integer.class));
if (config.exists("database.maximumLifetime")) builder.setMaximumLifetime(config.get("database.maximumLifetime", Integer.class));
if (config.exists("database.connectionTimeout")) builder.setConnectionTimeout(config.get("database.connectionTimeout", Integer.class));
if (config.exists("database.idleTimeout")) builder.setIdleTimeout(config.get("database.idleTimeout", Integer.class));
if (config.exists("database.sslEnabled")) builder.setSslEnabled(config.get("database.sslEnabled", Boolean.class));
if (config.exists("database.sslMode")) builder.setSslMode(config.get("database.sslMode"));
return builder.build();
}
public static class Builder { public static class Builder {
final MZDatabaseConfiguration mzDatabaseConfiguration; final MZDatabaseConfiguration mzDatabaseConfiguration;
public Builder() { public Builder() {