diff --git a/core/src/main/java/com/databasir/core/domain/database/converter/DatabaseTypePojoConverter.java b/core/src/main/java/com/databasir/core/domain/database/converter/DatabaseTypePojoConverter.java index 4a51244..524a9c7 100644 --- a/core/src/main/java/com/databasir/core/domain/database/converter/DatabaseTypePojoConverter.java +++ b/core/src/main/java/com/databasir/core/domain/database/converter/DatabaseTypePojoConverter.java @@ -14,9 +14,9 @@ public interface DatabaseTypePojoConverter { @Mapping(target = "id", ignore = true) @Mapping(target = "updateAt", ignore = true) @Mapping(target = "createAt", ignore = true) - DatabaseTypePojo of(DatabaseTypeCreateRequest request); + DatabaseTypePojo of(DatabaseTypeCreateRequest request, String jdbcDriverFilePath); - DatabaseTypePojo of(DatabaseTypeUpdateRequest request); + DatabaseTypePojo of(DatabaseTypeUpdateRequest request, String jdbcDriverFilePath); DatabaseTypeDetailResponse toDetailResponse(DatabaseTypePojo data); diff --git a/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeDetailResponse.java b/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeDetailResponse.java index 55e8215..6c377a6 100644 --- a/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeDetailResponse.java +++ b/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeDetailResponse.java @@ -17,6 +17,8 @@ public class DatabaseTypeDetailResponse { private String jdbcDriverFileUrl; + private String jdbcDriverFilePath; + private String jdbcDriverClassName; private String jdbcProtocol; diff --git a/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypePageResponse.java b/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypePageResponse.java index 4cf7664..6dc284c 100644 --- a/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypePageResponse.java +++ b/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypePageResponse.java @@ -17,6 +17,8 @@ public class DatabaseTypePageResponse { private String jdbcDriverFileUrl; + private String jdbcDriverFilePath; + private String jdbcDriverClassName; private String jdbcProtocol; diff --git a/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeSimpleResponse.java b/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeSimpleResponse.java index 0c9fdeb..c298a8a 100644 --- a/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeSimpleResponse.java +++ b/core/src/main/java/com/databasir/core/domain/database/data/DatabaseTypeSimpleResponse.java @@ -12,4 +12,6 @@ public class DatabaseTypeSimpleResponse { private String urlPattern; private String jdbcProtocol; + + private String icon; } diff --git a/core/src/main/java/com/databasir/core/domain/database/service/DatabaseTypeService.java b/core/src/main/java/com/databasir/core/domain/database/service/DatabaseTypeService.java index ceff088..9a72474 100644 --- a/core/src/main/java/com/databasir/core/domain/database/service/DatabaseTypeService.java +++ b/core/src/main/java/com/databasir/core/domain/database/service/DatabaseTypeService.java @@ -5,6 +5,7 @@ import com.databasir.core.domain.database.converter.DatabaseTypePojoConverter; import com.databasir.core.domain.database.data.*; import com.databasir.core.infrastructure.connection.DatabaseTypes; import com.databasir.core.infrastructure.driver.DriverResources; +import com.databasir.core.infrastructure.driver.DriverResult; import com.databasir.dao.impl.DatabaseTypeDao; import com.databasir.dao.impl.ProjectDao; import com.databasir.dao.tables.pojos.DatabaseTypePojo; @@ -36,8 +37,13 @@ public class DatabaseTypeService { private final DatabaseTypePojoConverter databaseTypePojoConverter; public Integer create(DatabaseTypeCreateRequest request) { - driverResources.validateJar(request.getJdbcDriverFileUrl(), request.getJdbcDriverClassName()); - DatabaseTypePojo pojo = databaseTypePojoConverter.of(request); + if (databaseTypeDao.existsByDatabaseType(request.getDatabaseType())) { + throw DomainErrors.DATABASE_TYPE_NAME_DUPLICATE.exception(); + } + DriverResult result = + driverResources.load(null, request.getJdbcDriverFileUrl(), request.getDatabaseType()); + driverResources.validateDriverJar(result.getDriverFile(), request.getJdbcDriverClassName()); + DatabaseTypePojo pojo = databaseTypePojoConverter.of(request, result.getDriverFilePath()); try { return databaseTypeDao.insertAndReturnId(pojo); } catch (DuplicateKeyException e) { @@ -48,24 +54,27 @@ public class DatabaseTypeService { @Transactional public void update(DatabaseTypeUpdateRequest request) { databaseTypeDao.selectOptionalById(request.getId()).ifPresent(data -> { - if (DatabaseTypes.has(data.getDatabaseType())) { - throw DomainErrors.MUST_NOT_MODIFY_SYSTEM_DEFAULT_DATABASE_TYPE.exception(); + DatabaseTypePojo pojo; + if (!Objects.equals(request.getDatabaseType(), data.getDatabaseType()) + || !Objects.equals(request.getJdbcDriverFileUrl(), data.getJdbcDriverFileUrl())) { + // 名称修改,下载地址修改需要删除原有的 driver 并重新下载验证 + driverResources.deleteByDatabaseType(data.getDatabaseType()); + // download + DriverResult result = + driverResources.load(null, request.getJdbcDriverFileUrl(), request.getDatabaseType()); + driverResources.validateDriverJar(result.getDriverFile(), request.getJdbcDriverClassName()); + // validate + pojo = databaseTypePojoConverter.of(request, result.getDriverFilePath()); + } else { + pojo = databaseTypePojoConverter.of(request, data.getJdbcDriverFilePath()); } - driverResources.validateJar(request.getJdbcDriverFileUrl(), request.getJdbcDriverClassName()); - DatabaseTypePojo pojo = databaseTypePojoConverter.of(request); + try { databaseTypeDao.updateById(pojo); } catch (DuplicateKeyException e) { throw DomainErrors.DATABASE_TYPE_NAME_DUPLICATE.exception(); } - - // 名称修改,下载地址修改需要删除原有的 driver - if (!Objects.equals(request.getDatabaseType(), data.getDatabaseType()) - || !Objects.equals(request.getJdbcDriverFileUrl(), data.getJdbcDriverFileUrl())) { - driverResources.deleteByDatabaseType(data.getDatabaseType()); - } }); - } public void deleteById(Integer id) { @@ -99,6 +108,7 @@ public class DatabaseTypeService { response.setUrlPattern(type.getUrlPattern()); response.setDescription(type.getDescription()); response.setJdbcProtocol(type.getJdbcProtocol()); + response.setIcon(type.getIcon()); return response; }) .collect(Collectors.toList()); diff --git a/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java b/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java index d66218e..9d8d94b 100644 --- a/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java +++ b/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java @@ -31,6 +31,7 @@ import org.springframework.util.CollectionUtils; import java.io.OutputStream; import java.sql.Connection; +import java.sql.SQLException; import java.util.Collections; import java.util.List; import java.util.Map; @@ -138,9 +139,20 @@ public class DocumentService { DatabasirConfig databasirConfig = new DatabasirConfig(); databasirConfig.setIgnoreTableNameRegex(jsonConverter.fromJson(rule.getIgnoreTableNameRegexArray())); databasirConfig.setIgnoreTableColumnNameRegex(jsonConverter.fromJson(rule.getIgnoreColumnNameRegexArray())); - return Databasir.of(databasirConfig) - .get(jdbcConnection, dataSource.getDatabaseName(), dataSource.getSchemaName()) - .orElseThrow(DomainErrors.DATABASE_META_NOT_FOUND::exception); + try { + DatabaseMeta databaseMeta = Databasir.of(databasirConfig) + .get(jdbcConnection, dataSource.getDatabaseName(), dataSource.getSchemaName()) + .orElseThrow(DomainErrors.DATABASE_META_NOT_FOUND::exception); + return databaseMeta; + } finally { + try { + if (!jdbcConnection.isClosed()) { + jdbcConnection.close(); + } + } catch (SQLException e) { + log.error("close jdbc connection error", e); + } + } } private void saveNewDocument(DatabaseMeta meta, diff --git a/core/src/main/java/com/databasir/core/infrastructure/connection/CustomDatabaseConnectionFactory.java b/core/src/main/java/com/databasir/core/infrastructure/connection/CustomDatabaseConnectionFactory.java index f37df45..48f1859 100644 --- a/core/src/main/java/com/databasir/core/infrastructure/connection/CustomDatabaseConnectionFactory.java +++ b/core/src/main/java/com/databasir/core/infrastructure/connection/CustomDatabaseConnectionFactory.java @@ -2,6 +2,7 @@ package com.databasir.core.infrastructure.connection; import com.databasir.core.domain.DomainErrors; import com.databasir.core.infrastructure.driver.DriverResources; +import com.databasir.core.infrastructure.driver.DriverResult; import com.databasir.dao.impl.DatabaseTypeDao; import com.databasir.dao.tables.pojos.DatabaseTypePojo; import lombok.RequiredArgsConstructor; @@ -17,6 +18,7 @@ import java.net.URLClassLoader; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; +import java.util.Objects; import java.util.Properties; @Component @@ -38,8 +40,8 @@ public class CustomDatabaseConnectionFactory implements DatabaseConnectionFactor public Connection getConnection(Context context) throws SQLException { String databaseType = context.getDatabaseType(); DatabaseTypePojo type = databaseTypeDao.selectByDatabaseType(databaseType); - File driverFile = driverResources.loadOrDownloadByDatabaseType(databaseType, type.getJdbcDriverFileUrl()); + File driverFile = loadDriver(type); URLClassLoader loader = null; try { loader = new URLClassLoader( @@ -53,7 +55,6 @@ public class CustomDatabaseConnectionFactory implements DatabaseConnectionFactor throw DomainErrors.CONNECT_DATABASE_FAILED.exception(e.getMessage()); } // retrieve the driver class - Class clazz = null; Driver driver = null; try { @@ -81,4 +82,15 @@ public class CustomDatabaseConnectionFactory implements DatabaseConnectionFactor return driver.connect(jdbcUrl, info); } + private File loadDriver(DatabaseTypePojo type) { + String databaseType = type.getDatabaseType(); + String file = type.getJdbcDriverFilePath(); + String url = type.getJdbcDriverFileUrl(); + DriverResult result = driverResources.load(file, url, databaseType); + File driverFile = result.getDriverFile(); + if (!Objects.equals(result.getDriverFilePath(), type.getJdbcDriverFilePath())) { + databaseTypeDao.updateDriverFile(type.getId(), result.getDriverFilePath()); + } + return driverFile; + } } diff --git a/core/src/main/java/com/databasir/core/infrastructure/driver/DriverResources.java b/core/src/main/java/com/databasir/core/infrastructure/driver/DriverResources.java index a498287..c8ec447 100644 --- a/core/src/main/java/com/databasir/core/infrastructure/driver/DriverResources.java +++ b/core/src/main/java/com/databasir/core/infrastructure/driver/DriverResources.java @@ -19,7 +19,6 @@ import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Optional; import java.util.UUID; import java.util.jar.JarFile; @@ -33,29 +32,79 @@ public class DriverResources { private final RestTemplate restTemplate; - public void deleteByDatabaseType(String databaseType) { - Path path = Paths.get(driverFilePath(driverBaseDirectory, databaseType)); + public DriverResult load(String driverFilePath, String driverFileUrl, String databaseType) { + if (driverFilePath == null) { + String targetFile = targetDriverFile(databaseType); + File file = download(driverFileUrl, targetFile); + return new DriverResult(targetFile, file); + } + File driverFile = Paths.get(driverFilePath).toFile(); + if (driverFile.exists()) { + return new DriverResult(driverFilePath, driverFile); + } else { + String targetFile = targetDriverFile(databaseType); + File file = download(driverFileUrl, targetFile); + return new DriverResult(targetFile, file); + } + } + + private File download(String driverFileUrl, String targetFile) { + Path path = Path.of(targetFile); + + // create parent directory + if (Files.notExists(path)) { + path.getParent().toFile().mkdirs(); + try { + Files.createFile(path); + } catch (IOException e) { + log.error("create file error " + targetFile, e); + throw DomainErrors.DOWNLOAD_DRIVER_ERROR.exception(e.getMessage()); + } + } + + // download try { + return restTemplate.execute(driverFileUrl, HttpMethod.GET, null, response -> { + if (response.getStatusCode().is2xxSuccessful()) { + File file = path.toFile(); + FileOutputStream out = new FileOutputStream(file); + StreamUtils.copy(response.getBody(), out); + IOUtils.closeQuietly(out, ex -> log.error("close file error", ex)); + log.info("{} download success ", targetFile); + return file; + } else { + log.error("{} download error from {}: {} ", targetFile, driverFileUrl, response); + throw DomainErrors.DOWNLOAD_DRIVER_ERROR.exception("驱动下载失败:" + + response.getStatusCode() + + ", " + + response.getStatusText()); + } + }); + } catch (RestClientException e) { + log.error(targetFile + " download driver error", e); + throw DomainErrors.DOWNLOAD_DRIVER_ERROR.exception(e.getMessage()); + } + } + + public void deleteByDatabaseType(String databaseType) { + String baseDir = driverBaseDirectory + "/" + databaseType; + Path path = Paths.get(baseDir); + try { + if (Files.exists(path)) { + Files.list(path).forEach(file -> { + try { + Files.deleteIfExists(file); + } catch (IOException e) { + log.error("delete file error " + file, e); + } + }); + } Files.deleteIfExists(path); } catch (IOException e) { log.error("delete driver error " + databaseType, e); } } - public Optional loadByDatabaseType(String databaseType) { - Path path = Paths.get(driverFilePath(driverBaseDirectory, databaseType)); - if (Files.exists(path)) { - return Optional.of(path.toFile()); - } else { - return Optional.empty(); - } - } - - public File loadOrDownloadByDatabaseType(String databaseType, String driverFileUrl) { - return loadByDatabaseType(databaseType) - .orElseGet(() -> download(driverFileUrl, driverFilePath(driverBaseDirectory, databaseType))); - } - public String resolveDriverClassName(String driverFileUrl) { String tempFilePath = "temp/" + UUID.randomUUID() + ".jar"; File driverFile = download(driverFileUrl, tempFilePath); @@ -100,47 +149,7 @@ public class DriverResources { return driverClassName; } - private File download(String driverFileUrl, String targetFile) { - Path path = Path.of(targetFile); - - // create parent directory - if (Files.notExists(path)) { - path.getParent().toFile().mkdirs(); - try { - Files.createFile(path); - } catch (IOException e) { - log.error("create file error " + targetFile, e); - throw DomainErrors.DOWNLOAD_DRIVER_ERROR.exception(e.getMessage()); - } - } - - // download - try { - return restTemplate.execute(driverFileUrl, HttpMethod.GET, null, response -> { - if (response.getStatusCode().is2xxSuccessful()) { - File file = path.toFile(); - FileOutputStream out = new FileOutputStream(file); - StreamUtils.copy(response.getBody(), out); - IOUtils.closeQuietly(out, ex -> log.error("close file error", ex)); - log.info("{} download success ", targetFile); - return file; - } else { - log.error("{} download error from {}: {} ", targetFile, driverFileUrl, response); - throw DomainErrors.DOWNLOAD_DRIVER_ERROR.exception("驱动下载失败:" - + response.getStatusCode() - + ", " - + response.getStatusText()); - } - }); - } catch (RestClientException e) { - log.error(targetFile + " download driver error", e); - throw DomainErrors.DOWNLOAD_DRIVER_ERROR.exception(e.getMessage()); - } - } - - public void validateJar(String driverFileUrl, String className) { - String tempFilePath = "temp/" + UUID.randomUUID() + ".jar"; - File driverFile = download(driverFileUrl, tempFilePath); + public void validateDriverJar(File driverFile, String className) { URLClassLoader loader = null; try { loader = new URLClassLoader( @@ -165,22 +174,12 @@ public class DriverResources { throw DomainErrors.DRIVER_CLASS_NOT_FOUND.exception("驱动初始化异常, 请检查驱动类名:" + e.getMessage()); } finally { IOUtils.closeQuietly(loader); - try { - Files.deleteIfExists(driverFile.toPath()); - } catch (IOException e) { - log.error("delete driver error " + tempFilePath, e); - } } } - private String driverFilePath(String baseDir, String databaseType) { - String fileName = databaseType + ".jar"; - String filePath; - if (baseDir.endsWith(File.separator)) { - filePath = baseDir + fileName; - } else { - filePath = baseDir + File.separator + fileName; - } - return filePath; + private String targetDriverFile(String databaseType) { + return driverBaseDirectory + + "/" + databaseType + + "/" + System.currentTimeMillis() + ".jar"; } } diff --git a/core/src/main/java/com/databasir/core/infrastructure/driver/DriverResult.java b/core/src/main/java/com/databasir/core/infrastructure/driver/DriverResult.java new file mode 100644 index 0000000..735e7f0 --- /dev/null +++ b/core/src/main/java/com/databasir/core/infrastructure/driver/DriverResult.java @@ -0,0 +1,18 @@ +package com.databasir.core.infrastructure.driver; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.File; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DriverResult { + + private String driverFilePath; + + private File driverFile; + +} diff --git a/core/src/test/java/com/databasir/core/domain/database/service/DatabaseTypeServiceTest.java b/core/src/test/java/com/databasir/core/domain/database/service/DatabaseTypeServiceTest.java index 8d03586..f5b90a0 100644 --- a/core/src/test/java/com/databasir/core/domain/database/service/DatabaseTypeServiceTest.java +++ b/core/src/test/java/com/databasir/core/domain/database/service/DatabaseTypeServiceTest.java @@ -17,6 +17,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.jdbc.Sql; import org.springframework.transaction.annotation.Transactional; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @Transactional @@ -33,7 +34,7 @@ class DatabaseTypeServiceTest extends BaseTest { @BeforeEach public void setUp() { - Mockito.doNothing().when(driverResources).validateJar(anyString(), anyString()); + Mockito.doNothing().when(driverResources).validateDriverJar(any(), anyString()); } @Test diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/DatabaseType.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/DatabaseType.java index 76f14df..7ef2bfc 100644 --- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/DatabaseType.java +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/DatabaseType.java @@ -17,7 +17,7 @@ import org.jooq.ForeignKey; import org.jooq.Identity; import org.jooq.Name; import org.jooq.Record; -import org.jooq.Row12; +import org.jooq.Row13; import org.jooq.Schema; import org.jooq.Table; import org.jooq.TableField; @@ -75,6 +75,11 @@ public class DatabaseType extends TableImpl { */ public final TableField JDBC_DRIVER_FILE_URL = createField(DSL.name("jdbc_driver_file_url"), SQLDataType.VARCHAR(1024).nullable(false), this, ""); + /** + * The column databasir.database_type.jdbc_driver_file_path. + */ + public final TableField JDBC_DRIVER_FILE_PATH = createField(DSL.name("jdbc_driver_file_path"), SQLDataType.VARCHAR(512), this, ""); + /** * The column databasir.database_type.jdbc_driver_class_name. */ @@ -190,11 +195,11 @@ public class DatabaseType extends TableImpl { } // ------------------------------------------------------------------------- - // Row12 type methods + // Row13 type methods // ------------------------------------------------------------------------- @Override - public Row12 fieldsRow() { - return (Row12) super.fieldsRow(); + public Row13 fieldsRow() { + return (Row13) super.fieldsRow(); } } diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/DatabaseTypePojo.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/DatabaseTypePojo.java index 129bcf4..93ac800 100644 --- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/DatabaseTypePojo.java +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/DatabaseTypePojo.java @@ -21,6 +21,7 @@ public class DatabaseTypePojo implements Serializable { private String icon; private String description; private String jdbcDriverFileUrl; + private String jdbcDriverFilePath; private String jdbcDriverClassName; private String jdbcProtocol; private String urlPattern; @@ -37,6 +38,7 @@ public class DatabaseTypePojo implements Serializable { this.icon = value.icon; this.description = value.description; this.jdbcDriverFileUrl = value.jdbcDriverFileUrl; + this.jdbcDriverFilePath = value.jdbcDriverFilePath; this.jdbcDriverClassName = value.jdbcDriverClassName; this.jdbcProtocol = value.jdbcProtocol; this.urlPattern = value.urlPattern; @@ -52,6 +54,7 @@ public class DatabaseTypePojo implements Serializable { String icon, String description, String jdbcDriverFileUrl, + String jdbcDriverFilePath, String jdbcDriverClassName, String jdbcProtocol, String urlPattern, @@ -65,6 +68,7 @@ public class DatabaseTypePojo implements Serializable { this.icon = icon; this.description = description; this.jdbcDriverFileUrl = jdbcDriverFileUrl; + this.jdbcDriverFilePath = jdbcDriverFilePath; this.jdbcDriverClassName = jdbcDriverClassName; this.jdbcProtocol = jdbcProtocol; this.urlPattern = urlPattern; @@ -146,6 +150,20 @@ public class DatabaseTypePojo implements Serializable { this.jdbcDriverFileUrl = jdbcDriverFileUrl; } + /** + * Getter for databasir.database_type.jdbc_driver_file_path. + */ + public String getJdbcDriverFilePath() { + return this.jdbcDriverFilePath; + } + + /** + * Setter for databasir.database_type.jdbc_driver_file_path. + */ + public void setJdbcDriverFilePath(String jdbcDriverFilePath) { + this.jdbcDriverFilePath = jdbcDriverFilePath; + } + /** * Getter for databasir.database_type.jdbc_driver_class_name. */ @@ -253,6 +271,7 @@ public class DatabaseTypePojo implements Serializable { sb.append(", ").append(icon); sb.append(", ").append(description); sb.append(", ").append(jdbcDriverFileUrl); + sb.append(", ").append(jdbcDriverFilePath); sb.append(", ").append(jdbcDriverClassName); sb.append(", ").append(jdbcProtocol); sb.append(", ").append(urlPattern); diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/DatabaseTypeRecord.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/DatabaseTypeRecord.java index 1326573..20a47df 100644 --- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/DatabaseTypeRecord.java +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/DatabaseTypeRecord.java @@ -6,21 +6,20 @@ package com.databasir.dao.tables.records; import com.databasir.dao.tables.DatabaseType; import com.databasir.dao.tables.pojos.DatabaseTypePojo; - -import java.time.LocalDateTime; - import org.jooq.Field; import org.jooq.Record1; -import org.jooq.Record12; -import org.jooq.Row12; +import org.jooq.Record13; +import org.jooq.Row13; import org.jooq.impl.UpdatableRecordImpl; +import java.time.LocalDateTime; + /** * customer database types */ @SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public class DatabaseTypeRecord extends UpdatableRecordImpl implements Record12 { +public class DatabaseTypeRecord extends UpdatableRecordImpl implements Record13 { private static final long serialVersionUID = 1L; @@ -96,102 +95,116 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl return (String) get(4); } + /** + * Setter for databasir.database_type.jdbc_driver_file_path. + */ + public void setJdbcDriverFilePath(String value) { + set(5, value); + } + + /** + * Getter for databasir.database_type.jdbc_driver_file_path. + */ + public String getJdbcDriverFilePath() { + return (String) get(5); + } + /** * Setter for databasir.database_type.jdbc_driver_class_name. */ public void setJdbcDriverClassName(String value) { - set(5, value); + set(6, value); } /** * Getter for databasir.database_type.jdbc_driver_class_name. */ public String getJdbcDriverClassName() { - return (String) get(5); + return (String) get(6); } /** * Setter for databasir.database_type.jdbc_protocol. */ public void setJdbcProtocol(String value) { - set(6, value); + set(7, value); } /** * Getter for databasir.database_type.jdbc_protocol. */ public String getJdbcProtocol() { - return (String) get(6); + return (String) get(7); } /** * Setter for databasir.database_type.url_pattern. */ public void setUrlPattern(String value) { - set(7, value); + set(8, value); } /** * Getter for databasir.database_type.url_pattern. */ public String getUrlPattern() { - return (String) get(7); + return (String) get(8); } /** * Setter for databasir.database_type.deleted. */ public void setDeleted(Boolean value) { - set(8, value); + set(9, value); } /** * Getter for databasir.database_type.deleted. */ public Boolean getDeleted() { - return (Boolean) get(8); + return (Boolean) get(9); } /** * Setter for databasir.database_type.deleted_token. */ public void setDeletedToken(Integer value) { - set(9, value); + set(10, value); } /** * Getter for databasir.database_type.deleted_token. */ public Integer getDeletedToken() { - return (Integer) get(9); + return (Integer) get(10); } /** * Setter for databasir.database_type.update_at. */ public void setUpdateAt(LocalDateTime value) { - set(10, value); + set(11, value); } /** * Getter for databasir.database_type.update_at. */ public LocalDateTime getUpdateAt() { - return (LocalDateTime) get(10); + return (LocalDateTime) get(11); } /** * Setter for databasir.database_type.create_at. */ public void setCreateAt(LocalDateTime value) { - set(11, value); + set(12, value); } /** * Getter for databasir.database_type.create_at. */ public LocalDateTime getCreateAt() { - return (LocalDateTime) get(11); + return (LocalDateTime) get(12); } // ------------------------------------------------------------------------- @@ -204,17 +217,17 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl } // ------------------------------------------------------------------------- - // Record12 type implementation + // Record13 type implementation // ------------------------------------------------------------------------- @Override - public Row12 fieldsRow() { - return (Row12) super.fieldsRow(); + public Row13 fieldsRow() { + return (Row13) super.fieldsRow(); } @Override - public Row12 valuesRow() { - return (Row12) super.valuesRow(); + public Row13 valuesRow() { + return (Row13) super.valuesRow(); } @Override @@ -244,36 +257,41 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl @Override public Field field6() { - return DatabaseType.DATABASE_TYPE.JDBC_DRIVER_CLASS_NAME; + return DatabaseType.DATABASE_TYPE.JDBC_DRIVER_FILE_PATH; } @Override public Field field7() { - return DatabaseType.DATABASE_TYPE.JDBC_PROTOCOL; + return DatabaseType.DATABASE_TYPE.JDBC_DRIVER_CLASS_NAME; } @Override public Field field8() { + return DatabaseType.DATABASE_TYPE.JDBC_PROTOCOL; + } + + @Override + public Field field9() { return DatabaseType.DATABASE_TYPE.URL_PATTERN; } @Override - public Field field9() { + public Field field10() { return DatabaseType.DATABASE_TYPE.DELETED; } @Override - public Field field10() { + public Field field11() { return DatabaseType.DATABASE_TYPE.DELETED_TOKEN; } @Override - public Field field11() { + public Field field12() { return DatabaseType.DATABASE_TYPE.UPDATE_AT; } @Override - public Field field12() { + public Field field13() { return DatabaseType.DATABASE_TYPE.CREATE_AT; } @@ -304,36 +322,41 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl @Override public String component6() { - return getJdbcDriverClassName(); + return getJdbcDriverFilePath(); } @Override public String component7() { - return getJdbcProtocol(); + return getJdbcDriverClassName(); } @Override public String component8() { + return getJdbcProtocol(); + } + + @Override + public String component9() { return getUrlPattern(); } @Override - public Boolean component9() { + public Boolean component10() { return getDeleted(); } @Override - public Integer component10() { + public Integer component11() { return getDeletedToken(); } @Override - public LocalDateTime component11() { + public LocalDateTime component12() { return getUpdateAt(); } @Override - public LocalDateTime component12() { + public LocalDateTime component13() { return getCreateAt(); } @@ -364,36 +387,41 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl @Override public String value6() { - return getJdbcDriverClassName(); + return getJdbcDriverFilePath(); } @Override public String value7() { - return getJdbcProtocol(); + return getJdbcDriverClassName(); } @Override public String value8() { + return getJdbcProtocol(); + } + + @Override + public String value9() { return getUrlPattern(); } @Override - public Boolean value9() { + public Boolean value10() { return getDeleted(); } @Override - public Integer value10() { + public Integer value11() { return getDeletedToken(); } @Override - public LocalDateTime value11() { + public LocalDateTime value12() { return getUpdateAt(); } @Override - public LocalDateTime value12() { + public LocalDateTime value13() { return getCreateAt(); } @@ -429,48 +457,54 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl @Override public DatabaseTypeRecord value6(String value) { - setJdbcDriverClassName(value); + setJdbcDriverFilePath(value); return this; } @Override public DatabaseTypeRecord value7(String value) { - setJdbcProtocol(value); + setJdbcDriverClassName(value); return this; } @Override public DatabaseTypeRecord value8(String value) { + setJdbcProtocol(value); + return this; + } + + @Override + public DatabaseTypeRecord value9(String value) { setUrlPattern(value); return this; } @Override - public DatabaseTypeRecord value9(Boolean value) { + public DatabaseTypeRecord value10(Boolean value) { setDeleted(value); return this; } @Override - public DatabaseTypeRecord value10(Integer value) { + public DatabaseTypeRecord value11(Integer value) { setDeletedToken(value); return this; } @Override - public DatabaseTypeRecord value11(LocalDateTime value) { + public DatabaseTypeRecord value12(LocalDateTime value) { setUpdateAt(value); return this; } @Override - public DatabaseTypeRecord value12(LocalDateTime value) { + public DatabaseTypeRecord value13(LocalDateTime value) { setCreateAt(value); return this; } @Override - public DatabaseTypeRecord values(Integer value1, String value2, String value3, String value4, String value5, String value6, String value7, String value8, Boolean value9, Integer value10, LocalDateTime value11, LocalDateTime value12) { + public DatabaseTypeRecord values(Integer value1, String value2, String value3, String value4, String value5, String value6, String value7, String value8, String value9, Boolean value10, Integer value11, LocalDateTime value12, LocalDateTime value13) { value1(value1); value2(value2); value3(value3); @@ -483,6 +517,7 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl value10(value10); value11(value11); value12(value12); + value13(value13); return this; } @@ -500,7 +535,7 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl /** * Create a detached, initialised DatabaseTypeRecord */ - public DatabaseTypeRecord(Integer id, String databaseType, String icon, String description, String jdbcDriverFileUrl, String jdbcDriverClassName, String jdbcProtocol, String urlPattern, Boolean deleted, Integer deletedToken, LocalDateTime updateAt, LocalDateTime createAt) { + public DatabaseTypeRecord(Integer id, String databaseType, String icon, String description, String jdbcDriverFileUrl, String jdbcDriverFilePath, String jdbcDriverClassName, String jdbcProtocol, String urlPattern, Boolean deleted, Integer deletedToken, LocalDateTime updateAt, LocalDateTime createAt) { super(DatabaseType.DATABASE_TYPE); setId(id); @@ -508,6 +543,7 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl setIcon(icon); setDescription(description); setJdbcDriverFileUrl(jdbcDriverFileUrl); + setJdbcDriverFilePath(jdbcDriverFilePath); setJdbcDriverClassName(jdbcDriverClassName); setJdbcProtocol(jdbcProtocol); setUrlPattern(urlPattern); @@ -529,6 +565,7 @@ public class DatabaseTypeRecord extends UpdatableRecordImpl setIcon(value.getIcon()); setDescription(value.getDescription()); setJdbcDriverFileUrl(value.getJdbcDriverFileUrl()); + setJdbcDriverFilePath(value.getJdbcDriverFilePath()); setJdbcDriverClassName(value.getJdbcDriverClassName()); setJdbcProtocol(value.getJdbcProtocol()); setUrlPattern(value.getUrlPattern()); diff --git a/dao/src/main/java/com/databasir/dao/impl/DatabaseTypeDao.java b/dao/src/main/java/com/databasir/dao/impl/DatabaseTypeDao.java index 48069d7..3b2752b 100644 --- a/dao/src/main/java/com/databasir/dao/impl/DatabaseTypeDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/DatabaseTypeDao.java @@ -58,4 +58,12 @@ public class DatabaseTypeDao extends BaseDao { public Optional selectOptionalById(Integer id) { return super.selectOptionalOne(DATABASE_TYPE.DELETED.eq(false).and(DATABASE_TYPE.ID.eq(id))); } + + public void updateDriverFile(Integer id, String driverFile) { + this.getDslContext() + .update(DATABASE_TYPE) + .set(DATABASE_TYPE.JDBC_DRIVER_FILE_PATH, driverFile) + .where(DATABASE_TYPE.ID.eq(id)) + .execute(); + } } \ No newline at end of file diff --git a/dao/src/main/resources/db/init/init.sql b/dao/src/main/resources/db/init/init.sql new file mode 100644 index 0000000..fb08945 --- /dev/null +++ b/dao/src/main/resources/db/init/init.sql @@ -0,0 +1,380 @@ +CREATE DATABASE IF NOT EXISTS databasir; +USE databasir; + +CREATE TABLE IF NOT EXISTS sys_key +( + id INT PRIMARY KEY AUTO_INCREMENT, + rsa_public_key TEXT NOT NULL, + rsa_private_key TEXT NOT NULL, + aes_key TEXT NOT NULL, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS sys_mail +( + id INT PRIMARY KEY AUTO_INCREMENT, + username TEXT NOT NULL, + password TEXT NOT NULL, + smtp_host VARCHAR(512) NOT NULL, + smtp_port INT NOT NULL, + use_ssl BOOLEAN NOT NULL DEFAULT FALSE, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS user +( + id INT PRIMARY KEY AUTO_INCREMENT, + email VARCHAR(512) NOT NULL, + username VARCHAR(128) NOT NULL, + password TEXT NOT NULL, + nickname VARCHAR(255) NOT NULL, + avatar VARCHAR(512) DEFAULT NULL, + enabled BOOLEAN NOT NULL DEFAULT FALSE, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + deleted_token INT NOT NULL DEFAULT 0, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_email (email, deleted_token), + CONSTRAINT UNIQUE uk_username (username, deleted_token) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS user_role +( + id INT PRIMARY KEY AUTO_INCREMENT, + user_id INT NOT NULL, + role VARCHAR(128) NOT NULL COMMENT 'SYS_OWNER, GROUP_OWNER, GROUP_MEMBER', + group_id INT DEFAULT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_user_id_group_id_role (user_id, group_id, role) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `group` +( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + description VARCHAR(512) NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `project` +( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + description TEXT NOT NULL, + group_id INT NOT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + deleted_token INT NOT NULL DEFAULT 0 COMMENT 'default is 0, it will be set to {id} when deleted', + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_group_id_name_deleted_token (group_id, name, deleted_token) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `project_sync_rule` +( + id INT PRIMARY KEY AUTO_INCREMENT, + project_id INT NOT NULL, + ignore_table_name_regex_array JSON NOT NULL, + ignore_column_name_regex_array JSON NOT NULL, + is_auto_sync BOOLEAN NOT NULL DEFAULT FALSE, + auto_sync_cron VARCHAR(128) NOT NULL DEFAULT '', + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_project_id (project_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `data_source` +( + id INT PRIMARY KEY AUTO_INCREMENT, + project_id INT NOT NULL, + database_name VARCHAR(255) NOT NULL, + schema_name VARCHAR(255) NOT NULL, + database_type VARCHAR(255) NOT NULL, + url TEXT NOT NULL, + username TEXT NOT NULL, + password TEXT NOT NULL, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_project_id (project_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `data_source_property` +( + id INT PRIMARY KEY AUTO_INCREMENT, + data_source_id INT NOT NULL, + `key` TEXT NOT NULL, + `value` TEXT NOT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_data_source_id (data_source_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS database_document +( + id INT PRIMARY KEY AUTO_INCREMENT, + project_id INT NOT NULL, + database_name VARCHAR(255) NOT NULL, + schema_name VARCHAR(255) NOT NULL, + product_name TEXT NOT NULL, + product_version TEXT NOT NULL, + version BIGINT NOT NULL DEFAULT 1, + is_archive BOOLEAN NOT NULL DEFAULT FALSE, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_project_id_version_is_archive (project_id, version, is_archive) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS table_document +( + + id INT PRIMARY KEY AUTO_INCREMENT, + database_document_id INT NOT NULL, + name TEXT NOT NULL, + type VARCHAR(255) NOT NULL, + comment VARCHAR(512) DEFAULT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_database_document_id (database_document_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS table_column_document +( + + id INT PRIMARY KEY AUTO_INCREMENT, + table_document_id INT NOT NULL, + database_document_id INT NOT NULL, + name TEXT NOT NULL, + type VARCHAR(255) NOT NULL, + data_type INT NOT NULL DEFAULT 99999, + comment VARCHAR(512) DEFAULT NULL, + default_value VARCHAR(512) DEFAULT NULL, + size INT NOT NULL, + decimal_digits INT DEFAULT NULL, + is_primary_key BOOLEAN NOT NULL, + nullable VARCHAR(64) NOT NULL COMMENT 'YES, NO, UNKNOWN', + auto_increment VARCHAR(64) NOT NULL COMMENT 'YES, NO, UNKNOWN', + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_table_document_id (table_document_id), + INDEX idx_database_document_id (database_document_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS table_foreign_key_document +( + id INT PRIMARY KEY AUTO_INCREMENT, + table_document_id INT NOT NULL, + database_document_id INT NOT NULL, + key_seq INT NOT NULL DEFAULT 0, + fk_name VARCHAR(255) DEFAULT NULL, + fk_table_name VARCHAR(512) NOT NULL, + fk_column_name VARCHAR(512) NOT NULL, + pk_name VARCHAR(255) DEFAULT NULL, + pk_table_name VARCHAR(512) NOT NULL, + pk_column_name VARCHAR(512) NOT NULL, + update_rule VARCHAR(128) NOT NULL COMMENT 'NO_ACTION, CASCADE, SET_NULL, SET_DEFAULT', + delete_rule VARCHAR(128) NOT NULL COMMENT 'NO_ACTION, CASCADE, SET_NULL, SET_DEFAULT', + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_table_document_id (table_document_id), + INDEX idx_database_document_id (database_document_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS table_index_document +( + + id INT PRIMARY KEY AUTO_INCREMENT, + table_document_id INT NOT NULL, + database_document_id INT NOT NULL, + name TEXT NOT NULL, + is_unique BOOLEAN NOT NULL, + column_name_array JSON NOT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_table_document_id (table_document_id), + INDEX idx_database_document_id (database_document_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS table_trigger_document +( + + id INT PRIMARY KEY AUTO_INCREMENT, + table_document_id INT NOT NULL, + database_document_id INT NOT NULL, + timing VARCHAR(64) NOT NULL, + manipulation VARCHAR(128) NOT NULL, + statement TEXT NOT NULL, + trigger_create_at VARCHAR(255) NOT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_table_document_id (table_document_id), + INDEX idx_database_document_id (database_document_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS login +( + id INT PRIMARY KEY AUTO_INCREMENT, + user_id INT NOT NULL, + access_token TEXT NOT NULL, + refresh_token TEXT NOT NULL, + access_token_expire_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + refresh_token_expire_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_user_id (user_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS document_discussion +( + id INT PRIMARY KEY AUTO_INCREMENT, + content TEXT NOT NULL, + user_id INT NOT NULL COMMENT 'user.id', + project_id INT NOT NULL, + table_name VARCHAR(255) NOT NULL, + column_name VARCHAR(255) DEFAULT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_project_id (project_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS operation_log +( + id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, + + operator_user_id INT NOT NULL COMMENT 'ref to user.id', + operator_username VARCHAR(128) NOT NULL COMMENT 'user.username', + operator_nickname VARCHAR(255) NOT NULL COMMENT 'user.nickname', + operation_module VARCHAR(128) NOT NULL, + operation_code VARCHAR(255) NOT NULL, + operation_name VARCHAR(255) NOT NULL, + operation_response JSON NOT NULL, + is_success BOOLEAN NOT NULL DEFAULT FALSE, + involved_project_id INT DEFAULT NULL COMMENT 'ref to project.id', + involved_group_id INT DEFAULT NULL COMMENT 'ref to group.id', + involved_user_id INT DEFAULT NULL COMMENT 'ref to user.id', + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS user_favorite_project +( + id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + user_id INT NOT NULL, + project_id INT NOT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE uk_user_id_project_id (user_id, project_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS oauth_app +( + id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + registration_id VARCHAR(100) NOT NULL, + app_name VARCHAR(128) NOT NULL, + app_icon VARCHAR(256) NOT NULL DEFAULT '', + app_type VARCHAR(64) NOT NULL COMMENT 'github, gitlab', + client_id VARCHAR(256), + client_secret VARCHAR(256), + auth_url VARCHAR(256), + resource_url VARCHAR(256), + scope VARCHAR(256), + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE uk_registration_id (registration_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci COMMENT 'oauth app info'; + +CREATE TABLE IF NOT EXISTS database_type +( + id INT PRIMARY KEY AUTO_INCREMENT, + database_type VARCHAR(128) NOT NULL COMMENT 'such as mysql, postgresql, mysql5.5 and so on', + icon VARCHAR(512) NOT NULL DEFAULT '', + description VARCHAR(512) NOT NULL, + jdbc_driver_file_url VARCHAR(1024) NOT NULL, + jdbc_driver_class_name VARCHAR(255) NOT NULL, + jdbc_protocol VARCHAR(128) NOT NULL, + url_pattern VARCHAR(255) NOT NULL, + jdbc_driver_file VARCHAR(512) DEFAULT NULL, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + deleted_token INT NOT NULL DEFAULT 0, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT uk_database_type_deleted_deleted_token UNIQUE (database_type, deleted, deleted_token) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci COMMENT 'customer database types'; + +REPLACE INTO databasir.database_type (id, database_type, icon, DESCRIPTION, jdbc_driver_file_url, + jdbc_driver_class_name, + jdbc_protocol, url_pattern) +VALUES (1, 'mysql', '', 'system default mysql', 'N/A', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql', + '{{jdbc.protocol}}://{{db.url}}/{{db.name}}'), + (2, 'postgresql', '', 'system default postgresql', 'N/A', 'org.postgresql.Driver', 'jdbc:postgresql', + '{{jdbc.protocol}}://{{db.url}}/{{db.name}}'); + +CREATE TABLE IF NOT EXISTS document_description +( + id INT PRIMARY KEY AUTO_INCREMENT, + content TEXT NOT NULL, + project_id INT NOT NULL, + table_name VARCHAR(255) NOT NULL, + column_name VARCHAR(255) DEFAULT NULL, + update_by INT NOT NULL, + update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_project_id_table_name_column_name (project_id, table_name, column_name) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci COMMENT 'custom document description'; + +CREATE TABLE IF NOT EXISTS document_template_property +( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `key` VARCHAR(255) NOT NULL, + `value` VARCHAR(255) DEFAULT NULL, + `default_value` VARCHAR(255) NOT NULL, + `type` VARCHAR(64) NOT NULL, + `create_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_type_key (`type`, `key`) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci COMMENT 'template property'; + +CREATE TABLE IF NOT EXISTS mock_data_rule +( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `project_id` INT NOT NULL, + `table_name` VARCHAR(255) NOT NULL, + `column_name` VARCHAR(255) NOT NULL, + `dependent_table_name` VARCHAR(255) DEFAULT NULL, + `dependent_column_name` VARCHAR(255) DEFAULT NULL, + `mock_data_type` VARCHAR(255) NOT NULL DEFAULT 'AUTO / REF / SCRIPT / PHONE / DATE / TIMESTAMP / ...', + `mock_data_script` TEXT DEFAULT NULL, + `update_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `create_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT UNIQUE uk_project_id_table_name_column_name (project_id, table_name, column_name) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS project_sync_task +( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `project_id` INT NOT NULL, + `user_id` INT NOT NULL, + `status` VARCHAR(32) NOT NULL DEFAULT 'NEW' COMMENT 'NEW \ RUNNING \ FINISHED \ FAILED \ CANCELED', + `result` VARCHAR(1024) NOT NULL DEFAULT '', + `run_at` DATETIME DEFAULT NULL, + `update_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `create_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + INDEX idx_project_id (project_id), + INDEX idx_user_id (user_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci; \ No newline at end of file diff --git a/dao/src/main/resources/db/migration/V1.4.1__driver_file.sql b/dao/src/main/resources/db/migration/V1.4.1__driver_file.sql new file mode 100644 index 0000000..df598de --- /dev/null +++ b/dao/src/main/resources/db/migration/V1.4.1__driver_file.sql @@ -0,0 +1,2 @@ +ALTER TABLE database_type + ADD COLUMN jdbc_driver_file_path VARCHAR(512) DEFAULT NULL AFTER jdbc_driver_file_url; \ No newline at end of file diff --git a/databasir-frontend b/databasir-frontend index 65875c7..0e1abbd 160000 --- a/databasir-frontend +++ b/databasir-frontend @@ -1 +1 @@ -Subproject commit 65875c7d631916b6ab672caccc4ab351a1ed7c39 +Subproject commit 0e1abbd7da7a26b05a6d06e78130a200f4e5e181