|
87 | 87 | import org.flowable.common.engine.impl.db.MybatisTypeAliasConfigurator;
|
88 | 88 | import org.flowable.common.engine.impl.db.MybatisTypeHandlerConfigurator;
|
89 | 89 | import org.flowable.common.engine.impl.db.SchemaManager;
|
| 90 | +import org.flowable.common.engine.impl.db.SchemaManagerDatabaseConfiguration; |
| 91 | +import org.flowable.common.engine.impl.db.SchemaManagerDatabaseConfigurationSessionFactory; |
90 | 92 | import org.flowable.common.engine.impl.db.SchemaOperationsEngineBuild;
|
91 | 93 | import org.flowable.common.engine.impl.event.EventDispatchAction;
|
92 | 94 | import org.flowable.common.engine.impl.event.FlowableEventDispatcherImpl;
|
|
122 | 124 | import org.flowable.common.engine.impl.persistence.entity.data.impl.MybatisPropertyDataManager;
|
123 | 125 | import org.flowable.common.engine.impl.runtime.Clock;
|
124 | 126 | import org.flowable.common.engine.impl.service.CommonEngineServiceImpl;
|
| 127 | +import org.flowable.common.engine.impl.util.DbUtil; |
125 | 128 | import org.flowable.common.engine.impl.util.DefaultClockImpl;
|
126 | 129 | import org.flowable.common.engine.impl.util.IoUtil;
|
127 | 130 | import org.flowable.common.engine.impl.util.ReflectUtil;
|
@@ -382,38 +385,7 @@ public abstract class AbstractEngineConfiguration {
|
382 | 385 | public static final String DATABASE_TYPE_COCKROACHDB = "cockroachdb";
|
383 | 386 |
|
384 | 387 | public static Properties getDefaultDatabaseTypeMappings() {
|
385 |
| - Properties databaseTypeMappings = new Properties(); |
386 |
| - databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2); |
387 |
| - databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL); |
388 |
| - databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL); |
389 |
| - databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL); |
390 |
| - databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE); |
391 |
| - databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES); |
392 |
| - databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL); |
393 |
| - databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2); |
394 |
| - databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2); |
395 |
| - databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2); |
396 |
| - databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2); |
397 |
| - databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2); |
398 |
| - databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2); |
399 |
| - databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2); |
400 |
| - databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2); |
401 |
| - databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2); |
402 |
| - databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2); |
403 |
| - databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2); |
404 |
| - databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2); |
405 |
| - databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2); |
406 |
| - databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2); |
407 |
| - databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2); |
408 |
| - databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2); |
409 |
| - databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2); |
410 |
| - databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2); |
411 |
| - databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2); |
412 |
| - databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2); |
413 |
| - databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2); |
414 |
| - databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2); |
415 |
| - databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB); |
416 |
| - return databaseTypeMappings; |
| 388 | + return DbUtil.getDefaultDatabaseTypeMappings(); |
417 | 389 | }
|
418 | 390 |
|
419 | 391 | protected Map<Object, Object> beans;
|
@@ -498,46 +470,7 @@ protected void initDataSource() {
|
498 | 470 | }
|
499 | 471 |
|
500 | 472 | public void initDatabaseType() {
|
501 |
| - Connection connection = null; |
502 |
| - try { |
503 |
| - connection = dataSource.getConnection(); |
504 |
| - DatabaseMetaData databaseMetaData = connection.getMetaData(); |
505 |
| - String databaseProductName = databaseMetaData.getDatabaseProductName(); |
506 |
| - logger.debug("database product name: '{}'", databaseProductName); |
507 |
| - |
508 |
| - // CRDB does not expose the version through the jdbc driver, so we need to fetch it through version(). |
509 |
| - if (PRODUCT_NAME_POSTGRES.equalsIgnoreCase(databaseProductName)) { |
510 |
| - try (PreparedStatement preparedStatement = connection.prepareStatement("select version() as version;"); |
511 |
| - ResultSet resultSet = preparedStatement.executeQuery()) { |
512 |
| - String version = null; |
513 |
| - if (resultSet.next()) { |
514 |
| - version = resultSet.getString("version"); |
515 |
| - } |
516 |
| - |
517 |
| - if (StringUtils.isNotEmpty(version) && version.toLowerCase().startsWith(PRODUCT_NAME_CRDB.toLowerCase())) { |
518 |
| - databaseProductName = PRODUCT_NAME_CRDB; |
519 |
| - logger.info("CockroachDB version '{}' detected", version); |
520 |
| - } |
521 |
| - } |
522 |
| - } |
523 |
| - |
524 |
| - databaseType = databaseTypeMappings.getProperty(databaseProductName); |
525 |
| - if (databaseType == null) { |
526 |
| - throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'"); |
527 |
| - } |
528 |
| - logger.debug("using database type: {}", databaseType); |
529 |
| - |
530 |
| - } catch (SQLException e) { |
531 |
| - throw new RuntimeException("Exception while initializing Database connection", e); |
532 |
| - } finally { |
533 |
| - try { |
534 |
| - if (connection != null) { |
535 |
| - connection.close(); |
536 |
| - } |
537 |
| - } catch (SQLException e) { |
538 |
| - logger.error("Exception while closing the Database connection", e); |
539 |
| - } |
540 |
| - } |
| 473 | + databaseType = DbUtil.determineDatabaseType(dataSource, logger, databaseTypeMappings); |
541 | 474 |
|
542 | 475 | // Special care for MSSQL, as it has a hard limit of 2000 params per statement (incl bulk statement).
|
543 | 476 | // Especially with executions, with 100 as default, this limit is passed.
|
@@ -765,6 +698,7 @@ public void initSessionFactories() {
|
765 | 698 |
|
766 | 699 | if (usingRelationalDatabase) {
|
767 | 700 | initDbSqlSessionFactory();
|
| 701 | + initSchemaManagerDatabaseConfigurationSessionFactory(); |
768 | 702 | }
|
769 | 703 |
|
770 | 704 | addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl::new));
|
@@ -811,6 +745,12 @@ public void initDbSqlSessionFactory() {
|
811 | 745 | addSessionFactory(dbSqlSessionFactory);
|
812 | 746 | }
|
813 | 747 |
|
| 748 | + protected void initSchemaManagerDatabaseConfigurationSessionFactory() { |
| 749 | + if (!sessionFactories.containsKey(SchemaManagerDatabaseConfiguration.class)) { |
| 750 | + addSessionFactory(new SchemaManagerDatabaseConfigurationSessionFactory()); |
| 751 | + } |
| 752 | + } |
| 753 | + |
814 | 754 | public DbSqlSessionFactory createDbSqlSessionFactory() {
|
815 | 755 | return new DbSqlSessionFactory(usePrefixId);
|
816 | 756 | }
|
|
0 commit comments