From 55f156b3f441313c0ec2861b9eea866068c37a3f Mon Sep 17 00:00:00 2001 From: Ashwini Singh Date: Tue, 15 Nov 2022 14:38:27 +1100 Subject: [PATCH] initial commit Commerce DB Sync --- DISCLAIMER.md | 1 + LICENSE | 403 +++--- README.md | 124 +- commercedbsync/.classpath | 15 + commercedbsync/.springBeans | 15 + commercedbsync/buildcallbacks.xml | 161 +++ commercedbsync/extensioninfo.xml | 16 + commercedbsync/external-dependencies.xml | 52 + commercedbsync/project.properties | 112 ++ .../resources/commercedbsync-beans.xml | 148 +++ .../resources/commercedbsync-items.xml | 111 ++ .../resources/commercedbsync-spring.xml | 312 +++++ .../resources/commercedbsync/dummy.txt | 0 .../commercedbsync/sap-hybris-platform.png | Bin 0 -> 4884 bytes .../groovy/MigrationSummaryScript.groovy | 59 + .../resources/groovy/ddlaltercreate.groovy | 73 ++ ...essentialdata-commercemigration-jobs.impex | 27 + .../commercedbsync-locales_de.properties | 6 + .../commercedbsync-locales_en.properties | 18 + .../commercedbsync-locales_es.properties | 6 + .../commercedbsync-locales_fr.properties | 6 + .../commercedbsync-locales_it.properties | 6 + .../commercedbsync-locales_ja.properties | 6 + .../commercedbsync-locales_ko.properties | 6 + .../commercedbsync-locales_pt.properties | 6 + .../commercedbsync-locales_ru.properties | 6 + .../commercedbsync-locales_zh.properties | 6 + .../resources/sql/createSchedulerTables.sql | 105 ++ .../sql/createSchedulerTablesHana.sql | 340 +++++ .../sql/createSchedulerTablesOracle.sql | 158 +++ .../sql/createSchedulerTablesPostGres.sql | 130 ++ .../CommercedbsyncStandalone.java | 44 + .../adapter/DataRepositoryAdapter.java | 26 + .../impl/ContextualDataRepositoryAdapter.java | 89 ++ .../commercedbsync/concurrent/DataPipe.java | 24 + .../concurrent/DataPipeFactory.java | 17 + .../concurrent/DataWorkerExecutor.java | 17 + .../concurrent/DataWorkerPoolFactory.java | 14 + .../concurrent/MDCTaskDecorator.java | 27 + .../concurrent/MaybeFinished.java | 49 + .../concurrent/PipeAbortedException.java | 17 + .../concurrent/RetriableTask.java | 54 + .../concurrent/impl/DefaultDataPipe.java | 98 ++ .../impl/DefaultDataPipeFactory.java | 319 +++++ .../impl/DefaultDataWorkerExecutor.java | 64 + .../impl/DefaultDataWorkerPoolFactory.java | 48 + .../constants/CommercedbsyncConstants.java | 87 ++ .../commercedbsync/context/CopyContext.java | 133 ++ .../context/IncrementalMigrationContext.java | 34 + .../context/MigrationContext.java | 95 ++ .../DefaultIncrementalMigrationContext.java | 146 +++ .../context/impl/DefaultMigrationContext.java | 306 +++++ .../validation/MigrationContextValidator.java | 15 + .../DefaultMigrationContextValidator.java | 52 + .../cron/FullMigrationCronJob.java | 32 + .../cron/IncrementalMigrationCronJob.java | 32 + .../commercedbsync/cron/MigrationCronJob.java | 32 + .../commercedbsync/dataset/DataColumn.java | 19 + .../commercedbsync/dataset/DataSet.java | 32 + .../dataset/impl/BulkDataSet.java | 77 ++ .../dataset/impl/DefaultDataColumn.java | 44 + .../dataset/impl/DefaultDataSet.java | 131 ++ .../MigrationDataSourceFactory.java | 18 + .../AbstractMigrationDataSourceFactory.java | 16 + .../DefaultMigrationDataSourceFactory.java | 31 + .../events/CopyCompleteEvent.java | 23 + .../events/CopyDatabaseTableEvent.java | 15 + .../commercedbsync/events/CopyEvent.java | 48 + .../handlers/CopyCompleteEventListener.java | 112 ++ .../CopyDatabaseTableEventListener.java | 88 ++ .../filter/DataCopyTableFilter.java | 15 + .../impl/CompositeDataCopyTableFilter.java | 27 + .../impl/ExclusionDataCopyTableFilter.java | 27 + .../impl/InclusionDataCopyTableFilter.java | 28 + .../impl/IncrementalDataCopyTableFilter.java | 31 + .../DefaultCMTRemoveInterceptor.java | 117 ++ .../jalo/ItemDeletionMarker.java | 32 + .../jobs/AbstractMigrationJobPerformable.java | 272 ++++ .../commercedbsync/jobs/FullMigrationJob.java | 76 ++ .../jobs/IncrementalMigrationJob.java | 259 ++++ .../DefaultCMTAfterSaveListener.java | 116 ++ .../performance/PerformanceCategory.java | 11 + .../performance/PerformanceProfiler.java | 26 + .../performance/PerformanceRecorder.java | 143 +++ .../performance/PerformanceUnit.java | 11 + .../impl/DefaultPerformanceProfiler.java | 67 + .../processors/MigrationPostProcessor.java | 17 + .../AdjustActiveTypeSystemPostProcessor.java | 95 ++ .../impl/DefaultMigrationPostProcessor.java | 25 + .../impl/ReportMigrationPostProcessor.java | 50 + .../profile/DataSourceConfiguration.java | 40 + .../impl/DefaultDataSourceConfiguration.java | 161 +++ .../provider/CopyItemProvider.java | 24 + .../impl/DefaultDataCopyItemProvider.java | 292 +++++ .../repository/DataRepository.java | 94 ++ .../impl/AbstractDataRepository.java | 580 +++++++++ .../repository/impl/AzureDataRepository.java | 176 +++ .../impl/AzureIncrementalDataRepository.java | 414 +++++++ .../DataIncrementalRepositoryFactory.java | 43 + .../impl/DataRepositoryFactory.java | 47 + .../repository/impl/HanaDataRepository.java | 118 ++ .../repository/impl/HsqlRepository.java | 56 + .../repository/impl/MySQLDataRepository.java | 80 ++ .../impl/MySQLIncrementalDataRepository.java | 206 ++++ .../repository/impl/OracleDataRepository.java | 232 ++++ .../impl/PostGresDataRepository.java | 110 ++ .../platform/MigrationHybrisHANABuilder.java | 78 ++ .../platform/MigrationHybrisHANAPlatform.java | 89 ++ .../platform/MigrationHybrisMSSqlBuilder.java | 79 ++ .../MigrationHybrisMSSqlPlatform.java | 114 ++ .../MigrationHybrisPostGresBuilder.java | 90 ++ .../MigrationHybrisPostGresPlatform.java | 61 + .../scheduler/DatabaseCopyScheduler.java | 25 + .../CustomClusterDatabaseCopyScheduler.java | 350 ++++++ .../service/DatabaseCopyTaskRepository.java | 130 ++ .../service/DatabaseMigrationCopyService.java | 18 + ...atabaseMigrationDataTypeMapperService.java | 21 + .../DatabaseMigrationReportService.java | 15 + ...DatabaseMigrationReportStorageService.java | 15 + .../service/DatabaseMigrationService.java | 67 + .../DatabaseMigrationSynonymService.java | 23 + .../DatabaseSchemaDifferenceService.java | 30 + ...DatabaseMigrationReportStorageService.java | 114 ++ .../DefaultDatabaseCopyTaskRepository.java | 340 +++++ ...atabaseMigrationDataTypeMapperService.java | 64 + ...DefaultDatabaseMigrationReportService.java | 77 ++ .../impl/DefaultDatabaseMigrationService.java | 127 ++ ...efaultDatabaseMigrationSynonymService.java | 34 + ...efaultDatabaseSchemaDifferenceService.java | 567 +++++++++ .../PipeDatabaseMigrationCopyService.java | 181 +++ .../setup/InitUpdateProcessTrigger.java | 55 + .../setup/MigrationSystemSetup.java | 53 + .../strategy/PipeWriterStrategy.java | 30 + .../strategy/impl/CopyPipeWriterStrategy.java | 1097 +++++++++++++++++ .../commercedbsync/utils/MaskUtil.java | 15 + .../platform/azure/media/AzureCloudUtils.java | 39 + .../platform/core/TenantPropertiesLoader.java | 30 + commercedbsync/velocity.log | 0 commercedbsynchac/.classpath | 14 + .../HybrisCodeGeneration.launch | 23 + commercedbsynchac/.springBeans | 16 + commercedbsynchac/buildcallbacks.xml | 18 + commercedbsynchac/extensioninfo.xml | 24 + commercedbsynchac/external-dependencies.xml | 17 + .../hac/resources/jsp/dataCopy.jsp | 109 ++ .../hac/resources/jsp/dataSource.jsp | 70 ++ .../hac/resources/jsp/migrationReports.jsp | 46 + .../hac/resources/jsp/schemaCopy.jsp | 106 ++ .../hac/resources/static/css/dataCopy.css | 71 ++ .../hac/resources/static/css/database.css | 70 ++ .../hac/resources/static/css/schemaCopy.css | 52 + .../hac/resources/static/css/table.css | 1 + .../resources/static/js/customStatistics.js | 11 + .../hac/resources/static/js/dataCopy.js | 271 ++++ .../hac/resources/static/js/dataSource.js | 165 +++ .../resources/static/js/migrationMetrics.js | 135 ++ .../resources/static/js/migrationReports.js | 66 + .../hac/resources/static/js/schemaCopy.js | 161 +++ .../CommercemigrationhacController.java | 442 +++++++ .../CommercemigrationhacControllerTest.class | Bin 0 -> 980 bytes .../CommercemigrationhacControllerTest.java | 55 + commercedbsynchac/project.properties | 9 + .../cx/boosters/commercedbsynchac/dummy.txt | 0 .../resources/commercedbsynchac-beans.xml | 70 ++ .../resources/commercedbsynchac-items.xml | 42 + .../resources/commercedbsynchac-spring.xml | 48 + .../commercedbsynchac-tab-config.json | 28 + ...bsynchac-without-migration-tab-config.json | 2 + .../localization/i2ihac-locales_de.properties | 6 + .../localization/i2ihac-locales_en.properties | 6 + .../localization/i2ihac-locales_es.properties | 6 + .../localization/i2ihac-locales_fr.properties | 6 + .../localization/i2ihac-locales_it.properties | 6 + .../localization/i2ihac-locales_ja.properties | 6 + .../localization/i2ihac-locales_ko.properties | 6 + .../localization/i2ihac-locales_pt.properties | 6 + .../localization/i2ihac-locales_ru.properties | 6 + .../localization/i2ihac-locales_zh.properties | 6 + .../CommercedbsynchacStandalone.java | 44 + .../constants/YhacextConstants.java | 21 + .../metric/MetricService.java | 16 + .../metric/impl/DefaultMetricService.java | 42 + .../metric/populator/MetricPopulator.java | 26 + .../populator/impl/CpuMetricPopulator.java | 44 + .../populator/impl/DTUMetricPopulator.java | 42 + .../impl/HikariConnectionMetricPopulator.java | 47 + ...HikariSourceConnectionMetricPopulator.java | 30 + ...HikariTargetConnectionMetricPopulator.java | 30 + .../populator/impl/IOMetricPopulator.java | 48 + .../populator/impl/MemoryMetricPopulator.java | 35 + .../impl/TaskExecutorMetricPopulator.java | 49 + docs/commercedbsync/after_save_listener_1.png | Bin 0 -> 26652 bytes docs/commercedbsync/after_save_listener_2.png | Bin 0 -> 15518 bytes docs/configuration/CONFIGURATION-GUIDE.md | 42 + docs/configuration/CONFIGURATION-REFERENCE.md | 46 + docs/developer/DEVELOPER-GUIDE.md | 104 ++ docs/performance/PERFORMANCE-GUIDE.md | 136 ++ docs/performance/performance_architecture.png | Bin 0 -> 50296 bytes ...te_for_scheduled_operational_activity.docx | Bin 0 -> 15962 bytes docs/security/SECURITY-GUIDE.md | 85 ++ docs/support/SUPPORT-GUIDE.md | 79 ++ docs/support/support_groovy_preview.png | Bin 0 -> 454427 bytes docs/troubleshooting/TROUBLESHOOTING-GUIDE.md | 135 ++ docs/user/SUPPORT-DELETE-GUIDE.md | 89 ++ docs/user/USER-GUIDE-DATA-MIGRATION.md | 213 ++++ docs/user/USER-GUIDE-DATA-REPLICATION.md | 139 +++ docs/user/data_migration_architecture.drawio | 1 + docs/user/data_migration_architecture.png | Bin 0 -> 106325 bytes .../user/data_replication_architecture.drawio | 1 + docs/user/data_replication_architecture.png | Bin 0 -> 405825 bytes docs/user/hac_migrate_data.png | Bin 0 -> 174241 bytes docs/user/hac_report.png | Bin 0 -> 83763 bytes docs/user/hac_schema_diff_exec.png | Bin 0 -> 134366 bytes docs/user/hac_schema_diff_prev.png | Bin 0 -> 71767 bytes docs/user/hac_validate_ds.png | Bin 0 -> 60217 bytes docs/user/proxy_timeout.png | Bin 0 -> 26600 bytes 216 files changed, 16613 insertions(+), 238 deletions(-) create mode 100644 DISCLAIMER.md create mode 100644 commercedbsync/.classpath create mode 100644 commercedbsync/.springBeans create mode 100644 commercedbsync/buildcallbacks.xml create mode 100644 commercedbsync/extensioninfo.xml create mode 100644 commercedbsync/external-dependencies.xml create mode 100644 commercedbsync/project.properties create mode 100644 commercedbsync/resources/commercedbsync-beans.xml create mode 100644 commercedbsync/resources/commercedbsync-items.xml create mode 100644 commercedbsync/resources/commercedbsync-spring.xml create mode 100644 commercedbsync/resources/commercedbsync/dummy.txt create mode 100644 commercedbsync/resources/commercedbsync/sap-hybris-platform.png create mode 100644 commercedbsync/resources/groovy/MigrationSummaryScript.groovy create mode 100644 commercedbsync/resources/groovy/ddlaltercreate.groovy create mode 100644 commercedbsync/resources/impex/essentialdata-commercemigration-jobs.impex create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_de.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_en.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_es.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_fr.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_it.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_ja.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_ko.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_pt.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_ru.properties create mode 100644 commercedbsync/resources/localization/commercedbsync-locales_zh.properties create mode 100644 commercedbsync/resources/sql/createSchedulerTables.sql create mode 100644 commercedbsync/resources/sql/createSchedulerTablesHana.sql create mode 100644 commercedbsync/resources/sql/createSchedulerTablesOracle.sql create mode 100644 commercedbsync/resources/sql/createSchedulerTablesPostGres.sql create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/CommercedbsyncStandalone.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/DataRepositoryAdapter.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/impl/ContextualDataRepositoryAdapter.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipe.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipeFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerExecutor.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerPoolFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MDCTaskDecorator.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MaybeFinished.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/PipeAbortedException.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/RetriableTask.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipe.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipeFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerExecutor.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerPoolFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/constants/CommercedbsyncConstants.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/CopyContext.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/IncrementalMigrationContext.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/MigrationContext.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultIncrementalMigrationContext.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultMigrationContext.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/MigrationContextValidator.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/impl/DefaultMigrationContextValidator.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/FullMigrationCronJob.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/IncrementalMigrationCronJob.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/MigrationCronJob.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataColumn.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataSet.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/BulkDataSet.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataColumn.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataSet.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/MigrationDataSourceFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/AbstractMigrationDataSourceFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/DefaultMigrationDataSourceFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyCompleteEvent.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyDatabaseTableEvent.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyEvent.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyCompleteEventListener.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyDatabaseTableEventListener.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/DataCopyTableFilter.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/CompositeDataCopyTableFilter.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/ExclusionDataCopyTableFilter.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/InclusionDataCopyTableFilter.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/IncrementalDataCopyTableFilter.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/interceptors/DefaultCMTRemoveInterceptor.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/jalo/ItemDeletionMarker.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/AbstractMigrationJobPerformable.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/FullMigrationJob.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/IncrementalMigrationJob.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/listeners/DefaultCMTAfterSaveListener.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceCategory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceProfiler.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceRecorder.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceUnit.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/impl/DefaultPerformanceProfiler.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/MigrationPostProcessor.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/AdjustActiveTypeSystemPostProcessor.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/DefaultMigrationPostProcessor.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/ReportMigrationPostProcessor.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/DataSourceConfiguration.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/impl/DefaultDataSourceConfiguration.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/CopyItemProvider.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/impl/DefaultDataCopyItemProvider.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/DataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AbstractDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureIncrementalDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataIncrementalRepositoryFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataRepositoryFactory.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HanaDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HsqlRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLIncrementalDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/OracleDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/PostGresDataRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANABuilder.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANAPlatform.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlBuilder.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlPlatform.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresBuilder.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresPlatform.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/DatabaseCopyScheduler.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/impl/CustomClusterDatabaseCopyScheduler.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseCopyTaskRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationCopyService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationDataTypeMapperService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportStorageService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationSynonymService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseSchemaDifferenceService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/BlobDatabaseMigrationReportStorageService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseCopyTaskRepository.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationDataTypeMapperService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationReportService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationSynonymService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseSchemaDifferenceService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/PipeDatabaseMigrationCopyService.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/InitUpdateProcessTrigger.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/MigrationSystemSetup.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/PipeWriterStrategy.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/impl/CopyPipeWriterStrategy.java create mode 100644 commercedbsync/src/com/sap/cx/boosters/commercedbsync/utils/MaskUtil.java create mode 100644 commercedbsync/src/de/hybris/platform/azure/media/AzureCloudUtils.java create mode 100644 commercedbsync/src/de/hybris/platform/core/TenantPropertiesLoader.java create mode 100644 commercedbsync/velocity.log create mode 100644 commercedbsynchac/.classpath create mode 100644 commercedbsynchac/.externalToolBuilders/HybrisCodeGeneration.launch create mode 100644 commercedbsynchac/.springBeans create mode 100644 commercedbsynchac/buildcallbacks.xml create mode 100644 commercedbsynchac/extensioninfo.xml create mode 100644 commercedbsynchac/external-dependencies.xml create mode 100644 commercedbsynchac/hac/resources/jsp/dataCopy.jsp create mode 100644 commercedbsynchac/hac/resources/jsp/dataSource.jsp create mode 100644 commercedbsynchac/hac/resources/jsp/migrationReports.jsp create mode 100644 commercedbsynchac/hac/resources/jsp/schemaCopy.jsp create mode 100644 commercedbsynchac/hac/resources/static/css/dataCopy.css create mode 100644 commercedbsynchac/hac/resources/static/css/database.css create mode 100644 commercedbsynchac/hac/resources/static/css/schemaCopy.css create mode 100644 commercedbsynchac/hac/resources/static/css/table.css create mode 100644 commercedbsynchac/hac/resources/static/js/customStatistics.js create mode 100644 commercedbsynchac/hac/resources/static/js/dataCopy.js create mode 100644 commercedbsynchac/hac/resources/static/js/dataSource.js create mode 100644 commercedbsynchac/hac/resources/static/js/migrationMetrics.js create mode 100644 commercedbsynchac/hac/resources/static/js/migrationReports.js create mode 100644 commercedbsynchac/hac/resources/static/js/schemaCopy.js create mode 100644 commercedbsynchac/hac/src/de/hybris/platform/hac/controller/CommercemigrationhacController.java create mode 100644 commercedbsynchac/hac/testclasses/de/hybris/platform/hac/controller/CommercemigrationhacControllerTest.class create mode 100644 commercedbsynchac/hac/testsrc/de/hybris/platform/hac/controller/CommercemigrationhacControllerTest.java create mode 100644 commercedbsynchac/project.properties create mode 100644 commercedbsynchac/resources/com/sap/cx/boosters/commercedbsynchac/dummy.txt create mode 100644 commercedbsynchac/resources/commercedbsynchac-beans.xml create mode 100644 commercedbsynchac/resources/commercedbsynchac-items.xml create mode 100644 commercedbsynchac/resources/commercedbsynchac-spring.xml create mode 100644 commercedbsynchac/resources/commercedbsynchac-tab-config.json create mode 100644 commercedbsynchac/resources/commercedbsynchac-without-migration-tab-config.json create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_de.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_en.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_es.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_fr.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_it.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_ja.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_ko.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_pt.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_ru.properties create mode 100644 commercedbsynchac/resources/localization/i2ihac-locales_zh.properties create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/CommercedbsynchacStandalone.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/constants/YhacextConstants.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/MetricService.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/impl/DefaultMetricService.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/MetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/CpuMetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/DTUMetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariConnectionMetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariSourceConnectionMetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariTargetConnectionMetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/IOMetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/MemoryMetricPopulator.java create mode 100644 commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/TaskExecutorMetricPopulator.java create mode 100644 docs/commercedbsync/after_save_listener_1.png create mode 100644 docs/commercedbsync/after_save_listener_2.png create mode 100644 docs/configuration/CONFIGURATION-GUIDE.md create mode 100644 docs/configuration/CONFIGURATION-REFERENCE.md create mode 100644 docs/developer/DEVELOPER-GUIDE.md create mode 100644 docs/performance/PERFORMANCE-GUIDE.md create mode 100644 docs/performance/performance_architecture.png create mode 100644 docs/performance/template_for_scheduled_operational_activity.docx create mode 100644 docs/security/SECURITY-GUIDE.md create mode 100644 docs/support/SUPPORT-GUIDE.md create mode 100644 docs/support/support_groovy_preview.png create mode 100644 docs/troubleshooting/TROUBLESHOOTING-GUIDE.md create mode 100644 docs/user/SUPPORT-DELETE-GUIDE.md create mode 100644 docs/user/USER-GUIDE-DATA-MIGRATION.md create mode 100644 docs/user/USER-GUIDE-DATA-REPLICATION.md create mode 100644 docs/user/data_migration_architecture.drawio create mode 100644 docs/user/data_migration_architecture.png create mode 100644 docs/user/data_replication_architecture.drawio create mode 100644 docs/user/data_replication_architecture.png create mode 100644 docs/user/hac_migrate_data.png create mode 100644 docs/user/hac_report.png create mode 100644 docs/user/hac_schema_diff_exec.png create mode 100644 docs/user/hac_schema_diff_prev.png create mode 100644 docs/user/hac_validate_ds.png create mode 100644 docs/user/proxy_timeout.png diff --git a/DISCLAIMER.md b/DISCLAIMER.md new file mode 100644 index 0000000..78b27bf --- /dev/null +++ b/DISCLAIMER.md @@ -0,0 +1 @@ +These Project development objects are not managed or delivered or intended for future inclusion as a standard component of the SAP Software. Therefore, at Project closure, these Project development objects will not include any further support services, defect resolution, maintenance, or upgrades or in any way be within scope of SAP support obligations for licensed SAP Software. Licensee is solely responsible for supporting such objects. SAP does not assure the compatibility of such objects with future releases of SAP Software or other SAP solutions. diff --git a/LICENSE b/LICENSE index 261eeb9..be36d55 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,202 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2018 SAP SE or an SAP affiliate company. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index d08b153..92352a9 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,87 @@ -# SAP Repository Template - -Default templates for SAP open source repositories, including LICENSE, .reuse/dep5, Code of Conduct, etc... All repositories on github.com/SAP will be created based on this template. - -## To-Do - -In case you are the maintainer of a new SAP open source project, these are the steps to do with the template files: - -- Check if the default license (Apache 2.0) also applies to your project. A license change should only be required in exceptional cases. If this is the case, please change the [license file](LICENSE). -- Enter the correct metadata for the REUSE tool. See our [wiki page](https://wiki.wdf.sap.corp/wiki/display/ospodocs/Using+the+Reuse+Tool+of+FSFE+for+Copyright+and+License+Information) for details how to do it. You can find an initial .reuse/dep5 file to build on. Please replace the parts inside the single angle quotation marks < > by the specific information for your repository and be sure to run the REUSE tool to validate that the metadata is correct. -- Adjust the contribution guidelines (e.g. add coding style guidelines, pull request checklists, different license if needed etc.) -- Add information about your project to this README (name, description, requirements etc). Especially take care for the placeholders - those ones need to be replaced with your project name. See the sections below the horizontal line and [our guidelines on our wiki page](https://wiki.wdf.sap.corp/wiki/display/ospodocs/Guidelines+for+README.md+file) what is required and recommended. -- Remove all content in this README above and including the horizontal line ;) - -*** - -# Our new open source project - -## About this project - -*Insert a short description of your project here...* - -## Requirements and Setup - -*Insert a short description what is required to get your project running...* - -## Support, Feedback, Contributing - -This project is open to feature requests/suggestions, bug reports etc. via [GitHub issues](https://github.com/SAP//issues). Contribution and feedback are encouraged and always welcome. For more information about how to contribute, the project structure, as well as additional contribution information, see our [Contribution Guidelines](CONTRIBUTING.md). - -## Code of Conduct - -We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone. By participating in this project, you agree to abide by its [Code of Conduct](CODE_OF_CONDUCT.md) at all times. - -## Licensing - -Copyright (20xx-)20xx SAP SE or an SAP affiliate company and contributors. Please see our [LICENSE](LICENSE) for copyright and license information. Detailed information including third-party components and their licensing/copyright information is available [via the REUSE tool](https://api.reuse.software/info/github.com/SAP/). +# SAP Commerce DB Sync + +[![REUSE status](https://api.reuse.software/badge/github.com/SAP-samples/commerce-migration-toolkit)](https://api.reuse.software/info/github.com/SAP-samples/commerce-migration-toolkit) + +SAP Commerce DB Sync performs table-to-table replication in single-directionally manner between two SAP Commerce instances (onPrem to Cloud) or between SAP Commerce and an external database. + +SAP Commerce DB Sync is implemented as SAP Commerce extensions and it does not require any third-party ETL. + +There are two main use cases: +* __Replicate data across an external database__: you can push data regularly in batch mode through a Commerce Cloud cronjob and synchronize to an external database. A typical use case is for analytics and reporting purpose when you need direct JDBC access to the database to run analytic jobs. +* __Data migration__: paired with the self-service media process described on [this CXWorks article](https://www.sap.com/cxworks/article/2589632453/migrate_to_sap_commerce_cloud_migrate_media_with_azcopy), it allows to self-service a one-shot data migration from the on-premise SAP Commerce environment to a SAP Commerce Cloud subscription. + +# Getting started + +* [User Guide for Data Replication](docs/user/USER-GUIDE-DATA-REPLICATION.md) Go through the details about Data replication between SAP Commerce Cloud and an external database. +* [User Guide for Data Migration](docs/user/USER-GUIDE-DATA-MIGRATION.md) When ready to start the migration activities, follow the instructions in the User Guide to trigger the data migration. +* [Configuration Guide](docs/configuration/CONFIGURATION-GUIDE.md) The extensions ship with a default configuration that may need to be adjusted depending on the desired behaviour. This guide explains how different features and behaviours can be configured. +* [Security Guide](docs/security/SECURITY-GUIDE.md) A data migration typically features sensitive data and uses delicate system access. Make sure you have read the Security Guide before you proceed with any migration activities and thereby acknowledge the security recommendations stated in the guide. +* [Performance Guide](docs/performance/PERFORMANCE-GUIDE.md) Performance is crucial for any data migration, not only for large databases but also generally to reduce the time of the cut-over window. The performance guide explains the basic concept of performance tuning and also provides benchmarks that will give you an impression of how to estimate the cutover time window. +* [Developer Guide](docs/developer/DEVELOPER-GUIDE.md) If you want to contribute please read this guide. +* [Troubleshooting Guide](docs/troubleshooting/TROUBLESHOOTING-GUIDE.md) A collection of common problems and how to tackle them. + +# Features Overview + +* Database Connectivity + * Multipe supported databases: Oracle, MySQL, HANA, MSSQL + * UI based connection validation +* Schema Differences + * UI based schema differences detector + * Automated target schema adaption + * Table creation / removal + * Column creation / removal + * Configurable behaviour +* Data Copy + * UI based copy trigger + * Configurable target table truncation + * Configurable index disabling + * Read/write batching with configurable sizes + * Copy parallelization + * Cluster awareness + * Column exclusions + * Table exclusions/inclusions + * Incremental mode (delta) + * Custom tables + * Staged approach using table prefix +* Reporting / Audit + * Automated reporting for schema changes + * Automated reporting for copy processes + * Stored on blob storage + * Logging of all actions triggered from the UI + +# Compatibility + + * SAP Commerce (>=1811) + * Tested with source databases: + * Azure SQL + * MySQL (5.7) + * Oracle (XE 11g) + * HANA (express 2.0) and HANA Cloud + * Tested with target databases: + * Azure SQL + * Oracle (XE 11g) + * HANA (express 2.0) and HANA Cloud + +# Performance + +Commerce DB Sync has been built to offer reasonable performance with large amount of data using the following design: +* Table to table replication using JDBC (low level) +* Selection of tables so we do not need a full synchronization in particular for large technical table (task logs, audit logs...)​ +* Multi-threaded and can manage multiple tables at the same time ​ +* Using UPSERT (INSERT/UPDATE) +* Use read replica Commerce database as a source database + +# Demo Video +Here is a video that presents how to use SAP Commerce DB sync (formerly known as CMT) for data migration from onPrem to Cloud: + https://sapvideoa35699dc5.hana.ondemand.com/?entry_id=1_gxduwrl3 + +# How to Obtain Support + +This repository is provided "as-is"; no support is available. + +Find more information about SAP Commerce Cloud Setup on our [help site](https://help.sap.com/viewer/product/SAP_COMMERCE_CLOUD_PUBLIC_CLOUD/LATEST/en-US). + +With regards Commerce DB Sync, access to the database for customers is and will not be possible in the future and SAP does not provide any additional support on Commerce DB Sync in particular. Support can be bought as paid engagement from SAP Consulting only. + +# License +Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This project is licensed under the Apache Software License, version 2.0 except as noted otherwise in the [LICENSE file](LICENSE). diff --git a/commercedbsync/.classpath b/commercedbsync/.classpath new file mode 100644 index 0000000..f37cfe7 --- /dev/null +++ b/commercedbsync/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/commercedbsync/.springBeans b/commercedbsync/.springBeans new file mode 100644 index 0000000..e476d04 --- /dev/null +++ b/commercedbsync/.springBeans @@ -0,0 +1,15 @@ + + + 1 + + + + + + + resources/commercedbsync-spring.xml + web/webroot/WEB-INF/commercedbsync-web-spring.xml + + + + diff --git a/commercedbsync/buildcallbacks.xml b/commercedbsync/buildcallbacks.xml new file mode 100644 index 0000000..c723961 --- /dev/null +++ b/commercedbsync/buildcallbacks.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PATCHING azurecloudserver.jar to enable configurable fake tenants in AzureCloudUtils + + + + + + + + + + + + ${ext.azurecloud.path}/bin/azurecloudserver.jar doesn't exist. Cannot patch AzureCloudUtils to + enable fake tenants! + + + + + + + + + + + diff --git a/commercedbsync/extensioninfo.xml b/commercedbsync/extensioninfo.xml new file mode 100644 index 0000000..4b1ef33 --- /dev/null +++ b/commercedbsync/extensioninfo.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/commercedbsync/external-dependencies.xml b/commercedbsync/external-dependencies.xml new file mode 100644 index 0000000..4abd5ae --- /dev/null +++ b/commercedbsync/external-dependencies.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + de.hybris.platform + commercedbsync + 6.7.0.0-RC19 + + jar + + + + com.google.code.gson + gson + 2.8.6 + + + com.google.guava + guava + 28.0-jre + + + org.apache.commons + commons-dbcp2 + 2.7.0 + + + com.microsoft.azure + azure-storage + 8.1.0 + + + com.zaxxer + HikariCP + 3.4.5 + + + com.github.freva + ascii-table + 1.1.0 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.13.3 + + + diff --git a/commercedbsync/project.properties b/commercedbsync/project.properties new file mode 100644 index 0000000..bc93ebb --- /dev/null +++ b/commercedbsync/project.properties @@ -0,0 +1,112 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# +commercedbsync.application-context=commercedbsync-spring.xml +installed.tenants= +task.engine.loadonstartup=false +solrfacetsearch.solrClientPool.checkInterval=0 +#backoffice.cockpitng.reset.scope=widgets,cockpitConfig +#backoffice.cockpitng.reset.triggers=start,login +################################ +# Migration specific properties +################################ +migration.ds.source.db.driver= +migration.ds.source.db.url= +migration.ds.source.db.username= +migration.ds.source.db.password= +migration.ds.source.db.tableprefix= +migration.ds.source.db.schema= +migration.ds.source.db.typesystemname=DEFAULT +migration.ds.source.db.typesystemsuffix= +migration.ds.source.db.connection.removeabandoned=true +migration.ds.source.db.connection.pool.size.idle.min=${db.pool.minIdle} +migration.ds.source.db.connection.pool.size.idle.max=${db.pool.maxIdle} +migration.ds.source.db.connection.pool.size.active.max=${db.pool.maxActive} +migration.ds.target.db.driver=${db.driver} +migration.ds.target.db.url=${db.url} +migration.ds.target.db.username=${db.username} +migration.ds.target.db.password=${db.password} +migration.ds.target.db.tableprefix=${db.tableprefix} +migration.ds.target.db.catalog= +migration.ds.target.db.schema=dbo +migration.ds.target.db.typesystemname=DEFAULT +migration.ds.target.db.typesystemsuffix= +migration.ds.target.db.connection.removeabandoned=true +migration.ds.target.db.connection.pool.size.idle.min=${db.pool.minIdle} +migration.ds.target.db.connection.pool.size.idle.max=${db.pool.maxIdle} +migration.ds.target.db.connection.pool.size.active.max=${db.pool.maxActive} +migration.ds.target.db.max.stage.migrations=5 +#triggered by updatesystem process or manually by hac +migration.trigger.updatesystem=false +# Schema migration section - parameters for copying schema from source to target +migration.schema.enabled=true +migration.schema.target.tables.add.enabled=true +migration.schema.target.tables.remove.enabled=false +migration.schema.target.columns.add.enabled=true +migration.schema.target.columns.remove.enabled=true +# automatically trigger schema migrator before data copy process is started +migration.schema.autotrigger.enabled=false +# the number of rows read per iteration +migration.data.reader.batchsize=1000 +# delete rows in target table before inserting new records +migration.data.truncate.enabled=true +# These tables will not be emptied before records are inserted +migration.data.truncate.excluded= +# maximum number of writer workers per table that can be executed in parallel within a single node in the cluster +migration.data.workers.writer.maxtasks=10 +# maximum number of reader workers per table that can be executed in parallel within a single node in the cluster +migration.data.workers.reader.maxtasks=3 +# max retry attempts of a worker in case there is a problem +migration.data.workers.retryattempts=0 +# maximum number of table that can be copied in parallel within a single node in the cluster +migration.data.maxparalleltablecopy=2 +# ignores data insertion errors and continues to the next records +migration.data.failonerror.enabled=true +# columns to be excluded. format: migration.data.columns.excluded.= +migration.data.columns.excluded.attributedescriptors= +migration.data.columns.nullify.attributedescriptors= +#remove all indices +migration.data.indices.drop.enabled=false +#disable indices during migration +migration.data.indices.disable.enabled=false +#if empty, disable indices on all tables. If table specified, only disable for this one. +migration.data.indices.disable.included= +#flag to enable the migration of audit tables +migration.data.tables.audit.enabled=true +#custom tables to migrate (use comma-separated list) +migration.data.tables.custom= +#tables to exclude (use table names name without prefix) +migration.data.tables.excluded=SYSTEMINIT,StoredHttpSessions +#tables to include (use table names name without prefix) +migration.data.tables.included= +migration.cluster.enabled=false +#enable the incremental database migration. +migration.data.incremental.enabled=false +#Only these tables will be taken into account for incremental migration. +migration.data.incremental.tables= +#The timestamp in ISO-8601 ISO_ZONED_DATE_TIME format. Records created or modified after this timestamp will be copied only. +migration.data.incremental.timestamp= +#EXPERIMENTAL: Enable bulk copy for better performance +migration.data.bulkcopy.enabled=false +migration.data.pipe.timeout=7200 +migration.data.pipe.capacity=100 +# No activity? -> migration aborted and marked as stalled +migration.stalled.timeout=7200 +migration.data.timeout=60 +migration.data.report.connectionstring=${media.globalSettings.cloudAzureBlobStorageStrategy.connection} +# Properties that will be masked in the report +migration.properties.masked=migration.data.report.connectionstring,migration.ds.source.db.password,migration.ds.target.db.password +migration.locale.default=en-US +# Enhanced Logging +log4j2.appender.migrationAppender.type=Console +log4j2.appender.migrationAppender.name=MigrationAppender +log4j2.appender.migrationAppender.layout.type=PatternLayout +log4j2.appender.migrationAppender.layout.pattern=%-5p [%t] [%c{1}] %X{migrationID,pipeline,clusterID} %m%n +log4j2.logger.migrationToolkit.name=com.sap.cx.boosters.commercedbsync +log4j2.logger.migrationToolkit.level=INFO +log4j2.logger.migrationToolkit.appenderRef.migration.ref=MigrationAppender +log4j2.logger.migrationToolkit.additivity=false + + diff --git a/commercedbsync/resources/commercedbsync-beans.xml b/commercedbsync/resources/commercedbsync-beans.xml new file mode 100644 index 0000000..b553e97 --- /dev/null +++ b/commercedbsync/resources/commercedbsync-beans.xml @@ -0,0 +1,148 @@ + + + + + + + RUNNING + PROCESSED + COMPLETED + ABORTED + STALLED + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No prefix, no type system suffix + + + No prefix, with type system suffix + + + With prefix, with type system suffix + + + With prefix, with type system suffix, no additional suffix + + + I.e, LP tables + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commercedbsync/resources/commercedbsync-items.xml b/commercedbsync/resources/commercedbsync-items.xml new file mode 100644 index 0000000..01def0a --- /dev/null +++ b/commercedbsync/resources/commercedbsync-items.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + List of table included for the migration + + + + java.lang.Boolean.FALSE + + + + + + + automatically trigger schema migrator before data copy process is started + + + false + + + delete rows in target table before inserting new records + + + false + + + + + + Cronjob For Incremental Migration. + + + + Last Executed Incremental migration Timestamp + + + + + + + + + Cronjob For full Migration. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commercedbsync/resources/commercedbsync-spring.xml b/commercedbsync/resources/commercedbsync-spring.xml new file mode 100644 index 0000000..eac433e --- /dev/null +++ b/commercedbsync/resources/commercedbsync-spring.xml @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commercedbsync/resources/commercedbsync/dummy.txt b/commercedbsync/resources/commercedbsync/dummy.txt new file mode 100644 index 0000000..e69de29 diff --git a/commercedbsync/resources/commercedbsync/sap-hybris-platform.png b/commercedbsync/resources/commercedbsync/sap-hybris-platform.png new file mode 100644 index 0000000000000000000000000000000000000000..3984adac505673185ded6e4f07a31b8de16f9b6c GIT binary patch literal 4884 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 literal 0 HcmV?d00001 diff --git a/commercedbsync/resources/groovy/MigrationSummaryScript.groovy b/commercedbsync/resources/groovy/MigrationSummaryScript.groovy new file mode 100644 index 0000000..ab05740 --- /dev/null +++ b/commercedbsync/resources/groovy/MigrationSummaryScript.groovy @@ -0,0 +1,59 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package groovy + +import de.hybris.platform.util.Config +import org.apache.commons.lang.StringUtils + +import java.util.stream.Collectors + +def result = generateMigrationSummary(migrationContext) +println result +return result + +def generateMigrationSummary(context) { + StringBuilder sb = new StringBuilder(); + try { + final String sourcePrefix = context.getDataSourceRepository().getDataSourceConfiguration().getTablePrefix(); + final String targetPrefix = context.getDataTargetRepository().getDataSourceConfiguration().getTablePrefix(); + final String dbPrefix = Config.getString("db.tableprefix", ""); + final Set sourceSet = migrationContext.getDataSourceRepository().getAllTableNames() + .stream() + .map({ tableName -> tableName.replace(sourcePrefix, "") }) + .collect(Collectors.toSet()); + + final Set targetSet = migrationContext.getDataTargetRepository().getAllTableNames() + sb.append("------------").append("\n") + sb.append("All tables: ").append(sourceSet.size() + targetSet.size()).append("\n") + sb.append("Source tables: ").append(sourceSet.size()).append("\n") + sb.append("Target tables: ").append(targetSet.size()).append("\n") + sb.append("------------").append("\n") + sb.append("Source prefix: ").append(sourcePrefix).append("\n") + sb.append("Target prefix: ").append(targetPrefix).append("\n") + sb.append("DB prefix: ").append(dbPrefix).append("\n") + sb.append("------------").append("\n") + sb.append("Migration Type: ").append("\n") + sb.append(StringUtils.isNotEmpty(dbPrefix) && + StringUtils.isNotEmpty(targetPrefix) && !StringUtils.equalsIgnoreCase(dbPrefix, targetPrefix) ? "STAGED" : "DIRECT").append("\n") + sb.append("------------").append("\n") + sb.append("Found prefixes:").append("\n") + + Map prefixes = new HashMap<>() + targetSet.forEach({ tableName -> + String srcTable = schemaDifferenceService.findCorrespondingSrcTable(sourceSet, tableName); + String prefix = tableName.replace(srcTable, ""); + prefixes.put(prefix, targetSet.stream().filter({ e -> e.startsWith(prefix) }).count()); + }); + prefixes.forEach({ k, v -> sb.append("Prefix: ").append(k).append(" number of tables: ").append(v).append("\n") }); + sb.append("------------").append("\n"); + + } catch (Exception e) { + e.printStackTrace(); + } + return sb.toString(); +} + diff --git a/commercedbsync/resources/groovy/ddlaltercreate.groovy b/commercedbsync/resources/groovy/ddlaltercreate.groovy new file mode 100644 index 0000000..4df0f40 --- /dev/null +++ b/commercedbsync/resources/groovy/ddlaltercreate.groovy @@ -0,0 +1,73 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +// Parameters +queryToRun = 'select p_streetname from addresses where p_streetname like \'%Test%\'' +indexToCreateaddresses = 'CREATE INDEX addresses_ownerpkstring_ddl ON ADDRESSES(typepkstring, ownerpkstring) ONLINE;' +indexToDropAddresses = 'drop index addresses_ownerpkstring_ddl ONLINE;' +AlterAddColumnAddressesQuery = 'ALTER TABLE ADDRESSES ADD (TEST%s BIGINT) ONLINE;' +AlterRemoveColumnAddresses = 'ALTER TABLE ADDRESSES DROP (TEST%s) ONLINE;' + +queryLoopCount = 600 +threadSize = 1 +threadPoolSize = 1 // Long Running Query Test + +import java.util.concurrent.Callable +import java.util.concurrent.TimeUnit +import java.util.concurrent.Executors +import groovy.time.TimeCategory +import de.hybris.platform.core.Registry +import de.hybris.platform.jalo.JaloSession +import de.hybris.platform.core.Tenant + +queryTasks = [] +Tenant currentTenant = Registry.getCurrentTenant(); +// Create Callable Threads +1.upto(threadSize) { index -> + // Create a database connection within each Thread + queryTasks << { + def totalTime1 = 0 + def totalTime2 = 0 + def indexCreation = true; + // Each thread runs a thread/loop specific template query X times + 1.upto(queryLoopCount) { loopIndex -> + + try { + Registry.setCurrentTenant(currentTenant); + JaloSession.getCurrentSession().activate(); + + start = new Date() + totalTime2 = 0 + String AlterAddColumnAddresses = String.format(AlterRemoveColumnAddresses ,loopIndex); + println(AlterAddColumnAddresses) + jdbcTemplate.execute(AlterAddColumnAddresses) + stop = new Date() + totalTime2 += TimeCategory.minus(stop, start).toMilliseconds() + println "Table Column Creation AlterAddColumnAddresses loop ${loopIndex} totalTime(ms) ${totalTime2}" + // Thread.sleep(5000); + + } finally { + JaloSession.getCurrentSession().close(); + Registry.unsetCurrentTenant(); + } + } + // Return average as the result of the Callable + totalTime1 + totalTime2 / queryLoopCount + } as Callable +} + +executorService = Executors.newFixedThreadPool(threadPoolSize) +println "Test started at ${new Date()}" +results = executorService.invokeAll(queryTasks) +totalAverage = 0 +results.eachWithIndex { it, index -> + totalAverage += it.get() + println "$index --> ${it.get()}" +} +println "Total Average --> ${totalAverage / threadSize}" +println "Test finished at ${new Date()}" +executorService.shutdown() +executorService.awaitTermination(200, TimeUnit.SECONDS) \ No newline at end of file diff --git a/commercedbsync/resources/impex/essentialdata-commercemigration-jobs.impex b/commercedbsync/resources/impex/essentialdata-commercemigration-jobs.impex new file mode 100644 index 0000000..3a4e356 --- /dev/null +++ b/commercedbsync/resources/impex/essentialdata-commercemigration-jobs.impex @@ -0,0 +1,27 @@ + +INSERT_UPDATE ServicelayerJob;code[unique=true];springId[unique=true] +;incrementalMigrationJob;incrementalMigrationJob +;fullMigrationJob;fullMigrationJob + +# Update details for incremental migration +INSERT_UPDATE IncrementalMigrationCronJob;code[unique=true];active;job(code)[default=incrementalMigrationJob];sessionLanguage(isoCode)[default=en] +;incrementalMigrationJob;true; + +INSERT_UPDATE IncrementalMigrationCronJob;code[unique=true];migrationItems +#% afterEach: impex.getLastImportedItem().setActivationTime(new Date(System.currentTimeMillis() - 3600 * 1000)); +;incrementalMigrationJob;PAYMENTMODES,ADDRESSES,users,CAT2PRODREL,CONSIGNMENTS,ORDERS + +INSERT_UPDATE Trigger;cronjob(code)[unique=true];cronExpression +#% afterEach: impex.getLastImportedItem().setLastStartTime(new Date(System.currentTimeMillis() - 3600 * 1000)); +;incrementalMigrationJob; 0 0/1 * * * ? + +INSERT_UPDATE FullMigrationCronJob;code[unique=true];active;job(code)[default=fullMigrationJob];sessionLanguage(isoCode)[default=en] +;fullMigrationJob;true; + +INSERT_UPDATE FullMigrationCronJob;code[unique=true];truncateEnabled;migrationItems +;fullMigrationJob;true;PAYMENTMODES,products + +INSERT_UPDATE Trigger;cronjob(code)[unique=true];cronExpression +#% afterEach: impex.getLastImportedItem().setActivationTime(new Date(System.currentTimeMillis() - 3600 * 1000)); +;fullMigrationJob; 0 0 0 * * ? + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_de.properties b/commercedbsync/resources/localization/commercedbsync-locales_de.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_de.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_en.properties b/commercedbsync/resources/localization/commercedbsync-locales_en.properties new file mode 100644 index 0000000..3c1263a --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_en.properties @@ -0,0 +1,18 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + +type.MigrationCronJob.truncateEnabled.name=Truncate Enabled +type.MigrationCronJob.truncateEnabled.description= + +type.MigrationCronJob.schemaAutotrigger.name=Schema Auto Trigger Enabled +type.MigrationCronJob.schemaAutotrigger.description= + +type.MigrationCronJob.lastStartTime.name=Last Start time For Incremental Job +type.MigrationCronJob.lastStartTime.description= + +type.MigrationCronJob.migrationItems.name=Migration Tables +type.MigrationCronJob.migrationItems.description= + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_es.properties b/commercedbsync/resources/localization/commercedbsync-locales_es.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_es.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_fr.properties b/commercedbsync/resources/localization/commercedbsync-locales_fr.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_fr.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_it.properties b/commercedbsync/resources/localization/commercedbsync-locales_it.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_it.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_ja.properties b/commercedbsync/resources/localization/commercedbsync-locales_ja.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_ja.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_ko.properties b/commercedbsync/resources/localization/commercedbsync-locales_ko.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_ko.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_pt.properties b/commercedbsync/resources/localization/commercedbsync-locales_pt.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_pt.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_ru.properties b/commercedbsync/resources/localization/commercedbsync-locales_ru.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_ru.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/localization/commercedbsync-locales_zh.properties b/commercedbsync/resources/localization/commercedbsync-locales_zh.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsync/resources/localization/commercedbsync-locales_zh.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsync/resources/sql/createSchedulerTables.sql b/commercedbsync/resources/sql/createSchedulerTables.sql new file mode 100644 index 0000000..bad4a15 --- /dev/null +++ b/commercedbsync/resources/sql/createSchedulerTables.sql @@ -0,0 +1,105 @@ + +DROP TABLE IF EXISTS MIGRATIONTOOLKIT_TABLECOPYTASKS; + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYTASKS ( + targetnodeId int NOT NULL, + migrationId NVARCHAR(255) NOT NULL, + pipelinename NVARCHAR(255) NOT NULL, + sourcetablename NVARCHAR(255) NOT NULL, + targettablename NVARCHAR(255) NOT NULL, + columnmap NVARCHAR(MAX) NULL, + duration NVARCHAR (255) NULL, + sourcerowcount int NOT NULL DEFAULT 0, + targetrowcount int NOT NULL DEFAULT 0, + failure char(1) NOT NULL DEFAULT '0', + error NVARCHAR(MAX) NULL, + published char(1) NOT NULL DEFAULT '0', + lastupdate DATETIME2 NOT NULL DEFAULT '0001-01-01 00:00:00', + avgwriterrowthroughput numeric(10,2) NULL DEFAULT 0, + avgreaderrowthroughput numeric(10,2) NULL DEFAULT 0, + durationinseconds numeric(10,2) NULL DEFAULT 0, + PRIMARY KEY (migrationid, targetnodeid, pipelinename) +); + +DROP TABLE IF EXISTS MIGRATIONTOOLKIT_TABLECOPYSTATUS; + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYSTATUS ( + migrationId NVARCHAR(255) NOT NULL, + startAt datetime2 NOT NULL DEFAULT GETUTCDATE(), + endAt datetime2, + lastUpdate datetime2, + total int NOT NULL DEFAULT 0, + completed int NOT NULL DEFAULT 0, + failed int NOT NULL DEFAULT 0, + status NVARCHAR(255) NOT NULL DEFAULT 'RUNNING' + PRIMARY KEY (migrationid) +); + +IF OBJECT_ID ('MIGRATIONTOOLKIT_TABLECOPYSTATUS_Update','TR') IS NOT NULL + DROP TRIGGER MIGRATIONTOOLKIT_TABLECOPYSTATUS_Update; + +CREATE TRIGGER MIGRATIONTOOLKIT_TABLECOPYSTATUS_Update +ON MIGRATIONTOOLKIT_TABLECOPYTASKS +AFTER INSERT, UPDATE +AS +BEGIN + DECLARE @relevant_count integer = 0 + SET NOCOUNT ON + /* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + + -- latest update overall = latest update timestamp of updated tasks + UPDATE s + SET s.lastUpdate = t.latestUpdate + FROM MIGRATIONTOOLKIT_TABLECOPYSTATUS s + INNER JOIN ( + SELECT migrationId, MAX(lastUpdate) AS latestUpdate + FROM inserted + GROUP BY migrationId + ) AS t + ON s.migrationId = t.migrationId + + SELECT @relevant_count = COUNT(pipelinename) + FROM inserted + WHERE failure = '1' + OR duration IS NOT NULL + + IF @relevant_count > 0 + BEGIN + -- updated completed count when tasks completed + UPDATE s + SET s.completed = t.completed + FROM MIGRATIONTOOLKIT_TABLECOPYSTATUS s + INNER JOIN ( + SELECT migrationId, COUNT(pipelinename) AS completed + FROM MIGRATIONTOOLKIT_TABLECOPYTASKS + WHERE duration IS NOT NULL + GROUP BY migrationId + ) AS t + ON s.migrationId = t.migrationId + -- update failed count when tasks failed + UPDATE s + SET s.failed = t.failed + FROM MIGRATIONTOOLKIT_TABLECOPYSTATUS s + INNER JOIN ( + SELECT migrationId, COUNT(pipelinename) AS failed + FROM MIGRATIONTOOLKIT_TABLECOPYTASKS + WHERE failure = '1' + GROUP BY migrationId + ) AS t + ON s.migrationId = t.migrationId + + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS + SET endAt = GETUTCDATE() + WHERE total = completed + AND endAt IS NULL + + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS + SET status = 'PROCESSED' + WHERE status = 'RUNNING' + AND total = completed + END +END; diff --git a/commercedbsync/resources/sql/createSchedulerTablesHana.sql b/commercedbsync/resources/sql/createSchedulerTablesHana.sql new file mode 100644 index 0000000..bf15d86 --- /dev/null +++ b/commercedbsync/resources/sql/createSchedulerTablesHana.sql @@ -0,0 +1,340 @@ + + +CREATE OR REPLACE PROCEDURE MIGRATION_PROCEDURE (IN tablename VARCHAR(1000)) + LANGUAGE SQLSCRIPT AS +BEGIN + DECLARE found INT=0; +SELECT count(*) INTO found FROM OBJECTS WHERE OBJECT_TYPE='TABLE' AND OBJECT_NAME=:tablename; +IF tablename = 'MIGRATIONTOOLKIT_TABLECOPYTASKS' AND :found > 0 + THEN +DROP TABLE MIGRATIONTOOLKIT_TABLECOPYTASKS; +END IF; + +IF tablename = 'MIGRATIONTOOLKIT_TABLECOPYSTATUS' AND :found > 0 + THEN +DROP TABLE MIGRATIONTOOLKIT_TABLECOPYSTATUS; +END IF; +END; +# +CALL MIGRATION_PROCEDURE('MIGRATIONTOOLKIT_TABLECOPYTASKS'); +# + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYTASKS ( + targetnodeId int NOT NULL, + migrationId NVARCHAR(255) NOT NULL, + pipelinename NVARCHAR(255) NOT NULL, + sourcetablename NVARCHAR(255) NOT NULL, + targettablename NVARCHAR(255) NOT NULL, + columnmap NVARCHAR(5000) NULL, + duration NVARCHAR (255) NULL, + sourcerowcount int NOT NULL DEFAULT 0, + targetrowcount int NOT NULL DEFAULT 0, + failure char(1) NOT NULL DEFAULT '0', + error NVARCHAR(5000) NULL, + published char(1) NOT NULL DEFAULT '0', + lastupdate Timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', + avgwriterrowthroughput numeric(10,2) NULL DEFAULT 0, + avgreaderrowthroughput numeric(10,2) NULL DEFAULT 0, + durationinseconds numeric(10,2) NULL DEFAULT 0, + PRIMARY KEY (migrationid, targetnodeid, pipelinename) +); + +# + +CALL MIGRATION_PROCEDURE('MIGRATIONTOOLKIT_TABLECOPYSTATUS'); +# + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYSTATUS ( + migrationId NVARCHAR(255) NOT NULL, + startAt Timestamp NOT NULL DEFAULT CURRENT_UTCDATE, + endAt Timestamp, + lastUpdate Timestamp, + total int NOT NULL DEFAULT 0, + completed int NOT NULL DEFAULT 0, + failed int NOT NULL DEFAULT 0, + status NVARCHAR(255) NOT NULL DEFAULT 'RUNNING', + PRIMARY KEY (migrationid) +); + +# + + +CREATE OR REPLACE TRIGGER MIGRATIONTOOLKIT_TABLECOPYSTATUS_Update_trigger +AFTER UPDATE + ON MIGRATIONTOOLKIT_TABLECOPYTASKS + REFERENCING OLD ROW AS old, NEW ROW AS new + FOR EACH ROW +BEGIN + /* ORIGSQL: PRAGMA AUTONOMOUS_TRANSACTION; */ + -- BEGIN AUTONOMOUS TRANSACTION + DECLARE var_pipeline_count DECIMAL(38,10); /* ORIGSQL: var_pipeline_count NUMBER ; */ + + /* ORIGSQL: CURSOR cur_count_pipeline IS select COUNT(pipelinename) countpipelines from MIGR(...) */ + DECLARE CURSOR cur_count_pipeline + FOR +SELECT /* ORIGSQL: SELECT COUNT(pipelinename) countpipelines from MIGRATIONTOOLKIT_TABLECOPYTASKS w(...) */ + COUNT(pipelinename) AS countpipelines +FROM + MIGRATIONTOOLKIT_TABLECOPYTASKS +WHERE + failure = '1' + OR duration IS NOT NULL; + +/* RESOLVE: Trigger declaration: Additional conversion may be required */ + +/* ORIGSQL: OPEN cur_count_pipeline; */ +OPEN cur_count_pipeline; + +/* ORIGSQL: FETCH cur_count_pipeline INTO var_pipeline_count; */ +FETCH cur_count_pipeline INTO var_pipeline_count; + +IF (:var_pipeline_count > 0) + THEN + -- completed count + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET COMPLETED = NVL((SELECT count(*) (...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: COMPLETED = */ + COMPLETED = IFNULL( /* ORIGSQL: NVL((SELECT count(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationi(...) */ + ( + SELECT /* ORIGSQL: (SELECT COUNT(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationid = (...) */ + COUNT(*) + FROM + MIGRATIONTOOLKIT_TABLECOPYTASKS TK + WHERE + ST.migrationid = TK.migrationid + AND duration IS NOT NULL + GROUP BY + migrationid + ) + ,0); + +-- failed count +/* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET failed = NVL((SELECT count(*) FRO(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: failed = */ + failed = IFNULL( /* ORIGSQL: NVL((SELECT count(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationi(...) */ + ( + SELECT /* ORIGSQL: (SELECT COUNT(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationid = (...) */ + COUNT(*) + FROM + MIGRATIONTOOLKIT_TABLECOPYTASKS TK + WHERE + ST.migrationid = TK.migrationid + AND failure = '1' + GROUP BY + migrationid + ) + ,0); +END IF; + -- this takes care of THIS ROW, for which trigger is fired + IF /* ORIGSQL: IF UPDATING AND */ +:new.failure = '1' + AND :old.failure = '0' + THEN + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET failed = failed + 1 WHERE migrati(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: failed = */ + failed = failed + 1 +WHERE + migrationid = :new.migrationid; + +--INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('Updating failed', 1); +END IF; + + -- this takes care of THIS ROW,l for which trigger is fired + IF /* ORIGSQL: IF UPDATING AND */ +:new.duration IS NOT NULL + AND :old.duration IS NULL + THEN + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET completed = completed + 1 WHERE m(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: completed = */ + completed = completed + 1 +WHERE + migrationid = :new.migrationid + AND total > completed; + +--INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('Updating completed', 1); +END IF; + + -- this sQL is slightly diff from the SQL server one + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS SET lastupdate = sys_extract_utc(systime(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS +SET + /* ORIGSQL: lastupdate = */ + lastupdate = CURRENT_UTCTIMESTAMP /* ORIGSQL: sys_extract_utc(systimestamp) */ +WHERE + migrationid = :new.migrationid; + +/* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS SET endAt = sys_extract_utc(systimestamp(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS +SET + /* ORIGSQL: endAt = */ + endAt = CURRENT_UTCTIMESTAMP /* ORIGSQL: sys_extract_utc(systimestamp) */ +WHERE + total = completed + AND endAt IS NULL; + +/* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS SET status = 'PROCESSED' WHERE status = (...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS +SET + /* ORIGSQL: status = */ + status = 'PROCESSED' +WHERE + status = 'RUNNING' + AND total = completed; + +/* ORIGSQL: COMMIT; */ +/* RESOLVE: Statement 'COMMIT' not currently supported in HANA SQL trigger objects */ +-- COMMIT;; /* NOT CONVERTED! */ +-- END; +END; + +# + +CREATE OR REPLACE TRIGGER MIGRATIONTOOLKIT_TABLECOPYSTATUS_Insert_trigger +AFTER INSERT +ON MIGRATIONTOOLKIT_TABLECOPYTASKS +REFERENCING OLD ROW AS old, NEW ROW AS new +FOR EACH ROW +BEGIN + /* ORIGSQL: PRAGMA AUTONOMOUS_TRANSACTION; */ + -- BEGIN AUTONOMOUS TRANSACTION + DECLARE var_pipeline_count DECIMAL(38,10); /* ORIGSQL: var_pipeline_count NUMBER ; */ + + /* ORIGSQL: CURSOR cur_count_pipeline IS select COUNT(pipelinename) countpipelines from MIGR(...) */ + DECLARE CURSOR cur_count_pipeline + FOR +SELECT /* ORIGSQL: SELECT COUNT(pipelinename) countpipelines from MIGRATIONTOOLKIT_TABLECOPYTASKS w(...) */ + COUNT(pipelinename) AS countpipelines +FROM + MIGRATIONTOOLKIT_TABLECOPYTASKS +WHERE + failure = '1' + OR duration IS NOT NULL; + +/* RESOLVE: Trigger declaration: Additional conversion may be required */ + +/* ORIGSQL: OPEN cur_count_pipeline; */ +OPEN cur_count_pipeline; + +/* ORIGSQL: FETCH cur_count_pipeline INTO var_pipeline_count; */ +FETCH cur_count_pipeline INTO var_pipeline_count; + +IF (:var_pipeline_count > 0) + THEN + -- completed count + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET COMPLETED = NVL((SELECT count(*) (...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: COMPLETED = */ + COMPLETED = IFNULL( /* ORIGSQL: NVL((SELECT count(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationi(...) */ + ( + SELECT /* ORIGSQL: (SELECT COUNT(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationid = (...) */ + COUNT(*) + FROM + MIGRATIONTOOLKIT_TABLECOPYTASKS TK + WHERE + ST.migrationid = TK.migrationid + AND duration IS NOT NULL + GROUP BY + migrationid + ) + ,0); + +-- failed count +/* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET failed = NVL((SELECT count(*) FRO(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: failed = */ + failed = IFNULL( /* ORIGSQL: NVL((SELECT count(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationi(...) */ + ( + SELECT /* ORIGSQL: (SELECT COUNT(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK WHERE ST.migrationid = (...) */ + COUNT(*) + FROM + MIGRATIONTOOLKIT_TABLECOPYTASKS TK + WHERE + ST.migrationid = TK.migrationid + AND failure = '1' + GROUP BY + migrationid + ) + ,0); +END IF; + + + -- this takes care of THIS ROW,l for which trigger is fired + IF /* ORIGSQL: IF INSERTING AND */ +:new.failure = '1' + THEN + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET failed = failed + 1 WHERE migrati(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: failed = */ + failed = failed + 1 +WHERE + migrationid = :new.migrationid; + +--INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('INSERTING failed', 1); +END IF; + + -- this takes care of THIS ROW,l for which trigger is fired + IF /* ORIGSQL: IF INSERTING AND */ +:new.duration IS NOT NULL + THEN + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET completed = completed + 1 WHERE m(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST +SET + /* ORIGSQL: completed = */ + completed = completed + 1 +WHERE + migrationid = :new.migrationid + AND total > completed; + +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +--INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('INSERTING completed', 1); +END IF; + + -- this sQL is slightly diff from the SQL server one + /* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS SET lastupdate = sys_extract_utc(systime(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS +SET + /* ORIGSQL: lastupdate = */ + lastupdate = CURRENT_UTCTIMESTAMP /* ORIGSQL: sys_extract_utc(systimestamp) */ +WHERE + migrationid = :new.migrationid; + +/* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS SET endAt = sys_extract_utc(systimestamp(...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS +SET + /* ORIGSQL: endAt = */ + endAt = CURRENT_UTCTIMESTAMP /* ORIGSQL: sys_extract_utc(systimestamp) */ +WHERE + total = completed + AND endAt IS NULL; + +/* ORIGSQL: UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS SET status = 'PROCESSED' WHERE status = (...) */ +UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS +SET + /* ORIGSQL: status = */ + status = 'PROCESSED' +WHERE + status = 'RUNNING' + AND total = completed; + +/* ORIGSQL: COMMIT; */ +/* RESOLVE: Statement 'COMMIT' not currently supported in HANA SQL trigger objects */ +-- COMMIT;; /* NOT CONVERTED! */ +-- END; +END; + +# \ No newline at end of file diff --git a/commercedbsync/resources/sql/createSchedulerTablesOracle.sql b/commercedbsync/resources/sql/createSchedulerTablesOracle.sql new file mode 100644 index 0000000..7286422 --- /dev/null +++ b/commercedbsync/resources/sql/createSchedulerTablesOracle.sql @@ -0,0 +1,158 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + + +BEGIN + EXECUTE IMMEDIATE 'DROP TABLE MIGRATIONTOOLKIT_TABLECOPYTASKS'; +EXCEPTION + WHEN OTHERS THEN NULL; +END; +/ + + + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYTASKS ( + targetnodeId number(10) NOT NULL, + migrationId NVARCHAR2(255) NOT NULL, + pipelinename NVARCHAR2(255) NOT NULL, + sourcetablename NVARCHAR2(255) NOT NULL, + targettablename NVARCHAR2(255) NOT NULL, + columnmap CLOB NULL, + duration NVARCHAR2 (255) NULL, + sourcerowcount number(10) DEFAULT 0 NOT NULL, + targetrowcount number(10) DEFAULT 0 NOT NULL, + failure char(1) DEFAULT '0' NOT NULL, + error CLOB NULL, + published char(1) DEFAULT '0' NOT NULL, + lastupdate Timestamp NOT NULL, + avgwriterrowthroughput number(10,2) DEFAULT 0 NULL, + avgreaderrowthroughput number(10,2) DEFAULT 0 NULL, + durationinseconds number(10,2) DEFAULT 0 NULL, + PRIMARY KEY (migrationid, targetnodeid, pipelinename) +) +/ + + + + +BEGIN + EXECUTE IMMEDIATE 'DROP TABLE MIGRATIONTOOLKIT_TABLECOPYSTATUS'; +EXCEPTION + WHEN OTHERS THEN NULL; +END; +/ + + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYSTATUS ( + migrationId NVARCHAR2(255) NOT NULL, + startAt TimeStamp DEFAULT SYS_EXTRACT_UTC(SYSTIMESTAMP) NOT NULL, + endAt Timestamp, + lastUpdate Timestamp, + total number(10) DEFAULT 0 NOT NULL, + completed number(10) DEFAULT 0 NOT NULL, + failed number(10) DEFAULT 0 NOT NULL, + status NVARCHAR2(255) DEFAULT 'RUNNING' NOT NULL, + PRIMARY key(migrationid) +) +/ + + + + +CREATE OR REPLACE TRIGGER MIGRATIONTOOLKIT_TABLECOPYSTATUS_Update + AFTER INSERT OR UPDATE + ON MIGRATIONTOOLKIT_TABLECOPYTASKS + FOR EACH ROW +DECLARE + PRAGMA AUTONOMOUS_TRANSACTION; + + var_pipeline_count NUMBER ; + + CURSOR cur_count_pipeline + IS select count(pipelinename) countpipelines from MIGRATIONTOOLKIT_TABLECOPYTASKS where failure='1' OR duration is not NULL; + +BEGIN + + + OPEN cur_count_pipeline; + FETCH cur_count_pipeline INTO var_pipeline_count; + IF (var_pipeline_count > 0 ) THEN + -- completed count + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET COMPLETED = + NVL + ((SELECT count(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK + WHERE + ST.migrationid = TK.migrationid + AND duration IS NOT NULL + GROUP BY migrationid + ),0); + + -- failed count + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET failed = + NVL + ((SELECT count(*) FROM MIGRATIONTOOLKIT_TABLECOPYTASKS TK + WHERE + ST.migrationid = TK.migrationid + AND failure='1' + GROUP BY migrationid + ),0); + + END IF; + -- this takes care of THIS ROW, for which trigger is fired + IF UPDATING AND :NEW.failure='1' AND :OLD.failure='0' THEN + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET failed = failed + 1 WHERE migrationid = :NEW.migrationid; + --INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('Updating failed', 1); + END IF; + + -- this takes care of THIS ROW,l for which trigger is fired + IF UPDATING AND :NEW.duration IS NOT NULL AND :OLD.duration IS NULL THEN + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET completed = completed + 1 WHERE migrationid = :NEW.migrationid; + --INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('Updating completed', 1); + END IF; + + -- this takes care of THIS ROW,l for which trigger is fired + IF INSERTING AND :NEW.failure='1' THEN + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET failed = failed + 1 WHERE migrationid = :NEW.migrationid; + --INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('INSERTING failed', 1); + END IF; + + -- this takes care of THIS ROW,l for which trigger is fired + IF INSERTING AND :NEW.duration IS NOT NULL THEN + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS ST SET completed = completed + 1 WHERE migrationid = :NEW.migrationid; + --INSERT INTO EVENT_LOG_CMT (DESCRIPTION, COUNTS) VALUES ('INSERTING completed', 1); + END IF; + + -- this sQL is slightly diff from the SQL server one + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS + SET lastupdate = sys_extract_utc(systimestamp) + WHERE migrationid = :NEW.migrationid; + + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS + SET endAt = sys_extract_utc(systimestamp) + WHERE total = completed + AND endAt IS NULL; + + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS + SET status = 'PROCESSED' + WHERE status = 'RUNNING' + AND total = completed; + COMMIT; +END; + +/ + diff --git a/commercedbsync/resources/sql/createSchedulerTablesPostGres.sql b/commercedbsync/resources/sql/createSchedulerTablesPostGres.sql new file mode 100644 index 0000000..451451b --- /dev/null +++ b/commercedbsync/resources/sql/createSchedulerTablesPostGres.sql @@ -0,0 +1,130 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + + + +DROP TABLE IF EXISTS MIGRATIONTOOLKIT_TABLECOPYTASKS; + +# + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYTASKS ( + targetnodeId int NOT NULL, + migrationId VARCHAR(255) NOT NULL, + pipelinename VARCHAR(255) NOT NULL, + sourcetablename VARCHAR(255) NOT NULL, + targettablename VARCHAR(255) NOT NULL, + columnmap text NULL, + duration VARCHAR (255) NULL, + sourcerowcount int NOT NULL DEFAULT 0, + targetrowcount int NOT NULL DEFAULT 0, + failure char(1) NOT NULL DEFAULT '0', + error text NULL, + published char(1) NOT NULL DEFAULT '0', + lastupdate timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', + avgwriterrowthroughput numeric(10,2) NULL DEFAULT 0, + avgreaderrowthroughput numeric(10,2) NULL DEFAULT 0, + durationinseconds numeric(10,2) NULL DEFAULT 0, + PRIMARY KEY (migrationid, targetnodeid, pipelinename) +); + +# + +DROP TABLE IF EXISTS MIGRATIONTOOLKIT_TABLECOPYSTATUS; + +# + +CREATE TABLE MIGRATIONTOOLKIT_TABLECOPYSTATUS ( + migrationId VARCHAR(255) NOT NULL, + startAt timestamp NOT NULL DEFAULT NOW(), + endAt timestamp, + lastUpdate timestamp, + total int NOT NULL DEFAULT 0, + completed int NOT NULL DEFAULT 0, + failed int NOT NULL DEFAULT 0, + status VARCHAR(255) NOT NULL DEFAULT 'RUNNING', + PRIMARY KEY (migrationid) +); + +# + +DROP TRIGGER IF EXISTS MIGRATIONTOOLKIT_TABLECOPYSTATUS_Update ON MIGRATIONTOOLKIT_TABLECOPYTASKS CASCADE; + +# + +DROP FUNCTION IF EXISTS MIGRATIONTOOLKIT_TABLECOPYSTATUS_proc; + +# + +CREATE FUNCTION MIGRATIONTOOLKIT_TABLECOPYSTATUS_proc() RETURNS trigger AS $$ + +DECLARE relevant_count integer default 0; +BEGIN + + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS AS s + SET lastUpdate = t.latestUpdate + FROM ( SELECT NEW.migrationId, MAX(NEW.lastUpdate) AS latestUpdate + GROUP BY migrationId + ) AS t + WHERE s.migrationId = t.migrationId; + + relevant_count = COUNT(NEW.pipelinename) + WHERE NEW.failure = '1' + OR NEW.duration IS NOT NULL; + + IF relevant_count > 0 then + -- updated completed count when tasks completed + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS AS s + SET completed = t.completed + FROM ( SELECT migrationId, COUNT(pipelinename) AS completed + FROM MIGRATIONTOOLKIT_TABLECOPYTASKS + WHERE duration IS NOT NULL + GROUP BY migrationId + ) AS t + WHERE s.migrationId = t.migrationId; + + -- update failed count when tasks failed + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS AS s + SET failed = t.failed + FROM ( SELECT migrationId, COUNT(pipelinename) AS failed + FROM MIGRATIONTOOLKIT_TABLECOPYTASKS + WHERE failure = '1' + GROUP BY migrationId + ) AS t + WHERE s.migrationId = t.migrationId; + + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS + SET endAt = NOW() + WHERE total = completed + AND endAt IS NULL; + + UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS + SET status = 'PROCESSED' + WHERE status = 'RUNNING' + AND total = completed; +END if; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +# + +CREATE TRIGGER MIGRATIONTOOLKIT_TABLECOPYSTATUS_Update + AFTER INSERT OR UPDATE ON MIGRATIONTOOLKIT_TABLECOPYTASKS + FOR EACH ROW EXECUTE PROCEDURE MIGRATIONTOOLKIT_TABLECOPYSTATUS_proc(); + +# \ No newline at end of file diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/CommercedbsyncStandalone.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/CommercedbsyncStandalone.java new file mode 100644 index 0000000..6e3e587 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/CommercedbsyncStandalone.java @@ -0,0 +1,44 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync; + +import de.hybris.platform.core.Registry; +import de.hybris.platform.jalo.JaloSession; +import de.hybris.platform.util.RedeployUtilities; +import de.hybris.platform.util.Utilities; + + +/** + * Demonstration of how to write a standalone application that can be run directly from within eclipse or from the + * commandline.
+ * To run this from commandline, just use the following command:
+ * + * java -jar bootstrap/bin/ybootstrap.jar "new CommercedbsyncStandalone().run();" + * From eclipse, just run as Java Application. Note that you maybe need to add all other projects like + * ext-commerce, ext-pim to the Launch configuration classpath. + */ +public class CommercedbsyncStandalone { + /** + * Main class to be able to run it directly as a java program. + * + * @param args the arguments from commandline + */ + public static void main(final String[] args) { + new CommercedbsyncStandalone().run(); + } + + public void run() { + Registry.activateStandaloneMode(); + Registry.activateMasterTenant(); + + final JaloSession jaloSession = JaloSession.getCurrentSession(); + System.out.println("Session ID: " + jaloSession.getSessionID()); //NOPMD + System.out.println("User: " + jaloSession.getUser()); //NOPMD + Utilities.printAppInfo(); + + RedeployUtilities.shutdown(); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/DataRepositoryAdapter.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/DataRepositoryAdapter.java new file mode 100644 index 0000000..e235c34 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/DataRepositoryAdapter.java @@ -0,0 +1,26 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.adapter; + +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; + +public interface DataRepositoryAdapter { + long getRowCount(MigrationContext context, String table) throws Exception; + + DataSet getAll(MigrationContext context, String table) throws Exception; + + DataSet getBatchWithoutIdentifier(MigrationContext context, OffsetQueryDefinition queryDefinition) throws Exception; + + DataSet getBatchOrderedByColumn(MigrationContext context, SeekQueryDefinition queryDefinition) throws Exception; + + DataSet getBatchMarkersOrderedByColumn(MigrationContext context, MarkersQueryDefinition queryDefinition) throws Exception; + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/impl/ContextualDataRepositoryAdapter.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/impl/ContextualDataRepositoryAdapter.java new file mode 100644 index 0000000..b0aae83 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/adapter/impl/ContextualDataRepositoryAdapter.java @@ -0,0 +1,89 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.adapter.impl; + +import com.sap.cx.boosters.commercedbsync.adapter.DataRepositoryAdapter; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; + +import java.time.Instant; + +/** + * Controls the way the repository is accessed by adapting the most common reading + * operations based on the configured context + */ +public class ContextualDataRepositoryAdapter implements DataRepositoryAdapter { + + private DataRepository repository; + + public ContextualDataRepositoryAdapter(DataRepository repository) { + this.repository = repository; + } + + @Override + public long getRowCount(MigrationContext context, String table) throws Exception { + if(context.isDeletionEnabled() || context.isLpTableMigrationEnabled()){ + return repository.getRowCountModifiedAfter(table, getIncrementalTimestamp(context),context.isDeletionEnabled(), context.isLpTableMigrationEnabled()); + } + else{ + if (context.isIncrementalModeEnabled()) { + return repository.getRowCountModifiedAfter(table, getIncrementalTimestamp(context)); + } else { + return repository.getRowCount(table); + } + } + } + + @Override + public DataSet getAll(MigrationContext context, String table) throws Exception { + if (context.isIncrementalModeEnabled()) { + return repository.getAllModifiedAfter(table, getIncrementalTimestamp(context)); + } else { + return repository.getAll(table); + } + } + + @Override + public DataSet getBatchWithoutIdentifier(MigrationContext context, OffsetQueryDefinition queryDefinition) throws Exception { + if (context.isIncrementalModeEnabled()) { + return repository.getBatchWithoutIdentifier(queryDefinition, getIncrementalTimestamp(context)); + } else { + return repository.getBatchWithoutIdentifier(queryDefinition); + } + } + + @Override + public DataSet getBatchOrderedByColumn(MigrationContext context, SeekQueryDefinition queryDefinition) throws Exception { + if (context.isIncrementalModeEnabled()) { + return repository.getBatchOrderedByColumn(queryDefinition, getIncrementalTimestamp(context)); + } else { + return repository.getBatchOrderedByColumn(queryDefinition); + } + } + + @Override + public DataSet getBatchMarkersOrderedByColumn(MigrationContext context, MarkersQueryDefinition queryDefinition) throws Exception { + if (context.isIncrementalModeEnabled()) { + return repository.getBatchMarkersOrderedByColumn(queryDefinition, getIncrementalTimestamp(context)); + } else { + return repository.getBatchMarkersOrderedByColumn(queryDefinition); + } + } + + private Instant getIncrementalTimestamp(MigrationContext context) { + Instant incrementalTimestamp = context.getIncrementalTimestamp(); + if (incrementalTimestamp == null) { + throw new IllegalStateException("Timestamp cannot be null in incremental mode. Set a timestamp using the property " + CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_TIMESTAMP); + } + return incrementalTimestamp; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipe.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipe.java new file mode 100644 index 0000000..fd00539 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipe.java @@ -0,0 +1,24 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +import javax.annotation.concurrent.ThreadSafe; + +/** + * Used to separate database reading and writing operations, after reading data from the DB, the result + * is put to the pipe and can be used by the database writer later on -> asynchronously + * + * @param + */ +@ThreadSafe +public interface DataPipe { + void requestAbort(Exception e); + + void put(MaybeFinished value) throws Exception; + + MaybeFinished get() throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipeFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipeFactory.java new file mode 100644 index 0000000..77bdcca --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataPipeFactory.java @@ -0,0 +1,17 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; + +import javax.annotation.concurrent.ThreadSafe; + +@ThreadSafe +public interface DataPipeFactory { + DataPipe create(CopyContext context, CopyContext.DataCopyItem item) throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerExecutor.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerExecutor.java new file mode 100644 index 0000000..019ee9a --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerExecutor.java @@ -0,0 +1,17 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +public interface DataWorkerExecutor { + Future safelyExecute(Callable callable) throws InterruptedException; + + void waitAndRethrowUncaughtExceptions() throws ExecutionException, InterruptedException; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerPoolFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerPoolFactory.java new file mode 100644 index 0000000..64e7f0c --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/DataWorkerPoolFactory.java @@ -0,0 +1,14 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +public interface DataWorkerPoolFactory { + ThreadPoolTaskExecutor create(CopyContext context); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MDCTaskDecorator.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MDCTaskDecorator.java new file mode 100644 index 0000000..8d37302 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MDCTaskDecorator.java @@ -0,0 +1,27 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +import org.slf4j.MDC; +import org.springframework.core.task.TaskDecorator; + +import java.util.Map; + +public class MDCTaskDecorator implements TaskDecorator { + @Override + public Runnable decorate(Runnable runnable) { + Map contextMap = MDC.getCopyOfContextMap(); + return () -> { + try { + MDC.setContextMap(contextMap); + runnable.run(); + } finally { + MDC.clear(); + } + }; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MaybeFinished.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MaybeFinished.java new file mode 100644 index 0000000..e6458da --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/MaybeFinished.java @@ -0,0 +1,49 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +/** + * MaybeFinished keeps track status of the data set that is currently being processed -> if all is ok, + * then status will be done, if theres an exception, it will be poison + * + * @param + */ +public class MaybeFinished { + private final T value; + private final boolean done; + private final boolean poison; + + private MaybeFinished(T value, boolean done, boolean poison) { + this.value = value; + this.done = done; + this.poison = poison; + } + + public static MaybeFinished of(T value) { + return new MaybeFinished<>(value, false, false); + } + + public static MaybeFinished finished(T value) { + return new MaybeFinished<>(value, true, false); + } + + public static MaybeFinished poison() { + return new MaybeFinished<>(null, true, true); + } + + public T getValue() { + return value; + } + + public boolean isDone() { + return done; + } + + public boolean isPoison() { + return poison; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/PipeAbortedException.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/PipeAbortedException.java new file mode 100644 index 0000000..8fe142b --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/PipeAbortedException.java @@ -0,0 +1,17 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +public class PipeAbortedException extends Exception { + public PipeAbortedException(String message) { + super(message); + } + + public PipeAbortedException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/RetriableTask.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/RetriableTask.java new file mode 100644 index 0000000..353c218 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/RetriableTask.java @@ -0,0 +1,54 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent; + +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.Callable; + +public abstract class RetriableTask implements Callable { + + private static final Logger LOG = LoggerFactory.getLogger(RetriableTask.class); + + private CopyContext context; + private String table; + private int retryCount = 0; + + public RetriableTask(CopyContext context, String table) { + this.context = context; + this.table = table; + } + + @Override + public Boolean call() { + try { + return internalRun(); + } catch (PipeAbortedException e) { + throw new RuntimeException("Ignore retries", e); + } catch (Exception e) { + if (retryCount < context.getMigrationContext().getMaxWorkerRetryAttempts()) { + LOG.warn("Retrying failed task {} for table {}. Retry count: {}. Cause: {}", getClass().getName(), table, retryCount, e); + e.printStackTrace(); + retryCount++; + return call(); + } else { + handleFailure(e); + return Boolean.FALSE; + } + } + } + + protected void handleFailure(Exception e) { + throw new RuntimeException(ExceptionUtils.getRootCauseMessage(e), e); + } + + protected abstract Boolean internalRun() throws Exception; + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipe.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipe.java new file mode 100644 index 0000000..6d07f3f --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipe.java @@ -0,0 +1,98 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent.impl; + +import com.sap.cx.boosters.commercedbsync.concurrent.MaybeFinished; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.scheduler.DatabaseCopyScheduler; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import com.sap.cx.boosters.commercedbsync.concurrent.DataPipe; +import com.sap.cx.boosters.commercedbsync.concurrent.PipeAbortedException; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +public class DefaultDataPipe implements DataPipe { + private static final Logger LOG = LoggerFactory.getLogger(DefaultDataPipe.class); + + private final BlockingQueue> queue; + private final int defaultTimeout; + private final AtomicReference abortException = new AtomicReference<>(); + private final CopyContext context; + private final CopyContext.DataCopyItem copyItem; + private final DatabaseCopyTaskRepository taskRepository; + private final DatabaseCopyScheduler scheduler; + + public DefaultDataPipe(DatabaseCopyScheduler scheduler, DatabaseCopyTaskRepository taskRepository, CopyContext context, CopyContext.DataCopyItem copyItem, int timeoutInSeconds, int capacity) { + this.taskRepository = taskRepository; + this.scheduler = scheduler; + this.context = context; + this.copyItem = copyItem; + this.queue = new ArrayBlockingQueue<>(capacity); + defaultTimeout = timeoutInSeconds; + } + + @Override + public void requestAbort(Exception cause) { + if (this.abortException.compareAndSet(null, cause)) { + if (context.getMigrationContext().isFailOnErrorEnabled()) { + try { + scheduler.abort(context); + } catch (Exception ex) { + LOG.warn("could not abort", ex); + } + } + try { + taskRepository.markTaskFailed(context, copyItem, cause); + } catch (Exception e) { + LOG.warn("could not update error status!", e); + } + try { + this.queue.offer(MaybeFinished.poison(), defaultTimeout, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOG.warn("Could not flush pipe with poison", e); + } + } + } + + private boolean isAborted() throws Exception { + if (this.abortException.get() == null && scheduler.isAborted(this.context)) { + this.requestAbort(new PipeAbortedException("Migration aborted")); + } + return this.abortException.get() != null; + } + + @Override + public void put(MaybeFinished value) throws Exception { + if (isAborted()) { + throw new PipeAbortedException("pipe aborted", this.abortException.get()); + } + if (!queue.offer(value, defaultTimeout, TimeUnit.SECONDS)) { + throw new RuntimeException("cannot put new item in time"); + } + } + + @Override + public MaybeFinished get() throws Exception { + if (isAborted()) { + throw new PipeAbortedException("pipe aborted", this.abortException.get()); + } + MaybeFinished element = queue.poll(defaultTimeout, TimeUnit.SECONDS); + if (isAborted()) { + throw new PipeAbortedException("pipe aborted", this.abortException.get()); + } + if (element == null) { + throw new RuntimeException(String.format("cannot get new item in time. Consider increasing the value of the property '%s' or '%s'", CommercedbsyncConstants.MIGRATION_DATA_PIPE_TIMEOUT, CommercedbsyncConstants.MIGRATION_DATA_PIPE_CAPACITY)); + } + return element; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipeFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipeFactory.java new file mode 100644 index 0000000..abafa03 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataPipeFactory.java @@ -0,0 +1,319 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent.impl; + +import com.sap.cx.boosters.commercedbsync.concurrent.DataWorkerExecutor; +import com.sap.cx.boosters.commercedbsync.concurrent.MaybeFinished; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceCategory; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceRecorder; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceUnit; +import com.sap.cx.boosters.commercedbsync.scheduler.DatabaseCopyScheduler; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import org.apache.commons.lang3.tuple.Pair; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import com.sap.cx.boosters.commercedbsync.adapter.DataRepositoryAdapter; +import com.sap.cx.boosters.commercedbsync.adapter.impl.ContextualDataRepositoryAdapter; +import com.sap.cx.boosters.commercedbsync.concurrent.DataPipe; +import com.sap.cx.boosters.commercedbsync.concurrent.DataPipeFactory; +import com.sap.cx.boosters.commercedbsync.concurrent.DataWorkerPoolFactory; +import com.sap.cx.boosters.commercedbsync.concurrent.RetriableTask; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public class DefaultDataPipeFactory implements DataPipeFactory { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultDataPipeFactory.class); + + private final DatabaseCopyTaskRepository taskRepository; + private final DatabaseCopyScheduler scheduler; + private final AsyncTaskExecutor executor; + private final DataWorkerPoolFactory dataReadWorkerPoolFactory; + + public DefaultDataPipeFactory(DatabaseCopyScheduler scheduler, DatabaseCopyTaskRepository taskRepository, AsyncTaskExecutor executor, DataWorkerPoolFactory dataReadWorkerPoolFactory) { + this.scheduler = scheduler; + this.taskRepository = taskRepository; + this.executor = executor; + this.dataReadWorkerPoolFactory = dataReadWorkerPoolFactory; + } + + @Override + public DataPipe create(CopyContext context, CopyContext.DataCopyItem item) throws Exception { + int dataPipeTimeout = context.getMigrationContext().getDataPipeTimeout(); + int dataPipeCapacity = context.getMigrationContext().getDataPipeCapacity(); + DataPipe pipe = new DefaultDataPipe<>(scheduler, taskRepository, context, item, dataPipeTimeout, dataPipeCapacity); + ThreadPoolTaskExecutor taskExecutor = dataReadWorkerPoolFactory.create(context); + DataWorkerExecutor workerExecutor = new DefaultDataWorkerExecutor<>(taskExecutor); + try { + executor.submit(() -> { + try { + scheduleWorkers(context, workerExecutor, pipe, item); + workerExecutor.waitAndRethrowUncaughtExceptions(); + pipe.put(MaybeFinished.finished(DataSet.EMPTY)); + } catch (Exception e) { + LOG.error("Error scheduling worker tasks ", e); + try { + pipe.put(MaybeFinished.poison()); + } catch (Exception p) { + LOG.error("Cannot contaminate pipe ", p); + } + } finally { + if (taskExecutor != null) { + taskExecutor.shutdown(); + } + } + }); + } catch (Exception e) { + throw new RuntimeException("Error invoking reader tasks ", e); + } + return pipe; + } + + private void scheduleWorkers(CopyContext context, DataWorkerExecutor workerExecutor, DataPipe pipe, CopyContext.DataCopyItem copyItem) throws Exception { + DataRepositoryAdapter dataRepositoryAdapter = new ContextualDataRepositoryAdapter(context.getMigrationContext().getDataSourceRepository()); + String table = copyItem.getSourceItem(); + long totalRows = copyItem.getRowCount(); + long pageSize = context.getMigrationContext().getReaderBatchSize(); + try { + PerformanceRecorder recorder = context.getPerformanceProfiler().createRecorder(PerformanceCategory.DB_READ, table); + recorder.start(); + + PipeTaskContext pipeTaskContext = new PipeTaskContext(context, pipe, table, dataRepositoryAdapter, pageSize, recorder); + + String batchColumn = ""; + // help.sap.com/viewer/d0224eca81e249cb821f2cdf45a82ace/LATEST/en-US/08a27931a21441b59094c8a6aa2a880e.html + if (context.getMigrationContext().getDataSourceRepository().isAuditTable(table) && + context.getMigrationContext().getDataSourceRepository().getAllColumnNames(table).contains("ID")) { + batchColumn = "ID"; + } else if (context.getMigrationContext().getDataSourceRepository().getAllColumnNames(table).contains("PK")) { + batchColumn = "PK"; + } + LOG.debug("Using batchColumn: {}", batchColumn.isEmpty() ? "NONE" : batchColumn); + + if (batchColumn.isEmpty()) { + // trying offset queries with unique index columns + Set batchColumns; + DataSet uniqueColumns = context.getMigrationContext().getDataSourceRepository().getUniqueColumns(table); + if (uniqueColumns.isNotEmpty()) { + if (uniqueColumns.getColumnCount() == 0) { + throw new IllegalStateException("Corrupt dataset retrieved. Dataset should have information about unique columns"); + } + batchColumns = uniqueColumns.getAllResults().stream().map(row -> String.valueOf(row.get(0))).collect(Collectors.toSet()); + for (int offset = 0; offset < totalRows; offset += pageSize) { + DataReaderTask dataReaderTask = new BatchOffsetDataReaderTask(pipeTaskContext, offset, batchColumns); + workerExecutor.safelyExecute(dataReaderTask); + } + } else { + //If no unique columns available to do batch sorting, fallback to read all + LOG.warn("Reading all rows at once without batching for table {}. Memory consumption might be negatively affected", table); + DataReaderTask dataReaderTask = new DefaultDataReaderTask(pipeTaskContext); + workerExecutor.safelyExecute(dataReaderTask); + } + } else { + // do the pagination by value comparison + MarkersQueryDefinition queryDefinition = new MarkersQueryDefinition(); + queryDefinition.setTable(table); + queryDefinition.setColumn(batchColumn); + queryDefinition.setBatchSize(pageSize); + queryDefinition.setDeletionEnabled(context.getMigrationContext().isDeletionEnabled()); + queryDefinition.setLpTableEnabled(context.getMigrationContext().isLpTableMigrationEnabled()); + DataSet batchMarkers = dataRepositoryAdapter.getBatchMarkersOrderedByColumn(context.getMigrationContext(), queryDefinition); + List> batchMarkersList = batchMarkers.getAllResults(); + if (batchMarkersList.isEmpty()) { + throw new RuntimeException("Could not retrieve batch values for table " + table); + } + for (int i = 0; i < batchMarkersList.size(); i++) { + List lastBatchMarkerRow = batchMarkersList.get(i); + Optional> nextBatchMarkerRow = Optional.empty(); + int nextIndex = i + 1; + if (nextIndex < batchMarkersList.size()) { + nextBatchMarkerRow = Optional.of(batchMarkersList.get(nextIndex)); + } + DataReaderTask dataReaderTask = new BatchMarkerDataReaderTask(pipeTaskContext, batchColumn, Pair.of(lastBatchMarkerRow, nextBatchMarkerRow)); + workerExecutor.safelyExecute(dataReaderTask); + } + } + } catch (Exception ex) { + LOG.error("{{}}: Exception while preparing reader tasks", table, ex); + pipe.requestAbort(ex); + if (ex instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + throw new RuntimeException("Exception while preparing reader tasks", ex); + } + } + + private static abstract class DataReaderTask extends RetriableTask { + private static final Logger LOG = LoggerFactory.getLogger(DataReaderTask.class); + + private PipeTaskContext pipeTaskContext; + + public DataReaderTask(PipeTaskContext pipeTaskContext) { + super(pipeTaskContext.getContext(), pipeTaskContext.getTable()); + this.pipeTaskContext = pipeTaskContext; + } + + public PipeTaskContext getPipeTaskContext() { + return pipeTaskContext; + } + } + + private static class DefaultDataReaderTask extends DataReaderTask { + + public DefaultDataReaderTask(PipeTaskContext pipeTaskContext) { + super(pipeTaskContext); + } + + @Override + protected Boolean internalRun() throws Exception { + process(); + return Boolean.TRUE; + } + + private void process() throws Exception { + MigrationContext migrationContext = getPipeTaskContext().getContext().getMigrationContext(); + DataSet all = getPipeTaskContext().getDataRepositoryAdapter().getAll(migrationContext, getPipeTaskContext().getTable()); + getPipeTaskContext().getRecorder().record(PerformanceUnit.ROWS, all.getAllResults().size()); + getPipeTaskContext().getPipe().put(MaybeFinished.of(all)); + } + } + + private static class BatchOffsetDataReaderTask extends DataReaderTask { + + private long offset = 0; + private Set batchColumns; + + public BatchOffsetDataReaderTask(PipeTaskContext pipeTaskContext, long offset, Set batchColumns) { + super(pipeTaskContext); + this.offset = offset; + this.batchColumns = batchColumns; + } + + @Override + protected Boolean internalRun() throws Exception { + process(); + return Boolean.TRUE; + } + + private void process() throws Exception { + DataRepositoryAdapter adapter = getPipeTaskContext().getDataRepositoryAdapter(); + CopyContext context = getPipeTaskContext().getContext(); + String table = getPipeTaskContext().getTable(); + long pageSize = getPipeTaskContext().getPageSize(); + OffsetQueryDefinition queryDefinition = new OffsetQueryDefinition(); + queryDefinition.setTable(table); + queryDefinition.setAllColumns(batchColumns); + queryDefinition.setBatchSize(pageSize); + queryDefinition.setOffset(offset); + queryDefinition.setDeletionEnabled(context.getMigrationContext().isDeletionEnabled()); + queryDefinition.setLpTableEnabled(context.getMigrationContext().isLpTableMigrationEnabled()); + DataSet result = adapter.getBatchWithoutIdentifier(context.getMigrationContext(), queryDefinition); + getPipeTaskContext().getRecorder().record(PerformanceUnit.ROWS, result.getAllResults().size()); + getPipeTaskContext().getPipe().put(MaybeFinished.of(result)); + } + } + + private static class BatchMarkerDataReaderTask extends DataReaderTask { + + private final String batchColumn; + private final Pair, Optional>> batchMarkersPair; + + public BatchMarkerDataReaderTask(PipeTaskContext pipeTaskContext, String batchColumn, Pair, Optional>> batchMarkersPair) { + super(pipeTaskContext); + this.batchColumn = batchColumn; + this.batchMarkersPair = batchMarkersPair; + } + + @Override + protected Boolean internalRun() throws Exception { + List lastBatchMarker = batchMarkersPair.getLeft(); + Optional> nextBatchMarker = batchMarkersPair.getRight(); + if (lastBatchMarker != null && lastBatchMarker.size() == 2) { + Object lastBatchValue = lastBatchMarker.get(0); + process(lastBatchValue, nextBatchMarker.map(v -> v.get(0))); + return Boolean.TRUE; + } else { + throw new IllegalArgumentException("Invalid batch marker passed to task"); + } + } + + private void process(Object lastValue, Optional nextValue) throws Exception { + CopyContext ctx = getPipeTaskContext().getContext(); + DataRepositoryAdapter adapter = getPipeTaskContext().getDataRepositoryAdapter(); + String table = getPipeTaskContext().getTable(); + long pageSize = getPipeTaskContext().getPageSize(); + SeekQueryDefinition queryDefinition = new SeekQueryDefinition(); + queryDefinition.setTable(table); + queryDefinition.setColumn(batchColumn); + queryDefinition.setLastColumnValue(lastValue); + queryDefinition.setNextColumnValue(nextValue.orElseGet(() -> null)); + queryDefinition.setBatchSize(pageSize); + queryDefinition.setDeletionEnabled(ctx.getMigrationContext().isDeletionEnabled()); + queryDefinition.setLpTableEnabled(ctx.getMigrationContext().isLpTableMigrationEnabled()); + DataSet page = adapter.getBatchOrderedByColumn(ctx.getMigrationContext(), queryDefinition); + getPipeTaskContext().getRecorder().record(PerformanceUnit.ROWS, pageSize); + getPipeTaskContext().getPipe().put(MaybeFinished.of(page)); + } + } + + private static class PipeTaskContext { + private CopyContext context; + private DataPipe pipe; + private String table; + private DataRepositoryAdapter dataRepositoryAdapter; + private long pageSize; + private PerformanceRecorder recorder; + + public PipeTaskContext(CopyContext context, DataPipe pipe, String table, DataRepositoryAdapter dataRepositoryAdapter, long pageSize, PerformanceRecorder recorder) { + this.context = context; + this.pipe = pipe; + this.table = table; + this.dataRepositoryAdapter = dataRepositoryAdapter; + this.pageSize = pageSize; + this.recorder = recorder; + } + + public CopyContext getContext() { + return context; + } + + public DataPipe getPipe() { + return pipe; + } + + public String getTable() { + return table; + } + + public DataRepositoryAdapter getDataRepositoryAdapter() { + return dataRepositoryAdapter; + } + + public long getPageSize() { + return pageSize; + } + + public PerformanceRecorder getRecorder() { + return recorder; + } + + } + +} + + diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerExecutor.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerExecutor.java new file mode 100644 index 0000000..62d53ce --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerExecutor.java @@ -0,0 +1,64 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent.impl; + +import com.sap.cx.boosters.commercedbsync.concurrent.DataWorkerExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.core.task.TaskRejectedException; +import org.springframework.util.backoff.BackOffExecution; +import org.springframework.util.backoff.ExponentialBackOff; + +import java.util.ArrayDeque; +import java.util.Queue; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +public class DefaultDataWorkerExecutor implements DataWorkerExecutor { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultDataWorkerExecutor.class); + + private AsyncTaskExecutor executor; + private Queue> futures = new ArrayDeque<>(); + + + public DefaultDataWorkerExecutor(AsyncTaskExecutor executor) { + this.executor = executor; + } + + @Override + public Future safelyExecute(Callable callable) throws InterruptedException { + Future future = internalSafelyExecute(callable, 0); + futures.add(future); + return future; + } + + private Future internalSafelyExecute(Callable callable, int rejections) throws InterruptedException { + try { + return executor.submit(callable); + } catch (TaskRejectedException e) { + BackOffExecution backOff = new ExponentialBackOff().start(); + long waitInterval = backOff.nextBackOff(); + for (int i = 0; i < rejections; i++) { + waitInterval = backOff.nextBackOff(); + } + LOG.trace("worker rejected. Retrying in {}ms...", waitInterval); + Thread.sleep(waitInterval); + return internalSafelyExecute(callable, rejections + 1); + } + } + + @Override + public void waitAndRethrowUncaughtExceptions() throws ExecutionException, InterruptedException { + Future future; + while ((future = futures.poll()) != null) { + future.get(); + } + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerPoolFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerPoolFactory.java new file mode 100644 index 0000000..8de0f1e --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/concurrent/impl/DefaultDataWorkerPoolFactory.java @@ -0,0 +1,48 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.concurrent.impl; + +import com.sap.cx.boosters.commercedbsync.concurrent.DataWorkerPoolFactory; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import org.springframework.core.task.TaskDecorator; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +public class DefaultDataWorkerPoolFactory implements DataWorkerPoolFactory { + + private TaskDecorator taskDecorator; + private String threadNamePrefix; + private int corePoolSize; + private int maxPoolSize; + private int keepAliveSeconds; + private int queueCapacity = 2147483647; + + public DefaultDataWorkerPoolFactory(TaskDecorator taskDecorator, String threadNamePrefix, int maxPoolSize, int keepAliveSeconds, boolean queueable) { + this.taskDecorator = taskDecorator; + this.threadNamePrefix = threadNamePrefix; + this.maxPoolSize = maxPoolSize; + this.keepAliveSeconds = keepAliveSeconds; + this.queueCapacity = queueable ? this.queueCapacity : 0; + this.corePoolSize = maxPoolSize; + } + + @Override + public ThreadPoolTaskExecutor create(CopyContext context) { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setTaskDecorator(taskDecorator); + executor.setThreadNamePrefix(threadNamePrefix); + executor.setCorePoolSize(corePoolSize); + executor.setMaxPoolSize(maxPoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + executor.setAllowCoreThreadTimeOut(true); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.setAwaitTerminationSeconds(Integer.MAX_VALUE); + executor.initialize(); + return executor; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/constants/CommercedbsyncConstants.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/constants/CommercedbsyncConstants.java new file mode 100644 index 0000000..3119bb9 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/constants/CommercedbsyncConstants.java @@ -0,0 +1,87 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.constants; + +import com.sap.cx.boosters.commercedbsync.constants.GeneratedCommercedbsyncConstants; + +/** + * Global class for all Commercedbsync constants. You can add global constants for your extension into this class. + */ +public final class CommercedbsyncConstants extends GeneratedCommercedbsyncConstants { + public static final String EXTENSIONNAME = "commercedbsync"; + public static final String PROPERTIES_PREFIX = "migration"; + public static final String MIGRATION_TRIGGER_UPDATESYSTEM = "migration.trigger.updatesystem"; + public static final String MIGRATION_SCHEMA_ENABLED = "migration.schema.enabled"; + public static final String MIGRATION_SCHEMA_TARGET_TABLES_ADD_ENABLED = "migration.schema.target.tables.add.enabled"; + public static final String MIGRATION_SCHEMA_TARGET_TABLES_REMOVE_ENABLED = "migration.schema.target.tables.remove.enabled"; + public static final String MIGRATION_SCHEMA_TARGET_COLUMNS_ADD_ENABLED = "migration.schema.target.columns.add.enabled"; + public static final String MIGRATION_SCHEMA_TARGET_COLUMNS_REMOVE_ENABLED = "migration.schema.target.columns.remove.enabled"; + public static final String MIGRATION_TARGET_MAX_STAGE_MIGRATIONS = "migration.ds.target.db.max.stage.migrations"; + public static final String MIGRATION_SCHEMA_AUTOTRIGGER_ENABLED = "migration.schema.autotrigger.enabled"; + public static final String MIGRATION_DATA_READER_BATCHSIZE = "migration.data.reader.batchsize"; + public static final String MIGRATION_DATA_TRUNCATE_ENABLED = "migration.data.truncate.enabled"; + public static final String MIGRATION_DATA_TRUNCATE_EXCLUDED = "migration.data.truncate.excluded"; + public static final String MIGRATION_DATA_WORKERS_READER_MAXTASKS = "migration.data.workers.reader.maxtasks"; + public static final String MIGRATION_DATA_WORKERS_WRITER_MAXTASKS = "migration.data.workers.writer.maxtasks"; + public static final String MIGRATION_DATA_WORKERS_RETRYATTEMPTS = "migration.data.workers.retryattempts"; + public static final String MIGRATION_DATA_MAXPRALLELTABLECOPY = "migration.data.maxparalleltablecopy"; + public static final String MIGRATION_DATA_FAILONEERROR_ENABLED = "migration.data.failonerror.enabled"; + public static final String MIGRATION_DATA_COLUMNS_EXCLUDED = "migration.data.columns.excluded"; + public static final String MIGRATION_DATA_COLUMNS_NULLIFY = "migration.data.columns.nullify"; + public static final String MIGRATION_DATA_INDICES_DROP_ENABLED = "migration.data.indices.drop.enabled"; + public static final String MIGRATION_DATA_INDICES_DISABLE_ENABLED = "migration.data.indices.disable.enabled"; + public static final String MIGRATION_DATA_INDICES_DISABLE_INCLUDED = "migration.data.indices.disable.included"; + public static final String MIGRATION_DATA_TABLES_AUDIT_ENABLED = "migration.data.tables.audit.enabled"; + public static final String MIGRATION_DATA_TABLES_CUSTOM = "migration.data.tables.custom"; + public static final String MIGRATION_DATA_TABLES_EXCLUDED = "migration.data.tables.excluded"; + public static final String MIGRATION_DATA_TABLES_INCLUDED = "migration.data.tables.included"; + public static final String MIGRATION_CLUSTER_ENABLED = "migration.cluster.enabled"; + public static final String MIGRATION_DATA_INCREMENTAL_ENABLED = "migration.data.incremental.enabled"; + public static final String MIGRATION_DATA_INCREMENTAL_TABLES = "migration.data.incremental.tables"; + public static final String MIGRATION_DATA_INCREMENTAL_TIMESTAMP = "migration.data.incremental.timestamp"; + public static final String MIGRATION_DATA_BULKCOPY_ENABLED = "migration.data.bulkcopy.enabled"; + public static final String MIGRATION_DATA_PIPE_TIMEOUT = "migration.data.pipe.timeout"; + public static final String MIGRATION_DATA_PIPE_CAPACITY = "migration.data.pipe.capacity"; + public static final String MIGRATION_STALLED_TIMEOUT = "migration.stalled.timeout"; + public static final String MIGRATION_DATA_REPORT_CONNECTIONSTRING = "migration.data.report.connectionstring"; + public static final String MIGRATION_DATATYPE_CHECK = "migration.datatype.check"; + public static final String MIGRATION_TABLESPREFIX = "MIGRATIONTOOLKIT_"; + + public static final String MDC_MIGRATIONID = "migrationID"; + public static final String MDC_PIPELINE = "pipeline"; + public static final String MDC_CLUSTERID = "clusterID"; + + public static final String DEPLOYMENTS_TABLE = "ydeployments"; + + + // Masking + public static final String MIGRATION_REPORT_MASKED_PROPERTIES = "migration.properties.masked"; + public static final String MASKED_VALUE = "***"; + + // Locale + public static final String MIGRATION_LOCALE_DEFAULT = "migration.locale.default"; + + // Incremental support + public static final String MIGRATION_DATA_INCREMENTAL_DELETIONS_ITEMTYPES = "migration.data.incremental.deletions.itemtypes"; + public static final String MIGRATION_DATA_INCREMENTAL_DELETIONS_TYPECODES = "migration.data.incremental.deletions.typecodes"; + public static final String MIGRATION_DATA_INCREMENTAL_DELETIONS_ITEMTYPES_ENABLED = "migration.data.incremental.deletions.itemtypes.enabled"; + public static final String MIGRATION_DATA_INCREMENTAL_DELETIONS_TYPECODES_ENABLED = "migration.data.incremental.deletions.typecodes.enabled"; + public static final String MIGRATION_DATA_DELETION_ENABLED = "migration.data.incremental.deletions.enabled"; + public static final String MIGRATION_DATA_DELETION_TABLE = "migration.data.incremental.deletions.table"; + + // ORACLE_TARGET -- START + public static final String MIGRATION_ORACLE_MAX = "VARCHAR2\\(2147483647\\)"; + public static final String MIGRATION_ORACLE_CLOB = "CLOB"; + public static final String MIGRATION_ORACLE_VARCHAR24k = "VARCHAR2(4000)"; + + // ORACLE_TARGET -- END + + private CommercedbsyncConstants() { + // empty to avoid instantiating this constant class + } + + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/CopyContext.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/CopyContext.java new file mode 100644 index 0000000..66f8cf8 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/CopyContext.java @@ -0,0 +1,133 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.context; + +import com.sap.cx.boosters.commercedbsync.performance.PerformanceProfiler; + +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.StringJoiner; +import java.util.TreeMap; + +/** + * Contains the Information needed to Copy Data + */ +public class CopyContext { + + private String migrationId; + private MigrationContext migrationContext; + private Set copyItems; + private PerformanceProfiler performanceProfiler; + + public CopyContext(String migrationId, MigrationContext migrationContext, Set copyItems, PerformanceProfiler performanceProfiler) { + this.migrationId = migrationId; + this.migrationContext = migrationContext; + this.copyItems = copyItems; + this.performanceProfiler = performanceProfiler; + } + + public IdCopyContext toIdCopyContext() { + return new IdCopyContext(migrationId, migrationContext, performanceProfiler); + } + + public MigrationContext getMigrationContext() { + return migrationContext; + } + + /** + * Media Items to be Copied + * + * @return + */ + public Set getCopyItems() { + return copyItems; + } + + public String getMigrationId() { + return migrationId; + } + + public PerformanceProfiler getPerformanceProfiler() { + return performanceProfiler; + } + + public static class DataCopyItem { + private final String sourceItem; + private final String targetItem; + private final Map columnMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + private final Long rowCount; + + public DataCopyItem(String sourceItem, String targetItem) { + this.sourceItem = sourceItem; + this.targetItem = targetItem; + this.rowCount = null; + } + + public DataCopyItem(String sourceItem, String targetItem, Map columnMap, Long rowCount) { + this.sourceItem = sourceItem; + this.targetItem = targetItem; + this.columnMap.clear(); + this.columnMap.putAll(columnMap); + this.rowCount = rowCount; + } + + public String getSourceItem() { + return sourceItem; + } + + public String getTargetItem() { + return targetItem; + } + + public String getPipelineName() { + return getSourceItem() + "->" + getTargetItem(); + } + + public Map getColumnMap() { + return columnMap; + } + + public Long getRowCount() { + return rowCount; + } + + @Override + public String toString() { + return new StringJoiner(", ", DataCopyItem.class.getSimpleName() + "[", "]") + .add("sourceItem='" + sourceItem + "'") + .add("targetItem='" + targetItem + "'") + .toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DataCopyItem that = (DataCopyItem) o; + return getSourceItem().equals(that.getSourceItem()) && + getTargetItem().equals(that.getTargetItem()); + } + + @Override + public int hashCode() { + return Objects.hash(getSourceItem(), getTargetItem()); + } + } + + public static class IdCopyContext extends CopyContext { + + public IdCopyContext(String migrationId, MigrationContext migrationContext, PerformanceProfiler performanceProfiler) { + super(migrationId, migrationContext, null, performanceProfiler); + } + + @Override + public Set getCopyItems() { + throw new UnsupportedOperationException("This is lean copy context without the actual copy items"); + } + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/IncrementalMigrationContext.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/IncrementalMigrationContext.java new file mode 100644 index 0000000..54808cc --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/IncrementalMigrationContext.java @@ -0,0 +1,34 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.context; + +import java.time.Instant; +import java.util.Set; + +/** + * The MigrationContext contains all information needed to perform a Source -> Target Migration + */ +public interface IncrementalMigrationContext extends MigrationContext { + + Instant getIncrementalMigrationTimestamp(); + + public void setSchemaMigrationAutoTriggerEnabled(final boolean autoTriggerEnabled); + + public void setTruncateEnabled(final boolean truncateEnabled); + + void setIncrementalMigrationTimestamp(final Instant timeStampInstant); + + Set setIncrementalTables(final Set incrementalTables); + + void setIncrementalModeEnabled(final boolean incrementalModeEnabled); + + void setIncludedTables(final Set includedTables); + + public void setDeletionEnabled(boolean deletionEnabled); + + public void setLpTableMigrationEnabled(boolean lpTableMigrationEnabled); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/MigrationContext.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/MigrationContext.java new file mode 100644 index 0000000..8381264 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/MigrationContext.java @@ -0,0 +1,95 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.context; + +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; + +import java.time.Instant; +import java.util.Map; +import java.util.Set; + +/** + * The MigrationContext contains all information needed to perform a Source -> Target Migration + */ +public interface MigrationContext { + DataRepository getDataSourceRepository(); + + DataRepository getDataTargetRepository(); + + boolean isMigrationTriggeredByUpdateProcess(); + + boolean isSchemaMigrationEnabled(); + + boolean isAddMissingTablesToSchemaEnabled(); + + boolean isRemoveMissingTablesToSchemaEnabled(); + + boolean isAddMissingColumnsToSchemaEnabled(); + + boolean isRemoveMissingColumnsToSchemaEnabled(); + + boolean isSchemaMigrationAutoTriggerEnabled(); + + int getReaderBatchSize(); + + boolean isTruncateEnabled(); + + boolean isAuditTableMigrationEnabled(); + + Set getTruncateExcludedTables(); + + int getMaxParallelReaderWorkers(); + + int getMaxParallelWriterWorkers(); + + int getMaxParallelTableCopy(); + + int getMaxWorkerRetryAttempts(); + + boolean isFailOnErrorEnabled(); + + Map> getExcludedColumns(); + + Map> getNullifyColumns(); + + Set getCustomTables(); + + Set getExcludedTables(); + + Set getIncludedTables(); + + boolean isDropAllIndexesEnabled(); + + boolean isDisableAllIndexesEnabled(); + + Set getDisableAllIndexesIncludedTables(); + + boolean isClusterMode(); + + boolean isIncrementalModeEnabled(); + + Set getIncrementalTables(); + + Instant getIncrementalTimestamp(); + + boolean isBulkCopyEnabled(); + + int getDataPipeTimeout(); + + int getDataPipeCapacity(); + + int getStalledTimeout(); + + String getMigrationReportConnectionString(); + + int getMaxTargetStagedMigrations(); + + boolean isDeletionEnabled(); + + boolean isLpTableMigrationEnabled(); + void refreshSelf(); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultIncrementalMigrationContext.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultIncrementalMigrationContext.java new file mode 100644 index 0000000..748a444 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultIncrementalMigrationContext.java @@ -0,0 +1,146 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.context.impl; + +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.configuration.Configuration; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import com.sap.cx.boosters.commercedbsync.context.IncrementalMigrationContext; +import com.sap.cx.boosters.commercedbsync.repository.impl.DataRepositoryFactory; + +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Collections; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + +public class DefaultIncrementalMigrationContext extends DefaultMigrationContext implements IncrementalMigrationContext { + + private static final Logger LOG = Logger.getLogger(DefaultIncrementalMigrationContext.class.getName()); + private Instant timestampInstant; + private Set incrementalTables; + private Set includedTables; + + + public DefaultIncrementalMigrationContext(DataSourceConfiguration sourceDataSourceConfiguration, DataSourceConfiguration targetDataSourceConfiguration, DataRepositoryFactory dataRepositoryFactory, Configuration configuration) throws Exception { + super(sourceDataSourceConfiguration, targetDataSourceConfiguration, dataRepositoryFactory, configuration); + } + + @Override + public Instant getIncrementalMigrationTimestamp() { + return timestampInstant; + } + + @Override + public void setSchemaMigrationAutoTriggerEnabled(boolean autoTriggerEnabled) { + configuration.setProperty(CommercedbsyncConstants.MIGRATION_SCHEMA_AUTOTRIGGER_ENABLED, + String.valueOf(autoTriggerEnabled)); + } + + @Override + public void setTruncateEnabled(boolean truncateEnabled) { + configuration.setProperty(CommercedbsyncConstants.MIGRATION_DATA_TRUNCATE_ENABLED, + String.valueOf(truncateEnabled)); + } + + @Override + public void setIncrementalMigrationTimestamp(Instant timeStampInstant) { + this.timestampInstant = timeStampInstant; + } + + @Override + public Set setIncrementalTables(Set incrementalTables) { + return this.incrementalTables = incrementalTables; + } + + + @Override + public Set getIncrementalTables() { + return CollectionUtils.isNotEmpty(this.incrementalTables) ? + this.incrementalTables : getListProperty(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_TABLES); + } + + @Override + public void setIncrementalModeEnabled(boolean incrementalModeEnabled) { + configuration.setProperty(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_ENABLED, + Boolean.toString(incrementalModeEnabled)); + } + + + @Override + public Instant getIncrementalTimestamp() { + if (null != getIncrementalMigrationTimestamp()) { + if (LOG.isDebugEnabled()) { + LOG.debug("Here getIncrementalTimestamp(): " + timestampInstant); + } + return getIncrementalMigrationTimestamp(); + } + String timeStamp = getStringProperty(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_TIMESTAMP); + if (StringUtils.isEmpty(timeStamp)) { + return null; + } + return ZonedDateTime.parse(timeStamp, DateTimeFormatter.ISO_ZONED_DATE_TIME).toInstant(); + } + + @Override + public Set getIncludedTables() { + if (isIncrementalModeEnabled()) { + return Collections.emptySet(); + } + return CollectionUtils.isNotEmpty(includedTables) ? includedTables : + getListProperty(CommercedbsyncConstants.MIGRATION_DATA_TABLES_INCLUDED); + } + + @Override + public void setIncludedTables(Set includedTables) { + this.includedTables = includedTables; + } + + @Override + public void setDeletionEnabled(boolean deletionEnabled) { + this.deletionEnabled = deletionEnabled; + } + + @Override + public void setLpTableMigrationEnabled(boolean lpTableMigrationEnabled) { + this.lpTableMigrationEnabled = lpTableMigrationEnabled; + } + + private Set getListProperty(final String key) { + final String tables = super.configuration.getString(key); + + if (StringUtils.isEmpty(tables)) { + return Collections.emptySet(); + } + + final Set result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + final String[] tablesArray = tables.split(","); + result.addAll(Arrays.stream(tablesArray).collect(Collectors.toSet())); + + return result; + } + // ORACLE_TARGET -- START + /* + * Fire this method only from HAC controller...not from the jobs. + */ + @Override + public void refreshSelf() + { + LOG.info("Refreshing Context"); + // lists + this.setIncludedTables(Collections.emptySet()); + this.setIncrementalTables(Collections.emptySet()); + this.setIncrementalMigrationTimestamp(null); + } + // ORACLE_TARGET -- END +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultMigrationContext.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultMigrationContext.java new file mode 100644 index 0000000..6c46062 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/impl/DefaultMigrationContext.java @@ -0,0 +1,306 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.context.impl; + + +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import org.apache.commons.configuration.Configuration; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.repository.impl.DataRepositoryFactory; + +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.stream.Collectors; + +public class DefaultMigrationContext implements MigrationContext { + private final DataRepository dataSourceRepository; + private final DataRepository dataTargetRepository; + protected boolean deletionEnabled; + protected boolean lpTableMigrationEnabled; + + protected final Configuration configuration; + + public DefaultMigrationContext(final DataSourceConfiguration sourceDataSourceConfiguration, + final DataSourceConfiguration targetDataSourceConfiguration, + final DataRepositoryFactory dataRepositoryFactory, + final Configuration configuration) throws Exception { + this.dataSourceRepository = dataRepositoryFactory.create(sourceDataSourceConfiguration); + this.dataTargetRepository = dataRepositoryFactory.create(targetDataSourceConfiguration); + this.configuration = configuration; + ensureDefaultLocale(configuration); + } + + private void ensureDefaultLocale(Configuration configuration) { + String localeProperty = configuration.getString(CommercedbsyncConstants.MIGRATION_LOCALE_DEFAULT); + Locale locale = Locale.forLanguageTag(localeProperty); + Locale.setDefault(locale); + } + + + @Override + public DataRepository getDataSourceRepository() { + return dataSourceRepository; + } + + @Override + public DataRepository getDataTargetRepository() { + return dataTargetRepository; + } + + @Override + public boolean isMigrationTriggeredByUpdateProcess() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_TRIGGER_UPDATESYSTEM); + } + + @Override + public boolean isSchemaMigrationEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_SCHEMA_ENABLED); + } + + @Override + public boolean isAddMissingTablesToSchemaEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_TABLES_ADD_ENABLED); + } + + @Override + public boolean isRemoveMissingTablesToSchemaEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_TABLES_REMOVE_ENABLED); + } + + @Override + public boolean isAddMissingColumnsToSchemaEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_COLUMNS_ADD_ENABLED); + } + + @Override + public boolean isRemoveMissingColumnsToSchemaEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_COLUMNS_REMOVE_ENABLED); + } + + @Override + public boolean isSchemaMigrationAutoTriggerEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_SCHEMA_AUTOTRIGGER_ENABLED); + } + + @Override + public int getReaderBatchSize() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_DATA_READER_BATCHSIZE); + } + + @Override + public boolean isTruncateEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_DATA_TRUNCATE_ENABLED); + } + + @Override + public boolean isAuditTableMigrationEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_DATA_TABLES_AUDIT_ENABLED); + } + + @Override + public Set getTruncateExcludedTables() { + return getListProperty(CommercedbsyncConstants.MIGRATION_DATA_TRUNCATE_EXCLUDED); + } + + @Override + public int getMaxParallelReaderWorkers() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_DATA_WORKERS_READER_MAXTASKS); + } + + @Override + public int getMaxParallelWriterWorkers() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_DATA_WORKERS_WRITER_MAXTASKS); + } + + @Override + public int getMaxWorkerRetryAttempts() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_DATA_WORKERS_RETRYATTEMPTS); + } + + + @Override + public int getMaxParallelTableCopy() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_DATA_MAXPRALLELTABLECOPY); + } + + @Override + public boolean isFailOnErrorEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_DATA_FAILONEERROR_ENABLED); + } + + @Override + public Map> getExcludedColumns() { + return getDynamicPropertyKeys(CommercedbsyncConstants.MIGRATION_DATA_COLUMNS_EXCLUDED); + } + + public Map> getNullifyColumns() { + return getDynamicPropertyKeys(CommercedbsyncConstants.MIGRATION_DATA_COLUMNS_NULLIFY); + } + + @Override + public Set getCustomTables() { + return getListProperty(CommercedbsyncConstants.MIGRATION_DATA_TABLES_CUSTOM); + } + + @Override + public Set getExcludedTables() { + return getListProperty(CommercedbsyncConstants.MIGRATION_DATA_TABLES_EXCLUDED); + } + + @Override + public Set getIncludedTables() { + return getListProperty(CommercedbsyncConstants.MIGRATION_DATA_TABLES_INCLUDED); + } + + @Override + public boolean isDropAllIndexesEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_DATA_INDICES_DROP_ENABLED); + } + + @Override + public boolean isDisableAllIndexesEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_DATA_INDICES_DISABLE_ENABLED); + } + + @Override + public Set getDisableAllIndexesIncludedTables() { + return getListProperty(CommercedbsyncConstants.MIGRATION_DATA_INDICES_DISABLE_INCLUDED); + } + + + @Override + public boolean isClusterMode() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_CLUSTER_ENABLED); + } + + @Override + public boolean isIncrementalModeEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_ENABLED); + } + + @Override + public Set getIncrementalTables() { + return getListProperty(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_TABLES); + } + + @Override + public Instant getIncrementalTimestamp() { + String timeStamp = getStringProperty(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_TIMESTAMP); + if (StringUtils.isEmpty(timeStamp)) { + return null; + } + return ZonedDateTime.parse(timeStamp, DateTimeFormatter.ISO_ZONED_DATE_TIME).toInstant(); + } + + @Override + public boolean isBulkCopyEnabled() { + return getBooleanProperty(CommercedbsyncConstants.MIGRATION_DATA_BULKCOPY_ENABLED); + } + + @Override + public int getDataPipeTimeout() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_DATA_PIPE_TIMEOUT); + } + + @Override + public int getDataPipeCapacity() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_DATA_PIPE_CAPACITY); + } + + @Override + public String getMigrationReportConnectionString() { + return getStringProperty(CommercedbsyncConstants.MIGRATION_DATA_REPORT_CONNECTIONSTRING); + } + + @Override + public int getMaxTargetStagedMigrations() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_TARGET_MAX_STAGE_MIGRATIONS); + } + + @Override + public boolean isDeletionEnabled() { + return this.deletionEnabled; + } + + @Override + public boolean isLpTableMigrationEnabled() { + return this.lpTableMigrationEnabled; + } + + @Override + public void refreshSelf() { + + } + + @Override + public int getStalledTimeout() { + return getNumericProperty(CommercedbsyncConstants.MIGRATION_STALLED_TIMEOUT); + } + + protected boolean getBooleanProperty(final String key) { + return configuration.getBoolean(key); + } + + protected int getNumericProperty(final String key) { + return configuration.getInt(key); + } + + protected String getStringProperty(final String key) { + return configuration.getString(key); + } + + private Set getListProperty(final String key) { + final String tables = configuration.getString(key); + + if (StringUtils.isEmpty(tables)) { + return Collections.emptySet(); + } + + final Set result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + final String[] tablesArray = tables.split(","); + result.addAll(Arrays.stream(tablesArray).collect(Collectors.toSet())); + + return result; + } + + private Map> getDynamicPropertyKeys(final String key) { + final Map> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + final Configuration subset = configuration.subset(key); + final Iterator keys = subset.getKeys(); + while (keys.hasNext()) { + final String current = keys.next(); + map.put(current, getListProperty(key + "." + current)); + } + return map; + } + + private Map getDynamicPropertyKeysValue(final String key) { + final Map map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + final Configuration subset = configuration.subset(key); + final Iterator keys = subset.getKeys(); + + while (keys.hasNext()) { + final String current = keys.next(); + final String params = configuration.getString(key + "." + current); + final String[] paramsArray = params.split(","); + map.put(current, paramsArray); + } + return map; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/MigrationContextValidator.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/MigrationContextValidator.java new file mode 100644 index 0000000..474e64c --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/MigrationContextValidator.java @@ -0,0 +1,15 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.context.validation; + +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +public interface MigrationContextValidator { + + void validateContext(MigrationContext context); + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/impl/DefaultMigrationContextValidator.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/impl/DefaultMigrationContextValidator.java new file mode 100644 index 0000000..d52c71d --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/context/validation/impl/DefaultMigrationContextValidator.java @@ -0,0 +1,52 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.context.validation.impl; + +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.context.validation.MigrationContextValidator; +import de.hybris.platform.servicelayer.config.ConfigurationService; +import org.apache.commons.lang.StringUtils; + +import java.util.Locale; + +public class DefaultMigrationContextValidator implements MigrationContextValidator { + + private static final String DB_URL_PROPERTY_KEY = "migration.ds.target.db.url"; + private static final String DISABLE_UNLOCKING = "system.unlocking.disabled"; + private ConfigurationService configurationService; + + @Override + public void validateContext(final MigrationContext context) { + // Canonically the target should always be the CCV2 DB and we have to verify nobody is trying to copy *from* that + final String sourceDbUrl = context.getDataSourceRepository().getDataSourceConfiguration().getConnectionString(); + final String ccv2ManagedDB = getConfigurationService().getConfiguration().getString(DB_URL_PROPERTY_KEY); + final boolean isSystemLocked = getConfigurationService().getConfiguration().getBoolean(DISABLE_UNLOCKING); + + if (sourceDbUrl.equals(ccv2ManagedDB)) { + throw new RuntimeException("Invalid data source configuration - cannot use the CCV2-managed database as the source."); + } + + if (isSystemLocked) { + throw new RuntimeException("You cannot run the migration on locked system. Check property " + DISABLE_UNLOCKING); + } + + //we check this for locale related comparison + Locale defaultLocale = Locale.getDefault(); + if (defaultLocale == null || StringUtils.isEmpty(defaultLocale.toString())) { + throw new RuntimeException("There is no default locale specified on the running server. Set the default locale and try again."); + } + } + + public ConfigurationService getConfigurationService() { + return configurationService; + } + + public void setConfigurationService(ConfigurationService configurationService) { + this.configurationService = configurationService; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/FullMigrationCronJob.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/FullMigrationCronJob.java new file mode 100644 index 0000000..a525ff2 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/FullMigrationCronJob.java @@ -0,0 +1,32 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.cron; + +import de.hybris.platform.jalo.Item; +import de.hybris.platform.jalo.JaloBusinessException; +import de.hybris.platform.jalo.SessionContext; +import de.hybris.platform.jalo.type.ComposedType; +import org.apache.log4j.Logger; +import com.sap.cx.boosters.commercedbsync.cron.GeneratedFullMigrationCronJob; + +public class FullMigrationCronJob extends GeneratedFullMigrationCronJob +{ + @SuppressWarnings("unused") + private static final Logger LOG = Logger.getLogger( FullMigrationCronJob.class.getName() ); + + @Override + protected Item createItem(final SessionContext ctx, final ComposedType type, final Item.ItemAttributeMap allAttributes) throws JaloBusinessException + { + // business code placed here will be executed before the item is created + // then create the item + final Item item = super.createItem( ctx, type, allAttributes ); + // business code placed here will be executed after the item was created + // and return the item + return item; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/IncrementalMigrationCronJob.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/IncrementalMigrationCronJob.java new file mode 100644 index 0000000..96e3094 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/IncrementalMigrationCronJob.java @@ -0,0 +1,32 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.cron; + +import de.hybris.platform.jalo.Item; +import de.hybris.platform.jalo.JaloBusinessException; +import de.hybris.platform.jalo.SessionContext; +import de.hybris.platform.jalo.type.ComposedType; +import org.apache.log4j.Logger; +import com.sap.cx.boosters.commercedbsync.cron.GeneratedIncrementalMigrationCronJob; + +public class IncrementalMigrationCronJob extends GeneratedIncrementalMigrationCronJob +{ + @SuppressWarnings("unused") + private static final Logger LOG = Logger.getLogger( IncrementalMigrationCronJob.class.getName() ); + + @Override + protected Item createItem(final SessionContext ctx, final ComposedType type, final ItemAttributeMap allAttributes) throws JaloBusinessException + { + // business code placed here will be executed before the item is created + // then create the item + final Item item = super.createItem( ctx, type, allAttributes ); + // business code placed here will be executed after the item was created + // and return the item + return item; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/MigrationCronJob.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/MigrationCronJob.java new file mode 100644 index 0000000..35e7814 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/cron/MigrationCronJob.java @@ -0,0 +1,32 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.cron; + +import de.hybris.platform.jalo.Item; +import de.hybris.platform.jalo.JaloBusinessException; +import de.hybris.platform.jalo.SessionContext; +import de.hybris.platform.jalo.type.ComposedType; +import org.apache.log4j.Logger; +import com.sap.cx.boosters.commercedbsync.cron.GeneratedMigrationCronJob; + +public class MigrationCronJob extends GeneratedMigrationCronJob +{ + @SuppressWarnings("unused") + private static final Logger LOG = Logger.getLogger( MigrationCronJob.class.getName() ); + + @Override + protected Item createItem(final SessionContext ctx, final ComposedType type, final ItemAttributeMap allAttributes) throws JaloBusinessException + { + // business code placed here will be executed before the item is created + // then create the item + final Item item = super.createItem( ctx, type, allAttributes ); + // business code placed here will be executed after the item was created + // and return the item + return item; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataColumn.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataColumn.java new file mode 100644 index 0000000..9c7a165 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataColumn.java @@ -0,0 +1,19 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.dataset; + +public interface DataColumn { + + String getColumnName(); + + int getColumnType(); + + int getPrecision(); + + int getScale(); + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataSet.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataSet.java new file mode 100644 index 0000000..829be66 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/DataSet.java @@ -0,0 +1,32 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.dataset; + +import com.microsoft.sqlserver.jdbc.ISQLServerBulkData; +import com.sap.cx.boosters.commercedbsync.dataset.impl.DefaultDataSet; + +import java.util.Collections; +import java.util.List; + +public interface DataSet { + + DataSet EMPTY = new DefaultDataSet(0, Collections.EMPTY_LIST, Collections.EMPTY_LIST); + + int getColumnCount(); + + List> getAllResults(); + + Object getColumnValue(String column, List row); + + Object getColumnValueForPostGres(String columnName, List row, DataColumn sourceColumnType, int targetColumnType); + + boolean isNotEmpty(); + + boolean hasColumn(String column); + + ISQLServerBulkData toSQLServerBulkData(); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/BulkDataSet.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/BulkDataSet.java new file mode 100644 index 0000000..d91d1f8 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/BulkDataSet.java @@ -0,0 +1,77 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.dataset.impl; + +import com.microsoft.sqlserver.jdbc.ISQLServerBulkData; +import org.apache.logging.log4j.util.Strings; +import com.sap.cx.boosters.commercedbsync.dataset.DataColumn; + +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class BulkDataSet extends DefaultDataSet implements ISQLServerBulkData { + + private final Map typeMap = new HashMap<>(); + private int pointer = -1; + private Set columnOrdinals; + + public BulkDataSet(int columnCount, List columnOrder, List> result) { + super(columnCount, columnOrder, result); + this.columnOrdinals = IntStream.range(1, columnOrder.size() + 1).boxed().collect(Collectors.toSet()); + this.typeMap.put(Types.BLOB, new DefaultDataColumn(Strings.EMPTY, Types.LONGVARBINARY, 0x7FFFFFFF, 0)); + } + + @Override + public Set getColumnOrdinals() { + return columnOrdinals; + } + + @Override + public String getColumnName(int i) { + return getColumnOrder().get(i - 1).getColumnName(); + } + + @Override + public int getColumnType(int i) { + return mapColumn(getColumnOrder().get(i - 1)).getColumnType(); + } + + @Override + public int getPrecision(int i) { + return mapColumn(getColumnOrder().get(i - 1)).getPrecision(); + } + + @Override + public int getScale(int i) { + return mapColumn(getColumnOrder().get(i - 1)).getScale(); + } + + @Override + public Object[] getRowData() throws SQLException { + return getAllResults().get(pointer).toArray(); + } + + @Override + public boolean next() throws SQLException { + pointer++; + return getAllResults().size() > pointer; + } + + private DataColumn mapColumn(DataColumn column) { + if (typeMap.containsKey(column.getColumnType())) { + return typeMap.get(column.getColumnType()); + } + return column; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataColumn.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataColumn.java new file mode 100644 index 0000000..0b05bc0 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataColumn.java @@ -0,0 +1,44 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.dataset.impl; + +import com.sap.cx.boosters.commercedbsync.dataset.DataColumn; + +public class DefaultDataColumn implements DataColumn { + + private final String name; + private final int type; + private final int precision; + private final int scale; + + public DefaultDataColumn(String name, int type, int precision, int scale) { + this.name = name; + this.type = type; + this.precision = precision; + this.scale = scale; + } + + @Override + public String getColumnName() { + return name; + } + + @Override + public int getColumnType() { + return type; + } + + @Override + public int getPrecision() { + return precision; + } + + @Override + public int getScale() { + return scale; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataSet.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataSet.java new file mode 100644 index 0000000..1d044f5 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/dataset/impl/DefaultDataSet.java @@ -0,0 +1,131 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.dataset.impl; + +import com.github.freva.asciitable.AsciiTable; +import com.microsoft.sqlserver.jdbc.ISQLServerBulkData; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import com.sap.cx.boosters.commercedbsync.dataset.DataColumn; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; + +import javax.annotation.concurrent.Immutable; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +@Immutable +public class DefaultDataSet implements DataSet { + + private final int columnCount; + private final List columnOrder; + private final List> result; + + public DefaultDataSet(int columnCount, List columnOrder, List> result) { + this.columnCount = columnCount; + // TODO REVIEW Downgraded from Java8 to Java11 + this.columnOrder = Collections.unmodifiableList(columnOrder); + this.result = Collections.unmodifiableList(result.stream().map(Collections::unmodifiableList).collect(Collectors.toList())); + } + + @Override + public int getColumnCount() { + return columnCount; + } + + @Override + public List> getAllResults() { + return result; + } + + @Override + public Object getColumnValue(String columnName, List row) { + if (columnName == null || !hasColumn(columnName)) { + throw new IllegalArgumentException(String.format("Column %s is not part of the result", columnName)); + } + int idx = IntStream.range(0, columnOrder.size()).filter(i -> columnName.equalsIgnoreCase(columnOrder.get(i).getColumnName())).findFirst().getAsInt(); + return row.get(idx); + } + + @Override + public Object getColumnValueForPostGres(String columnName, List row, DataColumn sourceColumnType, int targetColumnType) { + if (columnName == null || !hasColumn(columnName)) { + throw new IllegalArgumentException(String.format("Column %s is not part of the result", columnName)); + } + int idx = IntStream.range(0, columnOrder.size()).filter(i -> columnName.equalsIgnoreCase(columnOrder.get(i).getColumnName())).findFirst().getAsInt(); + Object columnValue = row.get(idx); + if(ObjectUtils.isNotEmpty(columnValue)){ + switch (sourceColumnType.getColumnType()) { + case 1: + if (sourceColumnType.getPrecision() == 4 && targetColumnType == 5) { + if (columnValue instanceof String && ((String) columnValue).trim().length() == 1) { + columnValue = (int) (((String) columnValue).trim().charAt(0)); + } + } + break; + default: + break; + + } + } + return columnValue; + } + + public Object getColumnValueForHANA(String columnName, List row, DataColumn sourceColumnType, int targetColumnType) { + if (columnName == null || !hasColumn(columnName)) { + throw new IllegalArgumentException(String.format("Column %s is not part of the result", columnName)); + } + int idx = IntStream.range(0, columnOrder.size()).filter(i -> columnName.equalsIgnoreCase(columnOrder.get(i).getColumnName())).findFirst().getAsInt(); + Object columnValue = row.get(idx); + if(ObjectUtils.isNotEmpty(columnValue)){ + switch (sourceColumnType.getColumnType()) { + case 1: + if (sourceColumnType.getPrecision() == 4 && targetColumnType == 5) { + if (columnValue instanceof String && ((String) columnValue).trim().length() == 1) { + columnValue = (int) (((String) columnValue).trim().charAt(0)); + } + } + break; + + default: + break; + } + } + return columnValue; + } + + @Override + public boolean isNotEmpty() { + return getAllResults() != null && getAllResults().size() > 0; + } + + @Override + public boolean hasColumn(String column) { + if (StringUtils.isEmpty(column)) { + return false; + } + return columnOrder.stream().map(DataColumn::getColumnName).anyMatch(column::equalsIgnoreCase); + } + + public String toString() { + String[] headers = columnOrder.stream().map(DataColumn::getColumnName).toArray(String[]::new); + String[][] data = getAllResults().stream() + .map(l -> l.stream().map(v -> String.valueOf(v)).toArray(String[]::new)) + .toArray(String[][]::new); + return AsciiTable.getTable(headers, data); + } + + public List getColumnOrder() { + return columnOrder; + } + + @Override + public ISQLServerBulkData toSQLServerBulkData() { + return new BulkDataSet(columnCount, columnOrder, result); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/MigrationDataSourceFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/MigrationDataSourceFactory.java new file mode 100644 index 0000000..62fb732 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/MigrationDataSourceFactory.java @@ -0,0 +1,18 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.datasource; + +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; + +import javax.sql.DataSource; + +/** + * Factory to create the DataSources used for Migration + */ +public interface MigrationDataSourceFactory { + DataSource create(DataSourceConfiguration dataSourceConfiguration); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/AbstractMigrationDataSourceFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/AbstractMigrationDataSourceFactory.java new file mode 100644 index 0000000..6d8da5f --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/AbstractMigrationDataSourceFactory.java @@ -0,0 +1,16 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.datasource.impl; + +import com.sap.cx.boosters.commercedbsync.datasource.MigrationDataSourceFactory; + +/** + * + */ +public abstract class AbstractMigrationDataSourceFactory implements MigrationDataSourceFactory { + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/DefaultMigrationDataSourceFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/DefaultMigrationDataSourceFactory.java new file mode 100644 index 0000000..1e7f4a7 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/datasource/impl/DefaultMigrationDataSourceFactory.java @@ -0,0 +1,31 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.datasource.impl; + +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import javax.sql.DataSource; + +public class DefaultMigrationDataSourceFactory extends AbstractMigrationDataSourceFactory { + + //TODO: resource leak: DataSources are never closed + @Override + public DataSource create(DataSourceConfiguration dataSourceConfiguration) { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl(dataSourceConfiguration.getConnectionString()); + config.setDriverClassName(dataSourceConfiguration.getDriver()); + config.setUsername(dataSourceConfiguration.getUserName()); + config.setPassword(dataSourceConfiguration.getPassword()); + config.setMaximumPoolSize(dataSourceConfiguration.getMaxActive()); + config.setMinimumIdle(dataSourceConfiguration.getMinIdle()); + config.setRegisterMbeans(true); + return new HikariDataSource(config); + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyCompleteEvent.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyCompleteEvent.java new file mode 100644 index 0000000..fc26fe8 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyCompleteEvent.java @@ -0,0 +1,23 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.events; + +/** + * * ClusterAwareEvent to signal completion of the assigned copy ta + */ +public class CopyCompleteEvent extends CopyEvent { + + private Boolean copyResult = false; + + public CopyCompleteEvent(final Integer sourceNodeId, final String migrationId) { + super(sourceNodeId, migrationId); + } + + public Boolean getCopyResult() { + return copyResult; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyDatabaseTableEvent.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyDatabaseTableEvent.java new file mode 100644 index 0000000..b336fb4 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyDatabaseTableEvent.java @@ -0,0 +1,15 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.events; + +/** + * Cluster Event to notify a Cluster to start the copy process + */ +public class CopyDatabaseTableEvent extends CopyEvent { + public CopyDatabaseTableEvent(final Integer sourceNodeId, final String migrationId) { + super(sourceNodeId, migrationId); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyEvent.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyEvent.java new file mode 100644 index 0000000..7408e16 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/CopyEvent.java @@ -0,0 +1,48 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.events; + +import de.hybris.platform.servicelayer.event.ClusterAwareEvent; +import de.hybris.platform.servicelayer.event.PublishEventContext; +import de.hybris.platform.servicelayer.event.events.AbstractEvent; + + +/** + * ClusterAwareEvent to notify other Nodes to start the migration + */ +public abstract class CopyEvent extends AbstractEvent implements ClusterAwareEvent { + + private final int sourceNodeId; + + private final String migrationId; + + public CopyEvent(final int sourceNodeId, final String migrationId) { + super(); + this.sourceNodeId = sourceNodeId; + this.migrationId = migrationId; + } + + @Override + public boolean canPublish(PublishEventContext publishEventContext) { + return true; + } + + /** + * @return the masterNodeId + */ + public int getSourceNodeId() { + return sourceNodeId; + } + + + /** + * @return the migrationId + */ + public String getMigrationId() { + return migrationId; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyCompleteEventListener.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyCompleteEventListener.java new file mode 100644 index 0000000..766b064 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyCompleteEventListener.java @@ -0,0 +1,112 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.events.handlers; + +import com.sap.cx.boosters.commercedbsync.events.CopyCompleteEvent; +import de.hybris.platform.servicelayer.event.impl.AbstractEventListener; +import de.hybris.platform.tx.Transaction; +import de.hybris.platform.tx.TransactionBody; +import com.sap.cx.boosters.commercedbsync.MigrationProgress; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceProfiler; +import com.sap.cx.boosters.commercedbsync.processors.MigrationPostProcessor; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashSet; + +/** + * Receives an Event when a node has completed Copying Data Tasks + */ +public class CopyCompleteEventListener extends AbstractEventListener { + private static final Logger LOG = LoggerFactory.getLogger(CopyCompleteEventListener.class.getName()); + + private MigrationContext migrationContext; + + private DatabaseCopyTaskRepository databaseCopyTaskRepository; + + private PerformanceProfiler performanceProfiler; + + private ArrayList postProcessors; + + @Override + protected void onEvent(final CopyCompleteEvent event) { + final String migrationId = event.getMigrationId(); + + LOG.info("Migration finished on Node " + event.getSourceNodeId() + " with result " + event.getCopyResult()); + final CopyContext copyContext = new CopyContext(migrationId, migrationContext, new HashSet<>(), + performanceProfiler); + + executePostProcessors(copyContext); + } + + /** + * Runs through all the Post Processors in a transaction to avoid multiple executions + * + * @param copyContext + */ + private void executePostProcessors(final CopyContext copyContext) { + try { + Transaction.current().execute(new TransactionBody() { + @Override + public Object execute() throws Exception { + + final MigrationStatus status = databaseCopyTaskRepository.getMigrationStatus(copyContext); + + // ORACLE_TARGET -- START + if (status.isFailed()) { + // return null; + LOG.error("Status FAILED"); + } + // ORACLE_TARGET -- END + + LOG.debug("Starting PostProcessor execution"); + + // ORACLE_TARGET -- START + if ((status.getStatus() == MigrationProgress.PROCESSED) + || (status.getStatus() == MigrationProgress.ABORTED)) { + postProcessors.forEach(p -> p.process(copyContext)); + } + // ORACLE_TARGET -- END + LOG.debug("Finishing PostProcessor execution"); + + databaseCopyTaskRepository.setMigrationStatus(copyContext, MigrationProgress.PROCESSED, + MigrationProgress.COMPLETED); + return null; + } + }); + } catch (final Exception e) { + if (e instanceof RuntimeException) { + LOG.error("Error during PostProcessor execution", e); + throw (RuntimeException) e; + } else { + LOG.error("Error during PostProcessor execution", e); + throw new RuntimeException(e); + } + } + } + + public void setDatabaseCopyTaskRepository(final DatabaseCopyTaskRepository databaseCopyTaskRepository) { + this.databaseCopyTaskRepository = databaseCopyTaskRepository; + } + + public void setMigrationContext(final MigrationContext migrationContext) { + this.migrationContext = migrationContext; + } + + public void setPerformanceProfiler(final PerformanceProfiler performanceProfiler) { + this.performanceProfiler = performanceProfiler; + } + + public void setPostProcessors(final ArrayList postProcessors) { + this.postProcessors = postProcessors; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyDatabaseTableEventListener.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyDatabaseTableEventListener.java new file mode 100644 index 0000000..e7372df --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/events/handlers/CopyDatabaseTableEventListener.java @@ -0,0 +1,88 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.events.handlers; + +import com.sap.cx.boosters.commercedbsync.events.CopyDatabaseTableEvent; +import de.hybris.platform.servicelayer.cluster.ClusterService; +import de.hybris.platform.servicelayer.event.impl.AbstractEventListener; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceProfiler; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTask; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationCopyService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants.MDC_CLUSTERID; +import static com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants.MDC_MIGRATIONID; + +/** + * Listener that starts the Migration Process on a given node + */ +public class CopyDatabaseTableEventListener extends AbstractEventListener { + private static final Logger LOG = LoggerFactory.getLogger(CopyDatabaseTableEventListener.class.getName()); + + private DatabaseMigrationCopyService databaseMigrationCopyService; + + private DatabaseCopyTaskRepository databaseCopyTaskRepository; + + private MigrationContext migrationContext; + + private PerformanceProfiler performanceProfiler; + + private ClusterService clusterService; + + + @Override + protected void onEvent(final CopyDatabaseTableEvent event) { + final String migrationId = event.getMigrationId(); + + LOG.debug("Starting Migration with Id {}", migrationId); + try (MDC.MDCCloseable ignored = MDC.putCloseable(MDC_MIGRATIONID, migrationId); + MDC.MDCCloseable ignored2 = MDC.putCloseable(MDC_CLUSTERID, String.valueOf(clusterService.getClusterId())) + ) { + CopyContext copyContext = new CopyContext(migrationId, migrationContext, new HashSet<>(), performanceProfiler); + Set copyTableTasks = databaseCopyTaskRepository.findPendingTasks(copyContext); + Set items = copyTableTasks.stream().map(task -> new CopyContext.DataCopyItem(task.getSourcetablename(), task.getTargettablename(), task.getColumnmap(), task.getSourcerowcount())).collect(Collectors.toSet()); + copyContext.getCopyItems().addAll(items); + databaseMigrationCopyService.copyAllAsync(copyContext); + + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + public void setDatabaseMigrationCopyService(final DatabaseMigrationCopyService databaseMigrationCopyService) { + this.databaseMigrationCopyService = databaseMigrationCopyService; + } + + public void setDatabaseCopyTaskRepository(final DatabaseCopyTaskRepository databaseCopyTaskRepository) { + this.databaseCopyTaskRepository = databaseCopyTaskRepository; + } + + public void setMigrationContext(final MigrationContext migrationContext) { + this.migrationContext = migrationContext; + } + + public void setPerformanceProfiler(final PerformanceProfiler performanceProfiler) { + this.performanceProfiler = performanceProfiler; + } + + @Override + public void setClusterService(ClusterService clusterService) { + super.setClusterService(clusterService); + this.clusterService = clusterService; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/DataCopyTableFilter.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/DataCopyTableFilter.java new file mode 100644 index 0000000..6457cff --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/DataCopyTableFilter.java @@ -0,0 +1,15 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.filter; + +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +import java.util.function.Predicate; + +public interface DataCopyTableFilter { + Predicate filter(MigrationContext context); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/CompositeDataCopyTableFilter.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/CompositeDataCopyTableFilter.java new file mode 100644 index 0000000..0a883c6 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/CompositeDataCopyTableFilter.java @@ -0,0 +1,27 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.filter.impl; + +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.filter.DataCopyTableFilter; + +import java.util.List; +import java.util.function.Predicate; + +public class CompositeDataCopyTableFilter implements DataCopyTableFilter { + + private List filters; + + @Override + public Predicate filter(MigrationContext context) { + return p -> filters.stream().allMatch(f -> f.filter(context).test(p)); + } + + public void setFilters(List filters) { + this.filters = filters; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/ExclusionDataCopyTableFilter.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/ExclusionDataCopyTableFilter.java new file mode 100644 index 0000000..9d8062e --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/ExclusionDataCopyTableFilter.java @@ -0,0 +1,27 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.filter.impl; + +import com.google.common.base.Predicates; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.filter.DataCopyTableFilter; +import org.apache.commons.lang.StringUtils; + +import java.util.Set; +import java.util.function.Predicate; + +public class ExclusionDataCopyTableFilter implements DataCopyTableFilter { + + @Override + public Predicate filter(MigrationContext context) { + Set excludedTables = context.getExcludedTables(); + if (excludedTables == null || excludedTables.isEmpty()) { + return Predicates.alwaysTrue(); + } + return p -> excludedTables.stream().noneMatch(e -> StringUtils.equalsIgnoreCase(e, p)); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/InclusionDataCopyTableFilter.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/InclusionDataCopyTableFilter.java new file mode 100644 index 0000000..4a3d02d --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/InclusionDataCopyTableFilter.java @@ -0,0 +1,28 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.filter.impl; + +import com.google.common.base.Predicates; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.filter.DataCopyTableFilter; +import org.apache.commons.lang.StringUtils; + +import java.util.Set; +import java.util.function.Predicate; + +public class InclusionDataCopyTableFilter implements DataCopyTableFilter { + + @Override + public Predicate filter(MigrationContext context) { + Set includedTables = context.getIncludedTables(); + if (includedTables == null || includedTables.isEmpty()) { + return Predicates.alwaysTrue(); + } + return p -> includedTables.stream().anyMatch(e -> StringUtils.equalsIgnoreCase(e, p)); + + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/IncrementalDataCopyTableFilter.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/IncrementalDataCopyTableFilter.java new file mode 100644 index 0000000..cf6ff4b --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/filter/impl/IncrementalDataCopyTableFilter.java @@ -0,0 +1,31 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.filter.impl; + +import com.google.common.base.Predicates; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.filter.DataCopyTableFilter; +import org.apache.commons.lang.StringUtils; + +import java.util.Set; +import java.util.function.Predicate; + +public class IncrementalDataCopyTableFilter implements DataCopyTableFilter { + + @Override + public Predicate filter(MigrationContext context) { + if (!context.isIncrementalModeEnabled()) { + return Predicates.alwaysTrue(); + } + Set incrementalTables = context.getIncrementalTables(); + if (incrementalTables == null || incrementalTables.isEmpty()) { + throw new IllegalStateException("At least one table for incremental copy must be specified. Check property " + CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_TABLES); + } + return p -> incrementalTables.stream().anyMatch(e -> StringUtils.equalsIgnoreCase(e, p)); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/interceptors/DefaultCMTRemoveInterceptor.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/interceptors/DefaultCMTRemoveInterceptor.java new file mode 100644 index 0000000..bc80218 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/interceptors/DefaultCMTRemoveInterceptor.java @@ -0,0 +1,117 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.interceptors; + +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import de.hybris.platform.core.model.ItemModel; +import de.hybris.platform.servicelayer.exceptions.ModelSavingException; +import de.hybris.platform.servicelayer.interceptor.InterceptorContext; +import de.hybris.platform.servicelayer.interceptor.RemoveInterceptor; +import de.hybris.platform.servicelayer.model.ModelService; +import de.hybris.platform.servicelayer.type.TypeService; +import de.hybris.platform.util.Config; +import java.util.Collections; +import java.util.List; +import javax.annotation.Nonnull; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.enums.ItemChangeType; +import com.sap.cx.boosters.commercedbsync.model.ItemDeletionMarkerModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DefaultCMTRemoveInterceptor implements RemoveInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultCMTRemoveInterceptor.class); + + private static final boolean deletionsEnabled = Config.getBoolean(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_ITEMTYPES_ENABLED,false); + + private static final String COMMA_SEPERATOR = ","; + + private ModelService modelService; + private TypeService typeService; + + @Override + public void onRemove(@Nonnull final ItemModel model, @Nonnull final InterceptorContext ctx) { + + if (!deletionsEnabled ) { + if (LOG.isDebugEnabled()) { + LOG.debug("CMT deletions is not enabled for ItemModel."); + } + return; + } + + List deletionsItemType = getListDeletionsItemType(); + + if ( deletionsItemType == null || deletionsItemType.isEmpty()) { + if (LOG.isDebugEnabled()) { + LOG.debug("No table defined to create a deletion record for CMT "); + } + return; + } + + if (deletionsItemType.contains(model.getItemtype().toLowerCase())) { + + ItemDeletionMarkerModel idm = null; + try { + if(LOG.isDebugEnabled()){ + LOG.info("inside remove DefaultCMTRemoveInterceptor for" + String + .valueOf(typeService.getComposedTypeForCode(model.getItemtype()).getTable())); + } + + idm = modelService.create(ItemDeletionMarkerModel.class); + fillInitialDeletionMarker(idm, model.getPk().getLong(), + typeService.getComposedTypeForCode(model.getItemtype()).getTable()); + modelService.save(idm); + + } catch (ModelSavingException ex) { + LOG.error("Exception during save for CMT table {} , PK : {} ", model.getItemtype(), + model.getPk()); + } + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Table {} not defined for CMT deletion record", model.getItemtype()); + } + } + } + + private void fillInitialDeletionMarker(final ItemDeletionMarkerModel marker, final Long itemPK, + final String table) { + Preconditions.checkNotNull(marker, "ItemDeletionMarker cannot be null in this place"); + Preconditions + .checkArgument(marker.getItemModelContext().isNew(), "ItemDeletionMarker must be new"); + + marker.setItemPK(itemPK); + marker.setTable(table); + marker.setChangeType(ItemChangeType.DELETED); + } + + private List getListDeletionsItemType() { + // TO DO change to static variable + final String itemTypes = Config.getString( + CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_ITEMTYPES, ""); + if (StringUtils.isEmpty(itemTypes)) { + return Collections.emptyList(); + } + List result = Splitter.on(COMMA_SEPERATOR) + .omitEmptyStrings() + .trimResults() + .splitToList(itemTypes.toLowerCase()); + + return result; + } + + public void setModelService(final ModelService modelService) { + this.modelService = modelService; + } + + public void setTypeService(final TypeService typeService) { + this.typeService = typeService; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jalo/ItemDeletionMarker.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jalo/ItemDeletionMarker.java new file mode 100644 index 0000000..34243c3 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jalo/ItemDeletionMarker.java @@ -0,0 +1,32 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.jalo; + +import de.hybris.platform.jalo.Item; +import de.hybris.platform.jalo.JaloBusinessException; +import de.hybris.platform.jalo.SessionContext; +import de.hybris.platform.jalo.type.ComposedType; +import org.apache.log4j.Logger; +import com.sap.cx.boosters.commercedbsync.jalo.GeneratedItemDeletionMarker; + +public class ItemDeletionMarker extends GeneratedItemDeletionMarker +{ + @SuppressWarnings("unused") + private static final Logger LOG = Logger.getLogger( ItemDeletionMarker.class.getName() ); + + @Override + protected Item createItem(final SessionContext ctx, final ComposedType type, final ItemAttributeMap allAttributes) throws JaloBusinessException + { + // business code placed here will be executed before the item is created + // then create the item + final Item item = super.createItem( ctx, type, allAttributes ); + // business code placed here will be executed after the item was created + // and return the item + return item; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/AbstractMigrationJobPerformable.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/AbstractMigrationJobPerformable.java new file mode 100644 index 0000000..e8ceae6 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/AbstractMigrationJobPerformable.java @@ -0,0 +1,272 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.jobs; + +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import de.hybris.platform.cronjob.enums.CronJobResult; +import de.hybris.platform.cronjob.enums.CronJobStatus; +import de.hybris.platform.cronjob.jalo.AbortCronJobException; +import de.hybris.platform.cronjob.model.CronJobModel; +import de.hybris.platform.servicelayer.cronjob.AbstractJobPerformable; +import de.hybris.platform.servicelayer.cronjob.CronJobService; +import de.hybris.platform.servicelayer.cronjob.PerformResult; +import de.hybris.platform.util.Config; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.BooleanUtils; +import com.sap.cx.boosters.commercedbsync.context.IncrementalMigrationContext; +import com.sap.cx.boosters.commercedbsync.model.cron.FullMigrationCronJobModel; +import com.sap.cx.boosters.commercedbsync.model.cron.IncrementalMigrationCronJobModel; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.util.Arrays; +import java.util.Set; + +public abstract class AbstractMigrationJobPerformable extends AbstractJobPerformable { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractMigrationJobPerformable.class); + + private static final String[] TYPE_SYSTEM_RELATED_TYPES = new String[]{"atomictypes", "attributeDescriptors", "collectiontypes", "composedtypes", "enumerationvalues", "maptypes"}; + + private static final String MIGRATION_UPDATE_TYPE_SYSTEM = "migration.ds.update.typesystem.table"; + private static final String SOURCE_TYPESYSTEMNAME = "migration.ds.source.db.typesystemname"; + + private static final String SOURCE_TYPESYSTEMSUFFIX = "migration.ds.source.db.typesystemsuffix"; + + private static final String TYPESYSTEM_SELECT_STATEMENT = "IF (EXISTS (SELECT * \n" + + " FROM INFORMATION_SCHEMA.TABLES \n" + + " WHERE TABLE_SCHEMA = '%s' \n" + + " AND TABLE_NAME = '%2$s'))\n" + + "BEGIN\n" + + " select name from %2$s where state = 'current'\n" + + "END"; + + + protected DatabaseMigrationService databaseMigrationService; + protected IncrementalMigrationContext incrementalMigrationContext; + protected CronJobService cronJobService; + protected String currentMigrationId; + private JdbcTemplate jdbcTemplate; + + @Override + public boolean isPerformable() + { + for(CronJobModel cronJob : getCronJobService().getRunningOrRestartedCronJobs()){ + if ((cronJob instanceof IncrementalMigrationCronJobModel + || cronJob instanceof FullMigrationCronJobModel)) { + LOG.info("Previous migrations job already running {} and Type {} ", cronJob.getCode(), cronJob.getItemtype()); + return false; + } + } + return true; + } + + /* + * ORACLE_TARGET - START The updateTypesystemTabl() also updates the TS. There is scope to make these 2 update + * methods efficient i.e set the TS only once. + */ + + protected void updateSourceTypesystemProperty() throws Exception + { + // Disabling Post processor + Config.setParameter("migration.data.postprocessor.tscheck.disable", "yes"); + + if(BooleanUtils.isFalse(Config.getBoolean(MIGRATION_UPDATE_TYPE_SYSTEM, false))){ + return; + } + DataRepository sourceRepository = incrementalMigrationContext.getDataSourceRepository(); + try( + Connection connection = sourceRepository.getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(String.format(TYPESYSTEM_SELECT_STATEMENT, + sourceRepository.getDataSourceConfiguration().getSchema(), "CCV2_TYPESYSTEM_MIGRATIONS")); + ) { + LOG.debug("SETTING the Type System from CCV2_TYPESYSTEM_MIGRATIONS" + String.format(TYPESYSTEM_SELECT_STATEMENT, + sourceRepository.getDataSourceConfiguration().getSchema(), "CCV2_TYPESYSTEM_MIGRATIONS")); + + String typeSystemName = null; + if (resultSet.next()) + { + typeSystemName = resultSet.getString("name"); + } + else + { + return; + } + if (typeSystemName != null && !typeSystemName.isEmpty()) + { + Config.setParameter(SOURCE_TYPESYSTEMNAME, typeSystemName); + LOG.info("SETTING typeSystemName = " + typeSystemName); + return; + } + } + } + protected void updateTypesystemTable(Set migrationItems) throws Exception { + + if(BooleanUtils.isFalse(Config.getBoolean(MIGRATION_UPDATE_TYPE_SYSTEM, false))){ + return; + } + DataRepository sourceRepository = incrementalMigrationContext.getDataSourceRepository(); + for(final String tableName: migrationItems){ + if(Arrays.stream(TYPE_SYSTEM_RELATED_TYPES).anyMatch(t -> StringUtils.startsWithIgnoreCase(tableName, t))) + { + try ( + Connection connection = sourceRepository.getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(String.format(TYPESYSTEM_SELECT_STATEMENT, + sourceRepository.getDataSourceConfiguration().getSchema(),"CCV2_TYPESYSTEM_MIGRATIONS")); + ) + { + LOG.debug("Type System table - table found in list, get latest TS => " + String.format(TYPESYSTEM_SELECT_STATEMENT, + sourceRepository.getDataSourceConfiguration().getSchema(), "CCV2_TYPESYSTEM_MIGRATIONS")); + String typeSystemName = null; + if (resultSet.next()) { + typeSystemName = resultSet.getString("name");; + } else{ + return; + } + + final String tsBaseTableName = extractTSbaseTableName(tableName); + + LOG.info("Type System table - table found in list, get latest Table name " + String.format( + "SELECT TableName FROM %s WHERE Typecode IS NOT NULL AND TableName LIKE '%s' AND TypeSystemName = '%s'", + CommercedbsyncConstants.DEPLOYMENTS_TABLE, tsBaseTableName + "%", typeSystemName)); + final String typeSystemTablesQuery = String.format( + "SELECT TableName FROM %s WHERE Typecode IS NOT NULL AND TableName LIKE '%s' AND TypeSystemName = '%s'", + CommercedbsyncConstants.DEPLOYMENTS_TABLE, tsBaseTableName + "%", typeSystemName); + final ResultSet typeSystemtableresultSet = stmt.executeQuery(typeSystemTablesQuery); + String typeSystemTableName = null; + if (typeSystemtableresultSet.next()) + { + typeSystemTableName = typeSystemtableresultSet.getString("TableName"); + } + // ORACLE_TARGET - START, add null check and return; + if (typeSystemTableName != null) + { + Config.setParameter(SOURCE_TYPESYSTEMNAME, typeSystemName); + final String typesystemsuffix = typeSystemTableName.substring(tsBaseTableName.length()); + + Config.setParameter(SOURCE_TYPESYSTEMSUFFIX, typesystemsuffix); + LOG.info("typeSystemName = " + typeSystemName + ",typesystemsuffix = " + typesystemsuffix); + return; + } + } + } + } + } + + /* + * If enumerationvalueslp, then extract enumerationvalues as base table name. + */ + private String extractTSbaseTableName(final String tableNameFromMigrationItems) + { + String tsBaseTableName = tableNameFromMigrationItems; + + // if it ends with lp + if (tableNameFromMigrationItems.toLowerCase().endsWith("lp")) + { + tsBaseTableName = tableNameFromMigrationItems.substring(0, tableNameFromMigrationItems.length() - 2); + } + + return tsBaseTableName; + } + + protected MigrationStatus waitForFinishCronjobs(IncrementalMigrationContext context, String migrationID, + final CronJobModel cronJobModel) throws Exception { + MigrationStatus status; + Thread.sleep(5000); + boolean aborted = false; + long since = 0; + do { + OffsetDateTime sinceTime = OffsetDateTime.ofInstant(Instant.ofEpochMilli(since), ZoneOffset.UTC); + status = databaseMigrationService.getMigrationState(context, migrationID,sinceTime); + Thread.sleep(5000); + since = System.currentTimeMillis(); + if (isJobStateAborted(cronJobModel)) + { + aborted = true; + break; + } + } while (!status.isCompleted()); + + if (aborted) + { + LOG.info(" Aborted ...STOPPING migration "); + databaseMigrationService.stopMigration(incrementalMigrationContext, currentMigrationId); + LOG.error("Database migration has been ABORTED, Migration State= " + status + ", Total Tasks " + + status.getTotalTasks() + ", migration id =" + status.getMigrationID() + ", Completed Tasks " + + status.getCompletedTasks()); + clearAbortRequestedIfNeeded(cronJobModel); + throw new AbortCronJobException("CronJOB ABORTED"); + } + + if (status.isFailed()) { + LOG.error("Database migration FAILED, Migration State= " + status + ", Total Tasks " + + status.getTotalTasks() + ", migration id =" + status.getMigrationID() + ", Completed Tasks " + + status.getCompletedTasks()); + throw new Exception("Database migration failed"); + } + + return status; + } + + protected boolean isJobStateAborted(final CronJobModel cronJobModel) + { + this.modelService.refresh(cronJobModel); + LOG.info("cron job status = " + cronJobModel.getStatus()); + LOG.info("cron job request to abort =" + cronJobModel.getRequestAbort()); + return ((cronJobModel.getStatus() == CronJobStatus.ABORTED) + || (cronJobModel.getRequestAbort() == null ? false : cronJobModel.getRequestAbort())); + } + + @Override + public boolean isAbortable() { + return true; + } + + public IncrementalMigrationContext getIncrementalMigrationContext() { + return incrementalMigrationContext; + } + + public void setIncrementalMigrationContext(IncrementalMigrationContext incrementalMigrationContext) { + this.incrementalMigrationContext = incrementalMigrationContext; + } + + public CronJobService getCronJobService() { + return cronJobService; + } + + public void setCronJobService(CronJobService cronJobService) { + this.cronJobService = cronJobService; + } + + public DatabaseMigrationService getDatabaseMigrationService() { + return databaseMigrationService; + } + + public void setDatabaseMigrationService(DatabaseMigrationService databaseMigrationService) { + this.databaseMigrationService = databaseMigrationService; + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/FullMigrationJob.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/FullMigrationJob.java new file mode 100644 index 0000000..4a00890 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/FullMigrationJob.java @@ -0,0 +1,76 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.jobs; + +import com.google.common.base.Preconditions; +import de.hybris.platform.cronjob.enums.CronJobResult; +import de.hybris.platform.cronjob.enums.CronJobStatus; +import de.hybris.platform.cronjob.jalo.AbortCronJobException; +import de.hybris.platform.cronjob.model.CronJobModel; +import de.hybris.platform.servicelayer.cronjob.PerformResult; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.model.cron.FullMigrationCronJobModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; + + +/** + * This class offers functionality for FullMigrationJob. + */ +public class FullMigrationJob extends AbstractMigrationJobPerformable { + + private static final Logger LOG = LoggerFactory.getLogger(FullMigrationJob.class); + + @Override + public PerformResult perform(final CronJobModel cronJobModel) { + FullMigrationCronJobModel fullMigrationCronJobModel; + + Preconditions + .checkState((cronJobModel instanceof FullMigrationCronJobModel), + "cronJobModel must the instance of FullMigrationCronJobModel"); + fullMigrationCronJobModel = (FullMigrationCronJobModel) cronJobModel; + Preconditions.checkNotNull(fullMigrationCronJobModel.getMigrationItems(), + "We expect at least one table for the full migration"); + Preconditions.checkState( + null != fullMigrationCronJobModel.getMigrationItems() && !fullMigrationCronJobModel + .getMigrationItems().isEmpty(), + "We expect at least one table for the full migration"); + + boolean caughtExeption = false; + try { + incrementalMigrationContext + .setIncludedTables(fullMigrationCronJobModel.getMigrationItems()); + // ORACLE_TARGET - START there is scope to make the 2 update methods + // efficient + updateSourceTypesystemProperty(); + // ORACLE_TARGET - END there is scope to make the 2 methods + // efficient + updateTypesystemTable(fullMigrationCronJobModel.getMigrationItems()); + incrementalMigrationContext.setDeletionEnabled(false); + incrementalMigrationContext.setLpTableMigrationEnabled(false); + incrementalMigrationContext.setTruncateEnabled(fullMigrationCronJobModel.isTruncateEnabled()); + incrementalMigrationContext.setSchemaMigrationAutoTriggerEnabled(fullMigrationCronJobModel.isSchemaAutotrigger()); + incrementalMigrationContext.setIncrementalModeEnabled(false); + currentMigrationId = databaseMigrationService.startMigration(incrementalMigrationContext); + MigrationStatus currentState = waitForFinishCronjobs(incrementalMigrationContext, currentMigrationId,cronJobModel); + } + catch (final AbortCronJobException e) + { + return new PerformResult(CronJobResult.ERROR, CronJobStatus.ABORTED); + } + catch (final Exception e) + { + caughtExeption = true; + LOG.error(" Exception caught: message= " + e.getMessage(), e); + } + return new PerformResult(caughtExeption ? CronJobResult.FAILURE : CronJobResult.SUCCESS, CronJobStatus.FINISHED); + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/IncrementalMigrationJob.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/IncrementalMigrationJob.java new file mode 100644 index 0000000..cb03d3f --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/jobs/IncrementalMigrationJob.java @@ -0,0 +1,259 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.jobs; + +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import de.hybris.platform.cronjob.enums.CronJobResult; +import de.hybris.platform.cronjob.enums.CronJobStatus; +import de.hybris.platform.cronjob.jalo.AbortCronJobException; +import de.hybris.platform.cronjob.model.CronJobModel; +import de.hybris.platform.jalo.type.TypeManager; +import de.hybris.platform.servicelayer.cronjob.PerformResult; +import de.hybris.platform.servicelayer.model.ModelService; +import de.hybris.platform.servicelayer.type.TypeService; +import de.hybris.platform.util.Config; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.model.cron.IncrementalMigrationCronJobModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * This class offers functionality for IncrementalMigrationJob. + */ +public class IncrementalMigrationJob extends AbstractMigrationJobPerformable { + + private static final Logger LOG = LoggerFactory.getLogger(IncrementalMigrationJob.class); + + private static final String LP_SUFFIX = "lp"; + + private static String tablePrefix = Config.getParameter("db.tableprefix") == null ? "" : Config.getParameter("db.tableprefix"); + + private static final String TABLE_EXISTS_SELECT_STATEMENT_MSSQL = "SELECT TABLE_NAME \n" + + " FROM INFORMATION_SCHEMA.TABLES \n" + + " WHERE TABLE_SCHEMA = '%s' \n" + + " AND TABLE_NAME = '%2$s'\n"; + private static final String TABLE_EXISTS_SELECT_STATEMENT_ORACLE = "SELECT TABLE_NAME \n" + " FROM dba_tables \n" + + " WHERE upper(owner) = upper('%s') \n" + " AND upper(table_name) = upper('%2$s') "; + + private static final String TABLE_EXISTS_SELECT_STATEMENT_HANA = "SELECT TABLE_NAME \n" + " FROM public.tables \n" + + " WHERE schema_name = upper('%s') \n" + " AND table_name = upper('%2$s') "; + + private static final String TABLE_EXISTS_SELECT_STATEMENT_POSTGRES = "SELECT TABLE_NAME \n" + " FROM public.tables \n" + + " WHERE schema_name = upper('%s') \n" + " AND table_name = upper('%2$s') "; + + + @Resource(name = "typeService") + private TypeService typeService; + + @Override + public PerformResult perform(final CronJobModel cronJobModel) { + IncrementalMigrationCronJobModel incrementalMigrationCronJob; + + Preconditions + .checkState((cronJobModel instanceof IncrementalMigrationCronJobModel), + "cronJobModel must the instance of FullMigrationCronJobModel"); + modelService.refresh(cronJobModel); + + incrementalMigrationCronJob = (IncrementalMigrationCronJobModel) cronJobModel; + Preconditions.checkState( + null != incrementalMigrationCronJob.getMigrationItems() && !incrementalMigrationCronJob + .getMigrationItems().isEmpty(), + "We expect at least one table for the incremental migration"); + final Set deletionTableSet = getDeletionTableSet(incrementalMigrationCronJob.getMigrationItems()); + MigrationStatus currentState; + String currentMigrationId; + boolean caughtExeption = false; + try { + + if (null != incrementalMigrationCronJob.getLastStartTime()) { + Instant timeStampInstant = incrementalMigrationCronJob.getLastStartTime().toInstant(); + LOG.info("For {} IncrementalTimestamp : {} ", incrementalMigrationCronJob.getCode(), + timeStampInstant); + incrementalMigrationContext.setIncrementalMigrationTimestamp(timeStampInstant); + } else { + LOG.error("IncrementalTimestamp is not set for Cronjobs : {} , Aborting the migration, and please set the *lastStartTime* before triggering" + + " ", incrementalMigrationCronJob.getCode()); + return new PerformResult(CronJobResult.ERROR, CronJobStatus.ABORTED); + } + incrementalMigrationContext.setIncrementalModeEnabled(true); + incrementalMigrationContext.setTruncateEnabled(Optional.ofNullable(incrementalMigrationCronJob.isTruncateEnabled()) + .map(e -> incrementalMigrationCronJob.isTruncateEnabled()) + .orElse(false)); + updateSourceTypesystemProperty(); + if (CollectionUtils.isNotEmpty(deletionTableSet) && isSchemaMigrationRequired(deletionTableSet)) { + // deletionTableSet.add(deletionTable); + LOG.info("Running Deletion incremental migration"); + incrementalMigrationContext.setSchemaMigrationAutoTriggerEnabled(false); + incrementalMigrationContext.setIncrementalTables(deletionTableSet); + incrementalMigrationContext.setDeletionEnabled(true); + incrementalMigrationContext.setLpTableMigrationEnabled(false); + currentMigrationId = databaseMigrationService.startMigration(incrementalMigrationContext); + currentState = databaseMigrationService.waitForFinish(this.incrementalMigrationContext, currentMigrationId); + } + + // Running incremental migration + Set tablesWithoutLp = incrementalMigrationCronJob.getMigrationItems().stream(). + filter(table-> !(StringUtils.endsWithIgnoreCase(table, LP_SUFFIX))).collect( + Collectors.toSet()); + if(CollectionUtils.isNotEmpty(tablesWithoutLp)){ + LOG.info("Running incremental migration for Non LP Table"); + incrementalMigrationContext.setDeletionEnabled(false); + incrementalMigrationContext.setLpTableMigrationEnabled(false); + incrementalMigrationContext.setIncrementalTables(tablesWithoutLp); + incrementalMigrationContext.setSchemaMigrationAutoTriggerEnabled(incrementalMigrationCronJob.isSchemaAutotrigger()); + currentMigrationId = databaseMigrationService.startMigration(incrementalMigrationContext); + currentState = waitForFinishCronjobs(incrementalMigrationContext, currentMigrationId,cronJobModel); + + } + // Running incremental migration for LP Table + Set tablesWithLp = incrementalMigrationCronJob.getMigrationItems().stream(). + filter(table-> StringUtils.endsWithIgnoreCase(table, LP_SUFFIX)).collect( + Collectors.toSet()); + if(CollectionUtils.isNotEmpty(tablesWithLp)){ + LOG.info("Running incremental migration for LP Table"); + incrementalMigrationContext.setDeletionEnabled(false); + incrementalMigrationContext.setLpTableMigrationEnabled(true); + incrementalMigrationContext.setIncrementalTables(tablesWithLp); + incrementalMigrationContext.setSchemaMigrationAutoTriggerEnabled(incrementalMigrationCronJob.isSchemaAutotrigger()); + currentMigrationId = databaseMigrationService.startMigration(incrementalMigrationContext); + currentState = waitForFinishCronjobs(incrementalMigrationContext, currentMigrationId,cronJobModel); + } + } + catch (final AbortCronJobException e) + { + caughtExeption = true; + return new PerformResult(CronJobResult.ERROR, CronJobStatus.ABORTED); + } + catch (final Exception e) { + caughtExeption = true; + LOG.error("Exception caught:", e); + } + if (!caughtExeption) { + incrementalMigrationCronJob.setLastStartTime(cronJobModel.getStartTime()); + modelService.save(cronJobModel); + } + return new PerformResult(caughtExeption ? CronJobResult.FAILURE : CronJobResult.SUCCESS, + CronJobStatus.FINISHED); + } + + private Set getDeletionTableSetFromItemType(Set incMigrationItems) { + String deletionItemTypes = Config + .getString(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_ITEMTYPES, ""); + if (StringUtils.isEmpty(deletionItemTypes)) { + return Collections.emptySet(); + } + + final Set result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + + final List itemtypesArray = Splitter.on(",") + .omitEmptyStrings() + .trimResults() + .splitToList(deletionItemTypes.toLowerCase()); + + String tableName; + for(String itemType : itemtypesArray){ + tableName = typeService.getComposedTypeForCode(itemType).getTable(); + + if(StringUtils.startsWith(tableName,tablePrefix)){ + tableName = StringUtils.removeStart(tableName,tablePrefix); + } + if(incMigrationItems.contains(tableName)){ + result.add(tableName); + } + } + return result; + } + + private Set getDeletionTableSetFromTypeCodes(Set incMigrationItems) { + String deletionTypecodes = Config + .getString(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_TYPECODES, ""); + if (StringUtils.isEmpty(deletionTypecodes)) { + return Collections.emptySet(); + } + + final Set result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + + final List typecodeArray = Splitter.on(",") + .omitEmptyStrings() + .trimResults() + .splitToList(deletionTypecodes.toLowerCase()); + + String tableName; + for(String typecode : typecodeArray){ + tableName = TypeManager.getInstance() + .getRootComposedType(Integer.valueOf(typecode)).getTable(); + + if(StringUtils.startsWith(tableName,tablePrefix)){ + tableName = StringUtils.removeStart(tableName,tablePrefix); + } + if(incMigrationItems.contains(tableName)){ + result.add(tableName); + } + } + return result; + } + + // TO do , change to static varriable + private Set getDeletionTableSet(Set incMigrationItems){ + if(Config + .getBoolean(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_TYPECODES_ENABLED, false)){ + return getDeletionTableSetFromTypeCodes(incMigrationItems); + } + else if(Config + .getBoolean(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_ITEMTYPES_ENABLED, false)){ + getDeletionTableSetFromItemType(incMigrationItems); + } + return Collections.emptySet(); + } + + + private boolean isSchemaMigrationRequired(Set deletionTableSet) throws Exception { + String TABLE_EXISTS_SELECT_STATEMENT; + if(incrementalMigrationContext.getDataTargetRepository().getDatabaseProvider().isHanaUsed()){ + TABLE_EXISTS_SELECT_STATEMENT = TABLE_EXISTS_SELECT_STATEMENT_HANA; + } else if(incrementalMigrationContext.getDataTargetRepository().getDatabaseProvider().isOracleUsed()){ + TABLE_EXISTS_SELECT_STATEMENT = TABLE_EXISTS_SELECT_STATEMENT_ORACLE; + } else if(incrementalMigrationContext.getDataTargetRepository().getDatabaseProvider().isMssqlUsed()){ + TABLE_EXISTS_SELECT_STATEMENT = TABLE_EXISTS_SELECT_STATEMENT_MSSQL; + }else if(incrementalMigrationContext.getDataTargetRepository().getDatabaseProvider().isPostgreSqlUsed()){ + TABLE_EXISTS_SELECT_STATEMENT = TABLE_EXISTS_SELECT_STATEMENT_POSTGRES; + } else{ + TABLE_EXISTS_SELECT_STATEMENT = TABLE_EXISTS_SELECT_STATEMENT_MSSQL; + } + try ( + Connection connection = incrementalMigrationContext.getDataTargetRepository() + .getConnection(); + Statement stmt = connection.createStatement(); + ) { + for (final String tableName : deletionTableSet) { + try (ResultSet resultSet = stmt.executeQuery(String.format(TABLE_EXISTS_SELECT_STATEMENT, + incrementalMigrationContext.getDataTargetRepository().getDataSourceConfiguration() + .getSchema(), tableName)); + ) { + String TABLE_NAME = null; + if (resultSet.next()) { + //TABLE_NAME = resultSet.getString("TABLE_NAME"); + } else { + return true; + } + } + } + } + return false; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/listeners/DefaultCMTAfterSaveListener.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/listeners/DefaultCMTAfterSaveListener.java new file mode 100644 index 0000000..1534346 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/listeners/DefaultCMTAfterSaveListener.java @@ -0,0 +1,116 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.listeners; + +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import de.hybris.platform.jalo.type.TypeManager; +import de.hybris.platform.servicelayer.model.ModelService; +import de.hybris.platform.servicelayer.type.TypeService; +import de.hybris.platform.tx.AfterSaveEvent; +import de.hybris.platform.tx.AfterSaveListener; +import de.hybris.platform.util.Config; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.enums.ItemChangeType; +import com.sap.cx.boosters.commercedbsync.model.ItemDeletionMarkerModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * DefaultCMTAfterSaveListener is an implementation of {@link AfterSaveListener} for use with + * capturing changes to Delete operations for any configured data models. + * + */ +public class DefaultCMTAfterSaveListener implements AfterSaveListener { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultCMTAfterSaveListener.class); + + private ModelService modelService; + + private static final String COMMA_SEPERATOR = ","; + + private TypeService typeService; + + private static final boolean deletionsEnabled = Config + .getBoolean(CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_TYPECODES_ENABLED,false); + + + @Override + public void afterSave(final Collection events) { + if (!deletionsEnabled) { + if (LOG.isDebugEnabled()) { + LOG.debug("CMT deletions is not enabled for ItemModel."); + } + return; + } + + List deletionsTypeCode = getListDeletionsTypeCode(); + + if (deletionsTypeCode == null || deletionsTypeCode.isEmpty()) { + if (LOG.isDebugEnabled()) { + LOG.debug("No typecode defined to create a deletion record for CMT "); + } + return; + } + events.forEach(event -> { + { + final int type = event.getType(); + final String typeCodeAsString = event.getPk().getTypeCodeAsString(); + if (AfterSaveEvent.REMOVE == type && deletionsTypeCode.contains(typeCodeAsString)) { + final String tableName = TypeManager.getInstance() + .getRootComposedType(event.getPk().getTypeCode()).getTable(); + final ItemDeletionMarkerModel idm = modelService.create(ItemDeletionMarkerModel.class); + convertAndfillInitialDeletionMarker(idm, event.getPk().getLong(), + tableName); + modelService.save(idm); + + } + } + }); + + } + + private void convertAndfillInitialDeletionMarker(final ItemDeletionMarkerModel marker, final Long itemPK, + final String table) + { + Preconditions.checkNotNull(marker, "ItemDeletionMarker cannot be null in this place"); + Preconditions + .checkArgument(marker.getItemModelContext().isNew(), "ItemDeletionMarker must be new"); + + marker.setItemPK(itemPK); + marker.setTable(table); + marker.setChangeType(ItemChangeType.DELETED); + } + + + // TO DO change to static variable + private List getListDeletionsTypeCode() { + final String typeCodes = Config.getString( + CommercedbsyncConstants.MIGRATION_DATA_INCREMENTAL_DELETIONS_TYPECODES, ""); + if (StringUtils.isEmpty(typeCodes)) { + return Collections.emptyList(); + } + List result = Splitter.on(COMMA_SEPERATOR) + .omitEmptyStrings() + .trimResults() + .splitToList(typeCodes); + + return result; + } + + public void setModelService(final ModelService modelService) + { + this.modelService = modelService; + } + + public void setTypeService(TypeService typeService) { + this.typeService = typeService; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceCategory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceCategory.java new file mode 100644 index 0000000..4a794b5 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceCategory.java @@ -0,0 +1,11 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.performance; + +public enum PerformanceCategory { + DB_READ, DB_WRITE +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceProfiler.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceProfiler.java new file mode 100644 index 0000000..0fe3652 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceProfiler.java @@ -0,0 +1,26 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.performance; + +import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; + +public interface PerformanceProfiler { + PerformanceRecorder createRecorder(PerformanceCategory category, String name); + + void muteRecorder(PerformanceCategory category, String name); + + ConcurrentHashMap getRecorders(); + + Collection getRecordersByCategory(PerformanceCategory category); + + double getAverageByCategoryAndUnit(PerformanceCategory category, PerformanceUnit unit); + + PerformanceRecorder getRecorder(PerformanceCategory category, String name); + + void reset(); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceRecorder.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceRecorder.java new file mode 100644 index 0000000..feff5c1 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceRecorder.java @@ -0,0 +1,143 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.performance; + +import com.google.common.base.Joiner; +import com.google.common.base.Stopwatch; +import com.google.common.util.concurrent.AtomicDouble; + +import javax.annotation.concurrent.ThreadSafe; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * + */ +public class PerformanceRecorder { + + private ConcurrentHashMap records = new ConcurrentHashMap<>(); + + private Stopwatch timer; + private PerformanceCategory category; + private String name; + + public PerformanceRecorder(PerformanceCategory category, String name) { + this(category, name, false); + } + + public PerformanceRecorder(PerformanceCategory category, String name, boolean autoStart) { + this.category = category; + this.name = name; + if (autoStart) { + this.timer = Stopwatch.createStarted(); + } else { + this.timer = Stopwatch.createUnstarted(); + } + } + + public void start() { + this.timer.start(); + } + + public void pause() { + this.timer.stop(); + } + + public String getName() { + return name; + } + + public PerformanceCategory getCategory() { + return category; + } + + public void record(PerformanceUnit unit, double value) { + if (getRecords().containsKey(unit)) { + getRecords().get(unit).submit(value); + } else { + PerformanceAggregation performanceAggregation = new PerformanceAggregation(getTimer(), unit); + performanceAggregation.submit(value); + getRecords().put(unit, performanceAggregation); + } + } + + public ConcurrentHashMap getRecords() { + return records; + } + + private Stopwatch getTimer() { + return timer; + } + + @Override + public String toString() { + return "PerformanceRecorder{name=" + getName() + ",{" + Joiner.on("},{").join(getRecords().values()) + "}}"; + } + + @ThreadSafe + public static class PerformanceAggregation { + + private Stopwatch timer; + private PerformanceUnit performanceUnit; + private TimeUnit timeUnit = TimeUnit.SECONDS; + private AtomicDouble sum = new AtomicDouble(0); + private AtomicDouble max = new AtomicDouble(0); + private AtomicDouble min = new AtomicDouble(0); + private AtomicDouble avg = new AtomicDouble(0); + + public PerformanceAggregation(Stopwatch timer, PerformanceUnit performanceUnit) { + this.performanceUnit = performanceUnit; + this.timer = timer; + } + + protected void submit(double value) { + getTotalThroughput().addAndGet(value); + long elapsed = timer.elapsed(TimeUnit.MILLISECONDS); + float elapsedToSeconds = elapsed / 1000f; + if (elapsedToSeconds > 0) { + getAvgThroughput().set(getTotalThroughput().get() / elapsedToSeconds); + getMaxThroughput().set(Math.max(getMaxThroughput().get(), getAvgThroughput().get())); + getMinThroughput().set(Math.max(getMinThroughput().get(), getAvgThroughput().get())); + } + } + + public PerformanceUnit getPerformanceUnit() { + return performanceUnit; + } + + public AtomicDouble getTotalThroughput() { + return sum; + } + + public AtomicDouble getAvgThroughput() { + return avg; + } + + public AtomicDouble getMinThroughput() { + return min; + } + + public AtomicDouble getMaxThroughput() { + return max; + } + + public TimeUnit getTimeUnit() { + return timeUnit; + } + + @Override + public String toString() { + return "PerformanceAggregation{" + + "performanceUnit=" + performanceUnit + + ", sum=" + sum + + ", max=" + max + " " + performanceUnit + "/" + timeUnit + + ", min=" + min + " " + performanceUnit + "/" + timeUnit + + ", avg=" + avg + " " + performanceUnit + "/" + timeUnit + + '}'; + } + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceUnit.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceUnit.java new file mode 100644 index 0000000..c2d5cfd --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/PerformanceUnit.java @@ -0,0 +1,11 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.performance; + +public enum PerformanceUnit { + ROWS, MB +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/impl/DefaultPerformanceProfiler.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/impl/DefaultPerformanceProfiler.java new file mode 100644 index 0000000..043eec0 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/performance/impl/DefaultPerformanceProfiler.java @@ -0,0 +1,67 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.performance.impl; + +import com.sap.cx.boosters.commercedbsync.performance.PerformanceCategory; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceProfiler; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceRecorder; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceUnit; + +import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +public class DefaultPerformanceProfiler implements PerformanceProfiler { + + private ConcurrentHashMap recorders = new ConcurrentHashMap<>(); + + + @Override + public PerformanceRecorder createRecorder(PerformanceCategory category, String name) { + String recorderName = createRecorderName(category, name); + return recorders.computeIfAbsent(recorderName, key -> new PerformanceRecorder(category, recorderName)); + } + + @Override + public void muteRecorder(PerformanceCategory category, String name) { + String recorderName = createRecorderName(category, name); + this.recorders.remove(recorderName); + } + + @Override + public ConcurrentHashMap getRecorders() { + return recorders; + } + + @Override + public Collection getRecordersByCategory(PerformanceCategory category) { + return recorders.values().stream().filter(r -> category == r.getCategory()).collect(Collectors.toList()); + } + + @Override + public double getAverageByCategoryAndUnit(PerformanceCategory category, PerformanceUnit unit) { + Collection recordersByCategory = getRecordersByCategory(category); + return recordersByCategory.stream().filter(r -> r.getRecords().get(unit) != null).mapToDouble(r -> + r.getRecords().get(unit).getAvgThroughput().get() + ).average().orElse(0); + } + + @Override + public PerformanceRecorder getRecorder(PerformanceCategory category, String name) { + return recorders.get(createRecorderName(category, name)); + } + + @Override + public void reset() { + getRecorders().clear(); + } + + protected String createRecorderName(PerformanceCategory category, String name) { + return category + "->" + name; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/MigrationPostProcessor.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/MigrationPostProcessor.java new file mode 100644 index 0000000..b028ccf --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/MigrationPostProcessor.java @@ -0,0 +1,17 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.processors; + +import com.sap.cx.boosters.commercedbsync.context.CopyContext; + +/** + * Postprocessor activated after a migration has terminated + */ +public interface MigrationPostProcessor { + + void process(CopyContext context); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/AdjustActiveTypeSystemPostProcessor.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/AdjustActiveTypeSystemPostProcessor.java new file mode 100644 index 0000000..c28776f --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/AdjustActiveTypeSystemPostProcessor.java @@ -0,0 +1,95 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.processors.impl; + +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import de.hybris.platform.servicelayer.config.ConfigurationService; +import org.apache.commons.lang3.StringUtils; +import com.sap.cx.boosters.commercedbsync.processors.MigrationPostProcessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Arrays; + +public class AdjustActiveTypeSystemPostProcessor implements MigrationPostProcessor { + + private static final Logger LOG = LoggerFactory.getLogger(AdjustActiveTypeSystemPostProcessor.class.getName()); + + private static final String CCV2_TS_MIGRATION_TABLE = "CCV2_TYPESYSTEM_MIGRATIONS"; + private static final String TYPESYSTEM_ADJUST_STATEMENT = "IF (EXISTS (SELECT * \n" + + " FROM INFORMATION_SCHEMA.TABLES \n" + + " WHERE TABLE_SCHEMA = '%s' \n" + + " AND TABLE_NAME = '%3$s'))\n" + + "BEGIN\n" + + " UPDATE [%3$s] SET [state] = 'retired' WHERE 1=1;\n" + + " UPDATE [%3$s] SET [state] = 'current', [comment] = 'Updated by CMT' WHERE [name] = '%s';\n" + + "END"; + // ORACLR_TARGET - START + private static final String[] TRUEVALUES = new String[] { "yes", "y", "true", "0" }; + private static final String CMT_DISABLED_POST_PROCESSOR = "migration.data.postprocessor.tscheck.disable"; + private ConfigurationService configurationService; + + /** + * @return the configurationService + */ + public ConfigurationService getConfigurationService() { + return configurationService; + } + + /** + * @param configurationService + * the configurationService to set + */ + public void setConfigurationService(final ConfigurationService configurationService) { + this.configurationService = configurationService; + } + + @Override + public void process(final CopyContext context) { + + if (isPostProcesorDisabled()) { + LOG.info("TS post processor is disabled "); + return; + } + final DataRepository targetRepository = context.getMigrationContext().getDataTargetRepository(); + final String typeSystemName = targetRepository.getDataSourceConfiguration().getTypeSystemName(); + + try ( Connection connection = targetRepository.getConnection(); + PreparedStatement statement = connection.prepareStatement(String.format(TYPESYSTEM_ADJUST_STATEMENT, + targetRepository.getDataSourceConfiguration().getSchema(), typeSystemName, + getMigrationsTableName(targetRepository))); + ) { + statement.execute(); + + LOG.info("Adjusted active type system to: " + typeSystemName); + } catch (SQLException e) { + LOG.error("Error executing post processor (SQLException) ", e); + } catch (Exception e) { + LOG.error("Error executing post processor", e); + } + } + + private String getMigrationsTableName(final DataRepository repository) { + return StringUtils.trimToEmpty(repository.getDataSourceConfiguration().getTablePrefix()) + .concat(CCV2_TS_MIGRATION_TABLE); + } + + private boolean isPostProcesorDisabled() { + final String ccv2DisabledProperties = getConfigurationService().getConfiguration() + .getString(CMT_DISABLED_POST_PROCESSOR); + // boolean disabled = false; + if (ccv2DisabledProperties == null || ccv2DisabledProperties.isEmpty()) { + return false; + } + return Arrays.stream(TRUEVALUES).anyMatch(ccv2DisabledProperties::equalsIgnoreCase); + // return disabled; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/DefaultMigrationPostProcessor.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/DefaultMigrationPostProcessor.java new file mode 100644 index 0000000..f7d4745 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/DefaultMigrationPostProcessor.java @@ -0,0 +1,25 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.processors.impl; + +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.processors.MigrationPostProcessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Implements the {@link MigrationPostProcessor} + */ +public class DefaultMigrationPostProcessor implements MigrationPostProcessor { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultMigrationPostProcessor.class.getName()); + + @Override + public void process(CopyContext context) { + LOG.info("DefaultMigrationPostProcessor Finished"); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/ReportMigrationPostProcessor.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/ReportMigrationPostProcessor.java new file mode 100644 index 0000000..ec8738a --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/processors/impl/ReportMigrationPostProcessor.java @@ -0,0 +1,50 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.processors.impl; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationReportService; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationReportStorageService; +import com.sap.cx.boosters.commercedbsync.MigrationReport; +import com.sap.cx.boosters.commercedbsync.processors.MigrationPostProcessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +public class ReportMigrationPostProcessor implements MigrationPostProcessor { + + private static final Logger LOG = LoggerFactory.getLogger(ReportMigrationPostProcessor.class.getName()); + + private DatabaseMigrationReportService databaseMigrationReportService; + private DatabaseMigrationReportStorageService databaseMigrationReportStorageService; + + @Override + public void process(CopyContext context) { + try { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + MigrationReport migrationReport = databaseMigrationReportService.getMigrationReport(context); + InputStream is = new ByteArrayInputStream(gson.toJson(migrationReport).getBytes(StandardCharsets.UTF_8)); + databaseMigrationReportStorageService.store(context.getMigrationId() + ".json", is); + LOG.info("Finished writing database migration report"); + } catch (Exception e) { + LOG.error("Error executing post processor", e); + } + } + + public void setDatabaseMigrationReportService(DatabaseMigrationReportService databaseMigrationReportService) { + this.databaseMigrationReportService = databaseMigrationReportService; + } + + public void setDatabaseMigrationReportStorageService(DatabaseMigrationReportStorageService databaseMigrationReportStorageService) { + this.databaseMigrationReportStorageService = databaseMigrationReportStorageService; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/DataSourceConfiguration.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/DataSourceConfiguration.java new file mode 100644 index 0000000..e869f26 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/DataSourceConfiguration.java @@ -0,0 +1,40 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.profile; + +/** + * Contains a DataSource Configuration + */ +public interface DataSourceConfiguration { + String getProfile(); + + String getDriver(); + + String getConnectionString(); + + String getUserName(); + + String getPassword(); + + String getSchema(); + + String getTypeSystemName(); + + String getTypeSystemSuffix(); + + String getCatalog(); + + String getTablePrefix(); + + int getMaxActive(); + + int getMaxIdle(); + + int getMinIdle(); + + boolean isRemoveAbandoned(); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/impl/DefaultDataSourceConfiguration.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/impl/DefaultDataSourceConfiguration.java new file mode 100644 index 0000000..796a8d0 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/profile/impl/DefaultDataSourceConfiguration.java @@ -0,0 +1,161 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.profile.impl; + +import org.apache.commons.configuration.Configuration; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; + +/** + * Contains the JDBC DataSource Configuration + */ +public class DefaultDataSourceConfiguration implements DataSourceConfiguration { + + private String profile; + private Configuration configuration; + private String driver; + private String connectionString; + private String userName; + private String password; + private String schema; + private String catalog; + private String tablePrefix; + private String typeSystemName; + private String typeSystemSuffix; + private int maxActive; + private int maxIdle; + private int minIdle; + private boolean removedAbandoned; + + public DefaultDataSourceConfiguration(Configuration configuration, String profile) { + this.profile = profile; + this.configuration = configuration; + this.load(configuration, profile); + } + + @Override + public String getProfile() { + return profile; + } + + @Override + public String getDriver() { + return driver; + } + + @Override + public String getConnectionString() { + return connectionString; + } + + @Override + public String getUserName() { + return userName; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getSchema() { + return schema; + } + + @Override + public String getTypeSystemName() { + this.typeSystemName = getProfileProperty(profile, configuration, "db.typesystemname"); + return typeSystemName; + } + + @Override + public String getTypeSystemSuffix() { + this.typeSystemSuffix = getProfileProperty(profile, configuration, "db.typesystemsuffix"); + return typeSystemSuffix; + } + + @Override + public String getCatalog() { + return catalog; + } + + @Override + public String getTablePrefix() { + return tablePrefix; + } + + @Override + public int getMaxActive() { + return maxActive; + } + + @Override + public int getMaxIdle() { + return maxIdle; + } + + @Override + public int getMinIdle() { + return minIdle; + } + + @Override + public boolean isRemoveAbandoned() { + return removedAbandoned; + } + + protected void load(Configuration configuration, String profile) { + this.driver = getProfileProperty(profile, configuration, "db.driver"); + this.connectionString = getProfileProperty(profile, configuration, "db.url"); + this.userName = getProfileProperty(profile, configuration, "db.username"); + this.password = getProfileProperty(profile, configuration, "db.password"); + this.schema = getProfileProperty(profile, configuration, "db.schema"); + this.catalog = getProfileProperty(profile, configuration, "db.catalog"); + this.tablePrefix = getProfileProperty(profile, configuration, "db.tableprefix"); + this.typeSystemName = getProfileProperty(profile, configuration, "db.typesystemname"); + this.typeSystemSuffix = getProfileProperty(profile, configuration, "db.typesystemsuffix"); + this.maxActive = parseInt(getProfileProperty(profile, configuration, "db.connection.pool.size.active.max")); + this.maxIdle = parseInt(getProfileProperty(profile, configuration, "db.connection.pool.size.idle.max")); + this.minIdle = parseInt(getProfileProperty(profile, configuration, "db.connection.pool.size.idle.min")); + this.removedAbandoned = Boolean.parseBoolean(getProfileProperty(profile, configuration, "db.connection.removeabandoned")); + } + + protected String getNormalProperty(Configuration configuration, String key) { + return checkProperty(configuration.getString(key), key); + } + + protected int parseInt(String value) { + if (StringUtils.isEmpty(value)) { + return 0; + } else { + return Integer.parseInt(value); + } + } + + protected String getProfileProperty(String profile, Configuration configuration, String key) { + String profilePropertyKey = createProfilePropertyKey(key, profile); + String property = configuration.getString(profilePropertyKey); + if (StringUtils.startsWith(property, "${")) { + property = configuration.getString(StringUtils.substringBetween(property, "{", "}")); + } + return checkProperty(property, profilePropertyKey); + } + + protected String checkProperty(String property, String key) { + if (property != null) { + return property; + } else { + throw new IllegalArgumentException(String.format( + "property %s doesn't exist", key)); + } + } + + protected String createProfilePropertyKey(String key, String profile) { + return "migration.ds." + profile + "." + key; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/CopyItemProvider.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/CopyItemProvider.java new file mode 100644 index 0000000..1a6761f --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/CopyItemProvider.java @@ -0,0 +1,24 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.provider; + +import com.sap.cx.boosters.commercedbsync.TableCandidate; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +import java.util.Set; + +/** + * Provides the means to copy an Item fro Source to Target + */ +public interface CopyItemProvider { + Set get(MigrationContext context) throws Exception; + + Set getSourceTableCandidates(MigrationContext context) throws Exception; + + Set getTargetTableCandidates(MigrationContext context) throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/impl/DefaultDataCopyItemProvider.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/impl/DefaultDataCopyItemProvider.java new file mode 100644 index 0000000..cb62665 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/provider/impl/DefaultDataCopyItemProvider.java @@ -0,0 +1,292 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.provider.impl; + +import com.google.common.collect.Sets; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.provider.CopyItemProvider; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.TableCandidate; +import com.sap.cx.boosters.commercedbsync.TypeSystemTable; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.filter.DataCopyTableFilter; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + +public class DefaultDataCopyItemProvider implements CopyItemProvider { + + public static final String SN_SUFFIX = "sn"; + private static final String LP_SUFFIX = "lp"; + private static final String LP_SUFFIX_UPPER = "LP"; + + private static final Logger LOG = LoggerFactory.getLogger(DefaultDataCopyItemProvider.class); + + private static final String[] TYPE_SYSTEM_RELATED_TYPES = new String[] { "atomictypes", "attributeDescriptors", + "collectiontypes", "composedtypes", "enumerationvalues", "maptypes" }; + private final Comparator tableCandidateComparator = (o1, o2) -> o1.getCommonTableName() + .compareToIgnoreCase(o2.getCommonTableName()); + private DataCopyTableFilter dataCopyTableFilter; + + private static boolean shouldMigrateAuditTable(final MigrationContext context, final String auditTableName) { + return context.isAuditTableMigrationEnabled() && StringUtils.isNotEmpty(auditTableName); + } + + // ORACLE_TARGET - START + private void logTables(final Set tablesCandidates, final String debugtext) { + if (LOG.isDebugEnabled()) { + LOG.debug("---------START------," + debugtext); + if (tablesCandidates != null && tablesCandidates.size() > 0) { + for (final TableCandidate source : tablesCandidates) { + LOG.debug("$$Table Common Name" + source.getCommonTableName() + ", Base Table =" + + source.getBaseTableName() + ", Suffix = " + source.getAdditionalSuffix() + " , Full TB = " + + source.getFullTableName() + ",Table Name = " + source.getTableName()); + /* + * if (Arrays.stream(TYPE_SYSTEM_RELATED_TYPES) .anyMatch(t + * -> + * StringUtils.startsWithIgnoreCase(source.getBaseTableName( + * ), t))) { } + */ + + } + LOG.debug("---------END------," + debugtext); + } + } + + } + // ORACLE_TARGET - END + + @Override + public Set get(final MigrationContext context) throws Exception { + final Set sourceTablesCandidates = getSourceTableCandidates(context); + final Set targetTablesCandidates = getTargetTableCandidates(context); + final Sets.SetView sourceTables = Sets.intersection(sourceTablesCandidates, + targetTablesCandidates); + + // ORACLE_TARGET --START ONLY FOR DEBUG + logTables(sourceTablesCandidates, "source table candidates"); + logTables(targetTablesCandidates, "target table candidates"); + logTables(sourceTables, "intersection tables"); + // ORACLE_TARGET --END ONLY FOR DEBUG + + final Set sourceTablesToMigrate = sourceTables.stream() + .filter(t -> dataCopyTableFilter.filter(context).test(t.getCommonTableName())) + .collect(Collectors.toSet()); + + return createCopyItems(context, sourceTablesToMigrate, targetTablesCandidates.stream() + .collect(Collectors.toMap(t -> t.getCommonTableName().toLowerCase(), t -> t))); + } + + @Override + public Set getSourceTableCandidates(final MigrationContext context) throws Exception { + return getTableCandidates(context, context.getDataSourceRepository()); + } + + @Override + public Set getTargetTableCandidates(final MigrationContext context) throws Exception { + return getAllTableCandidates(context); + } + + private Set getAllTableCandidates(final MigrationContext context) throws Exception { + final DataRepository targetRepository = context.getDataTargetRepository(); + final String prefix = targetRepository.getDataSourceConfiguration().getTablePrefix(); + + return targetRepository.getAllTableNames().stream() + .filter(n -> prefix == null || StringUtils.startsWithIgnoreCase(n, prefix)) + .map(n -> StringUtils.removeStartIgnoreCase(n, prefix)) + .filter(n -> !isNonMatchingTypesystemTable(targetRepository, n)) + .map(n -> createTableCandidate(targetRepository, n)) + .collect(Collectors.toCollection(() -> new TreeSet<>(tableCandidateComparator))); + } + + private boolean isNonMatchingTypesystemTable(final DataRepository repository, final String tableName) { + boolean isTypesystemTable = false; + // ORACLE_TARGET -- TODO SUFFIX SN_SUFFIX case ?? + if (!StringUtils.endsWithIgnoreCase(tableName, SN_SUFFIX)) { + isTypesystemTable = Arrays.stream(TYPE_SYSTEM_RELATED_TYPES) + .anyMatch(t -> StringUtils.startsWithIgnoreCase(tableName, t)); + } + if (isTypesystemTable) { + + final String additionalSuffix = getAdditionalSuffix(tableName, + repository.getDatabaseProvider()); + final String tableNameWithoutAdditionalSuffix = getTableNameWithoutAdditionalSuffix(tableName, + additionalSuffix); + final String typeSystemSuffix = repository.getDataSourceConfiguration().getTypeSystemSuffix(); + LOG.debug("$$TS table name=" + tableName + ",additionalSuffix=" + additionalSuffix + + ", tableNameWithoutAdditionalSuffix=" + tableNameWithoutAdditionalSuffix + ",typeSystemSuffix=" + + typeSystemSuffix); + LOG.debug("$$TS check=" + + !StringUtils.endsWithIgnoreCase(tableNameWithoutAdditionalSuffix, typeSystemSuffix)); + return !StringUtils.endsWithIgnoreCase(tableNameWithoutAdditionalSuffix, typeSystemSuffix); + } + return false; + } + + private Set getTableCandidates(final MigrationContext context, final DataRepository repository) + throws Exception { + final Set allTableNames = repository.getAllTableNames(); + + LOG.debug("$$ALL TABLES...getTableCandidates " + allTableNames); + final Set tableCandidates = new TreeSet<>(tableCandidateComparator); + + //add meta tables + tableCandidates.add(createTableCandidate(repository, CommercedbsyncConstants.DEPLOYMENTS_TABLE)); + tableCandidates.add(createTableCandidate(repository, "aclentries")); + tableCandidates.add(createTableCandidate(repository, "configitems")); + tableCandidates.add(createTableCandidate(repository, "numberseries")); + tableCandidates.add(createTableCandidate(repository, "metainformations")); + + //add tables listed in "ydeployments" + final Set allTypeSystemTables = repository.getAllTypeSystemTables(); + allTypeSystemTables.forEach(t -> { + tableCandidates.add(createTableCandidate(repository, t.getTableName())); + + final String propsTableName = t.getPropsTableName(); + + if (StringUtils.isNotEmpty(propsTableName)) { + tableCandidates.add(createTableCandidate(repository, t.getPropsTableName())); + } + + final TableCandidate lpTable = createTableCandidate(repository, t.getTableName() + LP_SUFFIX); + + if (allTableNames.stream().anyMatch(lpTable.getFullTableName()::equalsIgnoreCase)) { + LOG.debug("LP table Match... " + lpTable.getFullTableName()); + tableCandidates.add(lpTable); + } + + /* + * if (allTableNames.contains(lpTable.getFullTableName())) { + * tableCandidates.add(lpTable); } + */ + // ORACLE_TARGET -END + + if (shouldMigrateAuditTable(context, t.getAuditTableName())) { + final TableCandidate auditTable = createTableCandidate(repository, t.getAuditTableName()); + + // ORACLE_TARGET - START..needs to be tested.Case insensitive + // match + if (allTableNames.stream().anyMatch(auditTable.getFullTableName()::equalsIgnoreCase)) { + tableCandidates.add(lpTable); + } + + /* + * if (allTableNames.contains(auditTable.getFullTableName())) { + * tableCandidates.add(auditTable); } + */ + // ORACLE_TARGET - END + } + }); + + // custom tables + if (CollectionUtils.isNotEmpty(context.getCustomTables())) { + tableCandidates.addAll(context.getCustomTables().stream().map(t -> createTableCandidate(repository, t)) + .collect(Collectors.toSet())); + } + + return tableCandidates; + } + + private TableCandidate createTableCandidate(final DataRepository repository, final String tableName) { + final TableCandidate candidate = new TableCandidate(); + + final String additionalSuffix = getAdditionalSuffix(tableName, repository.getDatabaseProvider()); + final String tableNameWithoutAdditionalSuffix = getTableNameWithoutAdditionalSuffix(tableName, + additionalSuffix); + final String baseTableName = getTableNameWithoutTypeSystemSuffix(tableNameWithoutAdditionalSuffix, + repository.getDataSourceConfiguration().getTypeSystemSuffix()); + final boolean isTypeSystemRelatedTable = isTypeSystemRelatedTable(baseTableName); + candidate.setCommonTableName(baseTableName + additionalSuffix); + candidate.setTableName(tableName); + candidate.setFullTableName(repository.getDataSourceConfiguration().getTablePrefix() + tableName); + candidate.setAdditionalSuffix(additionalSuffix); + candidate.setBaseTableName(baseTableName); + candidate.setTypeSystemRelatedTable(isTypeSystemRelatedTable); + return candidate; + } + + private boolean isTypeSystemRelatedTable(final String tableName) { + return Arrays.stream(TYPE_SYSTEM_RELATED_TYPES).anyMatch(tableName::equalsIgnoreCase); + } + + private String getAdditionalSuffix(final String tableName, final DataBaseProvider dataBaseProvider) { + // ORACLE_TARGET - START + if (dataBaseProvider.isOracleUsed() && (StringUtils.endsWith(tableName, LP_SUFFIX_UPPER))) { + return LP_SUFFIX_UPPER; + }// ORACLE_TARGET - END + else if(dataBaseProvider.isHanaUsed() && (StringUtils.endsWith(tableName, LP_SUFFIX_UPPER))){ + return LP_SUFFIX_UPPER; + }else if (StringUtils.endsWithIgnoreCase(tableName, LP_SUFFIX)) { + return LP_SUFFIX; + } else { + return StringUtils.EMPTY; + } + } + + private String getTableNameWithoutTypeSystemSuffix(final String tableName, final String suffix) { + return StringUtils.removeEnd(tableName, suffix); + } + + private String getTableNameWithoutAdditionalSuffix(final String tableName, final String suffix) { + return StringUtils.removeEnd(tableName, suffix); + } + + private Set createCopyItems(final MigrationContext context, + final Set sourceTablesToMigrate, final Map targetTablesToMigrate) { + final Set copyItems = new HashSet<>(); + for (final TableCandidate sourceTableToMigrate : sourceTablesToMigrate) { + final String targetTableKey = sourceTableToMigrate.getCommonTableName().toLowerCase(); + + LOG.debug("Eligible Tables to Migrate =" + targetTableKey); + if (targetTablesToMigrate.containsKey(targetTableKey)) { + final TableCandidate targetTableToMigrate = targetTablesToMigrate.get(targetTableKey); + copyItems.add(createCopyItem(context, sourceTableToMigrate, targetTableToMigrate)); + } else { + throw new IllegalStateException("Target table must exists"); + } + } + return copyItems; + } + + private CopyContext.DataCopyItem createCopyItem(final MigrationContext context, final TableCandidate sourceTable, + final TableCandidate targetTable) { + final String sourceTableName = sourceTable.getFullTableName(); + final String targetTableName = targetTable.getFullTableName(); + final CopyContext.DataCopyItem dataCopyItem = new CopyContext.DataCopyItem(sourceTableName, targetTableName); + addColumnMappingsIfNecessary(context, sourceTable, dataCopyItem); + return dataCopyItem; + } + + private void addColumnMappingsIfNecessary(final MigrationContext context, final TableCandidate sourceTable, + final CopyContext.DataCopyItem dataCopyItem) { + if (sourceTable.getCommonTableName().equalsIgnoreCase(CommercedbsyncConstants.DEPLOYMENTS_TABLE)) { + final String sourceTypeSystemName = context.getDataSourceRepository().getDataSourceConfiguration() + .getTypeSystemName(); + final String targetTypeSystemName = context.getDataTargetRepository().getDataSourceConfiguration() + .getTypeSystemName(); + // Add mapping to override the TypeSystemName value in target table + if (!sourceTypeSystemName.equalsIgnoreCase(targetTypeSystemName)) { + dataCopyItem.getColumnMap().put("TypeSystemName", targetTypeSystemName); + } + } + } + + public void setDataCopyTableFilter(final DataCopyTableFilter dataCopyTableFilter) { + this.dataCopyTableFilter = dataCopyTableFilter; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/DataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/DataRepository.java new file mode 100644 index 0000000..1a73b08 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/DataRepository.java @@ -0,0 +1,94 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository; + + +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.model.Database; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import com.sap.cx.boosters.commercedbsync.TypeSystemTable; +import org.springframework.core.io.Resource; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.time.Instant; +import java.util.Set; + +/** + * + */ +public interface DataRepository { + Database asDatabase(); + + Database asDatabase(boolean reload); + + Set getAllTableNames() throws Exception; + + Set getAllTypeSystemTables() throws Exception; + + boolean isAuditTable(String table) throws Exception; + + Set getAllColumnNames(String table) throws Exception; + + DataSet getBatchWithoutIdentifier(OffsetQueryDefinition queryDefinition) throws Exception; + + DataSet getBatchWithoutIdentifier(OffsetQueryDefinition queryDefinition, Instant time) throws Exception; + + DataSet getBatchOrderedByColumn(SeekQueryDefinition queryDefinition) throws Exception; + + DataSet getBatchOrderedByColumn(SeekQueryDefinition queryDefinition, Instant time) throws Exception; + + DataSet getBatchMarkersOrderedByColumn(MarkersQueryDefinition queryDefinition) throws Exception; + + long getRowCount(String table) throws Exception; + + long getRowCountModifiedAfter(String table, Instant time, boolean isDeletionEnabled, boolean lpTableMigrationEnabled) throws SQLException; + + long getRowCountModifiedAfter(String table, Instant time) throws SQLException; + + DataSet getAll(String table) throws Exception; + + DataSet getAllModifiedAfter(String table, Instant time) throws Exception; + + DataSourceConfiguration getDataSourceConfiguration(); + + int executeUpdateAndCommit(String updateStatement) throws Exception; + + void runSqlScript(final Resource resource); + + float getDatabaseUtilization() throws SQLException; + + int truncateTable(String table) throws Exception; + + void disableIndexesOfTable(String table) throws Exception; + + void enableIndexesOfTable(String table) throws SQLException; + + void dropIndexesOfTable(String table) throws SQLException; + + Platform asPlatform(); + + Platform asPlatform(boolean reload); + + DataBaseProvider getDatabaseProvider(); + + Connection getConnection() throws Exception; + + DataSource getDataSource(); + + DataSet getBatchMarkersOrderedByColumn(MarkersQueryDefinition queryDefinition, Instant time) throws Exception; + + DataSet getUniqueColumns(String table) throws Exception; + + boolean validateConnection() throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AbstractDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AbstractDataRepository.java new file mode 100644 index 0000000..dd92a92 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AbstractDataRepository.java @@ -0,0 +1,580 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Joiner; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.dataset.impl.DefaultDataColumn; +import com.sap.cx.boosters.commercedbsync.dataset.impl.DefaultDataSet; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisPlatformFactory; +import de.hybris.bootstrap.ddl.tools.persistenceinfo.PersistenceInformation; +import org.apache.commons.lang3.StringUtils; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.model.Database; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import com.sap.cx.boosters.commercedbsync.TypeSystemTable; +import com.sap.cx.boosters.commercedbsync.dataset.DataColumn; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.datasource.MigrationDataSourceFactory; +import com.sap.cx.boosters.commercedbsync.datasource.impl.DefaultMigrationDataSourceFactory; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Base information an a + */ +public abstract class AbstractDataRepository implements DataRepository { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractDataRepository.class); + + private final Map dataSourceHolder = new ConcurrentHashMap<>(); + + private final DataSourceConfiguration dataSourceConfiguration; + private final MigrationDataSourceFactory migrationDataSourceFactory; + private final DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService; + private Platform platform; + private Database database; + + public AbstractDataRepository(DataSourceConfiguration dataSourceConfiguration, DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + this(dataSourceConfiguration, databaseMigrationDataTypeMapperService, new DefaultMigrationDataSourceFactory()); + } + + public AbstractDataRepository(DataSourceConfiguration dataSourceConfiguration, DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService, MigrationDataSourceFactory migrationDataSourceFactory) { + this.dataSourceConfiguration = dataSourceConfiguration; + this.migrationDataSourceFactory = migrationDataSourceFactory; + this.databaseMigrationDataTypeMapperService = databaseMigrationDataTypeMapperService; + } + + @Override + public DataSourceConfiguration getDataSourceConfiguration() { + return dataSourceConfiguration; + } + + @Override + public DataSource getDataSource() { + return dataSourceHolder.computeIfAbsent("DATASOURCE", s -> migrationDataSourceFactory.create(dataSourceConfiguration)); + } + + public Connection getConnection() throws SQLException { + Connection connection = getDataSource().getConnection(); + connection.setAutoCommit(false); + return connection; + } + + @Override + public int executeUpdateAndCommit(String updateStatement) throws SQLException { + try (Connection conn = getConnectionForUpdateAndCommit(); + Statement statement = conn.createStatement() + ) { + return statement.executeUpdate(updateStatement); + } + } + + public Connection getConnectionForUpdateAndCommit() throws SQLException { + Connection connection = getDataSource().getConnection(); + connection.setAutoCommit(true); + return connection; + } + + @Override + public void runSqlScript(Resource resource) { + final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource); + databasePopulator.setIgnoreFailedDrops(true); + databasePopulator.execute(getDataSource()); + } + + @Override + public float getDatabaseUtilization() throws SQLException { + throw new UnsupportedOperationException("Must be added in the specific repository implementation"); + } + + @Override + public int truncateTable(String table) throws SQLException { + return executeUpdateAndCommit(String.format("truncate table %s", table)); + } + + @Override + public long getRowCount(String table) throws SQLException { + List conditionsList = new ArrayList<>(1); + processDefaultConditions(table, conditionsList); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(String.format("select count(*) from %s where %s", table, expandConditions(conditions))) + ) { + long value = 0; + if (resultSet.next()) { + value = resultSet.getLong(1); + } + return value; + } + } + + @Override + public long getRowCountModifiedAfter(String table, Instant time, boolean isDeletionEnabled, boolean lpTableMigrationEnabled) + throws SQLException { + return getRowCountModifiedAfter(table,time); + } + + @Override + public long getRowCountModifiedAfter(String table, Instant time) throws SQLException { + List conditionsList = new ArrayList<>(1); + processDefaultConditions(table, conditionsList); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection()) { + try (PreparedStatement stmt = connection.prepareStatement(String.format("select count(*) from %s where modifiedts > ? AND %s", table, expandConditions(conditions)))) { + stmt.setTimestamp(1, Timestamp.from(time)); + ResultSet resultSet = stmt.executeQuery(); + long value = 0; + if (resultSet.next()) { + value = resultSet.getLong(1); + } + return value; + } + } + } + + @Override + public DataSet getAll(String table) throws Exception { + List conditionsList = new ArrayList<>(1); + processDefaultConditions(table, conditionsList); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(String.format("select * from %s where %s", table, expandConditions(conditions))) + ) { + return convertToDataSet(resultSet); + } + } + + @Override + public DataSet getAllModifiedAfter(String table, Instant time) throws Exception { + List conditionsList = new ArrayList<>(1); + processDefaultConditions(table, conditionsList); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection()) { + try (PreparedStatement stmt = connection.prepareStatement(String.format("select * from %s where modifiedts > ? and %s", table, expandConditions(conditions)))) { + stmt.setTimestamp(1, Timestamp.from(time)); + ResultSet resultSet = stmt.executeQuery(); + return convertToDataSet(resultSet); + } + } + } + + protected DefaultDataSet convertToDataSet(ResultSet resultSet) throws Exception { + return convertToDataSet(resultSet, Collections.emptySet()); + } + + protected DefaultDataSet convertToDataSet(ResultSet resultSet, Set ignoreColumns) throws Exception { + int realColumnCount = resultSet.getMetaData().getColumnCount(); + List columnOrder = new ArrayList<>(); + int columnCount = 0; + for (int i = 1; i <= realColumnCount; i++) { + String columnName = resultSet.getMetaData().getColumnName(i); + int columnType = resultSet.getMetaData().getColumnType(i); + int precision = resultSet.getMetaData().getPrecision(i); + int scale = resultSet.getMetaData().getScale(i); + if (ignoreColumns.stream().anyMatch(columnName::equalsIgnoreCase)) { + continue; + } + columnCount += 1; + columnOrder.add(new DefaultDataColumn(columnName, columnType, precision, scale)); + } + List> results = new ArrayList<>(); + while (resultSet.next()) { + List row = new ArrayList<>(); + for (DataColumn dataColumn : columnOrder) { + int idx = resultSet.findColumn(dataColumn.getColumnName()); + Object object = resultSet.getObject(idx); + //TODO: improve CLOB/BLOB handling + Object mappedValue = databaseMigrationDataTypeMapperService.dataTypeMapper(object, resultSet.getMetaData().getColumnType(idx)); + row.add(mappedValue); + } + results.add(row); + } + return new DefaultDataSet(columnCount, columnOrder, results); + } + + @Override + public void disableIndexesOfTable(String table) throws SQLException { + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(getDisableIndexesScript(table)) + ) { + while (resultSet.next()) { + String q = resultSet.getString(1); + LOG.debug("Running query: {}", q); + executeUpdateAndCommit(q); + } + } + } + + @Override + public void enableIndexesOfTable(String table) throws SQLException { + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(getEnableIndexesScript(table)) + ) { + while (resultSet.next()) { + String q = resultSet.getString(1); + LOG.debug("Running query: {}", q); + executeUpdateAndCommit(q); + } + } + } + + @Override + public void dropIndexesOfTable(String table) throws SQLException { + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(getDropIndexesScript(table)) + ) { + while (resultSet.next()) { + String q = resultSet.getString(1); + LOG.debug("Running query: {}", q); + executeUpdateAndCommit(q); + } + } + } + + protected String getDisableIndexesScript(String table) { + throw new UnsupportedOperationException("not implemented"); + + + } + + protected String getEnableIndexesScript(String table) { + throw new UnsupportedOperationException("not implemented"); + } + + protected String getDropIndexesScript(String table) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + public Platform asPlatform() { + return asPlatform(false); + } + + @Override + public Platform asPlatform(boolean reload) { + //TODO all properties to be set and check + if (this.platform == null || reload) { + final DatabaseSettings databaseSettings = new DatabaseSettings(getDatabaseProvider(), getDataSourceConfiguration().getConnectionString(), getDataSourceConfiguration().getDriver(), getDataSourceConfiguration().getUserName(), getDataSourceConfiguration().getPassword(), getDataSourceConfiguration().getTablePrefix(), ";"); + this.platform = createPlatform(databaseSettings, getDataSource()); + addCustomPlatformTypeMapping(this.platform); + } + return this.platform; + } + + protected Platform createPlatform(DatabaseSettings databaseSettings, DataSource dataSource) { + return HybrisPlatformFactory.createInstance(databaseSettings, dataSource); + } + + + protected void addCustomPlatformTypeMapping(Platform platform) { + } + + @Override + public Database asDatabase() { + return asDatabase(false); + } + + @Override + public Database asDatabase(boolean reload) { + if (this.database == null || reload) { + this.database = getDatabase(reload); + } + return this.database; + } + + protected Database getDatabase(boolean reload) { + String schema = getDataSourceConfiguration().getSchema(); + return asPlatform(reload).readModelFromDatabase(getDataSourceConfiguration().getProfile(), null, + schema, null); + } + + @Override + public Set getAllTableNames() throws SQLException { + Set allTableNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + String allTableNamesQuery = createAllTableNamesQuery(); + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(allTableNamesQuery) + ) { + while (resultSet.next()) { + String tableName = resultSet.getString(1); + if (!StringUtils.startsWithIgnoreCase(tableName, CommercedbsyncConstants.MIGRATION_TABLESPREFIX)) { + allTableNames.add(resultSet.getString(1)); + } + } + } + return allTableNames; + } + + @Override + public Set getAllTypeSystemTables() throws SQLException { + if (StringUtils.isEmpty(getDataSourceConfiguration().getTypeSystemName())) { + throw new RuntimeException("No type system name specified. Check the properties"); + } + String tablePrefix = getDataSourceConfiguration().getTablePrefix(); + String yDeploymentsTable = StringUtils.defaultIfBlank(tablePrefix, "") + CommercedbsyncConstants.DEPLOYMENTS_TABLE; + Set allTableNames = getAllTableNames(); + if (!allTableNames.contains(yDeploymentsTable)) { + return Collections.emptySet(); + } + String allTypeSystemTablesQuery = String.format("SELECT * FROM %s WHERE Typecode IS NOT NULL AND TableName IS NOT NULL AND TypeSystemName = '%s'", yDeploymentsTable, getDataSourceConfiguration().getTypeSystemName()); + Set allTypeSystemTables = new HashSet<>(); + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(allTypeSystemTablesQuery) + ) { + while (resultSet.next()) { + TypeSystemTable typeSystemTable = new TypeSystemTable(); + String name = resultSet.getString("Name"); + String tableName = resultSet.getString("TableName"); + typeSystemTable.setTypeCode(resultSet.getString("Typecode")); + typeSystemTable.setTableName(tableName); + typeSystemTable.setName(name); + typeSystemTable.setTypeSystemName(resultSet.getString("TypeSystemName")); + typeSystemTable.setAuditTableName(resultSet.getString("AuditTableName")); + typeSystemTable.setPropsTableName(resultSet.getString("PropsTableName")); + typeSystemTable.setTypeSystemSuffix(detectTypeSystemSuffix(tableName, name)); + typeSystemTable.setTypeSystemRelatedTable(PersistenceInformation.isTypeSystemRelatedDeployment(name)); + allTypeSystemTables.add(typeSystemTable); + } + } + return allTypeSystemTables; + } + + private String detectTypeSystemSuffix(String tableName, String name) { + if (PersistenceInformation.isTypeSystemRelatedDeployment(name)) { + return getDataSourceConfiguration().getTypeSystemSuffix(); + } + return StringUtils.EMPTY; + } + + @Override + public boolean isAuditTable(String table) throws Exception { + String tablePrefix = getDataSourceConfiguration().getTablePrefix(); + String query = String.format("SELECT count(*) from %s%s WHERE AuditTableName = ? OR AuditTableName = ?", StringUtils.defaultIfBlank(tablePrefix, ""), CommercedbsyncConstants.DEPLOYMENTS_TABLE); + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(query); + ) { + stmt.setObject(1, StringUtils.removeStartIgnoreCase(table, tablePrefix)); + stmt.setObject(2, table); + try (ResultSet rs = stmt.executeQuery()) { + boolean isAudit = false; + if (rs.next()) { + isAudit = rs.getInt(1) > 0; + } + return isAudit; + } + } + } + + protected abstract String createAllTableNamesQuery(); + + @Override + public Set getAllColumnNames(String table) throws SQLException { + String allColumnNamesQuery = createAllColumnNamesQuery(table); + Set allColumnNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(allColumnNamesQuery) + ) { + while (resultSet.next()) { + allColumnNames.add(resultSet.getString(1)); + } + } + return allColumnNames; + } + + protected abstract String createAllColumnNamesQuery(String table); + + @Override + public DataSet getBatchWithoutIdentifier(OffsetQueryDefinition queryDefinition) throws Exception { + return getBatchWithoutIdentifier(queryDefinition, null); + } + + @Override + public DataSet getBatchWithoutIdentifier(OffsetQueryDefinition queryDefinition, Instant time) throws Exception { + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(1); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildOffsetBatchQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + @Override + public DataSet getBatchOrderedByColumn(SeekQueryDefinition queryDefinition) throws Exception { + return getBatchOrderedByColumn(queryDefinition, null); + } + + @Override + public DataSet getBatchOrderedByColumn(SeekQueryDefinition queryDefinition, Instant time) throws Exception { + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(2); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + if (queryDefinition.getLastColumnValue() != null) { + conditionsList.add(String.format("%s >= %s", queryDefinition.getColumn(), queryDefinition.getLastColumnValue())); + } + if (queryDefinition.getNextColumnValue() != null) { + conditionsList.add(String.format("%s < %s", queryDefinition.getColumn(), queryDefinition.getNextColumnValue())); + } + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildValueBatchQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + + @Override + public DataSet getBatchMarkersOrderedByColumn(MarkersQueryDefinition queryDefinition) throws Exception { + return getBatchMarkersOrderedByColumn(queryDefinition, null); + } + + @Override + public DataSet getBatchMarkersOrderedByColumn(MarkersQueryDefinition queryDefinition, Instant time) throws Exception { + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(2); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildBatchMarkersQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + @Override + public DataSet getUniqueColumns(String table) throws Exception { + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement()) { + ResultSet resultSet = stmt.executeQuery(createUniqueColumnsQuery(table)); + return convertToDataSet(resultSet); + } + } + + protected abstract String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions); + + protected abstract String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions); + + protected abstract String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions); + + protected abstract String createUniqueColumnsQuery(String tableName); + + protected void processDefaultConditions(String table, List conditionsList) { + String tsCondition = getTsCondition(table); + if (StringUtils.isNotEmpty(tsCondition)) { + conditionsList.add(tsCondition); + } + } + + + private String getTsCondition(String table) { + Objects.requireNonNull(table); + if (table.toLowerCase().endsWith(CommercedbsyncConstants.DEPLOYMENTS_TABLE)) { + return String.format("TypeSystemName = '%s'", getDataSourceConfiguration().getTypeSystemName()); + } + return null; + } + + protected String expandConditions(String[] conditions) { + if (conditions == null || conditions.length == 0) { + return "1=1"; + } else { + return Joiner.on(" and ").join(conditions); + } + } + + protected DataSet convertToBatchDataSet(ResultSet resultSet) throws Exception { + return convertToDataSet(resultSet); + } + + @Override + public boolean validateConnection() throws Exception { + try (Connection connection = getConnection()) { + return connection.isValid(120); + } + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureDataRepository.java new file mode 100644 index 0000000..47fac4e --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureDataRepository.java @@ -0,0 +1,176 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Joiner; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisPlatform; +import org.apache.commons.lang.StringUtils; +import org.apache.ddlutils.Platform; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import com.sap.cx.boosters.commercedbsync.repository.platform.MigrationHybrisMSSqlPlatform; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Types; + +public class AzureDataRepository extends AbstractDataRepository { + + private static final Logger LOG = LoggerFactory.getLogger(AzureDataRepository.class); + + private static final String LP_SUFFIX = "lp"; + + public AzureDataRepository(DataSourceConfiguration dataSourceConfiguration, DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + + @Override + protected void addCustomPlatformTypeMapping(Platform platform) { + platform.getPlatformInfo().addNativeTypeMapping(Types.NCLOB, "NVARCHAR(MAX)"); + platform.getPlatformInfo().addNativeTypeMapping(Types.CLOB, "NVARCHAR(MAX)"); + platform.getPlatformInfo().addNativeTypeMapping(Types.LONGVARCHAR, "NVARCHAR(MAX)"); + platform.getPlatformInfo().addNativeTypeMapping(Types.VARBINARY, "VARBINARY"); + platform.getPlatformInfo().addNativeTypeMapping(Types.REAL, "float"); + platform.getPlatformInfo().addNativeTypeMapping(Types.LONGVARBINARY, "VARBINARY(MAX)"); + platform.getPlatformInfo().addNativeTypeMapping(Types.NCHAR, "NVARCHAR"); + platform.getPlatformInfo().setHasSize(Types.NCHAR, true); + platform.getPlatformInfo().setHasSize(Types.VARBINARY, true); + platform.getPlatformInfo().setHasSize(Types.NVARCHAR, true); + platform.getPlatformInfo().setHasPrecisionAndScale(Types.REAL, false); + } + + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = Joiner.on(',').join(queryDefinition.getAllColumns()); + return String.format("SELECT * FROM %s WHERE %s ORDER BY %s OFFSET %s ROWS FETCH NEXT %s ROWS ONLY", queryDefinition.getTable(), expandConditions(conditions), orderBy, queryDefinition.getOffset(), queryDefinition.getBatchSize()); + } + + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + return String.format("select top %s * from %s where %s order by %s", queryDefinition.getBatchSize(), queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getColumn()); + } + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + String column = queryDefinition.getColumn(); + String tableName = queryDefinition.getTable(); + if (queryDefinition.isLpTableEnabled()){ + tableName = getLpTableName(tableName); + } + return String.format("SELECT t.%s, t.rownum\n" + + "FROM\n" + + "(\n" + + " SELECT %s, (ROW_NUMBER() OVER (ORDER BY %s))-1 AS rownum\n" + + " FROM %s\n WHERE %s" + + ") AS t\n" + + "WHERE t.rownum %% %s = 0\n" + + "ORDER BY t.%s", column, column, column, tableName, expandConditions(conditions), queryDefinition.getBatchSize(), column); + } + + @Override + protected String createAllTableNamesQuery() { + return String.format( + "SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '%s'", + getDataSourceConfiguration().getSchema()); + } + + @Override + protected String createAllColumnNamesQuery(String tableName) { + return String.format( + "SELECT DISTINCT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s'", + getDataSourceConfiguration().getSchema(), tableName); + } + + @Override + protected String getDisableIndexesScript(String table) { + return String.format("SELECT 'ALTER INDEX ' + QUOTENAME(I.name) + ' ON ' + QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+ QUOTENAME(T.name) + ' DISABLE' FROM sys.indexes I INNER JOIN sys.tables T ON I.object_id = T.object_id WHERE I.type_desc = 'NONCLUSTERED' AND I.name IS NOT NULL AND I.is_disabled = 0 AND T.name = '%s'", table); + } + + @Override + protected String getEnableIndexesScript(String table) { + return String.format("SELECT 'ALTER INDEX ' + QUOTENAME(I.name) + ' ON ' + QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+ QUOTENAME(T.name) + ' REBUILD' FROM sys.indexes I INNER JOIN sys.tables T ON I.object_id = T.object_id WHERE I.type_desc = 'NONCLUSTERED' AND I.name IS NOT NULL AND I.is_disabled = 1 AND T.name = '%s'", table); + } + + @Override + protected String getDropIndexesScript(String table) { + return String.format("SELECT 'DROP INDEX ' + QUOTENAME(I.name) + ' ON ' + QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+ QUOTENAME(T.name) FROM sys.indexes I INNER JOIN sys.tables T ON I.object_id = T.object_id WHERE I.type_desc = 'NONCLUSTERED' AND I.name IS NOT NULL AND T.name = '%s'", table); + } + + @Override + public float getDatabaseUtilization() throws SQLException { + String query = "SELECT TOP 1 end_time, (SELECT Max(v) FROM (VALUES (avg_cpu_percent),(avg_data_io_percent),(avg_log_write_percent)) AS value(v)) AS [avg_DTU_percent] FROM sys.dm_db_resource_stats ORDER by end_time DESC;"; + try (Connection connection = getConnection(); + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(query); + ) { + if (resultSet.next()) { + return resultSet.getFloat("avg_DTU_percent"); + } else { + //LOG.debug("There are no data with regard to Azure DTU"); + return -1; + } + } catch (Exception e) { + LOG.trace("could not load database utilization stats"); + return -1; + } + } + + @Override + protected Platform createPlatform(DatabaseSettings databaseSettings, DataSource dataSource) { + HybrisPlatform instance = MigrationHybrisMSSqlPlatform.build(databaseSettings); + instance.setDataSource(dataSource); + return instance; + } + + @Override + protected String createUniqueColumnsQuery(String tableName) { + return String.format("SELECT col.name FROM (\n" + + "SELECT TOP (1)\n" + + " SchemaName = t.schema_id,\n" + + " ObjectId = ind.object_id,\n" + + " IndexId = ind.index_id,\n" + + " TableName = t.name,\n" + + " IndexName = ind.name,\n" + + " ColCount = count(*)\n" + + "FROM \n" + + " sys.indexes ind \n" + + "INNER JOIN \n" + + " sys.tables t ON ind.object_id = t.object_id \n" + + "WHERE \n" + + " t.name = '%s'\n" + + " AND\n" + + " SCHEMA_NAME(t.schema_id) = '%s'\n" + + " AND\n" + + " ind.is_unique = 1\n" + + "GROUP BY t.schema_id,ind.object_id,ind.index_id,t.name,ind.name\n" + + "ORDER BY ColCount ASC\n" + + ") t1\n" + + "INNER JOIN \n" + + " sys.index_columns ic ON t1.ObjectId = ic.object_id and t1.IndexId = ic.index_id \n" + + "INNER JOIN \n" + + " sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id ", tableName, getDataSourceConfiguration().getSchema()); + } + + @Override + public DataBaseProvider getDatabaseProvider() { + return DataBaseProvider.MSSQL; + } + + private String getLpTableName(String tableName){ + return StringUtils.removeEndIgnoreCase(tableName,LP_SUFFIX); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureIncrementalDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureIncrementalDataRepository.java new file mode 100644 index 0000000..0e683d2 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/AzureIncrementalDataRepository.java @@ -0,0 +1,414 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Joiner; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.platform.util.Config; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AzureIncrementalDataRepository extends AzureDataRepository{ + + private static final Logger LOG = LoggerFactory.getLogger(AzureIncrementalDataRepository.class); + + private static final String LP_SUFFIX = "lp"; + + private static final String PK = "PK"; + + private static String deletionTable = Config.getParameter("db.tableprefix") == null ? "" : Config.getParameter("db.tableprefix")+ "itemdeletionmarkers"; + + public AzureIncrementalDataRepository( + DataSourceConfiguration dataSourceConfiguration, + DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + + if(queryDefinition.isDeletionEnabled()) { + return buildOffsetBatchQueryForDeletion(queryDefinition,conditions); + } else if(queryDefinition.isLpTableEnabled()) { + return buildOffsetBatchQueryForLp(queryDefinition,conditions); + } + else { + return super.buildOffsetBatchQuery(queryDefinition,conditions); + } + } + + private String buildOffsetBatchQueryForLp(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = PK; + return String.format("SELECT * FROM %s WHERE %s ORDER BY %s OFFSET %s ROWS FETCH NEXT %s ROWS ONLY", getLpTableName(queryDefinition.getTable()), expandConditions(conditions), orderBy, queryDefinition.getOffset(), queryDefinition.getBatchSize()); + } + + private String buildOffsetBatchQueryForDeletion(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = Joiner.on(',').join(queryDefinition.getAllColumns()); + return String.format("SELECT * FROM %s WHERE %s ORDER BY %s OFFSET %s ROWS FETCH NEXT %s ROWS ONLY", deletionTable, expandConditions(conditions), orderBy, queryDefinition.getOffset(), queryDefinition.getBatchSize()); + } + + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + if(queryDefinition.isDeletionEnabled()) { + return buildValueBatchQueryForDeletion(queryDefinition,conditions); + } else { + return super.buildValueBatchQuery(queryDefinition,conditions); + } + } + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + if(queryDefinition.isDeletionEnabled()) { + return buildBatchMarkersQueryForDeletion(queryDefinition,conditions); + } else if(queryDefinition.isLpTableEnabled()) { + return super.buildBatchMarkersQuery(queryDefinition,conditions); + } else { + return super.buildBatchMarkersQuery(queryDefinition,conditions); + } + } + + @Override + public DataSet getBatchOrderedByColumn(SeekQueryDefinition queryDefinition, Instant time) throws Exception { + if(queryDefinition.isDeletionEnabled()) { + return getBatchOrderedByColumnForDeletion(queryDefinition,time); + } else if(queryDefinition.isLpTableEnabled()){ + return getBatchOrderedByColumnForLptable(queryDefinition,time); + } else { + return super.getBatchOrderedByColumn(queryDefinition,time); + } + } + + private String buildValueBatchQueryForDeletion(SeekQueryDefinition queryDefinition, String... conditions) { + return String.format("select top %s * from %s where %s order by %s", queryDefinition.getBatchSize(), deletionTable, expandConditions(conditions), queryDefinition.getColumn()); + } + + private DataSet getBatchOrderedByColumnForLptable(SeekQueryDefinition queryDefinition, Instant time) throws Exception { + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(2); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + if (queryDefinition.getLastColumnValue() != null) { + conditionsList.add(String.format("%s >= %s", queryDefinition.getColumn(), queryDefinition.getLastColumnValue())); + } + if (queryDefinition.getNextColumnValue() != null) { + conditionsList.add(String.format("%s < %s", queryDefinition.getColumn(), queryDefinition.getNextColumnValue())); + } + String[] conditions = null; + List pkList = new ArrayList(); + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connectionForPk = getConnection(); + PreparedStatement stmt = connectionForPk.prepareStatement(buildValueBatchQueryForLptable(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + ResultSet pkResultSet = stmt.executeQuery(); + pkList = convertToPkListForLpTable(pkResultSet); + } + + // migrating LP Table no + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildValueBatchQueryForLptableWithPK(queryDefinition,pkList, conditions))) { + // stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + private List convertToPkListForLpTable(ResultSet resultSet) throws Exception { + List pkList = new ArrayList<>(); + while (resultSet.next()) { + int idx = resultSet.findColumn(PK); + pkList.add(resultSet.getString(idx)); + } + return pkList; + } + + private String buildValueBatchQueryForLptableWithPK(SeekQueryDefinition queryDefinition, List pkList, String... conditions ) { + + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("select * from %s where ", queryDefinition.getTable())); + sqlBuilder.append("\n"); + sqlBuilder.append(String.format("ITEMPK in (%s) " , Joiner.on(',').join(pkList.stream().map(column -> " " + column).collect(Collectors.toList())))); + sqlBuilder.append(String.format("%s order by %s ", expandConditions(conditions), queryDefinition.getColumn())); + sqlBuilder.append(";"); + + return sqlBuilder.toString(); + } + + private String buildValueBatchQueryForLptableWithPK(OffsetQueryDefinition queryDefinition, List pkList, String... conditions ) { + + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("select * from %s where ", queryDefinition.getTable())); + sqlBuilder.append("\n"); + sqlBuilder.append(String.format("ITEMPK in (%s) " , Joiner.on(',').join(pkList.stream().map(column -> " " + column).collect(Collectors.toList())))); + sqlBuilder.append(";"); + + return sqlBuilder.toString(); + } + private String buildValueBatchQueryForLptable(SeekQueryDefinition queryDefinition, String... conditions) { + return String.format("select top %s PK from %s where %s order by %s", queryDefinition.getBatchSize(), getLpTableName(queryDefinition.getTable()), expandConditions(conditions), queryDefinition.getColumn()); + } + + private String buildOffsetBatchQueryForLptable(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = PK; + return String.format("SELECT PK FROM %s WHERE %s ORDER BY %s OFFSET %s ROWS FETCH NEXT %s ROWS ONLY", getLpTableName(queryDefinition.getTable()), expandConditions(conditions), orderBy, queryDefinition.getOffset(), queryDefinition.getBatchSize()); + } + + private DataSet getBatchOrderedByColumnForDeletion(SeekQueryDefinition queryDefinition, Instant time) throws Exception { + + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(3); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + conditionsList.add("p_table = ?"); + if (queryDefinition.getLastColumnValue() != null) { + conditionsList.add(String.format("%s >= %s", queryDefinition.getColumn(), queryDefinition.getLastColumnValue())); + } + if (queryDefinition.getNextColumnValue() != null) { + conditionsList.add(String.format("%s < %s", queryDefinition.getColumn(), queryDefinition.getNextColumnValue())); + } + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildValueBatchQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + // setting table for the deletions + stmt.setString(2,queryDefinition.getTable()); + + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + @Override + public DataSet getBatchWithoutIdentifier(OffsetQueryDefinition queryDefinition, Instant time) throws Exception { + + if(queryDefinition.isDeletionEnabled()) { + return getBatchWithoutIdentifierForDeletion(queryDefinition,time); + } else if(queryDefinition.isLpTableEnabled()){ + return getBatchWithoutIdentifierForLptable(queryDefinition,time); + } else { + return super.getBatchWithoutIdentifier(queryDefinition,time); + } + } + + private DataSet getBatchWithoutIdentifierForDeletion(OffsetQueryDefinition queryDefinition, Instant time) throws Exception { + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(2); + + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + conditionsList.add("p_table = ?"); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildOffsetBatchQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + // setting table for the deletions + stmt.setString(2,queryDefinition.getTable()); + + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + private DataSet getBatchWithoutIdentifierForLptable(OffsetQueryDefinition queryDefinition, Instant time) throws Exception { + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(1); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + List pkList = new ArrayList(); + try (Connection connectionForPk = getConnection(); + PreparedStatement stmt = connectionForPk.prepareStatement(buildOffsetBatchQueryForLptable(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + ResultSet pkResultSet = stmt.executeQuery(); + pkList = convertToPkListForLpTable(pkResultSet); + } + + // migrating LP Table no + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildValueBatchQueryForLptableWithPK(queryDefinition,pkList, conditions))) { + // stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + + } + + @Override + public DataSet getBatchMarkersOrderedByColumn(MarkersQueryDefinition queryDefinition, Instant time) throws Exception { + + if(!queryDefinition.isDeletionEnabled()) { + return super.getBatchMarkersOrderedByColumn(queryDefinition,time); + } + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(2); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + // setting table for the deletions + conditionsList.add("p_table = ?"); + + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildBatchMarkersQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + // setting table for the deletions + stmt.setString(2,queryDefinition.getTable()); + + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + @Override + public long getRowCountModifiedAfter(String table, Instant time,boolean isDeletionEnabled, boolean lpTableMigrationEnabled) throws SQLException { + if(isDeletionEnabled) { + return getRowCountModifiedAfterforDeletion(table,time); + } else if(lpTableMigrationEnabled) { + return getRowCountModifiedAfterforLpTable(table,time); + } + else{ + return super.getRowCountModifiedAfter(table,time,false,false); + + } + } + + private long getRowCountModifiedAfterforLpTable(String table, Instant time) throws SQLException { + List conditionsList = new ArrayList<>(1); + processDefaultConditions(table, conditionsList); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection()) { + try (PreparedStatement stmt = connection.prepareStatement(String.format("select count(*) from %s where modifiedts > ? AND %s", getLpTableName(table), expandConditions(conditions)))) { + stmt.setTimestamp(1, Timestamp.from(time)); + ResultSet resultSet = stmt.executeQuery(); + long value = 0; + if (resultSet.next()) { + value = resultSet.getLong(1); + } + return value; + } + } + } + + private long getRowCountModifiedAfterforDeletion(String table, Instant time) throws SQLException { + // + List conditionsList = new ArrayList<>(2); + processDefaultConditions(table, conditionsList); + // setting table for the deletions + conditionsList.add("p_table = ?"); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection()) { + try (PreparedStatement stmt = connection.prepareStatement(String.format("select count(*) from %s where modifiedts > ? AND %s", deletionTable, expandConditions(conditions)))) { + stmt.setTimestamp(1, Timestamp.from(time)); + // setting table for the deletions + stmt.setString(2,table); + ResultSet resultSet = stmt.executeQuery(); + long value = 0; + if (resultSet.next()) { + value = resultSet.getLong(1); + } + return value; + } + } + } + + private String buildBatchMarkersQueryForDeletion(MarkersQueryDefinition queryDefinition, String... conditions) { + String column = queryDefinition.getColumn(); + return String.format("SELECT t.%s, t.rownum\n" + + "FROM\n" + + "(\n" + + " SELECT %s, (ROW_NUMBER() OVER (ORDER BY %s))-1 AS rownum\n" + + " FROM %s\n WHERE %s" + + ") AS t\n" + + "WHERE t.rownum %% %s = 0\n" + + "ORDER BY t.%s", column, column, column, deletionTable, expandConditions(conditions), queryDefinition.getBatchSize(), column); + } + + private long getRowCountModifiedAfterForLP(String table, Instant time) throws SQLException { + List conditionsList = new ArrayList<>(1); + + if (! StringUtils.endsWithIgnoreCase(table,LP_SUFFIX)) { + return super.getRowCountModifiedAfter(table,time,false,false); + } + table = StringUtils.removeEndIgnoreCase(table,LP_SUFFIX); + + processDefaultConditions(table, conditionsList); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection()) { + try (PreparedStatement stmt = connection.prepareStatement(String.format("select count(*) from %s where modifiedts > ? AND %s", table, expandConditions(conditions)))) { + stmt.setTimestamp(1, Timestamp.from(time)); + ResultSet resultSet = stmt.executeQuery(); + long value = 0; + if (resultSet.next()) { + value = resultSet.getLong(1); + } + return value; + } + } + } + + private String getLpTableName(String tableName){ + return StringUtils.removeEndIgnoreCase(tableName,LP_SUFFIX); + } + } diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataIncrementalRepositoryFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataIncrementalRepositoryFactory.java new file mode 100644 index 0000000..a1a5391 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataIncrementalRepositoryFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Strings; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; + +public class DataIncrementalRepositoryFactory extends DataRepositoryFactory { + + public DataIncrementalRepositoryFactory(DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(databaseMigrationDataTypeMapperService); + } + + public DataRepository create(DataSourceConfiguration dataSourceConfiguration) + throws Exception { + String connectionString = dataSourceConfiguration.getConnectionString(); + if (Strings.isNullOrEmpty(connectionString)) { + throw new RuntimeException("No connection string provided for data source '" + dataSourceConfiguration.getProfile() + "'"); + } else { + String connectionStringLower = connectionString.toLowerCase(); + if (connectionStringLower.startsWith("jdbc:mysql")) { + return new MySQLIncrementalDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:sqlserver")) { + return new AzureIncrementalDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:oracle")) { + return new OracleDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:sap")) { + return new HanaDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:hsqldb")) { + return new HsqlRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:postgresql")) { + return new PostGresDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + } + throw new RuntimeException("Cannot handle connection string for " + connectionString); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataRepositoryFactory.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataRepositoryFactory.java new file mode 100644 index 0000000..35435e8 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/DataRepositoryFactory.java @@ -0,0 +1,47 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Strings; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; + +public class DataRepositoryFactory { + + protected final DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService; + + public DataRepositoryFactory(DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + this.databaseMigrationDataTypeMapperService = databaseMigrationDataTypeMapperService; + } + + public DataRepository create(DataSourceConfiguration dataSourceConfiguration) + throws Exception { + String connectionString = dataSourceConfiguration.getConnectionString(); + if (Strings.isNullOrEmpty(connectionString)) { + throw new RuntimeException("No connection string provided for data source '" + dataSourceConfiguration.getProfile() + "'"); + } else { + String connectionStringLower = connectionString.toLowerCase(); + if (connectionStringLower.startsWith("jdbc:mysql")) { + return new MySQLDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:sqlserver")) { + return new AzureDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:oracle")) { + return new OracleDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:sap")) { + return new HanaDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:hsqldb")) { + return new HsqlRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:postgresql")) { + return new PostGresDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } else if (connectionStringLower.startsWith("jdbc:postgresql")) { + return new PostGresDataRepository(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + } + throw new RuntimeException("Cannot handle connection string for " + connectionString); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HanaDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HanaDataRepository.java new file mode 100644 index 0000000..8cc44b6 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HanaDataRepository.java @@ -0,0 +1,118 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Joiner; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.repository.platform.MigrationHybrisHANAPlatform; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisPlatform; +import org.apache.ddlutils.Platform; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +import javax.sql.DataSource; +import java.sql.Types; + +public class HanaDataRepository extends AbstractDataRepository { + + public HanaDataRepository(DataSourceConfiguration dataSourceConfiguration, DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = Joiner.on(',').join(queryDefinition.getAllColumns()); + return String.format("select * from %s where %s order by %s limit %s offset %s", queryDefinition.getTable(), expandConditions(conditions), orderBy, queryDefinition.getBatchSize(), queryDefinition.getOffset()); + } + + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + return String.format("select * from %s where %s order by %s limit %s", queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getColumn(), queryDefinition.getBatchSize()); + } + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + String column = queryDefinition.getColumn(); + return String.format("SELECT t.%s, t.rownr as \"rownum\" \n" + + "FROM\n" + + "(\n" + + " SELECT %s, (ROW_NUMBER() OVER (ORDER BY %s))-1 AS rownr\n" + + " FROM %s\n WHERE %s" + + ") t\n" + + "WHERE mod(t.rownr,%s) = 0\n" + + "ORDER BY t.%s", column, column, column, queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getBatchSize(), column); + } + + @Override + protected String createAllTableNamesQuery() { + return String.format("select distinct table_name from table_columns where lower(schema_name) = lower('%s') order by table_name", getDataSourceConfiguration().getSchema()); + } + + @Override + protected String createAllColumnNamesQuery(String table) { + return String.format("select distinct column_name from table_columns where lower(schema_name) = lower('%s') and lower(table_name) = lower('%s')", getDataSourceConfiguration().getSchema(), table); + } + @Override + public void runSqlScript(Resource resource) { + final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource); + databasePopulator.setIgnoreFailedDrops(true); + databasePopulator.setSeparator("#"); + databasePopulator.execute(getDataSource()); + } + + @Override + protected String createUniqueColumnsQuery(String tableName) { + return String.format("SELECT t2.\"COLUMN_NAME\"\n" + + "FROM\n" + + "(\n" + + " SELECT * FROM (\n" + + " SELECT i.\"SCHEMA_NAME\", i.\"TABLE_NAME\", i.\"INDEX_NAME\", count(*) as \"COL_COUNT\"\n" + + " FROM INDEXES i\n" + + " INNER JOIN INDEX_COLUMNS c\n" + + " ON i.\"INDEX_NAME\" = c.\"INDEX_NAME\" AND i.\"SCHEMA_NAME\" = c.\"SCHEMA_NAME\" AND i.\"TABLE_NAME\" = c.\"TABLE_NAME\"\n" + + " WHERE \n" + + " lower(i.\"SCHEMA_NAME\") = lower('%s')\n" + + " AND\n" + + " lower(i.\"TABLE_NAME\") = lower('%s')\n" + + " AND(\n" + + " lower(i.\"CONSTRAINT\") = lower('UNIQUE') OR \n" + + " lower(i.\"CONSTRAINT\") = lower('PRIMARY KEY'))\n" + + " GROUP BY i.\"SCHEMA_NAME\", i.\"TABLE_NAME\", i.\"INDEX_NAME\"\n" + + " ORDER BY COL_COUNT ASC \n" + + " )\n" + + " LIMIT 1\n" + + ") t1\n" + + "INNER JOIN INDEX_COLUMNS t2\n" + + "ON t1.\"INDEX_NAME\" = t2.\"INDEX_NAME\" AND t1.\"SCHEMA_NAME\" = t2.\"SCHEMA_NAME\" AND t1.\"TABLE_NAME\" = t2.\"TABLE_NAME\"", getDataSourceConfiguration().getSchema(), tableName); + } + + @Override + protected void addCustomPlatformTypeMapping(final Platform platform) { + platform.getPlatformInfo().addNativeTypeMapping(Types.NCHAR, "NVARCHAR", Types.NVARCHAR); + platform.getPlatformInfo().addNativeTypeMapping(Types.CHAR, "VARCHAR", Types.VARCHAR); + platform.getPlatformInfo().addNativeTypeMapping(Types.DOUBLE, "DECIMAL", Types.DECIMAL); + // platform.getPlatformInfo().addNativeTypeMapping(-1, "NCLOB", Types.NCLOB); + } + @Override + public DataBaseProvider getDatabaseProvider() { + return DataBaseProvider.HANA; + } + + @Override + protected Platform createPlatform(DatabaseSettings databaseSettings, DataSource dataSource) { + HybrisPlatform instance = MigrationHybrisHANAPlatform.build(databaseSettings); + instance.setDataSource(dataSource); + return instance; + } +} + diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HsqlRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HsqlRepository.java new file mode 100644 index 0000000..3b8708a --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/HsqlRepository.java @@ -0,0 +1,56 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; + +public class HsqlRepository extends AbstractDataRepository { + + public HsqlRepository(DataSourceConfiguration dataSourceConfiguration, DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + protected String createAllTableNamesQuery() { + throw new UnsupportedOperationException(); + } + + @Override + protected String createAllColumnNamesQuery(String table) { + throw new UnsupportedOperationException(); + } + + @Override + protected String createUniqueColumnsQuery(String tableName) { + throw new UnsupportedOperationException("not implemented"); + } + + @Override + public DataBaseProvider getDatabaseProvider() { + return DataBaseProvider.HSQL; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLDataRepository.java new file mode 100644 index 0000000..fbc019f --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLDataRepository.java @@ -0,0 +1,80 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Joiner; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; + +public class MySQLDataRepository extends AbstractDataRepository { + public MySQLDataRepository(DataSourceConfiguration dataSourceConfiguration, DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = Joiner.on(',').join(queryDefinition.getAllColumns()); + return String.format("select * from %s where %s order by %s limit %s,%s", queryDefinition.getTable(), expandConditions(conditions), orderBy, queryDefinition.getOffset(), queryDefinition.getBatchSize()); + } + + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + return String.format("select * from %s where %s order by %s limit %s", queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getColumn(), queryDefinition.getBatchSize()); + } + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + String column = queryDefinition.getColumn(); + return String.format("SELECT %s,rownum\n" + + "FROM ( \n" + + " SELECT \n" + + " @row := @row +1 AS rownum, %s \n" + + " FROM (SELECT @row :=-1) r, %s WHERE %s ORDER BY %s) ranked \n" + + "WHERE rownum %% %s = 0 ", column, column, queryDefinition.getTable(), expandConditions(conditions), column, queryDefinition.getBatchSize()); + } + + @Override + protected String createAllTableNamesQuery() { + return String.format( + "select TABLE_NAME from information_schema.tables where table_schema = '%s' and TABLE_TYPE = 'BASE TABLE'", + getDataSourceConfiguration().getSchema()); + } + + @Override + protected String createAllColumnNamesQuery(String tableName) { + return String.format( + "SELECT DISTINCT COLUMN_NAME from information_schema.columns where table_schema = '%s' AND TABLE_NAME = '%s'", + getDataSourceConfiguration().getSchema(), tableName); + } + + @Override + protected String createUniqueColumnsQuery(String tableName) { + return String.format( + "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.STATISTICS t1\n" + + "INNER JOIN \n" + + "(\n" + + "SELECT DISTINCT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, count(INDEX_NAME) as COL_COUNT \n" + + "FROM INFORMATION_SCHEMA.STATISTICS \n" + + "WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s' AND NON_UNIQUE = 0\n" + + "GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME\n" + + "ORDER BY COL_COUNT ASC\n" + + "LIMIT 1\n" + + ") t2\n" + + "ON t1.TABLE_SCHEMA = t2.TABLE_SCHEMA AND t1.TABLE_NAME = t2.TABLE_NAME AND t1.INDEX_NAME = t2.INDEX_NAME\n" + + ";\n", + getDataSourceConfiguration().getSchema(), tableName); + } + + @Override + public DataBaseProvider getDatabaseProvider() { + return DataBaseProvider.MYSQL; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLIncrementalDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLIncrementalDataRepository.java new file mode 100644 index 0000000..bc2582b --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/MySQLIncrementalDataRepository.java @@ -0,0 +1,206 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Joiner; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.platform.util.Config; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MySQLIncrementalDataRepository extends MySQLDataRepository{ + + private static final Logger LOG = LoggerFactory.getLogger(MySQLIncrementalDataRepository.class); + + private static String deletionTable = Config.getParameter("db.tableprefix") == null ? "" : Config.getParameter("db.tableprefix")+ "itemdeletionmarkers"; + + public MySQLIncrementalDataRepository( + DataSourceConfiguration dataSourceConfiguration, + DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + + if(!queryDefinition.isDeletionEnabled()) { + return super.buildOffsetBatchQuery(queryDefinition,conditions); + } + String orderBy = Joiner.on(',').join(queryDefinition.getAllColumns()); + return String.format("select * from %s where %s order by %s limit %s,%s", deletionTable, expandConditions(conditions), orderBy, queryDefinition.getOffset(), queryDefinition.getBatchSize()); + } + + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + if(!queryDefinition.isDeletionEnabled()) { + return super.buildValueBatchQuery(queryDefinition,conditions); + } + return String.format("select * from %s where %s order by %s limit %s", deletionTable, expandConditions(conditions), queryDefinition.getColumn(), queryDefinition.getBatchSize()); + } + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + if(!queryDefinition.isDeletionEnabled()) { + return super.buildBatchMarkersQuery(queryDefinition,conditions); + } + String column = queryDefinition.getColumn(); + return String.format("SELECT %s,rownum\n" + + "FROM ( \n" + + " SELECT \n" + + " @row := @row +1 AS rownum, %s \n" + + " FROM (SELECT @row :=-1) r, %s WHERE %s ORDER BY %s) ranked \n" + + "WHERE rownum %% %s = 0 ", column, column, deletionTable, expandConditions(conditions), column, queryDefinition.getBatchSize()); + } + + + + + @Override + public DataSet getBatchOrderedByColumn(SeekQueryDefinition queryDefinition, Instant time) throws Exception { + // + if(!queryDefinition.isDeletionEnabled()) { + return super.getBatchOrderedByColumn(queryDefinition,time); + } + + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(3); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + conditionsList.add("p_table = ?"); + if (queryDefinition.getLastColumnValue() != null) { + conditionsList.add(String.format("%s >= %s", queryDefinition.getColumn(), queryDefinition.getLastColumnValue())); + } + if (queryDefinition.getNextColumnValue() != null) { + conditionsList.add(String.format("%s < %s", queryDefinition.getColumn(), queryDefinition.getNextColumnValue())); + } + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildValueBatchQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + // setting table for the deletions + stmt.setString(2,queryDefinition.getTable()); + + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + @Override + public DataSet getBatchWithoutIdentifier(OffsetQueryDefinition queryDefinition, Instant time) throws Exception { + + if(!queryDefinition.isDeletionEnabled()) { + return super.getBatchWithoutIdentifier(queryDefinition,time); + } + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(2); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + conditionsList.add("p_table = ?"); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildOffsetBatchQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + // setting table for the deletions + stmt.setString(2,queryDefinition.getTable()); + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + + + } + + @Override + public DataSet getBatchMarkersOrderedByColumn(MarkersQueryDefinition queryDefinition, Instant time) throws Exception { + + if(!queryDefinition.isDeletionEnabled()) { + return super.getBatchMarkersOrderedByColumn(queryDefinition,time); + } + //get batches with modifiedts >= configured time for incremental migration + List conditionsList = new ArrayList<>(2); + processDefaultConditions(queryDefinition.getTable(), conditionsList); + if (time != null) { + conditionsList.add("modifiedts > ?"); + } + // setting table for the deletions + conditionsList.add("p_table = ?"); + + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection(); + PreparedStatement stmt = connection.prepareStatement(buildBatchMarkersQuery(queryDefinition, conditions))) { + stmt.setFetchSize(Long.valueOf(queryDefinition.getBatchSize()).intValue()); + if (time != null) { + stmt.setTimestamp(1, Timestamp.from(time)); + } + // setting table for the deletions + stmt.setString(2,queryDefinition.getTable()); + + ResultSet resultSet = stmt.executeQuery(); + return convertToBatchDataSet(resultSet); + } + } + + @Override + public long getRowCountModifiedAfter(String table, Instant time,boolean isDeletionEnabled,boolean lpTableMigrationEnabled) throws SQLException { + if(!isDeletionEnabled) { + return super.getRowCountModifiedAfter(table,time,false,false); + } + // + List conditionsList = new ArrayList<>(2); + processDefaultConditions(table, conditionsList); + // setting table for the deletions + conditionsList.add("p_table = ?"); + String[] conditions = null; + if (conditionsList.size() > 0) { + conditions = conditionsList.toArray(new String[conditionsList.size()]); + } + try (Connection connection = getConnection()) { + try (PreparedStatement stmt = connection.prepareStatement(String.format("select count(*) from %s where modifiedts > ? AND %s", deletionTable, expandConditions(conditions)))) { + stmt.setTimestamp(1, Timestamp.from(time)); + // setting table for the deletions + stmt.setString(2,table); + ResultSet resultSet = stmt.executeQuery(); + long value = 0; + if (resultSet.next()) { + value = resultSet.getLong(1); + } + return value; + } + } + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/OracleDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/OracleDataRepository.java new file mode 100644 index 0000000..db46d3a --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/OracleDataRepository.java @@ -0,0 +1,232 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisOraclePlatform; +import de.hybris.bootstrap.ddl.HybrisPlatform; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Collections; + +import javax.sql.DataSource; + +import org.apache.ddlutils.Platform; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +import com.google.common.base.Joiner; + +public class OracleDataRepository extends AbstractDataRepository { + public OracleDataRepository(final DataSourceConfiguration dataSourceConfiguration, + final DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + ensureJdbcCompliance(); + } + + private void ensureJdbcCompliance() { + // without this types like timestamps may not be jdbc compliant + System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true"); + // ORACLE_TARGET - START + System.getProperties().setProperty("oracle.jdbc.autoCommitSpecCompliant", "false"); + // ORACLE_TARGET - END + } + + @Override + protected DataSet convertToBatchDataSet(final ResultSet resultSet) throws Exception { + return convertToDataSet(resultSet, Collections.singleton("rn")); + } + + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = Joiner.on(',').join(queryDefinition.getAllColumns()); + return String.format( + "select * " + + " from ( " + + " select /*+ first_rows(%s) */ " + + " t.*, " + + " row_number() " + + " over (order by %s) rn " + + " from %s t where %s) " + + "where rn between %s and %s " + + "order by rn", queryDefinition.getBatchSize(), orderBy, queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getOffset() + 1, queryDefinition.getOffset() + queryDefinition.getBatchSize()); + } + + // https://blogs.oracle.com/oraclemagazine/on-top-n-and-pagination-queries + // "Pagination in Getting Rows N Through M" + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + return String.format( + "select * " + + " from ( " + + " select /*+ first_rows(%s) */ " + + " t.*, " + + " row_number() " + + " over (order by t.%s) rn " + + " from %s t where %s) " + + "where rn <= %s " + + "order by rn", queryDefinition.getBatchSize(), queryDefinition.getColumn(), queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getBatchSize()); + } + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + String column = queryDefinition.getColumn(); + return String.format("SELECT t.%s, t.rownr as \"rownum\" \n" + + "FROM\n" + + "(\n" + + " SELECT %s, (ROW_NUMBER() OVER (ORDER BY %s))-1 AS rownr\n" + + " FROM %s\n WHERE %s" + + ") t\n" + + "WHERE mod(t.rownr,%s) = 0\n" + + "ORDER BY t.%s", column, column, column, queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getBatchSize(), column); + } + + @Override + protected String createAllTableNamesQuery() { + return String.format( + "select distinct TABLE_NAME from ALL_TAB_COLUMNS where lower(OWNER) = lower('%s')", + getDataSourceConfiguration().getSchema()); + } + + @Override + protected String createAllColumnNamesQuery(String table) { + return String.format( + "select distinct COLUMN_NAME from ALL_TAB_COLUMNS where lower(OWNER) = lower('%s') AND lower(TABLE_NAME) = lower('%s')", + getDataSourceConfiguration().getSchema(), table); + } + + @Override + protected String createUniqueColumnsQuery(String tableName) { + return String.format("SELECT t2.\"COLUMN_NAME\"\n" + + "FROM\n" + + "(\n" + + " SELECT * FROM (\n" + + " SELECT i.\"OWNER\", i.\"TABLE_NAME\", i.\"INDEX_NAME\", count(*) as \"COL_COUNT\"\n" + + " FROM ALL_INDEXES i\n" + + " INNER JOIN ALL_IND_COLUMNS c\n" + + " ON i.\"INDEX_NAME\" = c.\"INDEX_NAME\" AND i.\"OWNER\" = c.\"INDEX_OWNER\" AND i.\"TABLE_NAME\" = c.\"TABLE_NAME\"\n" + + " WHERE \n" + + " lower(i.\"OWNER\") = lower('%s')\n" + + " AND\n" + + " lower(i.\"TABLE_NAME\") = lower('%s')\n" + + " AND\n" + + " lower(i.\"UNIQUENESS\") = lower('UNIQUE')\n" + + " GROUP BY i.\"OWNER\", i.\"TABLE_NAME\", i.\"INDEX_NAME\"\n" + + " ORDER BY COL_COUNT ASC \n" + + " )\n" + + " WHERE ROWNUM = 1\n" + + ") t1\n" + + "INNER JOIN ALL_IND_COLUMNS t2\n" + + "ON t1.\"INDEX_NAME\" = t2.\"INDEX_NAME\" AND t1.\"OWNER\" = t2.\"INDEX_OWNER\" AND t1.\"TABLE_NAME\" = t2.\"TABLE_NAME\"", getDataSourceConfiguration().getSchema(), tableName); + } + + @Override + protected Platform createPlatform(final DatabaseSettings databaseSettings, final DataSource dataSource) { + final HybrisPlatform platform = HybrisOraclePlatform.build(databaseSettings); + /* + * ORACLE_TARGET -> if the JdbcModelReader.readTables() is invoked with + * a null schemaPattern, protected Collection readTables(String catalog, + * String schemaPattern, String[] tableTypes) throws SQLException { + * ..then in Oracle it retrieves ALL the tables ..include SYS. This + * causes other issues such as Unsupported JDBC Type Exception, + * therefore always set the schema pattern to the target Oracle's + * schema. + */ + platform.getModelReader().setDefaultSchemaPattern(getDataSourceConfiguration().getSchema()); + platform.setDataSource(dataSource); + return platform; + } + + // ORACLE_TARGET, the separator needs to be in place for the PL/SQL style + // blocks to run, else you get an EOF exception with ; + @Override + public void runSqlScript(final Resource resource) { + final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource); + databasePopulator.setIgnoreFailedDrops(true); + databasePopulator.setSeparator("/"); + databasePopulator.execute(getDataSource()); + + } + + @Override + public float getDatabaseUtilization() throws SQLException { + return (float) 1.00; + } + + /* + * @Override protected void addCustomPlatformTypeMapping(Platform platform) + * { //System.out.println("$$SETTING ORACLE TYPE "); + * + * platform.getPlatformInfo().addNativeTypeMapping(2009, "SQLXML"); try { + * platform.getPlatformInfo().addNativeTypeMapping(981939, "TEST"); } catch + * (Exception e) { throw e; + * + * } + * + * } + */ + + @Override + protected void addCustomPlatformTypeMapping(final Platform platform) { + // platform.getPlatformInfo().addNativeTypeMapping(Types.NCLOB, + // "NVARCHAR(MAX)"); + // platform.getPlatformInfo().addNativeTypeMapping(Types.CLOB, + // "NVARCHAR(MAX)"); + // platform.getPlatformInfo().addNativeTypeMapping(Types.NVARCHAR, + // "VARCHAR2"); + + platform.getPlatformInfo().addNativeTypeMapping(Types.NVARCHAR, "VARCHAR2"); + platform.getPlatformInfo().setHasSize(Types.NVARCHAR, true); + platform.getPlatformInfo().addNativeTypeMapping(Types.VARBINARY, "BLOB"); + platform.getPlatformInfo().setHasSize(Types.VARBINARY, false); + + platform.getPlatformInfo().addNativeTypeMapping(Types.REAL, "NUMBER(30,8)"); + platform.getPlatformInfo().setHasPrecisionAndScale(Types.REAL, false); + + platform.getPlatformInfo().addNativeTypeMapping(Types.DOUBLE, "NUMBER(30,8)"); + platform.getPlatformInfo().setHasPrecisionAndScale(Types.DOUBLE, false); + platform.getPlatformInfo().setHasSize(Types.DOUBLE, false); + + platform.getPlatformInfo().addNativeTypeMapping(Types.BIGINT, "NUMBER(20,0)"); + platform.getPlatformInfo().setHasSize(Types.BIGINT, false); + platform.getPlatformInfo().setHasPrecisionAndScale(Types.BIGINT, false); + + platform.getPlatformInfo().addNativeTypeMapping(Types.INTEGER, "NUMBER(20,0)"); + platform.getPlatformInfo().setHasSize(Types.INTEGER, false); + platform.getPlatformInfo().setHasPrecisionAndScale(Types.INTEGER, false); + + platform.getPlatformInfo().addNativeTypeMapping(Types.TINYINT, "NUMBER(1,0)"); + platform.getPlatformInfo().setHasSize(Types.TINYINT, false); + platform.getPlatformInfo().setHasPrecisionAndScale(Types.TINYINT, false); + + platform.getPlatformInfo().addNativeTypeMapping(Types.CHAR, "NUMBER(10,0)"); + platform.getPlatformInfo().setHasSize(Types.CHAR, false); + platform.getPlatformInfo().setHasPrecisionAndScale(Types.CHAR, false); + // platform.getPlatformInfo().setHasNullDefault(Types.CHAR, true); + + // platform.getPlatformInfo().addNativeTypeMapping(Types.REAL, "float"); + // platform.getPlatformInfo().addNativeTypeMapping(Types.LONGVARBINARY, + // "VARBINARY(MAX)"); + + // platform.getPlatformInfo().setHasPrecisionAndScale(Types.REAL, + // false); + } + + @Override + public DataBaseProvider getDatabaseProvider() { + return DataBaseProvider.ORACLE; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/PostGresDataRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/PostGresDataRepository.java new file mode 100644 index 0000000..257b5d4 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/impl/PostGresDataRepository.java @@ -0,0 +1,110 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.impl; + +import com.google.common.base.Joiner; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import de.hybris.bootstrap.ddl.DataBaseProvider; +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisPlatform; +import org.apache.ddlutils.Platform; +import com.sap.cx.boosters.commercedbsync.MarkersQueryDefinition; +import com.sap.cx.boosters.commercedbsync.OffsetQueryDefinition; +import com.sap.cx.boosters.commercedbsync.SeekQueryDefinition; +import com.sap.cx.boosters.commercedbsync.repository.platform.MigrationHybrisPostGresPlatform; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +import javax.sql.DataSource; + +public class PostGresDataRepository extends AbstractDataRepository { + public PostGresDataRepository(DataSourceConfiguration dataSourceConfiguration, DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService) { + super(dataSourceConfiguration, databaseMigrationDataTypeMapperService); + } + + @Override + protected String buildOffsetBatchQuery(OffsetQueryDefinition queryDefinition, String... conditions) { + String orderBy = Joiner.on(',').join(queryDefinition.getAllColumns()); + return String.format("select * from %s where %s order by %s limit %s,%s", queryDefinition.getTable(), expandConditions(conditions), orderBy, queryDefinition.getOffset(), queryDefinition.getBatchSize()); + } + + @Override + public void runSqlScript(Resource resource) { + final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource); + databasePopulator.setIgnoreFailedDrops(true); + databasePopulator.setSeparator("#"); + databasePopulator.execute(getDataSource()); + } + + @Override + protected String buildValueBatchQuery(SeekQueryDefinition queryDefinition, String... conditions) { + return String.format("select * from %s where %s order by %s limit %s", queryDefinition.getTable(), expandConditions(conditions), queryDefinition.getColumn(), queryDefinition.getBatchSize()); + } + + + @Override + protected String buildBatchMarkersQuery(MarkersQueryDefinition queryDefinition, String... conditions) { + String column = queryDefinition.getColumn(); + return String.format("SELECT %s,rownum\n" + + "FROM ( \n" + + " SELECT \n" + + " @row := @row +1 AS rownum, %s \n" + + " FROM (SELECT @row :=-1) r, %s WHERE %s ORDER BY %s) ranked \n" + + "WHERE rownum %% %s = 0 ", column, column, queryDefinition.getTable(), expandConditions(conditions), column, queryDefinition.getBatchSize()); + } + + @Override + protected String createAllTableNamesQuery() { + return String.format( + "select TABLE_NAME from information_schema.tables where table_schema = '%s' and TABLE_TYPE = 'BASE TABLE'", + getDataSourceConfiguration().getSchema()); + } + + @Override + protected String createAllColumnNamesQuery(String tableName) { + return String.format( + "SELECT DISTINCT COLUMN_NAME from information_schema.columns where table_schema = '%s' AND TABLE_NAME = '%s'", + getDataSourceConfiguration().getSchema(), tableName); + } + + @Override + protected String createUniqueColumnsQuery(String tableName) { + return String.format( + "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.STATISTICS t1\n" + + "INNER JOIN \n" + + "(\n" + + "SELECT DISTINCT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, count(INDEX_NAME) as COL_COUNT \n" + + "FROM INFORMATION_SCHEMA.STATISTICS \n" + + "WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s' AND NON_UNIQUE = 0\n" + + "GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME\n" + + "ORDER BY COL_COUNT ASC\n" + + "LIMIT 1\n" + + ") t2\n" + + "ON t1.TABLE_SCHEMA = t2.TABLE_SCHEMA AND t1.TABLE_NAME = t2.TABLE_NAME AND t1.INDEX_NAME = t2.INDEX_NAME\n" + + ";\n", + getDataSourceConfiguration().getSchema(), tableName); + } + + @Override + protected void addCustomPlatformTypeMapping(final Platform platform) { + + // DO nothing + } + + @Override + public DataBaseProvider getDatabaseProvider() { + return DataBaseProvider.POSTGRESQL; + } + + @Override + protected Platform createPlatform(DatabaseSettings databaseSettings, DataSource dataSource) { + HybrisPlatform instance = MigrationHybrisPostGresPlatform.build(databaseSettings); + instance.setDataSource(dataSource); + return instance; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANABuilder.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANABuilder.java new file mode 100644 index 0000000..d871175 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANABuilder.java @@ -0,0 +1,78 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.platform; + +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.sql.ColumnNativeTypeDecorator; +import de.hybris.bootstrap.ddl.sql.HanaSqlBuilder; +import de.hybris.bootstrap.ddl.sql.HybrisMSSqlBuilder; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.model.Column; + +import java.sql.Types; + +public class MigrationHybrisHANABuilder extends HanaSqlBuilder { + + public MigrationHybrisHANABuilder(Platform platform, DatabaseSettings databaseSettings, + final Iterable columnNativeTypeDecorators) { + super(platform, databaseSettings,columnNativeTypeDecorators); + } + + @Override + protected String getSqlType(Column column) { + /* + core-advanced-deployment.xml:661 + TODO implement more generic mapper for special attrs + */ + final String nativeType = this.getNativeType(column); + + final int sizePos = nativeType.indexOf(SIZE_PLACEHOLDER); + final StringBuilder sqlType = new StringBuilder(); + + if((column.getTypeCode() == Types.NVARCHAR) && Integer.parseInt(column.getSize()) > 5000){ + return sqlType.append("NCLOB").toString(); + } + + sqlType.append(sizePos >= 0 ? nativeType.substring(0, sizePos) : nativeType); + + Object sizeSpec = column.getSize(); + if (sizeSpec == null) { + sizeSpec = this.getPlatformInfo().getDefaultSize(column.getTypeCode()); + } + + if (sizeSpec != null) + { + if (this.getPlatformInfo().hasSize(column.getTypeCode())) { + sqlType.append("("); + sqlType.append(detectSize(column)); + sqlType.append(")"); + } else if (this.getPlatformInfo().hasPrecisionAndScale(column.getTypeCode())) { + sqlType.append("("); + sqlType.append(column.getSizeAsInt()); + sqlType.append(","); + sqlType.append(column.getScale()); + sqlType.append(")"); + } + } + sqlType.append(sizePos >= 0 ? nativeType.substring(sizePos + "{0}".length()) : ""); + return sqlType.toString(); + } + + //ddlutils cannot handle "complex" sizes ootb, therefore adding support here + private String detectSize(Column column) { + if (this.getPlatformInfo().hasSize(column.getTypeCode())) { + if (column.getTypeCode() == Types.NVARCHAR) { + if (column.getSizeAsInt() > 255 && column.getSizeAsInt() <=5000 ) { + return ""+ 5000; + } + } else if (column.getTypeCode() == Types.DOUBLE) { + return "30,8"; + } + } + return column.getSize(); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANAPlatform.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANAPlatform.java new file mode 100644 index 0000000..24197f4 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisHANAPlatform.java @@ -0,0 +1,89 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.platform; + +import com.google.common.collect.ImmutableList; +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisHanaPlatform; +import de.hybris.bootstrap.ddl.HybrisPlatform; +import de.hybris.bootstrap.ddl.jdbc.PlatformJDBCMappingProvider; +import de.hybris.bootstrap.ddl.sql.ColumnNativeTypeDecorator; +import de.hybris.bootstrap.ddl.sql.HanaBlobColumnNativeTypeDecorator; +import org.apache.ddlutils.PlatformInfo; +import org.apache.ddlutils.model.JdbcTypeCategoryEnum; +import org.apache.ddlutils.model.TypeMap; +import org.apache.ddlutils.platform.SqlBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Types; + +public class MigrationHybrisHANAPlatform extends HybrisHanaPlatform implements HybrisPlatform { + + private static final Logger LOG = LoggerFactory.getLogger(MigrationHybrisHANAPlatform.class); + + private SqlBuilder sqlBuilder; + + + private MigrationHybrisHANAPlatform(final DatabaseSettings databaseSettings) { + super(databaseSettings); + } + + public static HybrisPlatform build(DatabaseSettings databaseSettings) { + + final MigrationHybrisHANAPlatform instance = new MigrationHybrisHANAPlatform(databaseSettings); + HANAHybrisTypeMap.register(); + instance.provideCustomMapping(); + instance.setSqlBuilder(new MigrationHybrisHANABuilder(instance, databaseSettings, getNativeTypeDecorators(databaseSettings))); + return instance; + } + private void provideCustomMapping() + { + final PlatformInfo platformInfo = getPlatformInfo(); + + platformInfo.setMaxColumnNameLength(PlatformJDBCMappingProvider.MAX_COLUMN_NAME_LENGTH); + + platformInfo.addNativeTypeMapping(PlatformJDBCMappingProvider.HYBRIS_PK, "BIGINT", Types.BIGINT); + platformInfo.addNativeTypeMapping(PlatformJDBCMappingProvider.HYBRIS_LONG_STRING, "NCLOB", Types.NCLOB); + platformInfo.addNativeTypeMapping(PlatformJDBCMappingProvider.HYBRIS_JSON, "NCLOB", Types.LONGVARCHAR); + platformInfo.addNativeTypeMapping(PlatformJDBCMappingProvider.HYBRIS_COMMA_SEPARATED_PKS, "NVARCHAR{0}", Types.NVARCHAR); + // platformInfo.addNativeTypeMapping(2011, "NCLOB"); + + platformInfo.setHasSize(PlatformJDBCMappingProvider.HYBRIS_LONG_STRING, true); + platformInfo.setHasSize(PlatformJDBCMappingProvider.HYBRIS_COMMA_SEPARATED_PKS, true); + + platformInfo.addNativeTypeMapping(Types.BIT, "DECIMAL(1,0)", Types.NUMERIC); + + platformInfo.addNativeTypeMapping(Types.DECIMAL, "DECIMAL", Types.DECIMAL); + platformInfo.setHasSize(Types.FLOAT, true); + platformInfo.setHasSize(Types.DOUBLE, true); + platformInfo.setHasSize(Types.NVARCHAR, true); + } + + @Override + public SqlBuilder getSqlBuilder() { + return this.sqlBuilder; + } + + @Override + protected void setSqlBuilder(SqlBuilder builder) { + this.sqlBuilder = builder; + } + + private static Iterable getNativeTypeDecorators(final DatabaseSettings databaseSettings) + { + return ImmutableList.of(new HanaBlobColumnNativeTypeDecorator(databaseSettings)); + } + static class HANAHybrisTypeMap extends TypeMap { + + static void register() { + registerJdbcType(Types.NCHAR, "NVARCHAR", JdbcTypeCategoryEnum.TEXTUAL); + registerJdbcType(Types.NCLOB, "NCLOB", JdbcTypeCategoryEnum.TEXTUAL); + } + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlBuilder.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlBuilder.java new file mode 100644 index 0000000..03e0acd --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlBuilder.java @@ -0,0 +1,79 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.platform; + +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.sql.HybrisMSSqlBuilder; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.model.Column; + +import java.sql.Types; + +public class MigrationHybrisMSSqlBuilder extends HybrisMSSqlBuilder { + + public MigrationHybrisMSSqlBuilder(Platform platform, DatabaseSettings databaseSettings) { + super(platform, databaseSettings); + } + + @Override + protected String getSqlType(Column column) { + /* + core-advanced-deployment.xml:661 + TODO implement more generic mapper for special attrs + */ + if (column.getName().equalsIgnoreCase("InheritancePathString")) { + return "varchar(1800)"; + } + String nativeType = this.getNativeType(column); + int sizePos = nativeType.indexOf("{0}"); + StringBuilder sqlType = new StringBuilder(); + sqlType.append(sizePos >= 0 ? nativeType.substring(0, sizePos) : nativeType); + Object sizeSpec = column.getSize(); + if (sizeSpec == null) { + sizeSpec = this.getPlatformInfo().getDefaultSize(column.getTypeCode()); + } + + if (sizeSpec != null) { + if (this.getPlatformInfo().hasSize(column.getTypeCode())) { + sqlType.append("("); + sqlType.append(detectSize(column)); + sqlType.append(")"); + } else if (this.getPlatformInfo().hasPrecisionAndScale(column.getTypeCode())) { + sqlType.append("("); + sqlType.append(column.getSizeAsInt()); + sqlType.append(","); + sqlType.append(column.getScale()); + sqlType.append(")"); + } + } + + sqlType.append(sizePos >= 0 ? nativeType.substring(sizePos + "{0}".length()) : ""); + return sqlType.toString(); + } + + //ddlutils cannot handle "complex" sizes ootb, therefore adding support here + private String detectSize(Column column) { + if (this.getPlatformInfo().hasSize(column.getTypeCode())) { + if (column.getTypeCode() == Types.NVARCHAR) { + if (column.getSizeAsInt() > 4000) { + return "MAX"; + } + } + if (column.getTypeCode() == Types.VARCHAR) { + if (column.getSizeAsInt() > 8000) { + return "MAX"; + } + } + if (column.getTypeCode() == Types.VARBINARY) { + if (column.getSizeAsInt() > 8000) { + return "MAX"; + } + } + } + return column.getSize(); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlPlatform.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlPlatform.java new file mode 100644 index 0000000..bc0e138 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisMSSqlPlatform.java @@ -0,0 +1,114 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.platform; + +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisPlatform; +import de.hybris.bootstrap.ddl.sql.HybrisMSSqlBuilder; +import org.apache.ddlutils.DatabaseOperationException; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.PlatformInfo; +import org.apache.ddlutils.model.Column; +import org.apache.ddlutils.model.Database; +import org.apache.ddlutils.model.Table; +import org.apache.ddlutils.platform.DatabaseMetaDataWrapper; +import org.apache.ddlutils.platform.mssql.MSSqlModelReader; +import org.apache.ddlutils.platform.mssql.MSSqlPlatform; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class MigrationHybrisMSSqlPlatform extends MSSqlPlatform implements HybrisPlatform { + + private static final Logger LOG = LoggerFactory.getLogger(MigrationHybrisMSSqlPlatform.class); + + + private MigrationHybrisMSSqlPlatform() { + } + + public static HybrisPlatform build(DatabaseSettings databaseSettings) { + MigrationHybrisMSSqlPlatform instance = new MigrationHybrisMSSqlPlatform(); + instance.provideCustomMapping(); + instance.setSqlBuilder(new MigrationHybrisMSSqlBuilder(instance, databaseSettings)); + MigrationHybrisMSSqlPlatform.HybrisMSSqlModelReader reader = new MigrationHybrisMSSqlPlatform.HybrisMSSqlModelReader(instance); + reader.setDefaultTablePattern(databaseSettings.getTablePrefix() + '%'); + instance.setModelReader(reader); + return instance; + } + + public Database readModelFromDatabase(String name) throws DatabaseOperationException { + return this.readModelFromDatabase(name, (String) null, (String) null, (String[]) null); + } + + private void provideCustomMapping() { + PlatformInfo platformInfo = this.getPlatformInfo(); + platformInfo.setMaxColumnNameLength(30); + platformInfo.addNativeTypeMapping(12002, "BIGINT", -5); + platformInfo.addNativeTypeMapping(12000, "NVARCHAR(MAX)", -1); + platformInfo.addNativeTypeMapping(12003, "NVARCHAR(MAX)", -1); + platformInfo.addNativeTypeMapping(12001, "NVARCHAR(MAX)", -1); + platformInfo.addNativeTypeMapping(-5, "BIGINT"); + platformInfo.addNativeTypeMapping(12, "NVARCHAR"); + platformInfo.addNativeTypeMapping(-7, "TINYINT"); + platformInfo.addNativeTypeMapping(4, "INTEGER"); + platformInfo.addNativeTypeMapping(5, "INTEGER"); + platformInfo.addNativeTypeMapping(-6, "TINYINT", -6); + platformInfo.addNativeTypeMapping(8, "FLOAT", 8); + platformInfo.addNativeTypeMapping(6, "FLOAT", 8); + platformInfo.addNativeTypeMapping(-9, "NVARCHAR", -9); + platformInfo.addNativeTypeMapping(92, "DATETIME2", 93); + platformInfo.addNativeTypeMapping(93, "DATETIME2"); + platformInfo.addNativeTypeMapping(2004, "VARBINARY(MAX)"); + } + + public String getTableName(Table table) { + return this.getSqlBuilder().getTableName(table); + } + + public String getColumnName(Column column) { + return ((HybrisMSSqlBuilder) this.getSqlBuilder()).getColumnName(column); + } + + @Override + public void alterTables(Connection connection, Database desiredModel, boolean continueOnError) throws DatabaseOperationException { + String sql = this.getAlterTablesSql(connection, desiredModel); + LOG.info(sql); + this.evaluateBatch(connection, sql, continueOnError); + } + + private static class HybrisMSSqlModelReader extends MSSqlModelReader { + private static final String TABLE_NAME_KEY = "TABLE_NAME"; + private final Set tablesToExclude = new HashSet() { + { + this.add("trace_xe_action_map"); + this.add("trace_xe_event_map"); + } + }; + + public HybrisMSSqlModelReader(Platform platform) { + super(platform); + } + + protected Table readTable(DatabaseMetaDataWrapper metaData, Map values) throws SQLException { + return this.tableShouldBeExcluded(values) ? null : super.readTable(metaData, values); + } + + private boolean tableShouldBeExcluded(Map values) { + String tableName = this.getTableNameFrom(values); + return tableName != null && this.tablesToExclude.contains(tableName.toLowerCase()); + } + + private String getTableNameFrom(Map values) { + return (String) values.get("TABLE_NAME"); + } + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresBuilder.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresBuilder.java new file mode 100644 index 0000000..2d018f6 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresBuilder.java @@ -0,0 +1,90 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.platform; + +import org.apache.commons.lang3.StringUtils; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.model.Column; +import org.apache.ddlutils.model.TypeMap; +import org.apache.ddlutils.platform.postgresql.PostgreSqlBuilder; +import java.sql.Types; + +public class MigrationHybrisPostGresBuilder extends PostgreSqlBuilder { + + public MigrationHybrisPostGresBuilder(Platform platform) { + super(platform); + } + + @Override + protected String getSqlType(Column column) { + + String nativeType = this.getNativeType(column); + int sizePos = nativeType.indexOf("{0}"); + StringBuilder sqlType = new StringBuilder(); + + if((column.getTypeCode() == Types.NVARCHAR) && Integer.parseInt(column.getSize()) > 5000){ + return sqlType.append("text").toString(); + } + + sqlType.append(sizePos >= 0 ? nativeType.substring(0, sizePos) : nativeType); + Object sizeSpec = column.getSize(); + if (sizeSpec == null) { + sizeSpec = this.getPlatformInfo().getDefaultSize(column.getTypeCode()); + } + + if (sizeSpec != null) { + if (this.getPlatformInfo().hasSize(column.getTypeCode())) { + sqlType.append("("); + sqlType.append(detectSize(column)); + sqlType.append(")"); + } else if (this.getPlatformInfo().hasPrecisionAndScale(column.getTypeCode())) { + sqlType.append("("); + sqlType.append(column.getSizeAsInt()); + sqlType.append(","); + sqlType.append(column.getScale()); + sqlType.append(")"); + } + } + + sqlType.append(sizePos >= 0 ? nativeType.substring(sizePos + "{0}".length()) : ""); + return sqlType.toString(); + } + + //ddlutils cannot handle "complex" sizes ootb, therefore adding support here + private String detectSize(Column column) { + if (this.getPlatformInfo().hasSize(column.getTypeCode())) { + if (column.getTypeCode() == Types.NVARCHAR) { + if (column.getSizeAsInt() > 4000) { + return "MAX"; + } + } + if (column.getTypeCode() == Types.VARCHAR) { + if (column.getSizeAsInt() > 8000) { + return "MAX"; + } + } + if (column.getTypeCode() == Types.VARBINARY) { + if (column.getSizeAsInt() > 8000) { + return "MAX"; + } + } + } + return column.getSize(); + } + + + @Override + public boolean isValidDefaultValue(String defaultSpec, int typeCode) { + return defaultSpec != null && StringUtils.isNumeric(defaultSpec) && (defaultSpec.length() > 0 || !TypeMap.isNumericType(typeCode) && !TypeMap.isDateTimeType(typeCode)); + } + + @Override + public String getColumnName(final Column column) + { + return column.getName(); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresPlatform.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresPlatform.java new file mode 100644 index 0000000..b3ad417 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/repository/platform/MigrationHybrisPostGresPlatform.java @@ -0,0 +1,61 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.repository.platform; + +import de.hybris.bootstrap.ddl.DatabaseSettings; +import de.hybris.bootstrap.ddl.HybrisPlatform; +import org.apache.ddlutils.PlatformInfo; +import org.apache.ddlutils.model.Column; +import org.apache.ddlutils.model.Table; +import org.apache.ddlutils.platform.postgresql.PostgreSqlPlatform; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.sql.Types; + +public class MigrationHybrisPostGresPlatform extends PostgreSqlPlatform implements HybrisPlatform { + + private static final Logger LOG = LoggerFactory.getLogger(MigrationHybrisPostGresPlatform.class); + + + private MigrationHybrisPostGresPlatform() { + super(); + } + + public static HybrisPlatform build(DatabaseSettings databaseSettings) { + MigrationHybrisPostGresPlatform instance = new MigrationHybrisPostGresPlatform(); + instance.provideCustomMapping(); + instance.setSqlBuilder(new MigrationHybrisPostGresBuilder(instance)); + return instance; + } + + + private void provideCustomMapping() { + PlatformInfo platformInfo = this.getPlatformInfo(); + platformInfo.setMaxColumnNameLength(31); + platformInfo.addNativeTypeMapping(Types.NVARCHAR, "VARCHAR", Types.VARCHAR); + platformInfo.addNativeTypeMapping(Types.NCHAR, "int2", Types.TINYINT); + platformInfo.addNativeTypeMapping(Types.CHAR, "int2", Types.TINYINT); + platformInfo.setHasSize(Types.CHAR, false); + platformInfo.setHasSize(Types.NCHAR, false); + platformInfo.setHasSize(Types.NVARCHAR, true); + platformInfo.setHasSize(Types.VARCHAR, true); + platformInfo.addNativeTypeMapping(Types.BIGINT, "int8"); + platformInfo.addNativeTypeMapping(Types.INTEGER, "int2"); + platformInfo.addNativeTypeMapping(Types.SMALLINT, "int2"); + platformInfo.addNativeTypeMapping(Types.TINYINT, "int2"); + platformInfo.addNativeTypeMapping(Types.DOUBLE, "float8"); + } + + @Override + public String getTableName(Table table) { + return this.getSqlBuilder().getTableName(table); + } + + public String getColumnName(Column column) { + return ((MigrationHybrisPostGresBuilder) this.getSqlBuilder()).getColumnName(column); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/DatabaseCopyScheduler.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/DatabaseCopyScheduler.java new file mode 100644 index 0000000..a4bd880 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/DatabaseCopyScheduler.java @@ -0,0 +1,25 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.scheduler; + +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; + +import java.time.OffsetDateTime; + +/** + * Scheduler for Cluster Migration + */ +public interface DatabaseCopyScheduler { + void schedule(CopyContext context) throws Exception; + + MigrationStatus getCurrentState(CopyContext context, OffsetDateTime since) throws Exception; + + boolean isAborted(CopyContext context) throws Exception; + + void abort(CopyContext context) throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/impl/CustomClusterDatabaseCopyScheduler.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/impl/CustomClusterDatabaseCopyScheduler.java new file mode 100644 index 0000000..573d4dd --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/scheduler/impl/CustomClusterDatabaseCopyScheduler.java @@ -0,0 +1,350 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.scheduler.impl; + +import com.sap.cx.boosters.commercedbsync.events.CopyCompleteEvent; +import com.sap.cx.boosters.commercedbsync.scheduler.DatabaseCopyScheduler; +import de.hybris.platform.cluster.PingBroadcastHandler; +import de.hybris.platform.core.Registry; +import de.hybris.platform.core.Tenant; +import de.hybris.platform.jalo.JaloSession; +import de.hybris.platform.servicelayer.cluster.ClusterService; +import de.hybris.platform.servicelayer.event.EventService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.time.DurationFormatUtils; +import org.apache.commons.lang3.tuple.Pair; +import com.sap.cx.boosters.commercedbsync.MigrationProgress; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.adapter.DataRepositoryAdapter; +import com.sap.cx.boosters.commercedbsync.adapter.impl.ContextualDataRepositoryAdapter; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.events.CopyDatabaseTableEvent; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTask; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.core.io.ClassPathResource; + +import java.time.Duration; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants.MDC_CLUSTERID; +import static com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants.MDC_PIPELINE; + +/** + * Scheduler for Cluster Based Migrations + */ +public class CustomClusterDatabaseCopyScheduler implements DatabaseCopyScheduler { + + private static final Logger LOG = LoggerFactory.getLogger(CustomClusterDatabaseCopyScheduler.class); + + private EventService eventService; + + private ClusterService clusterService; + + private DatabaseCopyTaskRepository databaseCopyTaskRepository; + + /** + * Schedules a Data Copy Task for each table across all the available nodes + * + * @param context + * @throws Exception + */ + @Override + public void schedule(CopyContext context) throws Exception { + String sqlScript = ""; + // ORACLE_TARGET - START + if (context.getMigrationContext().getDataTargetRepository().getDatabaseProvider().isOracleUsed()) { + sqlScript = "/sql/createSchedulerTablesOracle.sql"; + } else if(context.getMigrationContext().getDataTargetRepository().getDatabaseProvider().isHanaUsed()){ + sqlScript = "/sql/createSchedulerTablesHana.sql"; + } else if(context.getMigrationContext().getDataTargetRepository().getDatabaseProvider().isPostgreSqlUsed()){ + sqlScript = "/sql/createSchedulerTablesPostGres.sql"; + } else { + sqlScript = "/sql/createSchedulerTables.sql"; + } + logMigrationContext(context.getMigrationContext()); + // ORACLE_TARGET - END + context.getMigrationContext().getDataTargetRepository().runSqlScript(new ClassPathResource(sqlScript)); + int ownNodeId = clusterService.getClusterId(); + if (!CollectionUtils.isEmpty(context.getCopyItems())) { + databaseCopyTaskRepository.createMigrationStatus(context); + final List nodeIds = getClusterNodes(context); + int nodeIndex = 0; + DataRepositoryAdapter dataRepositoryAdapter = new ContextualDataRepositoryAdapter(context.getMigrationContext().getDataSourceRepository()); + List> itemsToSchedule = generateSchedulerItemList(context, dataRepositoryAdapter); + for (final Pair itemToSchedule : itemsToSchedule) { + CopyContext.DataCopyItem dataCopyItem = itemToSchedule.getLeft(); + final long sourceRowCount = itemToSchedule.getRight(); + if (sourceRowCount > 0) { + if (nodeIndex >= (nodeIds.size())) { + nodeIndex = 0; + } + final int destinationNodeId = nodeIds.get(nodeIndex); + databaseCopyTaskRepository.scheduleTask(context, dataCopyItem, sourceRowCount, destinationNodeId); + nodeIndex++; + } else { + databaseCopyTaskRepository.scheduleTask(context, dataCopyItem, sourceRowCount, ownNodeId); + databaseCopyTaskRepository.markTaskCompleted(context, dataCopyItem, "0"); + } + } + startMonitorThread(context); + final CopyDatabaseTableEvent event = new CopyDatabaseTableEvent(ownNodeId, context.getMigrationId()); + eventService.publishEvent(event); + } + } + + private void logMigrationContext(final MigrationContext context) { + if (context == null) { + return; + } + LOG.info("--------MIGRATION CONTEXT- START----------"); + LOG.info("isAddMissingColumnsToSchemaEnabled=" + context.isAddMissingColumnsToSchemaEnabled()); + LOG.info("isAddMissingTablesToSchemaEnabled=" + context.isAddMissingTablesToSchemaEnabled()); + LOG.info("isAuditTableMigrationEnabled=" + context.isAuditTableMigrationEnabled()); + LOG.info("isBulkCopyEnabled=" + context.isBulkCopyEnabled()); + LOG.info("isClusterMode=" + context.isClusterMode()); + LOG.info("isDeletionEnabled=" + context.isDeletionEnabled()); + LOG.info("isDisableAllIndexesEnabled=" + context.isDisableAllIndexesEnabled()); + LOG.info("isDropAllIndexesEnabled=" + context.isDropAllIndexesEnabled()); + LOG.info("isFailOnErrorEnabled=" + context.isFailOnErrorEnabled()); + LOG.info("isIncrementalModeEnabled=" + context.isIncrementalModeEnabled()); + LOG.info("isMigrationTriggeredByUpdateProcess=" + context.isMigrationTriggeredByUpdateProcess()); + LOG.info("isRemoveMissingColumnsToSchemaEnabled=" + context.isRemoveMissingColumnsToSchemaEnabled()); + LOG.info("isRemoveMissingTablesToSchemaEnabled=" + context.isRemoveMissingTablesToSchemaEnabled()); + LOG.info("isSchemaMigrationAutoTriggerEnabled=" + context.isSchemaMigrationAutoTriggerEnabled()); + LOG.info("isSchemaMigrationEnabled=" + context.isSchemaMigrationEnabled()); + LOG.info("isTruncateEnabled=" + context.isTruncateEnabled()); + LOG.info("getIncludedTables=" + context.getIncludedTables()); + LOG.info("getExcludedTables=" + context.getExcludedTables()); + LOG.info("getIncrementalTables=" + context.getIncrementalTables()); + LOG.info("getTruncateExcludedTables=" + context.getTruncateExcludedTables()); + LOG.info("getCustomTables=" + context.getCustomTables()); + LOG.info("getIncrementalTimestamp=" + context.getIncrementalTimestamp()); + LOG.info( + "Source TS Name=" + context.getDataSourceRepository().getDataSourceConfiguration().getTypeSystemName()); + LOG.info("Source TS Suffix =" + + context.getDataSourceRepository().getDataSourceConfiguration().getTypeSystemSuffix()); + LOG.info( + "Target TS Name=" + context.getDataTargetRepository().getDataSourceConfiguration().getTypeSystemName()); + LOG.info("Target TS Suffix =" + + context.getDataTargetRepository().getDataSourceConfiguration().getTypeSystemSuffix()); + + LOG.info("--------MIGRATION CONTEXT- END----------"); + } + private List> generateSchedulerItemList(CopyContext context, DataRepositoryAdapter dataRepositoryAdapter) throws Exception { + List> pairs = new ArrayList<>(); + for (CopyContext.DataCopyItem copyItem : context.getCopyItems()) { + pairs.add(Pair.of(copyItem, dataRepositoryAdapter.getRowCount(context.getMigrationContext(), copyItem.getSourceItem()))); + } + //we sort the items to make sure big tables are assigned to nodes in a fair way + return pairs.stream().sorted((p1, p2) -> Long.compare(p1.getRight(), p2.getRight())).collect(Collectors.toList()); + } + + /** + * Starts a thread to monitor the migration + * + * @param context + */ + private void startMonitorThread(CopyContext context) { + JaloSession jaloSession = JaloSession.getCurrentSession(); + + Thread monitor = new Thread(new MigrationMonitor(context, jaloSession), "MigrationMonitor"); + monitor.start(); + } + + @Override + public MigrationStatus getCurrentState(CopyContext context, OffsetDateTime since) throws Exception { + Objects.requireNonNull(context); + Objects.requireNonNull(since); + + MigrationStatus status = databaseCopyTaskRepository.getMigrationStatus(context); + if (!since.equals(OffsetDateTime.MAX)) { + Set updated = databaseCopyTaskRepository.getUpdatedTasks(context, since); + List statusUpdates = new ArrayList<>(updated); + statusUpdates.sort(Comparator.comparing(DatabaseCopyTask::getLastUpdate).thenComparing(DatabaseCopyTask::getPipelinename)); + status.setStatusUpdates(statusUpdates); + } + return status; + } + + @Override + public boolean isAborted(CopyContext context) throws Exception { + MigrationStatus current = this.databaseCopyTaskRepository.getMigrationStatus(context); + return MigrationProgress.ABORTED.equals(current.getStatus()); + } + + @Override + public void abort(CopyContext context) throws Exception { + this.databaseCopyTaskRepository.setMigrationStatus(context, MigrationProgress.ABORTED); + stopPerformanceProfiling(context); + } + + private void stopPerformanceProfiling(CopyContext context) { + if (context.getPerformanceProfiler() != null) { + context.getPerformanceProfiler().reset(); + } + } + + private List getClusterNodes(CopyContext context) { + if (!context.getMigrationContext().isClusterMode()) { + return Collections.singletonList(clusterService.getClusterId()); + } + final List nodeIds = new ArrayList<>(); + try { + // Same code as the hac cluster overview page + PingBroadcastHandler pingBroadcastHandler = PingBroadcastHandler.getInstance(); + pingBroadcastHandler.getNodes().forEach(i -> nodeIds.add(i.getNodeID())); + } catch (final Exception e) { + LOG.warn("Using single cluster node because an error was encountered while fetching cluster nodes information: {{}}", e.getMessage(), e); + } + if (CollectionUtils.isEmpty(nodeIds)) { + nodeIds.add(clusterService.getClusterId()); + } + return nodeIds; + } + + public void setClusterService(ClusterService clusterService) { + this.clusterService = clusterService; + } + + public void setDatabaseCopyTaskRepository(DatabaseCopyTaskRepository databaseCopyTaskRepository) { + this.databaseCopyTaskRepository = databaseCopyTaskRepository; + } + + public void setEventService(EventService eventService) { + this.eventService = eventService; + } + + /** + * Thread to monitor the Migration + */ + private class MigrationMonitor implements Runnable { + private final CopyContext context; + private final Map contextMap; + private final Tenant tenant; + private final JaloSession jaloSession; + private OffsetDateTime lastUpdate = OffsetDateTime.of(1970, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC); + + public MigrationMonitor(CopyContext context, JaloSession jaloSession) { + this.context = context; + this.contextMap = MDC.getCopyOfContextMap(); + this.jaloSession = jaloSession; + this.tenant = jaloSession.getTenant(); + + } + + @Override + public void run() { + try { + prepareThread(); + pollState(); + notifyFinished(); + } catch (Exception e) { + LOG.error("Failed getting current state", e); + } finally { + cleanupThread(); + } + } + + /** + * Detects if the migration has stalled + * + * @throws Exception + */ + private void pollState() throws Exception { + MigrationStatus currentState; + do { + currentState = getCurrentState(context, lastUpdate); + lastUpdate = OffsetDateTime.now(ZoneOffset.UTC); + + // setting deletion + if(context.getMigrationContext().isDeletionEnabled()){ + currentState.setDeletionEnabled(true); + } + + logState(currentState); + Duration elapsedTillLastUpdate = Duration.between(currentState.getLastUpdate().toInstant(ZoneOffset.UTC), Instant.now()); + int stalledTimeout = context.getMigrationContext().getStalledTimeout(); + if (elapsedTillLastUpdate.compareTo(Duration.of(stalledTimeout, ChronoUnit.SECONDS)) >= 0) { + LOG.error("Migration stalled!"); + databaseCopyTaskRepository.setMigrationStatus(context, MigrationProgress.STALLED); + } + Thread.sleep(5000); + } while (!currentState.isCompleted()); + } + + /** + * Notifies nodes about termination + */ + private void notifyFinished() { + final CopyCompleteEvent completeEvent = new CopyCompleteEvent(clusterService.getClusterId(), context.getMigrationId()); + eventService.publishEvent(completeEvent); + } + + /** + * Logs the current migration state + * + * @param status + */ + private void logState(MigrationStatus status) { + for (final DatabaseCopyTask copyTask : status.getStatusUpdates()) { + try (MDC.MDCCloseable ignore = MDC.putCloseable(MDC_PIPELINE, copyTask.getPipelinename()); + MDC.MDCCloseable ignore2 = MDC.putCloseable(MDC_CLUSTERID, String.valueOf(copyTask.getTargetnodeId()))) { + if (copyTask.isFailure()) { + LOG.error("{}/{} processed. FAILED in {{}}. Cause: {{}} Last Update: {{}}", copyTask.getTargetrowcount(), copyTask.getSourcerowcount(), copyTask.getDuration(), copyTask.getError(), copyTask.getLastUpdate()); + } else if (copyTask.isCompleted()) { + LOG.info("{}/{} processed. Completed in {{}}. Last Update: {{}}", copyTask.getTargetrowcount(), copyTask.getSourcerowcount(), copyTask.getDuration(), copyTask.getLastUpdate()); + } else { + LOG.debug("{}/{} processed. Last Update: {{}}", copyTask.getTargetrowcount(), copyTask.getSourcerowcount(), copyTask.getLastUpdate()); + } + } + } + LOG.info("{}/{} tables migrated. {} failed. State: {}", status.getCompletedTasks(), status.getTotalTasks(), status.getFailedTasks(), status.getStatus()); + if (status.isCompleted()) { + String endState = "finished"; + if (status.isFailed()) { + endState = "FAILED"; + } + LOG.info("Migration {} ({}) in {}", endState, status.getStatus(), DurationFormatUtils.formatDurationHMS(Duration.between(status.getStart(), status.getEnd()).toMillis())); + } + } + + + protected void prepareThread() { + MDC.setContextMap(contextMap); + + // tenant + Registry.setCurrentTenant(tenant); + // jalo session + this.jaloSession.activate(); + } + + protected void cleanupThread() { + MDC.clear(); + + // jalo session + JaloSession.deactivate(); + // tenant + Registry.unsetCurrentTenant(); + } + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseCopyTaskRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseCopyTaskRepository.java new file mode 100644 index 0000000..6e64b05 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseCopyTaskRepository.java @@ -0,0 +1,130 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service; + +import com.sap.cx.boosters.commercedbsync.MigrationProgress; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.CopyContext.DataCopyItem; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTask; + +import java.time.OffsetDateTime; +import java.util.Set; + +/** + * Repository to manage Migration Status and Tasks + */ +public interface DatabaseCopyTaskRepository { + + /** + * Creates a new DB Migration status record + * + * @param context + * @throws Exception + */ + void createMigrationStatus(CopyContext context) throws Exception; + + /** + * Updates the Migration status record + * + * @param context + * @param progress + * @throws Exception + */ + void setMigrationStatus(CopyContext context, MigrationProgress progress) throws Exception; + + + /** + * Updates the Migration status record from one status to another + * + * @param context + * @param from + * @param to + * @throws Exception + */ + void setMigrationStatus(CopyContext context, MigrationProgress from, MigrationProgress to) throws Exception; + + /** + * Retrieves the current migration status + * + * @param context + * @return + * @throws Exception + */ + MigrationStatus getMigrationStatus(CopyContext context) throws Exception; + + /** + * Schedules a copy Task + * + * @param context the migration context + * @param copyItem the item to copy + * @param sourceRowCount + * @param targetNode the nodeId to perform the copy + * @throws Exception + */ + void scheduleTask(CopyContext context, CopyContext.DataCopyItem copyItem, long sourceRowCount, int targetNode) throws Exception; + + /** + * Retrieves all pending tasks + * + * @param context + * @return + * @throws Exception + */ + Set findPendingTasks(CopyContext context) throws Exception; + + /** + * Updates progress on a Task + * + * @param context + * @param copyItem + * @param itemCount + * @throws Exception + */ + void updateTaskProgress(CopyContext context, CopyContext.DataCopyItem copyItem, long itemCount) throws Exception; + + /** + * Marks the Task as Completed + * + * @param context + * @param copyItem + * @param duration + * @throws Exception + */ + void markTaskCompleted(CopyContext context, CopyContext.DataCopyItem copyItem, String duration) throws Exception; + + /** + * Marks the Task as Failed + * + * @param context + * @param copyItem + * @param error + * @throws Exception + */ + void markTaskFailed(CopyContext context, CopyContext.DataCopyItem copyItem, Exception error) throws Exception; + + /** + * Gets all updated Tasks + * + * @param context + * @param since offset + * @return + * @throws Exception + */ + Set getUpdatedTasks(CopyContext context, OffsetDateTime since) throws Exception; + + Set getAllTasks(CopyContext context) throws Exception; + /** + * ORACLE_TARGET -- added duration ins econds Marks the Task as Completed + * + * @param context + * @param copyItem + * @param duration + * @throws Exception + */ +void markTaskCompleted(CopyContext context, DataCopyItem copyItem, String duration, float durationseconds) + throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationCopyService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationCopyService.java new file mode 100644 index 0000000..1694a53 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationCopyService.java @@ -0,0 +1,18 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service; + +import com.sap.cx.boosters.commercedbsync.context.CopyContext; + + +/** + * Actual Service to perform the Migration + */ +public interface DatabaseMigrationCopyService { + + void copyAllAsync(CopyContext context); + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationDataTypeMapperService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationDataTypeMapperService.java new file mode 100644 index 0000000..a1205b6 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationDataTypeMapperService.java @@ -0,0 +1,21 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service; + +import java.io.IOException; +import java.sql.SQLException; + + +/** + * Service to deal with Mapping different types between Databases + */ +public interface DatabaseMigrationDataTypeMapperService { + + /** + * Converts BLOB, CLOB and NCLOB Data + */ + Object dataTypeMapper(final Object sourceColumnValue, final int jdbcType) throws IOException, SQLException; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportService.java new file mode 100644 index 0000000..b17a958 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportService.java @@ -0,0 +1,15 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service; + +import com.sap.cx.boosters.commercedbsync.MigrationReport; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; + +public interface DatabaseMigrationReportService { + + MigrationReport getMigrationReport(CopyContext copyContext) throws Exception; + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportStorageService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportStorageService.java new file mode 100644 index 0000000..677b3fa --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationReportStorageService.java @@ -0,0 +1,15 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service; + +import java.io.InputStream; + +public interface DatabaseMigrationReportStorageService { + void store(String fileName, InputStream inputStream) throws Exception; + + boolean validateConnection(); +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationService.java new file mode 100644 index 0000000..dd5de45 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationService.java @@ -0,0 +1,67 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service; + +import com.sap.cx.boosters.commercedbsync.MigrationReport; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +import java.time.OffsetDateTime; + +public interface DatabaseMigrationService { + + /** + * Asynchronously start a new database migration + * + * @param context Migration configuration + * @return migrationID of the started migration + * @throws Exception if anything goes wrong during start + */ + String startMigration(MigrationContext context) throws Exception; + + /** + * Stops the the database migration process. + * The process is stopped on all nodes, in case clustering is used. + * + * @param context Migration configuration + * @param migrationID ID of the migration process that should be stopped + * @throws Exception if anything goes wrong + */ + void stopMigration(MigrationContext context, String migrationID) throws Exception; + + /** + * Get current overall state without details + * + * @param context + * @param migrationID + * @return + * @throws Exception + */ + MigrationStatus getMigrationState(MigrationContext context, String migrationID) throws Exception; + + /** + * Get current state with details per copy task + * + * @param context + * @param migrationID + * @param since Get all updates since this timestamp. Must be in UTC! + * @return + * @throws Exception + */ + MigrationStatus getMigrationState(MigrationContext context, String migrationID, OffsetDateTime since) throws Exception; + + MigrationReport getMigrationReport(MigrationContext context, String migrationID) throws Exception; + + /** + * Busy wait until migration is done. Use only for tests! + * + * @param context + * @param migrationID + * @return + * @throws Exception when migration was not successful + */ + MigrationStatus waitForFinish(MigrationContext context, String migrationID) throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationSynonymService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationSynonymService.java new file mode 100644 index 0000000..50f97a2 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseMigrationSynonymService.java @@ -0,0 +1,23 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service; + +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; + +public interface DatabaseMigrationSynonymService { + + /** + * CCv2 Workaround: ccv2 builder does not support prefixes yet. + * creating synonym on ydeployments -> prefix_yeployments + * creating synonym on attributedescriptors -> prefix_attributedescriptors. + * + * @param repository + * @param prefix + * @throws Exception + */ + void recreateSynonyms(DataRepository repository, String prefix) throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseSchemaDifferenceService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseSchemaDifferenceService.java new file mode 100644 index 0000000..daecf92 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/DatabaseSchemaDifferenceService.java @@ -0,0 +1,30 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service; + +import com.sap.cx.boosters.commercedbsync.service.impl.DefaultDatabaseSchemaDifferenceService; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +/** + * Calculates and applies Schema Differences between two Databases + */ +public interface DatabaseSchemaDifferenceService { + + String generateSchemaDifferencesSql(MigrationContext context) throws Exception; + + void executeSchemaDifferencesSql(MigrationContext context, String sql) throws Exception; + + void executeSchemaDifferences(MigrationContext context) throws Exception; + + /** + * Calculates the differences between two schemas + * + * @param migrationContext + * @return + */ + DefaultDatabaseSchemaDifferenceService.SchemaDifferenceResult getDifference(MigrationContext migrationContext) throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/BlobDatabaseMigrationReportStorageService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/BlobDatabaseMigrationReportStorageService.java new file mode 100644 index 0000000..ed59da6 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/BlobDatabaseMigrationReportStorageService.java @@ -0,0 +1,114 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.microsoft.azure.storage.CloudStorageAccount; +import com.microsoft.azure.storage.NameValidator; +import com.microsoft.azure.storage.blob.CloudBlob; +import com.microsoft.azure.storage.blob.CloudBlobClient; +import com.microsoft.azure.storage.blob.CloudBlobContainer; +import com.microsoft.azure.storage.blob.CloudBlockBlob; +import com.microsoft.azure.storage.blob.ListBlobItem; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationReportStorageService; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class BlobDatabaseMigrationReportStorageService implements DatabaseMigrationReportStorageService { + + private static final Logger LOG = LoggerFactory.getLogger(BlobDatabaseMigrationReportStorageService.class.getName()); + + private static final String ROOT_CONTAINER = "migration"; + + private CloudBlobClient cloudBlobClient; + + private MigrationContext migrationContext; + + protected void init() throws Exception { + CloudStorageAccount account = CloudStorageAccount.parse(migrationContext.getMigrationReportConnectionString()); + this.cloudBlobClient = account.createCloudBlobClient(); + } + + @Override + public void store(String fileName, InputStream inputStream) throws Exception { + String path = fileName; + if (inputStream != null) { + CloudBlockBlob blob = getContainer(ROOT_CONTAINER, true).getBlockBlobReference(path); + byte[] bytes = IOUtils.toByteArray(inputStream); + ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + blob.upload(bis, bytes.length); + bis.close(); + LOG.info("File {} written to blob storage at {}/{}", path, ROOT_CONTAINER, path); + } else { + throw new IllegalArgumentException(String.format("Input Stream is null for root '%s' and path '%s'", ROOT_CONTAINER, path)); + } + } + + protected CloudBlobContainer getContainer(String name, boolean createIfNotExists) throws Exception { + CloudBlobContainer containerReference = getCloudBlobClient().getContainerReference(name); + if (createIfNotExists) { + containerReference.createIfNotExists(); + } + return containerReference; + } + + public List listAllReports() throws Exception { + getCloudBlobClient(); + Iterable migrationBlobs = cloudBlobClient.getContainerReference(ROOT_CONTAINER).listBlobs(); + List result = new ArrayList<>(); + migrationBlobs.forEach(blob -> { + result.add((CloudBlockBlob) blob); + }); + return result; + } + + public byte[] getReport(String reportId) throws Exception { + checkReportIdValid(reportId); + CloudBlob blob = cloudBlobClient.getContainerReference(ROOT_CONTAINER).getBlobReferenceFromServer(reportId); + byte[] output = new byte[blob.getStreamWriteSizeInBytes()]; + blob.downloadToByteArray(output, 0); + return output; + } + + private void checkReportIdValid(String reportId) { + NameValidator.validateFileName(reportId); + if (StringUtils.contains(reportId, "/")) { + throw new IllegalArgumentException("Invalid report id provided"); + } + if (!StringUtils.endsWith(reportId, ".json") && !StringUtils.endsWith(reportId, ".sql")) { + throw new IllegalArgumentException("Invalid file name ending provided"); + } + } + + protected CloudBlobClient getCloudBlobClient() throws Exception { + if (cloudBlobClient == null) { + init(); + } + return cloudBlobClient; + } + + @Override + public boolean validateConnection() { + try { + getCloudBlobClient().listContainers(); + } catch (Exception e) { + return false; + } + return true; + } + + public void setMigrationContext(MigrationContext migrationContext) { + this.migrationContext = migrationContext; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseCopyTaskRepository.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseCopyTaskRepository.java new file mode 100644 index 0000000..bcf92dc --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseCopyTaskRepository.java @@ -0,0 +1,340 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceCategory; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceRecorder; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceUnit; +import de.hybris.platform.servicelayer.cluster.ClusterService; +import org.apache.commons.lang3.StringUtils; +import com.sap.cx.boosters.commercedbsync.MigrationProgress; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTask; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.util.Calendar; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TimeZone; + + +/** + * Repository to manage the status on of the migration copy tasks across the cluster + */ +public class DefaultDatabaseCopyTaskRepository implements DatabaseCopyTaskRepository { + + private ClusterService clusterService; + + @Override + public void createMigrationStatus(CopyContext context) throws Exception { + String insert = "INSERT INTO MIGRATIONTOOLKIT_TABLECOPYSTATUS (migrationId, total) VALUES (?, ?)"; + try (Connection conn = getConnection(context); + PreparedStatement stmt = conn.prepareStatement(insert) + ) { + stmt.setObject(1, context.getMigrationId()); + stmt.setObject(2, context.getCopyItems().size()); + stmt.executeUpdate(); + conn.commit(); + } + } + + @Override + public void setMigrationStatus(CopyContext context, MigrationProgress progress) throws Exception { + setMigrationStatus(context, MigrationProgress.RUNNING, progress); + } + + @Override + public void setMigrationStatus(CopyContext context, MigrationProgress from, MigrationProgress to) throws Exception { + + String update = "UPDATE MIGRATIONTOOLKIT_TABLECOPYSTATUS SET status = ? WHERE status = ? AND migrationId = ?"; + try (Connection conn = getConnection(context); + PreparedStatement stmt = conn.prepareStatement(update) + ) { + stmt.setObject(1, to.name()); + stmt.setObject(2, from.name()); + stmt.setObject(3, context.getMigrationId()); + stmt.executeUpdate(); + conn.commit(); + } + } + + + @Override + public MigrationStatus getMigrationStatus(CopyContext context) throws Exception { + String query = "SELECT * FROM MIGRATIONTOOLKIT_TABLECOPYSTATUS WHERE migrationId = ?"; + try (Connection conn = getConnection(context); + PreparedStatement stmt = conn.prepareStatement(query) + ) { + stmt.setObject(1, context.getMigrationId()); + try (ResultSet rs = stmt.executeQuery()) { + rs.next(); + return convertToStatus(rs); + } + } + } + + /** + * @param rs result set to covert + * @return the equivalent Migration Status + * @throws Exception + */ + private MigrationStatus convertToStatus(ResultSet rs) throws Exception { + MigrationStatus status = new MigrationStatus(); + status.setMigrationID(rs.getString("migrationId")); + status.setStart(getDateTime(rs, "startAt")); + status.setEnd(getDateTime(rs, "endAt")); + status.setLastUpdate(getDateTime(rs, "lastUpdate")); + status.setTotalTasks(rs.getInt("total")); + status.setCompletedTasks(rs.getInt("completed")); + status.setFailedTasks(rs.getInt("failed")); + status.setStatus(MigrationProgress.valueOf(rs.getString("status"))); + + status.setCompleted(status.getTotalTasks() == status.getCompletedTasks() || MigrationProgress.STALLED.equals(status.getStatus())); + status.setFailed(status.getFailedTasks() > 0 || MigrationProgress.STALLED.equals(status.getStatus())); + status.setStatusUpdates(Collections.emptyList()); + + return status; + } + + private LocalDateTime getDateTime(ResultSet rs, String column) throws Exception { + Timestamp ts = rs.getObject(column, Timestamp.class); + return ts == null ? null : ts.toLocalDateTime(); + } + + + @Override + public void scheduleTask(CopyContext context, CopyContext.DataCopyItem copyItem, long sourceRowCount, int targetNode) throws Exception { + String insert = "INSERT INTO MIGRATIONTOOLKIT_TABLECOPYTASKS (targetnodeid, pipelinename, sourcetablename, targettablename, columnmap, migrationid, sourcerowcount, lastupdate) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + try (Connection conn = getConnection(context); + PreparedStatement stmt = conn.prepareStatement(insert) + ) { + stmt.setObject(1, targetNode); + stmt.setObject(2, copyItem.getPipelineName()); + stmt.setObject(3, copyItem.getSourceItem()); + stmt.setObject(4, copyItem.getTargetItem()); + stmt.setObject(5, new Gson().toJson(copyItem.getColumnMap())); + stmt.setObject(6, context.getMigrationId()); + stmt.setObject(7, sourceRowCount); + setTimestamp(stmt, 8, now()); + stmt.executeUpdate(); + conn.commit(); + } + } + + private Timestamp now() { + Instant now = java.time.Instant.now(); + Timestamp ts = new Timestamp(now.toEpochMilli()); + return ts; + } + + private Connection getConnection(CopyContext context) throws Exception { + return context.getMigrationContext().getDataTargetRepository().getConnection(); + } + + + @Override + public Set findPendingTasks(CopyContext context) throws Exception { + String sql = "SELECT * from MIGRATIONTOOLKIT_TABLECOPYTASKS WHERE targetnodeid=? AND migrationid=? AND duration IS NULL ORDER BY sourcerowcount"; + try (Connection connection = getConnection(context); + PreparedStatement stmt = connection.prepareStatement(sql) + ) { + stmt.setObject(1, getTargetNodeId()); + stmt.setObject(2, context.getMigrationId()); + try (ResultSet resultSet = stmt.executeQuery()) { + return convertToTask(resultSet); + } + } + } + + @Override + public void updateTaskProgress(CopyContext context, CopyContext.DataCopyItem copyItem, long itemCount) throws Exception { + String sql = "UPDATE MIGRATIONTOOLKIT_TABLECOPYTASKS " + + "SET targetrowcount=?, " + + "lastupdate=?, " + + "avgwriterrowthroughput=?, " + + "avgreaderrowthroughput=? " + + "WHERE targetnodeid=? " + + "AND migrationid=? " + + "AND pipelinename=?"; + try (Connection connection = getConnection(context); + PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setObject(1, itemCount); + setTimestamp(stmt, 2, now()); + stmt.setObject(3, getAvgPerformanceValue(context, PerformanceCategory.DB_WRITE, copyItem.getTargetItem())); + stmt.setObject(4, getAvgPerformanceValue(context, PerformanceCategory.DB_READ, copyItem.getSourceItem())); + stmt.setObject(5, getTargetNodeId()); + stmt.setObject(6, context.getMigrationId()); + stmt.setObject(7, copyItem.getPipelineName()); + stmt.executeUpdate(); + connection.commit(); + } + } + + protected void setTimestamp(PreparedStatement stmt, int i, Timestamp ts) throws SQLException { + stmt.setTimestamp(i, ts, Calendar.getInstance(TimeZone.getTimeZone("UTC"))); + } + + public void markTaskCompleted(final CopyContext context, final CopyContext.DataCopyItem copyItem, + final String duration) throws Exception { + markTaskCompleted(context, copyItem, duration, 0); + } + @Override + // ORACLE_TARGET - added durationInseconds + public void markTaskCompleted(final CopyContext context, final CopyContext.DataCopyItem copyItem, + final String duration, final float durationseconds) throws Exception { + Objects.requireNonNull(duration, "duration must not be null"); + String sql = "UPDATE MIGRATIONTOOLKIT_TABLECOPYTASKS " + + "SET duration=?, " + + "lastupdate=?, " + + "avgwriterrowthroughput=?, " + + "avgreaderrowthroughput=?, " + + "durationinseconds=? " + + "WHERE targetnodeid=? " + + "AND migrationid=? " + + "AND pipelinename=? " + + "AND duration IS NULL"; + try (Connection connection = getConnection(context); + PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setObject(1, duration); + setTimestamp(stmt, 2, now()); + stmt.setObject(3, getAvgPerformanceValue(context, PerformanceCategory.DB_WRITE, copyItem.getTargetItem())); + stmt.setObject(4, getAvgPerformanceValue(context, PerformanceCategory.DB_READ, copyItem.getSourceItem())); + // ORACLE_TARGET - added durationInseconds + stmt.setFloat(5, durationseconds); + stmt.setObject(6, getTargetNodeId()); + stmt.setObject(7, context.getMigrationId()); + stmt.setObject(8, copyItem.getPipelineName()); + stmt.executeUpdate(); + connection.commit(); + } + mutePerformanceRecorder(context, copyItem); + } + + @Override + public void markTaskFailed(CopyContext context, CopyContext.DataCopyItem copyItem, Exception error) throws Exception { + String sql = "UPDATE MIGRATIONTOOLKIT_TABLECOPYTASKS " + + "SET failure='1', duration='-1', " + + "error=?, " + + "lastupdate=? " + + "WHERE targetnodeid=? " + + "AND migrationId=? " + + "AND pipelinename=? " + + "AND failure = '0'"; + try (Connection connection = getConnection(context); + PreparedStatement stmt = connection.prepareStatement(sql)) { + String errorMsg = error.getMessage(); + if (StringUtils.isBlank(errorMsg)) { + errorMsg = error.getClass().getName(); + } + stmt.setObject(1, errorMsg.trim()); + setTimestamp(stmt, 2, now()); + stmt.setObject(3, getTargetNodeId()); + stmt.setObject(4, context.getMigrationId()); + stmt.setObject(5, copyItem.getPipelineName()); + stmt.executeUpdate(); + connection.commit(); + } + mutePerformanceRecorder(context, copyItem); + } + + @Override + public Set getUpdatedTasks(CopyContext context, OffsetDateTime since) throws Exception { + String sql = "select * from MIGRATIONTOOLKIT_TABLECOPYTASKS WHERE migrationid=? AND lastupdate >= ?"; + try (Connection connection = getConnection(context); + PreparedStatement stmt = connection.prepareStatement(sql); + ) { + stmt.setObject(1, context.getMigrationId()); + setTimestamp(stmt, 2, toTimestamp(since)); + try (ResultSet resultSet = stmt.executeQuery()) { + return convertToTask(resultSet); + } + } + } + + private Timestamp toTimestamp(OffsetDateTime ts) { + return new Timestamp(ts.toInstant().toEpochMilli()); + } + + @Override + public Set getAllTasks(CopyContext context) throws Exception { + String sql = "select * from MIGRATIONTOOLKIT_TABLECOPYTASKS WHERE migrationid=?"; + try (Connection connection = getConnection(context); + PreparedStatement stmt = connection.prepareStatement(sql); + ) { + stmt.setObject(1, context.getMigrationId()); + try (ResultSet resultSet = stmt.executeQuery()) { + return convertToTask(resultSet); + } + } + } + + private int getTargetNodeId() { + return clusterService.getClusterId(); + } + + public void setClusterService(ClusterService clusterService) { + this.clusterService = clusterService; + } + + + private Set convertToTask(ResultSet rs) throws Exception { + Set copyTasks = new HashSet<>(); + while (rs.next()) { + DatabaseCopyTask copyTask = new DatabaseCopyTask(); + copyTask.setTargetnodeId(rs.getInt("targetnodeId")); + copyTask.setMigrationId(rs.getString("migrationId")); + copyTask.setPipelinename(rs.getString("pipelinename")); + copyTask.setSourcetablename(rs.getString("sourcetablename")); + copyTask.setTargettablename(rs.getString("targettablename")); + copyTask.setColumnmap(new Gson().fromJson(rs.getString("columnmap"), new TypeToken>() { + }.getType())); + copyTask.setDuration(rs.getString("duration")); + copyTask.setCompleted(copyTask.getDuration() != null); + copyTask.setSourcerowcount(rs.getLong("sourcerowcount")); + copyTask.setTargetrowcount(rs.getLong("targetrowcount")); + copyTask.setFailure(rs.getBoolean("failure")); + copyTask.setError(rs.getString("error")); + copyTask.setLastUpdate(getDateTime(rs, "lastupdate")); + copyTask.setAvgReaderRowThroughput(rs.getDouble("avgreaderrowthroughput")); + copyTask.setAvgWriterRowThroughput(rs.getDouble("avgwriterrowthroughput")); + // ORACLE_TARGET + copyTask.setDurationinseconds(rs.getDouble("durationinseconds")); + copyTasks.add(copyTask); + } + return copyTasks; + } + + private double getAvgPerformanceValue(CopyContext context, PerformanceCategory category, String tableName) { + PerformanceRecorder recorder = context.getPerformanceProfiler().getRecorder(category, tableName); + if (recorder != null) { + PerformanceRecorder.PerformanceAggregation performanceAggregation = recorder.getRecords().get(PerformanceUnit.ROWS); + if (performanceAggregation != null) { + return performanceAggregation.getAvgThroughput().get(); + } + } + return 0; + } + + private void mutePerformanceRecorder(CopyContext context, CopyContext.DataCopyItem copyItem) { + context.getPerformanceProfiler().muteRecorder(PerformanceCategory.DB_READ, copyItem.getSourceItem()); + context.getPerformanceProfiler().muteRecorder(PerformanceCategory.DB_WRITE, copyItem.getTargetItem()); + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationDataTypeMapperService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationDataTypeMapperService.java new file mode 100644 index 0000000..cdee576 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationDataTypeMapperService.java @@ -0,0 +1,64 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.google.common.io.ByteStreams; +import org.apache.commons.io.IOUtils; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.Reader; +import java.io.StringWriter; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.NClob; +import java.sql.SQLException; +import java.sql.Types; + +/** + * + */ +public class DefaultDatabaseMigrationDataTypeMapperService implements DatabaseMigrationDataTypeMapperService { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultDatabaseMigrationDataTypeMapperService.class); + + @Override + public Object dataTypeMapper(final Object sourceColumnValue, final int jdbcType) + throws IOException, SQLException { + Object targetColumnValue = sourceColumnValue; + if (sourceColumnValue == null) { + // do nothing + } else if (jdbcType == Types.BLOB) { + targetColumnValue = new ByteArrayInputStream(ByteStreams.toByteArray(((Blob) sourceColumnValue).getBinaryStream())); + } else if (jdbcType == Types.NCLOB) { + targetColumnValue = getValue((NClob) sourceColumnValue); + } else if (jdbcType == Types.CLOB) { + targetColumnValue = getValue((Clob) sourceColumnValue); + } + return targetColumnValue; + } + + private String getValue(final NClob nClob) throws SQLException, IOException { + return getValue(nClob.getCharacterStream()); + } + + private String getValue(final Clob clob) throws SQLException, IOException { + return getValue(clob.getCharacterStream()); + } + + private String getValue(final Reader in) throws SQLException, IOException { + final StringWriter w = new StringWriter(); + IOUtils.copy(in, w); + String value = w.toString(); + w.close(); + in.close(); + return value; + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationReportService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationReportService.java new file mode 100644 index 0000000..993cddf --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationReportService.java @@ -0,0 +1,77 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.scheduler.DatabaseCopyScheduler; +import com.sap.cx.boosters.commercedbsync.utils.MaskUtil; +import de.hybris.platform.servicelayer.config.ConfigurationService; +import org.apache.commons.configuration.Configuration; +import com.sap.cx.boosters.commercedbsync.MigrationReport; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationReportService; + +import java.time.OffsetDateTime; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.stream.Collectors; + +public class DefaultDatabaseMigrationReportService implements DatabaseMigrationReportService { + + private DatabaseCopyScheduler databaseCopyScheduler; + private DatabaseCopyTaskRepository databaseCopyTaskRepository; + private ConfigurationService configurationService; + + @Override + public MigrationReport getMigrationReport(CopyContext copyContext) throws Exception { + final MigrationReport migrationReport = new MigrationReport(); + migrationReport.setMigrationID(copyContext.getMigrationId()); + populateConfiguration(migrationReport); + migrationReport.setMigrationStatus(databaseCopyScheduler.getCurrentState(copyContext, OffsetDateTime.MAX)); + migrationReport.setDatabaseCopyTasks(databaseCopyTaskRepository.getAllTasks(copyContext)); + return migrationReport; + } + + private void populateConfiguration(MigrationReport migrationReport) { + final SortedMap configuration = new TreeMap<>(); + final Configuration config = configurationService.getConfiguration(); + final Configuration subset = config.subset(CommercedbsyncConstants.PROPERTIES_PREFIX); + final Set maskedProperties = Arrays.stream(config.getString(CommercedbsyncConstants.MIGRATION_REPORT_MASKED_PROPERTIES) + .split(",")).collect(Collectors.toSet()); + + final Iterator keys = subset.getKeys(); + + while (keys.hasNext()) { + final String key = keys.next(); + final String prefixedKey = CommercedbsyncConstants.PROPERTIES_PREFIX + "." + key; + + if (CommercedbsyncConstants.MIGRATION_REPORT_MASKED_PROPERTIES.equals(prefixedKey)) { + continue; + } + + configuration.put(prefixedKey, maskedProperties.contains(prefixedKey) ? CommercedbsyncConstants.MASKED_VALUE : MaskUtil.stripJdbcPassword(subset.getString(key))); + } + + migrationReport.setConfiguration(configuration); + } + + public void setDatabaseCopyScheduler(DatabaseCopyScheduler databaseCopyScheduler) { + this.databaseCopyScheduler = databaseCopyScheduler; + } + + public void setDatabaseCopyTaskRepository(DatabaseCopyTaskRepository databaseCopyTaskRepository) { + this.databaseCopyTaskRepository = databaseCopyTaskRepository; + } + + public void setConfigurationService(ConfigurationService configurationService) { + this.configurationService = configurationService; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationService.java new file mode 100644 index 0000000..ab56cdd --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationService.java @@ -0,0 +1,127 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceProfiler; +import com.sap.cx.boosters.commercedbsync.scheduler.DatabaseCopyScheduler; +import com.sap.cx.boosters.commercedbsync.MigrationReport; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.context.validation.MigrationContextValidator; +import com.sap.cx.boosters.commercedbsync.provider.CopyItemProvider; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationReportService; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationService; +import com.sap.cx.boosters.commercedbsync.service.DatabaseSchemaDifferenceService; +import org.slf4j.MDC; + +import java.time.OffsetDateTime; +import java.util.Set; +import java.util.UUID; + +public class DefaultDatabaseMigrationService implements DatabaseMigrationService { + + private DatabaseCopyScheduler databaseCopyScheduler; + private CopyItemProvider copyItemProvider; + private PerformanceProfiler performanceProfiler; + private DatabaseMigrationReportService databaseMigrationReportService; + private DatabaseSchemaDifferenceService schemaDifferenceService; + private MigrationContextValidator migrationContextValidator; + + @Override + public String startMigration(final MigrationContext context) throws Exception { + migrationContextValidator.validateContext(context); + + // TODO: running migration check + performanceProfiler.reset(); + + final String migrationId = UUID.randomUUID().toString(); + + MDC.put(CommercedbsyncConstants.MDC_MIGRATIONID, migrationId); + + if (context.isSchemaMigrationEnabled() && context.isSchemaMigrationAutoTriggerEnabled()) { + schemaDifferenceService.executeSchemaDifferences(context); + } + + CopyContext copyContext = buildCopyContext(context, migrationId); + databaseCopyScheduler.schedule(copyContext); + + return migrationId; + } + + @Override + public void stopMigration(MigrationContext context, String migrationID) throws Exception { + CopyContext copyContext = buildIdContext(context, migrationID); + databaseCopyScheduler.abort(copyContext); + } + + private CopyContext buildCopyContext(MigrationContext context, String migrationID) throws Exception { + Set dataCopyItems = copyItemProvider.get(context); + return new CopyContext(migrationID, context, dataCopyItems, performanceProfiler); + } + + private CopyContext buildIdContext(MigrationContext context, String migrationID) throws Exception { + //we use a lean implementation of the copy context to avoid calling the provider which is not required for task management. + return new CopyContext.IdCopyContext(migrationID, context, performanceProfiler); + } + + @Override + public MigrationStatus getMigrationState(MigrationContext context, String migrationID) throws Exception { + return getMigrationState(context, migrationID, OffsetDateTime.MAX); + } + + @Override + public MigrationStatus getMigrationState(MigrationContext context, String migrationID, OffsetDateTime since) throws Exception { + CopyContext copyContext = buildIdContext(context, migrationID); + return databaseCopyScheduler.getCurrentState(copyContext, since); + } + + @Override + public MigrationReport getMigrationReport(MigrationContext context, String migrationID) throws Exception { + CopyContext copyContext = buildIdContext(context, migrationID); + return databaseMigrationReportService.getMigrationReport(copyContext); + } + + @Override + public MigrationStatus waitForFinish(MigrationContext context, String migrationID) throws Exception { + MigrationStatus status; + do { + status = getMigrationState(context, migrationID); + Thread.sleep(5000); + } while (!status.isCompleted()); + + if (status.isFailed()) { + throw new Exception("Database migration failed"); + } + + return status; + } + + public void setDatabaseCopyScheduler(DatabaseCopyScheduler databaseCopyScheduler) { + this.databaseCopyScheduler = databaseCopyScheduler; + } + + public void setCopyItemProvider(CopyItemProvider copyItemProvider) { + this.copyItemProvider = copyItemProvider; + } + + public void setPerformanceProfiler(PerformanceProfiler performanceProfiler) { + this.performanceProfiler = performanceProfiler; + } + + public void setDatabaseMigrationReportService(DatabaseMigrationReportService databaseMigrationReportService) { + this.databaseMigrationReportService = databaseMigrationReportService; + } + + public void setSchemaDifferenceService(DatabaseSchemaDifferenceService schemaDifferenceService) { + this.schemaDifferenceService = schemaDifferenceService; + } + + public void setMigrationContextValidator(MigrationContextValidator migrationContextValidator) { + this.migrationContextValidator = migrationContextValidator; + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationSynonymService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationSynonymService.java new file mode 100644 index 0000000..990dc1a --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseMigrationSynonymService.java @@ -0,0 +1,34 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationSynonymService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DefaultDatabaseMigrationSynonymService implements DatabaseMigrationSynonymService { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultDatabaseMigrationSynonymService.class); + + private static final String YDEPLOYMENTS = CommercedbsyncConstants.DEPLOYMENTS_TABLE; + private static final String ATTRDESCRIPTORS = "attributedescriptors"; + + + @Override + public void recreateSynonyms(DataRepository repository, String prefix) throws Exception { + recreateSynonym(repository, YDEPLOYMENTS, prefix); + recreateSynonym(repository, ATTRDESCRIPTORS, prefix); + } + + private void recreateSynonym(DataRepository repository, String table, String actualPrefix) throws Exception { + LOG.info("Creating Synonym for {} on {}{}", table, actualPrefix, table); + repository.executeUpdateAndCommit(String.format("DROP SYNONYM IF EXISTS %s", table)); + repository.executeUpdateAndCommit(String.format("CREATE SYNONYM %s FOR %s%s", table, actualPrefix, table)); + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseSchemaDifferenceService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseSchemaDifferenceService.java new file mode 100644 index 0000000..b64c800 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/DefaultDatabaseSchemaDifferenceService.java @@ -0,0 +1,567 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import de.hybris.platform.servicelayer.config.ConfigurationService; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.ddlutils.Platform; +import org.apache.ddlutils.model.Column; +import org.apache.ddlutils.model.Database; +import org.apache.ddlutils.model.Table; +import com.sap.cx.boosters.commercedbsync.TableCandidate; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.filter.DataCopyTableFilter; +import com.sap.cx.boosters.commercedbsync.provider.CopyItemProvider; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationReportStorageService; +import com.sap.cx.boosters.commercedbsync.service.DatabaseSchemaDifferenceService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class DefaultDatabaseSchemaDifferenceService implements DatabaseSchemaDifferenceService { + private static final Logger LOG = LoggerFactory.getLogger(DefaultDatabaseSchemaDifferenceService.class); + + private DataCopyTableFilter dataCopyTableFilter; + private DatabaseMigrationReportStorageService databaseMigrationReportStorageService; + private CopyItemProvider copyItemProvider; + private ConfigurationService configurationService; + + @Override + public String generateSchemaDifferencesSql(MigrationContext context) throws Exception { + final int maxStageMigrations = context.getMaxTargetStagedMigrations(); + final Set stagingPrefixes = findStagingPrefixes(context); + String schemaSql = ""; + if (stagingPrefixes.size() > maxStageMigrations) { + final Database databaseModelWithChanges = getDatabaseModelWithChanges4TableDrop(context); + LOG.info("generateSchemaDifferencesSql..getDatabaseModelWithChanges4TableDrop.. - calibrating changes "); + schemaSql = context.getDataTargetRepository().asPlatform().getDropTablesSql(databaseModelWithChanges, true); + LOG.info("generateSchemaDifferencesSql - generated DDL SQLs for DROP. "); + } else { + LOG.info( + "generateSchemaDifferencesSql..getDatabaseModelWithChanges4TableCreation - calibrating Schema changes "); + final DatabaseStatus databaseModelWithChanges = getDatabaseModelWithChanges4TableCreation(context); + if (databaseModelWithChanges.isHasSchemaDiff()) { + LOG.info("generateSchemaDifferencesSql..Schema Diff found - now to generate the SQLs "); + if (context.getDataTargetRepository().getDatabaseProvider().isHanaUsed()){ + schemaSql = context.getDataTargetRepository().asPlatform() + .getAlterTablesSql(null ,context.getDataTargetRepository().getDataSourceConfiguration().getSchema(),null,databaseModelWithChanges.getDatabase()); + } else { + schemaSql = context.getDataTargetRepository().asPlatform() + .getAlterTablesSql(databaseModelWithChanges.getDatabase()); + } + + schemaSql = postProcess(schemaSql, context); + LOG.info("generateSchemaDifferencesSql - generated DDL ALTER SQLs. "); + } + + } + + return schemaSql; + } + + /* + * ORACLE_TARGET - START This a TEMP fix, it is difficlt to get from from + * Sql Server NVARCHAR(255), NVARCHAR(MAX) to convert properly into to + * Orcale's VARCHAR2(255) and CLOB respectively. Therefore when the schema + * script output has VARCHAR2(2147483647) which is from SqlServer's + * NVARCHAR(max), then we just make it CLOB. Alternatively check if + * something can be done via the mappings in OracleDataRepository. + */ + private String postProcess(String schemaSql, final MigrationContext context) { + if (context.getDataTargetRepository().getDatabaseProvider().isOracleUsed()) { + schemaSql = schemaSql.replaceAll(CommercedbsyncConstants.MIGRATION_ORACLE_MAX, + CommercedbsyncConstants.MIGRATION_ORACLE_VARCHAR24k); + // another odd character that comes un in the SQL + LOG.info("Changing the NVARCHAR2 " + schemaSql); + schemaSql = schemaSql.replaceAll("NUMBER\\(10,0\\) DEFAULT \'\'\'\'\'\'", "NUMBER(10,0) DEFAULT 0"); + } + return schemaSql; + } + // ORACLE_TARGET - END + + @Override + public void executeSchemaDifferencesSql(final MigrationContext context, final String sql) throws Exception { + + if (!context.isSchemaMigrationEnabled()) { + throw new RuntimeException("Schema migration is disabled. Check property:" + + CommercedbsyncConstants.MIGRATION_SCHEMA_ENABLED); + } + + final Platform platform = context.getDataTargetRepository().asPlatform(); + final boolean continueOnError = false; + final Connection connection = platform.borrowConnection(); + try { + platform.evaluateBatch(connection, sql, continueOnError); + LOG.info("Executed the following sql to change the schema:\n" + sql); + writeReport(context, sql); + } catch (final Exception e) { + throw new RuntimeException("Could not execute Schema Diff Script", e); + } finally { + platform.returnConnection(connection); + } + } + + @Override + public void executeSchemaDifferences(final MigrationContext context) throws Exception { + executeSchemaDifferencesSql(context, generateSchemaDifferencesSql(context)); + } + + private Set findDuplicateTables(final MigrationContext migrationContext) { + try { + final Set stagingPrefixes = findStagingPrefixes(migrationContext); + final Set targetSet = migrationContext.getDataTargetRepository().getAllTableNames(); + return targetSet.stream() + .filter(t -> stagingPrefixes.stream().anyMatch(p -> StringUtils.startsWithIgnoreCase(t, p))) + .collect(Collectors.toSet()); + } catch (final Exception e) { + LOG.error("Error occurred while trying to find duplicate tables", e); + } + return Collections.EMPTY_SET; + } + + private Set findStagingPrefixes(final MigrationContext context) throws Exception { + final String currentSystemPrefix = configurationService.getConfiguration().getString("db.tableprefix"); + final String currentMigrationPrefix = context.getDataTargetRepository().getDataSourceConfiguration() + .getTablePrefix(); + final Set targetSet = context.getDataTargetRepository().getAllTableNames(); + final String deploymentsTable = CommercedbsyncConstants.DEPLOYMENTS_TABLE; + final Set detectedPrefixes = targetSet.stream().filter(t -> t.toLowerCase().endsWith(deploymentsTable)) + .filter(t -> !StringUtils.equalsIgnoreCase(t, currentSystemPrefix + deploymentsTable)) + .filter(t -> !StringUtils.equalsIgnoreCase(t, currentMigrationPrefix + deploymentsTable)) + .map(t -> StringUtils.removeEndIgnoreCase(t, deploymentsTable)).collect(Collectors.toSet()); + return detectedPrefixes; + + } + + private Database getDatabaseModelWithChanges4TableDrop(final MigrationContext context) { + final Set duplicateTables = findDuplicateTables(context); + final Database database = context.getDataTargetRepository().asDatabase(true); + // clear tables and add only the ones to be removed + final Table[] tables = database.getTables(); + Stream.of(tables).forEach(t -> { + database.removeTable(t); + }); + duplicateTables.forEach(t -> { + final Table table = ObjectUtils.defaultIfNull(database.findTable(t), new Table()); + table.setName(t); + database.addTable(table); + }); + return database; + } + + protected DatabaseStatus getDatabaseModelWithChanges4TableCreation(final MigrationContext migrationContext) + throws Exception { + final DatabaseStatus dbStatus = new DatabaseStatus(); + + final SchemaDifferenceResult differenceResult = getDifference(migrationContext); + if (!differenceResult.hasDifferences()) { + LOG.info("getDatabaseModelWithChanges4TableCreation - No Difference found in schema "); + dbStatus.setDatabase(migrationContext.getDataTargetRepository().asDatabase()); + dbStatus.setHasSchemaDiff(false); + return dbStatus; + } + final SchemaDifference targetDiff = differenceResult.getTargetSchema(); + final Database database = targetDiff.getDatabase(); + + // add missing tables in target + if (migrationContext.isAddMissingTablesToSchemaEnabled()) { + final List missingTables = targetDiff.getMissingTables(); + for (final TableKeyPair missingTable : missingTables) { + final Table tableClone = (Table) differenceResult.getSourceSchema().getDatabase() + .findTable(missingTable.getLeftName(), false).clone(); + tableClone.setName(missingTable.getRightName()); + tableClone.setCatalog( + migrationContext.getDataTargetRepository().getDataSourceConfiguration().getCatalog()); + tableClone + .setSchema(migrationContext.getDataTargetRepository().getDataSourceConfiguration().getSchema()); + database.addTable(tableClone); + LOG.info("getDatabaseModelWithChanges4TableCreation - missingTable.getRightName() =" + + missingTable.getRightName() + ", missingTable.getLeftName() = " + missingTable.getLeftName()); + } + } + + // add missing columns in target + if (migrationContext.isAddMissingColumnsToSchemaEnabled()) { + final ListMultimap missingColumnsInTable = targetDiff.getMissingColumnsInTable(); + for (final TableKeyPair missingColumnsTable : missingColumnsInTable.keySet()) { + final List columns = missingColumnsInTable.get(missingColumnsTable); + for (final String missingColumn : columns) { + final Table missingColumnsTableModel = differenceResult.getSourceSchema().getDatabase() + .findTable(missingColumnsTable.getLeftName(), false); + final Column columnClone = (Column) missingColumnsTableModel.findColumn(missingColumn, false) + .clone(); + LOG.info(" Column " + columnClone.getName() + ", Type = " + columnClone.getType() + ", Type Code " + + columnClone.getTypeCode() + ",size " + columnClone.getSize() + ", size as int " + + columnClone.getSizeAsInt()); + // columnClone.set + final Table table = database.findTable(missingColumnsTable.getRightName(), false); + Preconditions.checkState(table != null, "Data inconsistency: Table must exist."); + table.addColumn(columnClone); + } + } + } + + //remove superfluous tables in target + if (migrationContext.isRemoveMissingTablesToSchemaEnabled()) { + throw new UnsupportedOperationException("not yet implemented"); + } + + // remove superfluous columns in target + if (migrationContext.isRemoveMissingColumnsToSchemaEnabled()) { + final ListMultimap superfluousColumnsInTable = differenceResult.getSourceSchema() + .getMissingColumnsInTable(); + for (final TableKeyPair superfluousColumnsTable : superfluousColumnsInTable.keySet()) { + final List columns = superfluousColumnsInTable.get(superfluousColumnsTable); + for (final String superfluousColumn : columns) { + final Table table = database.findTable(superfluousColumnsTable.getLeftName(), false); + Preconditions.checkState(table != null, "Data inconsistency: Table must exist."); + final Column columnToBeRemoved = table.findColumn(superfluousColumn, false); + // remove indices in case column is part of one + Stream.of(table.getIndices()).filter(i -> i.hasColumn(columnToBeRemoved)) + .forEach(i -> table.removeIndex(i)); + table.removeColumn(columnToBeRemoved); + } + } + } + dbStatus.setDatabase(database); + dbStatus.setHasSchemaDiff(true); + LOG.info("getDatabaseModelWithChanges4TableCreation Schema Diff found - done "); + return dbStatus; + } + + protected void writeReport(final MigrationContext migrationContext, final String differenceSql) { + try { + final String fileName = String.format("schemaChanges-%s.sql", LocalDateTime.now().getNano()); + databaseMigrationReportStorageService.store(fileName, + new ByteArrayInputStream(differenceSql.getBytes(StandardCharsets.UTF_8))); + } catch (final Exception e) { + LOG.error("Error executing writing diff report", e); + } + } + + @Override + public SchemaDifferenceResult getDifference(final MigrationContext migrationContext) throws Exception { + try { + LOG.info("reading source database model ..."); + migrationContext.getDataSourceRepository().asDatabase(true); + LOG.info("reading target database model ..."); + migrationContext.getDataTargetRepository().asDatabase(true); + + LOG.info("computing SCHEMA diff, REF DB = " + + migrationContext.getDataTargetRepository().getDatabaseProvider().getDbName() + + "vs Checking in DB = " + + migrationContext.getDataSourceRepository().getDatabaseProvider().getDbName()); + final Set targetTableCandidates = copyItemProvider + .getTargetTableCandidates(migrationContext); + final SchemaDifference sourceSchemaDifference = computeDiff(migrationContext, + migrationContext.getDataTargetRepository(), migrationContext.getDataSourceRepository(), + targetTableCandidates); + LOG.info("compute SCHMEA diff, REF DB =" + + migrationContext.getDataSourceRepository().getDatabaseProvider().getDbName() + + "vs Checking in DB = " + + migrationContext.getDataTargetRepository().getDatabaseProvider().getDbName()); + final Set sourceTableCandidates = copyItemProvider + .getSourceTableCandidates(migrationContext); + final SchemaDifference targetSchemaDifference = computeDiff(migrationContext, + migrationContext.getDataSourceRepository(), migrationContext.getDataTargetRepository(), + sourceTableCandidates); + final SchemaDifferenceResult schemaDifferenceResult = new SchemaDifferenceResult(sourceSchemaDifference, + targetSchemaDifference); + LOG.info("Diff finished. Differences detected: " + schemaDifferenceResult.hasDifferences()); + + return schemaDifferenceResult; + } catch (final Exception e) { + throw new RuntimeException("Error computing schema diff", e); + } + } + + protected String getSchemaDifferencesAsJson(final SchemaDifferenceResult schemaDifferenceResult) { + final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + return gson.toJson(schemaDifferenceResult); + } + + private void logMigrationContext(final MigrationContext context) { + if (context == null) { + return; + } + LOG.info("--------MIGRATION CONTEXT- START----------"); + LOG.info("isAddMissingColumnsToSchemaEnabled=" + context.isAddMissingColumnsToSchemaEnabled()); + LOG.info("isAddMissingTablesToSchemaEnabled=" + context.isAddMissingTablesToSchemaEnabled()); + LOG.info("isAuditTableMigrationEnabled=" + context.isAuditTableMigrationEnabled()); + LOG.info("isBulkCopyEnabled=" + context.isBulkCopyEnabled()); + LOG.info("isClusterMode=" + context.isClusterMode()); + LOG.info("isDeletionEnabled=" + context.isDeletionEnabled()); + LOG.info("isDisableAllIndexesEnabled=" + context.isDisableAllIndexesEnabled()); + LOG.info("isDropAllIndexesEnabled=" + context.isDropAllIndexesEnabled()); + LOG.info("isFailOnErrorEnabled=" + context.isFailOnErrorEnabled()); + LOG.info("isIncrementalModeEnabled=" + context.isIncrementalModeEnabled()); + LOG.info("isMigrationTriggeredByUpdateProcess=" + context.isMigrationTriggeredByUpdateProcess()); + LOG.info("isRemoveMissingColumnsToSchemaEnabled=" + context.isRemoveMissingColumnsToSchemaEnabled()); + LOG.info("isRemoveMissingTablesToSchemaEnabled=" + context.isRemoveMissingTablesToSchemaEnabled()); + LOG.info("isSchemaMigrationAutoTriggerEnabled=" + context.isSchemaMigrationAutoTriggerEnabled()); + LOG.info("isSchemaMigrationEnabled=" + context.isSchemaMigrationEnabled()); + LOG.info("isTruncateEnabled=" + context.isTruncateEnabled()); + LOG.info("getIncludedTables=" + context.getIncludedTables()); + LOG.info("getExcludedTables=" + context.getExcludedTables()); + LOG.info("getIncrementalTables=" + context.getIncrementalTables()); + LOG.info("getTruncateExcludedTables=" + context.getTruncateExcludedTables()); + LOG.info("getCustomTables=" + context.getCustomTables()); + LOG.info("getIncrementalTimestamp=" + context.getIncrementalTimestamp()); + LOG.info( + "Source TS Name=" + context.getDataSourceRepository().getDataSourceConfiguration().getTypeSystemName()); + LOG.info("Source TS Suffix =" + + context.getDataSourceRepository().getDataSourceConfiguration().getTypeSystemSuffix()); + LOG.info( + "Target TS Name=" + context.getDataTargetRepository().getDataSourceConfiguration().getTypeSystemName()); + LOG.info("Target TS Suffix =" + + context.getDataTargetRepository().getDataSourceConfiguration().getTypeSystemSuffix()); + + LOG.info("--------MIGRATION CONTEXT- END----------"); + } + + protected SchemaDifference computeDiff(final MigrationContext context, final DataRepository leftRepository, + final DataRepository rightRepository, final Set leftCandidates) { + logMigrationContext(context); + final SchemaDifference schemaDifference = new SchemaDifference(rightRepository.asDatabase(), + rightRepository.getDataSourceConfiguration().getTablePrefix()); + final Set leftDatabaseTables = getTables(context, leftRepository, leftCandidates); + LOG.info("LEFT Repo = " + leftRepository.getDatabaseProvider().getDbName()); + LOG.info("RIGHT Repo = " + rightRepository.getDatabaseProvider().getDbName()); + + try { + LOG.debug(" All tables in LEFT Repo " + leftRepository.getAllTableNames()); + LOG.debug(" All tables in RIGHT Repo " + rightRepository.getAllTableNames()); + } catch (final Exception e) { + LOG.error("Cannot fetch all Table Names" + e); + } + + // LOG.info(" -------------------------------"); + for (final TableCandidate leftCandidate : leftDatabaseTables) { + LOG.info(" Checking if Left Table exists --> " + leftCandidate.getFullTableName()); + final Table leftTable = leftRepository.asDatabase().findTable(leftCandidate.getFullTableName(), false); + if (leftTable == null) { + LOG.error(String.format("Table %s in DB %s cannot be found, but should exist", + leftCandidate.getFullTableName(), + leftRepository.getDataSourceConfiguration().getConnectionString())); + continue; + + // throw new RuntimeException(String.format("Table %s in DB %s + // cannot be found, but should exists", + // leftCandidate.getFullTableName(), + // leftRepository.getDataSourceConfiguration().getConnectionString())); + } + final String rightTableName = translateTableName(leftRepository, rightRepository, leftCandidate); + final Table rightTable = rightRepository.asDatabase().findTable(rightTableName, false); + if (rightTable == null) { + schemaDifference.getMissingTables().add(new TableKeyPair(leftTable.getName(), rightTableName)); + LOG.info("MISSING Table !! --> " + leftTable.getName() + " searched for " + rightTableName); + } else { + // LOG.info(" FOUND Table --> " + rightTable.getName()); + final Column[] leftTableColumns = leftTable.getColumns(); + for (final Column leftTableColumn : leftTableColumns) { + if (rightTable.findColumn(leftTableColumn.getName(), false) == null) { + LOG.info("Missing column --> " + leftTableColumn.getName() + " -->" + leftTable.getName()); + schemaDifference.getMissingColumnsInTable().put( + new TableKeyPair(leftTable.getName(), rightTable.getName()), leftTableColumn.getName()); + } + } + } + } + return schemaDifference; + } + + private String translateTableName(final DataRepository leftRepository, final DataRepository rightRepository, + final TableCandidate leftCandidate) { + String translatedTableName = rightRepository.getDataSourceConfiguration().getTablePrefix() + + leftCandidate.getBaseTableName(); + if (leftCandidate.isTypeSystemRelatedTable()) { + translatedTableName += rightRepository.getDataSourceConfiguration().getTypeSystemSuffix(); + } + // ORCALE_TEMP - START + /* + * if (!leftCandidate.getAdditionalSuffix().isEmpty() && + * translatedTableName.toLowerCase().endsWith(leftCandidate. + * getAdditionalSuffix())) { + * //System.out.println("$$Translated name ends with LP " + + * translatedTableName); return translatedTableName; } + */ + // ORCALE_TEMP - END + return translatedTableName + leftCandidate.getAdditionalSuffix(); + } + + private Set getTables(final MigrationContext context, final DataRepository repository, + final Set candidates) { + return candidates.stream().filter(c -> dataCopyTableFilter.filter(context).test(c.getCommonTableName())) + .collect(Collectors.toSet()); + } + + public void setDataCopyTableFilter(final DataCopyTableFilter dataCopyTableFilter) { + this.dataCopyTableFilter = dataCopyTableFilter; + } + + public void setDatabaseMigrationReportStorageService( + final DatabaseMigrationReportStorageService databaseMigrationReportStorageService) { + this.databaseMigrationReportStorageService = databaseMigrationReportStorageService; + } + + public void setConfigurationService(final ConfigurationService configurationService) { + this.configurationService = configurationService; + } + + public void setCopyItemProvider(final CopyItemProvider copyItemProvider) { + this.copyItemProvider = copyItemProvider; + } + + public static class SchemaDifferenceResult { + private final SchemaDifference sourceSchema; + private final SchemaDifference targetSchema; + + public SchemaDifferenceResult(final SchemaDifference sourceSchema, final SchemaDifference targetSchema) { + this.sourceSchema = sourceSchema; + this.targetSchema = targetSchema; + } + + public SchemaDifference getSourceSchema() { + return sourceSchema; + } + + public SchemaDifference getTargetSchema() { + return targetSchema; + } + + public boolean hasDifferences() { + final boolean hasMissingTargetTables = getTargetSchema().getMissingTables().size() > 0; + final boolean hasMissingColumnsInTargetTable = getTargetSchema().getMissingColumnsInTable().size() > 0; + final boolean hasMissingSourceTables = getSourceSchema().getMissingTables().size() > 0; + final boolean hasMissingColumnsInSourceTable = getSourceSchema().getMissingColumnsInTable().size() > 0; + return hasMissingTargetTables || hasMissingColumnsInTargetTable || hasMissingSourceTables + || hasMissingColumnsInSourceTable; + } + } + + class DatabaseStatus { + private Database database; + + /** + * @return the database + */ + public Database getDatabase() { + return database; + } + + /** + * @param database + * the database to set + */ + public void setDatabase(final Database database) { + this.database = database; + } + + /** + * @return the hasSchemaDiff + */ + public boolean isHasSchemaDiff() { + return hasSchemaDiff; + } + + /** + * @param hasSchemaDiff + * the hasSchemaDiff to set + */ + public void setHasSchemaDiff(final boolean hasSchemaDiff) { + this.hasSchemaDiff = hasSchemaDiff; + } + + private boolean hasSchemaDiff; + } + + public static class SchemaDifference { + + private final Database database; + private final String prefix; + + private final List missingTables = new ArrayList<>(); + private final ListMultimap missingColumnsInTable = ArrayListMultimap.create(); + + public SchemaDifference(final Database database, final String prefix) { + this.database = database; + this.prefix = prefix; + + } + + public Database getDatabase() { + return database; + } + + public String getPrefix() { + return prefix; + } + + public List getMissingTables() { + return missingTables; + } + + public ListMultimap getMissingColumnsInTable() { + return missingColumnsInTable; + } + } + + public static class TableKeyPair { + private final String leftName; + private final String rightName; + + public TableKeyPair(final String leftName, final String rightName) { + this.leftName = leftName; + this.rightName = rightName; + } + + public String getLeftName() { + return leftName; + } + + public String getRightName() { + return rightName; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final TableKeyPair that = (TableKeyPair) o; + return leftName.equals(that.leftName) && rightName.equals(that.rightName); + } + + @Override + public int hashCode() { + return Objects.hash(leftName, rightName); + } + } + +} \ No newline at end of file diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/PipeDatabaseMigrationCopyService.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/PipeDatabaseMigrationCopyService.java new file mode 100644 index 0000000..88b3e60 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/service/impl/PipeDatabaseMigrationCopyService.java @@ -0,0 +1,181 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.service.impl; + +import com.google.common.base.Stopwatch; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.scheduler.DatabaseCopyScheduler; +import com.sap.cx.boosters.commercedbsync.strategy.PipeWriterStrategy; +import org.apache.commons.lang3.tuple.Pair; +import com.sap.cx.boosters.commercedbsync.concurrent.DataPipe; +import com.sap.cx.boosters.commercedbsync.concurrent.DataPipeFactory; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationCopyService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.core.task.TaskRejectedException; +import org.springframework.util.backoff.BackOffExecution; +import org.springframework.util.backoff.ExponentialBackOff; + +import java.util.ArrayList; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; +import java.util.stream.Collectors; + +/** + * Service to start the asynchronous migration + */ +public class PipeDatabaseMigrationCopyService implements DatabaseMigrationCopyService { + private static final Logger LOG = LoggerFactory.getLogger(PipeDatabaseMigrationCopyService.class); + + private final DataPipeFactory pipeFactory; + private final PipeWriterStrategy writerStrategy; + private final AsyncTaskExecutor executor; + private final DatabaseCopyTaskRepository databaseCopyTaskRepository; + private final DatabaseCopyScheduler scheduler; + + + public PipeDatabaseMigrationCopyService(DataPipeFactory pipeFactory, PipeWriterStrategy writerStrategy, AsyncTaskExecutor executor, DatabaseCopyTaskRepository databaseCopyTaskRepository, DatabaseCopyScheduler scheduler) { + this.pipeFactory = pipeFactory; + this.writerStrategy = writerStrategy; + this.executor = executor; + this.databaseCopyTaskRepository = databaseCopyTaskRepository; + this.scheduler = scheduler; + } + + @Override + public void copyAllAsync(CopyContext context) { + Set copyItems = context.getCopyItems(); + Deque>> tasksToSchedule = generateCopyTasks(context, copyItems); + scheduleTasks(context, tasksToSchedule); + } + + /** + * Creates Tasks to copy the Data + * + * @param context + * @param copyItems + * @return + */ + private Deque>> generateCopyTasks(CopyContext context, Set copyItems) { + return copyItems.stream() + .map(item -> Pair.of(item, (Callable) () -> { + final Stopwatch timer = Stopwatch.createStarted(); + try (MDC.MDCCloseable ignored = MDC.putCloseable(CommercedbsyncConstants.MDC_PIPELINE, item.getPipelineName())) { + try { + copy(context, item); + } catch (Exception e) { + LOG.error("Failed to copy item", e); + return Boolean.FALSE; + } finally { + // ORACLE_TARGET ADDED duration in seconds + final Stopwatch endStop = timer.stop(); + silentlyUpdateCompletedState(context, item, endStop.toString(), endStop.elapsed().getSeconds()); + } + } + return Boolean.TRUE; + })).collect(Collectors.toCollection(LinkedList::new)); + } + + /** + * Performs the actual copy of an item + * + * @param copyContext + * @param item + * @throws Exception + */ + private void copy(CopyContext copyContext, CopyContext.DataCopyItem item) throws Exception { + DataPipe dataPipe = null; + try { + dataPipe = pipeFactory.create(copyContext, item); + writerStrategy.write(copyContext, dataPipe, item); + } catch (Exception e) { + if (dataPipe != null) { + dataPipe.requestAbort(e); + } + throw e; + } + } + + /** + * Adds the tasks to the executor + * + * @param context + * @param tasksToSchedule + */ + private void scheduleTasks(CopyContext context, Deque>> tasksToSchedule) { + List>> runningTasks = new ArrayList<>(); + BackOffExecution backoff = null; + CopyContext.DataCopyItem previousReject = null; + try { + while (tasksToSchedule.peekFirst() != null) { + Pair> task = tasksToSchedule.removeFirst(); + try { + runningTasks.add(Pair.of(task.getLeft(), executor.submit(task.getRight()))); + } catch (TaskRejectedException e) { + // this shouldn't really happen, the writer thread pool has an unbounded queue + // but better be safe than sorry... + tasksToSchedule.addFirst(task); + if (!Objects.equals(task.getLeft(), previousReject)) { + backoff = new ExponentialBackOff().start(); + } + previousReject = task.getLeft(); + long waitInterval = backoff.nextBackOff(); + LOG.debug("Task rejected. Retrying in {}ms...", waitInterval); + Thread.sleep(waitInterval); + } + } + } catch (Exception e) { + try { + scheduler.abort(context); + } catch (Exception exception) { + LOG.error("Could not abort migration", e); + } + for (Pair> running : runningTasks) { + if (running.getRight().cancel(true)) { + markAsCancelled(context, running.getLeft()); + } + } + for (Pair> copyTask : tasksToSchedule) { + markAsCancelled(context, copyTask.getLeft()); + } + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + } + + LOG.debug("Running Tasks" + runningTasks.size()); + } + + private void markAsCancelled(CopyContext context, CopyContext.DataCopyItem item) { + try { + databaseCopyTaskRepository.markTaskFailed(context, item, new RuntimeException("Execution cancelled")); + } catch (Exception e) { + LOG.error("Failed to set cancelled status", e); + } + } + + // ORACLE_TARGET - added durationInseconds + private void silentlyUpdateCompletedState(final CopyContext context, final CopyContext.DataCopyItem item, + final String duration, final float durationSeconds) { + try { + // ORACLE_TARGET - added durationInseconds + databaseCopyTaskRepository.markTaskCompleted(context, item, duration, durationSeconds); + } catch (final Exception e) { + LOG.error("Failed to update copy status", e); + } + } +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/InitUpdateProcessTrigger.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/InitUpdateProcessTrigger.java new file mode 100644 index 0000000..87d72b9 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/InitUpdateProcessTrigger.java @@ -0,0 +1,55 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.setup; + +import de.hybris.platform.media.services.MediaStorageInitializer; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InitUpdateProcessTrigger implements MediaStorageInitializer { + + private static final Logger LOG = LoggerFactory.getLogger(InitUpdateProcessTrigger.class); + + private MigrationContext migrationContext; + private DatabaseMigrationService databaseMigrationService; + private boolean failOnError = false; + + public InitUpdateProcessTrigger(MigrationContext migrationContext, DatabaseMigrationService databaseMigrationService) { + this.migrationContext = migrationContext; + this.databaseMigrationService = databaseMigrationService; + } + + @Override + public void onInitialize() { + //Do nothing + } + + @Override + public void onUpdate() { + try { + if (migrationContext.isMigrationTriggeredByUpdateProcess()) { + LOG.info("Starting data migration ..."); + String migrationId = databaseMigrationService.startMigration(migrationContext); + databaseMigrationService.waitForFinish(migrationContext, migrationId); + //note: further update activities not stopped here -> should we? + } + } catch (Exception e) { + failOnError = migrationContext.isFailOnErrorEnabled(); + if (failOnError) { + throw new Error(e); + } + } + } + + @Override + public boolean failOnInitUpdateError() { + return failOnError; + } + +} \ No newline at end of file diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/MigrationSystemSetup.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/MigrationSystemSetup.java new file mode 100644 index 0000000..869c1c7 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/setup/MigrationSystemSetup.java @@ -0,0 +1,53 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.setup; + +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import de.hybris.platform.core.initialization.SystemSetup; +import de.hybris.platform.core.initialization.SystemSetupContext; +import de.hybris.platform.servicelayer.config.ConfigurationService; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationSynonymService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * This class provides hooks into the system's initialization and update processes. + */ +@SystemSetup(extension = CommercedbsyncConstants.EXTENSIONNAME) +public class MigrationSystemSetup { + + private static final Logger LOG = LoggerFactory.getLogger(MigrationSystemSetup.class); + + private MigrationContext migrationContext; + private ConfigurationService configurationService; + private DatabaseMigrationSynonymService databaseMigrationSynonymService; + + public MigrationSystemSetup(MigrationContext migrationContext, ConfigurationService configurationService, DatabaseMigrationSynonymService databaseMigrationSynonymService) { + this.migrationContext = migrationContext; + this.configurationService = configurationService; + this.databaseMigrationSynonymService = databaseMigrationSynonymService; + } + + /** + * CCv2 Workaround: ccv2 builder does not support prefixes yet. + * creating synonym on ydeployments -> prefix_yeployments + * creating synonym on attributedescriptors -> prefix_attributedescriptors. + * + * @param context + * @throws Exception + */ + @SystemSetup(type = SystemSetup.Type.ESSENTIAL, process = SystemSetup.Process.ALL) + public void createEssentialData(final SystemSetupContext context) throws Exception { + String actualPrefix = configurationService.getConfiguration().getString("db.tableprefix"); + if (StringUtils.isNotEmpty(actualPrefix)) { + databaseMigrationSynonymService.recreateSynonyms(migrationContext.getDataTargetRepository(), actualPrefix); + } + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/PipeWriterStrategy.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/PipeWriterStrategy.java new file mode 100644 index 0000000..8b96053 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/PipeWriterStrategy.java @@ -0,0 +1,30 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.strategy; + +import com.sap.cx.boosters.commercedbsync.concurrent.DataPipe; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; + +import javax.annotation.concurrent.ThreadSafe; + +/** + * Main Strategy to Write Data to a target Database + * + * @param + */ +@ThreadSafe +public interface PipeWriterStrategy { + /** + * Performs the actual copying of Data Items + * + * @param context + * @param pipe + * @param item + * @throws Exception + */ + void write(CopyContext context, DataPipe pipe, CopyContext.DataCopyItem item) throws Exception; +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/impl/CopyPipeWriterStrategy.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/impl/CopyPipeWriterStrategy.java new file mode 100644 index 0000000..5691b33 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/strategy/impl/CopyPipeWriterStrategy.java @@ -0,0 +1,1097 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.strategy.impl; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.base.Stopwatch; +import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy; +import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions; +import com.microsoft.sqlserver.jdbc.SQLServerConnection; +import com.sap.cx.boosters.commercedbsync.concurrent.DataWorkerExecutor; +import com.sap.cx.boosters.commercedbsync.concurrent.MaybeFinished; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceCategory; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceRecorder; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceUnit; +import com.sap.cx.boosters.commercedbsync.strategy.PipeWriterStrategy; +import de.hybris.bootstrap.ddl.DataBaseProvider; + +import java.io.StringReader; +import java.util.Collections; + +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.concurrent.DataPipe; +import com.sap.cx.boosters.commercedbsync.concurrent.DataWorkerPoolFactory; +import com.sap.cx.boosters.commercedbsync.concurrent.RetriableTask; +import com.sap.cx.boosters.commercedbsync.concurrent.impl.DefaultDataWorkerExecutor; +import com.sap.cx.boosters.commercedbsync.context.CopyContext; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.dataset.DataColumn; +import com.sap.cx.boosters.commercedbsync.dataset.DataSet; +import com.sap.cx.boosters.commercedbsync.dataset.impl.DefaultDataSet; +import com.sap.cx.boosters.commercedbsync.profile.DataSourceConfiguration; +import com.sap.cx.boosters.commercedbsync.service.DatabaseCopyTaskRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationDataTypeMapperService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + + +public class CopyPipeWriterStrategy implements PipeWriterStrategy { + private static final Logger LOG = LoggerFactory.getLogger(CopyPipeWriterStrategy.class); + + private final DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService; + + private final DatabaseCopyTaskRepository taskRepository; + + private final DataWorkerPoolFactory dataWriteWorkerPoolFactory; + + private static final String LP_SUFFIX = "lp"; + + public CopyPipeWriterStrategy(DatabaseMigrationDataTypeMapperService databaseMigrationDataTypeMapperService, DatabaseCopyTaskRepository taskRepository, DataWorkerPoolFactory dataWriteWorkerPoolFactory) { + this.databaseMigrationDataTypeMapperService = databaseMigrationDataTypeMapperService; + this.taskRepository = taskRepository; + this.dataWriteWorkerPoolFactory = dataWriteWorkerPoolFactory; + } + + @Override + public void write(CopyContext context, DataPipe pipe, CopyContext.DataCopyItem item) throws Exception { + // ORACLE_TARGET - START + // Fetch the provider to figure out the name of the DBName + final DataBaseProvider dbProvider = context.getMigrationContext().getDataTargetRepository() + .getDatabaseProvider(); + // ORACLE_TARGET - END + String targetTableName = item.getTargetItem(); + PerformanceRecorder performanceRecorder = context.getPerformanceProfiler().createRecorder(PerformanceCategory.DB_WRITE, targetTableName); + performanceRecorder.start(); + Set excludedColumns = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + if (context.getMigrationContext().getExcludedColumns().containsKey(targetTableName)) { + excludedColumns.addAll(context.getMigrationContext().getExcludedColumns().get(targetTableName)); + LOG.info("Ignoring excluded column(s): {}", excludedColumns); + } + Set nullifyColumns = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + if (context.getMigrationContext().getNullifyColumns().containsKey(targetTableName)) { + nullifyColumns.addAll(context.getMigrationContext().getNullifyColumns().get(targetTableName)); + LOG.info("Nullify column(s): {}", nullifyColumns); + } + + List columnsToCopy = new ArrayList<>(); + try (Connection sourceConnection = context.getMigrationContext().getDataSourceRepository().getConnection(); + Statement stmt = sourceConnection.createStatement(); + ResultSet metaResult = stmt.executeQuery(String.format("select * from %s where 0 = 1", item.getSourceItem())); + ) { + ResultSetMetaData sourceMeta = metaResult.getMetaData(); + int columnCount = sourceMeta.getColumnCount(); + for (int i = 1; i <= columnCount; i++) { + String column = sourceMeta.getColumnName(i); + if (!excludedColumns.contains(column)) { + columnsToCopy.add(column); + } + } + } + + if (columnsToCopy.isEmpty()) { + throw new IllegalStateException(String.format("%s: source has no columns or all columns excluded", item.getPipelineName())); + } + ThreadPoolTaskExecutor taskExecutor = dataWriteWorkerPoolFactory.create(context); + DataWorkerExecutor workerExecutor = new DefaultDataWorkerExecutor<>(taskExecutor); + Connection targetConnection = null; + AtomicLong totalCount = new AtomicLong(0); + List upsertIds = new ArrayList<>(); + try { + targetConnection = context.getMigrationContext().getDataTargetRepository().getConnection(); + // ORACLE_TARGET - START - pass the dbProvider and dsConfiguration + // information into the requiredidentityinsert function + + boolean requiresIdentityInsert = false; + if (dbProvider.isPostgreSqlUsed()){ + // do nothing + } else { + requiresIdentityInsert = requiresIdentityInsert(item.getTargetItem(), targetConnection, + dbProvider, context.getMigrationContext().getDataTargetRepository().getDataSourceConfiguration()); + } + // ORACLE_TARGET - START - pass the dbProvider info into the + // requiredidentityinsert function + MaybeFinished sourcePage; + boolean firstPage = true; + do { + sourcePage = pipe.get(); + if (sourcePage.isPoison()) { + throw new IllegalStateException("Poison received; dying. Check the logs for further insights."); + } + DataSet dataSet = sourcePage.getValue(); + if (firstPage) { + doTruncateIfNecessary(context, item.getTargetItem()); + doTurnOnOffIndicesIfNecessary(context, item.getTargetItem(), false); + if (context.getMigrationContext().isIncrementalModeEnabled()) { + if (context.getMigrationContext().isLpTableMigrationEnabled() + && StringUtils.endsWithIgnoreCase(item.getSourceItem(),LP_SUFFIX)){ + determineLpUpsertId(upsertIds, dataSet); + } else{ + determineUpsertId(upsertIds, dataSet); + } + } + firstPage = false; + } + if (dataSet.isNotEmpty()) { + DataWriterContext dataWriterContext = new DataWriterContext(context, item, dataSet, columnsToCopy, nullifyColumns, performanceRecorder, totalCount, upsertIds, requiresIdentityInsert); + RetriableTask writerTask = createWriterTask(dataWriterContext); + workerExecutor.safelyExecute(writerTask); + } + } while (!sourcePage.isDone()); + workerExecutor.waitAndRethrowUncaughtExceptions(); + if (taskExecutor != null) { + taskExecutor.shutdown(); + } + } catch (Exception e) { + pipe.requestAbort(e); + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + throw e; + } finally { + if (targetConnection != null) { + doTurnOnOffIndicesIfNecessary(context, item.getTargetItem(), true); + targetConnection.close(); + } + updateProgress(context, item, totalCount.get()); + } + } + + private void switchIdentityInsert(Connection connection, final String tableName, boolean on) { + try (Statement stmt = connection.createStatement()) { + String onOff = on ? "ON" : "OFF"; + stmt.executeUpdate(String.format("SET IDENTITY_INSERT %s %s", tableName, onOff)); + } catch (final Exception e) { + //TODO using brute force FIX + } + } + + protected void executeBatch(CopyContext.DataCopyItem item, PreparedStatement preparedStatement, long batchCount, PerformanceRecorder recorder) throws SQLException { + final Stopwatch timer = Stopwatch.createStarted(); + preparedStatement.executeBatch(); + preparedStatement.clearBatch(); + LOG.debug("Batch written ({} items) for table '{}' in {}", batchCount, item.getTargetItem(), timer.stop().toString()); + recorder.record(PerformanceUnit.ROWS, batchCount); + } + + private void updateProgress(CopyContext context, CopyContext.DataCopyItem item, long totalCount) { + try { + taskRepository.updateTaskProgress(context, item, totalCount); + } catch (Exception e) { + LOG.warn("Could not update progress", e); + } + } + + protected void doTruncateIfNecessary(CopyContext context, String targetTableName) throws Exception { + if (context.getMigrationContext().isTruncateEnabled()) { + if (!context.getMigrationContext().getTruncateExcludedTables().contains(targetTableName)) { + assertTruncateAllowed(context, targetTableName); + context.getMigrationContext().getDataTargetRepository().truncateTable(targetTableName); + } + } + } + + protected void doTurnOnOffIndicesIfNecessary(CopyContext context, String targetTableName, boolean on) throws Exception { + if (context.getMigrationContext().isDropAllIndexesEnabled()) { + if (!on) { + LOG.debug("{} indexes for table '{}'", "Dropping", targetTableName); + context.getMigrationContext().getDataTargetRepository().dropIndexesOfTable(targetTableName); + } + } else { + if (context.getMigrationContext().isDisableAllIndexesEnabled()) { + if (!context.getMigrationContext().getDisableAllIndexesIncludedTables().isEmpty()) { + if (!context.getMigrationContext().getDisableAllIndexesIncludedTables().contains(targetTableName)) { + return; + } + } + LOG.debug("{} indexes for table '{}'", on ? "Rebuilding" : "Disabling", targetTableName); + if (on) { + context.getMigrationContext().getDataTargetRepository().enableIndexesOfTable(targetTableName); + } else { + context.getMigrationContext().getDataTargetRepository().disableIndexesOfTable(targetTableName); + } + } + } + } + + protected void assertTruncateAllowed(CopyContext context, String targetTableName) throws Exception { + if (context.getMigrationContext().isIncrementalModeEnabled()) { + throw new IllegalStateException("Truncating tables in incremental mode is illegal. Change the property " + CommercedbsyncConstants.MIGRATION_DATA_TRUNCATE_ENABLED + " to false"); + } + } + + protected boolean isColumnOverride(CopyContext context, CopyContext.DataCopyItem item, String sourceColumnName) { + return MapUtils.isNotEmpty(item.getColumnMap()) && item.getColumnMap().containsKey(sourceColumnName); + } + + protected boolean isColumnOverride(CopyContext context, CopyContext.DataCopyItem item) { + return MapUtils.isNotEmpty(item.getColumnMap()); + } + + private PreparedStatement createPreparedStatement(final CopyContext context, final String targetTableName, + final List columnsToCopy, final List upsertIds, final Connection targetConnection) + throws Exception { + if (context.getMigrationContext().isIncrementalModeEnabled()) { + if (!upsertIds.isEmpty()) { + // ORACLE_TARGET - START + String sqlBuild = ""; + if (context.getMigrationContext().getDataTargetRepository().getDatabaseProvider().isOracleUsed()) { + sqlBuild = getBulkUpsertStatementOracle(targetTableName, columnsToCopy, upsertIds.get(0)); + } else if (context.getMigrationContext().getDataTargetRepository().getDatabaseProvider().isHanaUsed()) { + sqlBuild = getBulkUpsertStatementHana(targetTableName, columnsToCopy, upsertIds); + } else if (context.getMigrationContext().getDataTargetRepository().getDatabaseProvider().isPostgreSqlUsed()) { + sqlBuild = getBulkUpsertStatementPostGres(targetTableName, columnsToCopy, upsertIds.get(0)); + } + else { + sqlBuild = getBulkUpsertStatement(targetTableName, columnsToCopy, upsertIds); + } + return targetConnection.prepareStatement(sqlBuild); + // ORACLE_TARGET - END + } else { + throw new RuntimeException( + "The incremental approach can only be used on tables that have a valid identifier like PK or ID"); + } + } else { + return targetConnection.prepareStatement(getBulkInsertStatement(targetTableName, columnsToCopy, + columnsToCopy.stream().map(column -> "?").collect(Collectors.toList()))); + } + } + + private String getBulkInsertStatement(String targetTableName, List columnsToCopy, List columnsToCopyValues) { + return "INSERT INTO " + targetTableName + " " + getBulkInsertStatementParamList(columnsToCopy, columnsToCopyValues); + } + + private String getBulkInsertStatementParamList(List columnsToCopy, List columnsToCopyValues) { + return "(" + + String.join(", ", columnsToCopy) + ") VALUES (" + + columnsToCopyValues.stream().collect(Collectors.joining(", ")) + + ")"; + } + + private String getBulkUpdateStatementParamList(List columnsToCopy, List columnsToCopyValues) { + return "SET " + IntStream.range(0, columnsToCopy.size()).mapToObj(idx -> String.format("%s = %s", columnsToCopy.get(idx), columnsToCopyValues.get(idx))).collect(Collectors.joining(", ")); + } + + // ORACLE_TARGET -- START + private String getBulkUpdateStatementParamListOracle(final List columnsToCopy, + final List columnsToCopyValues) { + + final List columnsToCopyMinusPK = columnsToCopy.stream().filter(s -> !s.equalsIgnoreCase("PK")) + .collect(Collectors.toList()); + final List columnsToCopyValuesMinusPK = columnsToCopyValues.stream() + .filter(s -> !s.equalsIgnoreCase("s.PK")).collect(Collectors.toList()); + LOG.debug("getBulkUpdateStatementParamListOracle - columnsToCopyMinusPK =" + columnsToCopyMinusPK); + return "SET " + IntStream.range(0, columnsToCopyMinusPK.size()).mapToObj( + idx -> String.format("%s = %s", columnsToCopyMinusPK.get(idx), columnsToCopyValuesMinusPK.get(idx))) + .collect(Collectors.joining(", ")); + } + // ORACLE_TARGET -- END + private void determineUpsertId(List upsertIds ,DataSet dataSet) { + if (dataSet.hasColumn("PK")) { + upsertIds.add("PK"); + return; + } else if (dataSet.hasColumn("ID")) { + upsertIds.add("ID"); + return; + } else { + //should we support more IDs? In the hybris context there is hardly any other with regards to transactional data. + return ; + } + } + + private void determineLpUpsertId(List upsertIds ,DataSet dataSet) { + if (dataSet.hasColumn("ITEMPK") + && dataSet.hasColumn("LANGPK")) { + upsertIds.add("ITEMPK"); + upsertIds.add("LANGPK"); + return; + } else{ + //should we support more IDs? In the hybris context there is hardly any other with regards to transactional data. + return; + } + } + + private String getBulkUpsertStatement(String targetTableName, List columnsToCopy, List upsertIds) { + /* + * https://michaeljswart.com/2017/07/sql-server-upsert-patterns-and-antipatterns/ + * We are not using a stored procedure here as CCv2 does not grant sp exec permission to the default db user + */ + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("MERGE %s WITH (HOLDLOCK) AS t", targetTableName)); + sqlBuilder.append("\n"); + sqlBuilder.append(String.format("USING (SELECT %s) AS s ON ", Joiner.on(',').join(columnsToCopy.stream().map(column -> "? " + column).collect(Collectors.toList())))); + sqlBuilder.append(String.format("( %s )" , upsertIds.stream().map(column -> String.format(" t.%s = s.%s",column,column)).collect(Collectors.joining(" AND ")))); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN MATCHED THEN UPDATE"); //update + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkUpdateStatementParamList(columnsToCopy, columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN NOT MATCHED THEN INSERT"); //insert + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkInsertStatementParamList(columnsToCopy, columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + sqlBuilder.append(";"); + // ORACLE_TARGET + LOG.debug("UPSERT SQL SERVER SQl builder=" + sqlBuilder.toString()); + return sqlBuilder.toString(); + } + + // ORACLE_TARGET - START + private String getBulkUpsertStatementOracle(final String targetTableName, final List columnsToCopy, + final String columnId) { + + final StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("MERGE INTO %s t", targetTableName)); + sqlBuilder.append("\n"); + sqlBuilder.append(String.format("USING (SELECT %s from dual) s ON (t.%s = s.%s)", + Joiner.on(',').join(columnsToCopy.stream().map(column -> "? " + column).collect(Collectors.toList())), + columnId, columnId)); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN MATCHED THEN UPDATE"); // update + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkUpdateStatementParamListOracle(columnsToCopy, + columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN NOT MATCHED THEN INSERT"); // insert + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkInsertStatementParamList(columnsToCopy, + columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + // sqlBuilder.append(";"); + // ORACLE_TARGET + LOG.debug("UPSERT ORACLE SQl builder=" + sqlBuilder.toString()); + return sqlBuilder.toString(); + } + // ORACLE_TARGET - END + + private String getBulkUpsertStatementPostGres(final String targetTableName, final List columnsToCopy, + final String columnId) { + + final StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("MERGE INTO %s t", targetTableName)); + sqlBuilder.append("\n"); + sqlBuilder.append(String.format("USING (SELECT %s from dual) s ON (t.%s = s.%s)", + Joiner.on(',').join(columnsToCopy.stream().map(column -> "? " + column).collect(Collectors.toList())), + columnId, columnId)); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN MATCHED THEN UPDATE"); // update + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkUpdateStatementParamListOracle(columnsToCopy, + columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN NOT MATCHED THEN INSERT"); // insert + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkInsertStatementParamList(columnsToCopy, + columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + // sqlBuilder.append(";"); + // ORACLE_TARGET + LOG.debug("UPSERT PostGres SQl builder=" + sqlBuilder.toString()); + return sqlBuilder.toString(); + } + + private String getBulkUpsertStatementHana(final String targetTableName, final List columnsToCopy, + List upsertIds) { + final StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("MERGE INTO %s t", targetTableName)); + sqlBuilder.append("\n"); + sqlBuilder.append(String.format("USING (SELECT %s from dummy) s ON ", Joiner.on(',').join(columnsToCopy.stream().map(column -> "? " + column).collect(Collectors.toList())))); + sqlBuilder.append(String.format("( %s )" , upsertIds.stream().map(column -> String.format(" t.%s = s.%s",column,column)).collect(Collectors.joining(" AND ")))); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN MATCHED THEN UPDATE"); // update + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkUpdateStatementParamListOracle(columnsToCopy, + columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN NOT MATCHED THEN INSERT"); // insert + sqlBuilder.append("\n"); + sqlBuilder.append(getBulkInsertStatementParamList(columnsToCopy, + columnsToCopy.stream().map(column -> "s." + column).collect(Collectors.toList()))); + // sqlBuilder.append(";"); + // ORACLE_TARGET + LOG.debug("UPSERT HANA SQl builder=" + sqlBuilder.toString()); + return sqlBuilder.toString(); + } + + private String getBulkDeleteStatement(String targetTableName, String columnId) { + /* + * https://michaeljswart.com/2017/07/sql-server-upsert-patterns-and-antipatterns/ + * We are not using a stored procedure here as CCv2 does not grant sp exec permission to the default db user + */ + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("MERGE %s WITH (HOLDLOCK) AS t", targetTableName)); + sqlBuilder.append("\n"); + sqlBuilder.append(String.format("USING (SELECT %s) AS s ON t.%s = s.%s", "? " + columnId, columnId, columnId)); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN MATCHED THEN DELETE"); //DELETE + sqlBuilder.append(";"); + // ORACLE_TARGET + LOG.debug("MERGE-DELETE SQL Server " + sqlBuilder.toString()); + return sqlBuilder.toString(); + } + + // ORACLE_TARGET - START + private String getBulkDeleteStatementOracle(final String targetTableName, final String columnId) { + final StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(String.format("MERGE INTO %s t", targetTableName)); + sqlBuilder.append("\n"); + // sqlBuilder.append(String.format("USING (SELECT %s , '2022-02-15 + // 10:48:49.496' modifiedTS from dual) s ON (t.%s = s.%s)", + // "? " + columnId, columnId, columnId)); + sqlBuilder.append( + String.format("USING (SELECT %s from dual) s ON (t.%s = s.%s)", "? " + columnId, columnId, columnId)); + sqlBuilder.append("\n"); + sqlBuilder.append("WHEN MATCHED THEN "); // DELETE + sqlBuilder.append("UPDATE SET t.HJMPTS = 0 "); // IS INSERT OR UPDATE + // MANDATORY, therefore + // setting a dummy + // value. Hopefully + // HJMPTS is present in + // all tables + sqlBuilder.append("DELETE WHERE " + String.format(" t.%s = s.%s ", columnId, columnId));// DELETE + // is + // OPTIONAL + // sqlBuilder.append(";"); + // ORACLE_TARGET + LOG.debug("MERGE-DELETE ORACLE " + sqlBuilder.toString()); + return sqlBuilder.toString(); + } + // ORACLE_TARGET - END + + // ORACLE_TARGET -- START Helper Function 1 + private StringBuilder buildSqlForIdentityInsertCheck(final String targetTableName, + final DataBaseProvider dbProvider, final DataSourceConfiguration dsConfig) { + final StringBuilder sqlBuilder = new StringBuilder(); + if (dbProvider.isMssqlUsed()) { + sqlBuilder.append("SELECT \n"); + sqlBuilder.append("count(*)\n"); + sqlBuilder.append("FROM sys.columns\n"); + sqlBuilder.append("WHERE\n"); + sqlBuilder.append(String.format("object_id = object_id('%s')\n", targetTableName)); + sqlBuilder.append("AND\n"); + sqlBuilder.append("is_identity = 1\n"); + sqlBuilder.append(";\n"); + } else if (dbProvider.isOracleUsed()) { + // get schema name + final String schema = dsConfig.getSchema(); + sqlBuilder.append("SELECT \n"); + sqlBuilder.append("has_identity\n"); + sqlBuilder.append("FROM dba_tables\n"); + sqlBuilder.append("WHERE\n"); + sqlBuilder.append(String.format("UPPER(table_name) = UPPER('%s')\n", targetTableName)); + sqlBuilder.append(String.format(" AND UPPER(owner) = UPPER('%s')\n", schema)); + // sqlBuilder.append(";\n"); + } else if (dbProvider.isHanaUsed()) { + // get schema name + final String schema = dsConfig.getSchema(); + sqlBuilder.append("SELECT \n"); + sqlBuilder.append("is_insert_only\n"); + sqlBuilder.append("FROM public.tables\n"); + sqlBuilder.append("WHERE\n"); + sqlBuilder.append(String.format("table_name = UPPER('%s')\n", targetTableName)); + sqlBuilder.append(String.format(" AND schema_name = UPPER('%s')\n", schema)); + // sqlBuilder.append(";\n"); + } + else { + sqlBuilder.append("SELECT \n"); + sqlBuilder.append("count(*)\n"); + sqlBuilder.append("FROM sys.columns\n"); + sqlBuilder.append("WHERE\n"); + sqlBuilder.append(String.format("object_id = object_id('%s')\n", targetTableName)); + sqlBuilder.append("AND\n"); + sqlBuilder.append("is_identity = 1\n"); + sqlBuilder.append(";\n"); + } + LOG.debug("IDENTITY check SQL -> " + sqlBuilder); + return sqlBuilder; + } + // ORACLE_TARGET -- END + + // ORACLE_TARGET -- START Helper Function 2 + private boolean checkIdentityfromResultSet(final ResultSet resultSet, final DataBaseProvider dbProvider) + throws SQLException { + boolean requiresIdentityInsert = false; + + final String dbName = dbProvider.getDbName().toLowerCase(); + if (resultSet.next()) { + if (dbProvider.isMssqlUsed()) { + requiresIdentityInsert = resultSet.getInt(1) > 0; + } else if (dbProvider.isOracleUsed()) { + requiresIdentityInsert = resultSet.getBoolean(1); + } else if (dbProvider.isHanaUsed()) { + requiresIdentityInsert = resultSet.getBoolean(1); + } else{ + requiresIdentityInsert = resultSet.getInt(1) > 0; + } + } + return requiresIdentityInsert; + + } + // ORACLE_TARGET -- END + + // ORACLE_TARGET -- START + private boolean requiresIdentityInsert(final String targetTableName, final Connection targetConnection, + final DataBaseProvider dbProvider, final DataSourceConfiguration dsConfig) { + final StringBuilder sqlBuilder = buildSqlForIdentityInsertCheck(targetTableName, dbProvider, dsConfig); + + try ( + final Statement statement = targetConnection.createStatement(); + final ResultSet resultSet = statement.executeQuery(sqlBuilder.toString()); + ){ + final boolean requiresIdentityInsert = checkIdentityfromResultSet(resultSet, dbProvider); + + return requiresIdentityInsert; + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + // ORACLE_TARGET -- END + + private boolean requiresIdentityInsert(String targetTableName, Connection targetConnection) { + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append("SELECT \n"); + sqlBuilder.append("count(*)\n"); + sqlBuilder.append("FROM sys.columns\n"); + sqlBuilder.append("WHERE\n"); + sqlBuilder.append(String.format("object_id = object_id('%s')\n", targetTableName)); + sqlBuilder.append("AND\n"); + sqlBuilder.append("is_identity = 1\n"); + sqlBuilder.append(";\n"); + try ( + Statement statement = targetConnection.createStatement(); + ResultSet resultSet = statement.executeQuery(sqlBuilder.toString()); + ) { + boolean requiresIdentityInsert = false; + if (resultSet.next()) { + requiresIdentityInsert = resultSet.getInt(1) > 0; + } + return requiresIdentityInsert; + } + catch (SQLException e) { + throw new RuntimeException(e); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private RetriableTask createWriterTask(DataWriterContext dwc) { + MigrationContext ctx = dwc.getContext().getMigrationContext(); + if(ctx.isDeletionEnabled()){ + return new DataDeleteWriterTask(dwc); + } else { + + if (!ctx.isBulkCopyEnabled()) { + return new DataWriterTask(dwc); + } else { + boolean noNullification = dwc.getNullifyColumns().isEmpty(); + boolean noIncremental = !ctx.isIncrementalModeEnabled(); + boolean noColumnOverride = !isColumnOverride(dwc.getContext(), dwc.getCopyItem()); + if (noNullification && noIncremental && noColumnOverride) { + LOG.warn("EXPERIMENTAL: Using bulk copy for {}", + dwc.getCopyItem().getTargetItem()); + return new DataBulkWriterTask(dwc); + } else { + return new DataWriterTask(dwc); + } + } + } + } + + private static class DataWriterContext { + private CopyContext context; + private CopyContext.DataCopyItem copyItem; + private DataSet dataSet; + private List columnsToCopy; + private Set nullifyColumns; + private PerformanceRecorder performanceRecorder; + private AtomicLong totalCount; + private List upsertIds; + private boolean requiresIdentityInsert; + + public DataWriterContext(CopyContext context, CopyContext.DataCopyItem copyItem, DataSet dataSet, List columnsToCopy, Set nullifyColumns, PerformanceRecorder performanceRecorder, AtomicLong totalCount, List upsertIds, boolean requiresIdentityInsert) { + this.context = context; + this.copyItem = copyItem; + this.dataSet = dataSet; + this.columnsToCopy = columnsToCopy; + this.nullifyColumns = nullifyColumns; + this.performanceRecorder = performanceRecorder; + this.totalCount = totalCount; + this.upsertIds = upsertIds; + this.requiresIdentityInsert = requiresIdentityInsert; + } + + public CopyContext getContext() { + return context; + } + + public CopyContext.DataCopyItem getCopyItem() { + return copyItem; + } + + public DataSet getDataSet() { + return dataSet; + } + + public List getColumnsToCopy() { + return columnsToCopy; + } + + public Set getNullifyColumns() { + return nullifyColumns; + } + + public PerformanceRecorder getPerformanceRecorder() { + return performanceRecorder; + } + + public AtomicLong getTotalCount() { + return totalCount; + } + + public List getUpsertId() { + return upsertIds; + } + + public boolean isRequiresIdentityInsert() { + return requiresIdentityInsert; + } + } + + private class DataWriterTask extends RetriableTask { + + private DataWriterContext ctx; + + public DataWriterTask(DataWriterContext ctx) { + super(ctx.getContext(), ctx.getCopyItem().getTargetItem()); + this.ctx = ctx; + } + + @Override + protected Boolean internalRun() { + try { + if (!ctx.getDataSet().getAllResults().isEmpty()) { + process(); + } + return Boolean.TRUE; + } catch (Exception e) { + //LOG.error("Error while executing table task " + ctx.getCopyItem().getTargetItem(),e); + throw new RuntimeException("Error processing writer task for " + ctx.getCopyItem().getTargetItem(), e); + } + } + + private void process() throws Exception { + Connection connection = null; + Boolean originalAutoCommit = null; + boolean requiresIdentityInsert = ctx.isRequiresIdentityInsert(); + try { + connection = ctx.getContext().getMigrationContext().getDataTargetRepository().getConnection(); + // ORACLE_TARGET - START Fetch the provider to figure out the + // name of the DBName + final DataBaseProvider dbProvider = ctx.getContext().getMigrationContext().getDataTargetRepository() + .getDatabaseProvider(); + LOG.debug("TARGET DB name = " + dbProvider.getDbName() + " SOURCE TABLE = " + ctx.getCopyItem().getSourceItem() + + ", TARGET Table = " + ctx.getCopyItem().getTargetItem()); + /* + * if + * (ctx.getCopyItem().getTargetItem().equalsIgnoreCase("medias") + * ) { return; } + */ + // ORACLE_TARGET - END Fetch the provider to figure out the name + // of the DBName + originalAutoCommit = connection.getAutoCommit(); + try (PreparedStatement bulkWriterStatement = createPreparedStatement(ctx.getContext(), ctx.getCopyItem().getTargetItem(), ctx.getColumnsToCopy(), ctx.getUpsertId(), connection); + Statement tempStmt = connection.createStatement(); + ResultSet tempTargetRs = tempStmt.executeQuery(String.format("select * from %s where 0 = 1", ctx.getCopyItem().getTargetItem()))) { + connection.setAutoCommit(false); + if (requiresIdentityInsert) { + switchIdentityInsert(connection, ctx.getCopyItem().getTargetItem(), true); + } + // ORACLE_TARGET - START - just to print once, helpful to + // debug issues at the time of actual copy. + boolean printed2004 = false; + boolean printed2005 = false; + final boolean printedDef = false; + // ORACLE_TARGET - END - just to print once, helpful to + // debug issues at the time of actual copy. + for (List row : ctx.getDataSet().getAllResults()) { + int sourceColumnTypeIdx = 0; + int paramIdx = 1; + for (String sourceColumnName : ctx.getColumnsToCopy()) { + int targetColumnIdx = tempTargetRs.findColumn(sourceColumnName); + DataColumn sourceColumnType = ((DefaultDataSet) ctx.getDataSet()).getColumnOrder().get(sourceColumnTypeIdx); + int targetColumnType = tempTargetRs.getMetaData().getColumnType(targetColumnIdx); + if (ctx.getNullifyColumns().contains(sourceColumnName)) { + bulkWriterStatement.setNull(paramIdx, targetColumnType); + LOG.trace("Column {} is nullified. Setting NULL value...", sourceColumnName); + } else { + if (isColumnOverride(ctx.getContext(), ctx.getCopyItem(), sourceColumnName)) { + bulkWriterStatement.setObject(paramIdx, ctx.getCopyItem().getColumnMap().get(sourceColumnName), targetColumnType); + } else { + Object sourceColumnValue = null; + if(dbProvider.isPostgreSqlUsed()){ + sourceColumnValue = ctx.getDataSet().getColumnValueForPostGres(sourceColumnName, row,sourceColumnType,targetColumnType); + } + else if(dbProvider.isHanaUsed()){ + sourceColumnValue = ((DefaultDataSet) ctx.getDataSet()).getColumnValueForHANA(sourceColumnName, row,sourceColumnType,targetColumnType); + } + else{ + sourceColumnValue = ctx.getDataSet().getColumnValue(sourceColumnName, row); + } + if (sourceColumnValue != null) { + // ##ORACLE_TARGET -- START TRY-catch to + // catch all exceptions, not to print + // each time, print one for each + // type/worker. + try { + if (! dbProvider.isOracleUsed()) { + // for all cases non-oracle + bulkWriterStatement.setObject(paramIdx, sourceColumnValue, + targetColumnType); + } else { + // if type is oracle, then there + // are a bunch of exceptions + // when the type is 2004, 2005 + // 2004 = BLOB , 2005 = CLOB + switch (targetColumnType) { + /* + * code to handle BLOB, because + * setObject throws exception + * example Products.p_buyerids + * is varbinary(max) in + * (sqlserver) AND blob in + * (oracle) + */ + // TODO Use Constant definitions + case 2004: { + // temp debug code - start + // ....only to print once.. + if (!printed2004) { + LOG.debug("BLOB 2004 sourceColumnName = " + sourceColumnName + + " souce value type CN=" + + sourceColumnValue.getClass().getCanonicalName() + + " , Name = " + sourceColumnValue.getClass().getName() + + " , Type Name = " + + sourceColumnValue.getClass().getTypeName()); + printed2004 = true; + } + // temp debug code end + bulkWriterStatement.setBytes(paramIdx, (byte[]) sourceColumnValue); + break; + + } + /* + * code to handle CLOB, because + * setObject throws exception + * example Promotion.description + * is nvarchar(max) in + * (sqlserver) AND blob in + * (oracle) + */ + case 2005: { + // temp debug code - start + // ....only to print once.. + if (!printed2005) { + LOG.debug("CLOB 2005 sourceColumnName = " + sourceColumnName + + " souce value type CN=" + + sourceColumnValue.getClass().getCanonicalName() + + " , Name = " + sourceColumnValue.getClass().getName() + + " , Type Name = " + + sourceColumnValue.getClass().getTypeName()); + printed2005 = true; + } + // temp debug code end + // CLOB or NCLOB ?? String + // -> StringReader + // bulkWriterStatement.setBytes(paramIdx, + // (byte[]) + // sourceColumnValue); + // bulkWriterStatement.setClob(paramIdx, + // (Clob) + // sourceColumnValue); + if (sourceColumnValue instanceof java.lang.String) { + final String clobString = (String) sourceColumnValue; + // typically a + // StringReader is + // enough, but exception + // occurs when the value + // is empty...therefore + // set to null + if (!clobString.isEmpty()) { + LOG.debug(" reading CLOB"); + // LOG.info("CLOB is + // not empty"); + bulkWriterStatement.setClob(paramIdx, + new StringReader((String) sourceColumnValue), + ((String) sourceColumnValue).length()); + LOG.debug(" wrote CLOB"); + } else { + LOG.debug("CLOB is empty...setting null"); + bulkWriterStatement.setNull(paramIdx, targetColumnType); + } + } + break; + } + default: { + bulkWriterStatement.setObject(paramIdx, sourceColumnValue, + targetColumnType); + break; + } + } + + } + } catch (final NumberFormatException e) { + /* + * To handle SqlServer CHAR -> + * Oracle Number. example + * Medias.p_fieldseparator + */ + LOG.error( + "NumberFormatException - Error setting Type on sourceColumnName = " + + sourceColumnName + ", sourceColumnValue = " + + sourceColumnValue + ", targetColumnType =" + + targetColumnType + ", source type = " + + sourceColumnValue.getClass().getTypeName()); + if (dbProvider.isOracleUsed()) { + if (sourceColumnValue instanceof java.lang.String) { + final char character = sourceColumnValue.toString().charAt(0); + final int ascii = character; + // 2 is NUMBER..need to use + // constants NOW + if (targetColumnType == 2) { + // bulkWriterStatement.setIn(paramIdx, + // ascii, + // targetColumnType); + bulkWriterStatement.setInt(paramIdx, ascii); + } + } + } + } catch (final Exception e) { + LOG.error("Error setting Type on sourceColumnName = " + sourceColumnName + + ", sourceColumnValue = " + sourceColumnValue + + ", targetColumnType =" + targetColumnType + ", source type = " + + sourceColumnValue.getClass().getTypeName(), e); + throw e; + } + // ##ORACLE_TARGET -- END TRY-catch temp + // to catch this BLOB Copy issue. + } else { + // for all cases oracle/sqlserver... + bulkWriterStatement.setNull(paramIdx, targetColumnType); + } + } + } + paramIdx += 1; + sourceColumnTypeIdx +=1; + } + + bulkWriterStatement.addBatch(); + } + + final int batchCount = ctx.getDataSet().getAllResults().size(); + executeBatch(ctx.getCopyItem(), bulkWriterStatement, batchCount, ctx.getPerformanceRecorder()); + bulkWriterStatement.clearParameters(); + bulkWriterStatement.clearBatch(); + connection.commit(); + // LOG.info("$$ updating progress from data wtiter task"); + final long totalCount = ctx.getTotalCount().addAndGet(batchCount); + updateProgress(ctx.getContext(), ctx.getCopyItem(), totalCount); + } + } catch (final Exception e) { + if (connection != null) { + connection.rollback(); + } + throw e; + } finally { + if (connection != null && originalAutoCommit != null) { + connection.setAutoCommit(originalAutoCommit); + } + if (connection != null && ctx != null) { + if (requiresIdentityInsert) { + switchIdentityInsert(connection, ctx.getCopyItem().getTargetItem(), false); + } + connection.close(); + } + } + } + } + + private class DataBulkWriterTask extends RetriableTask { + + private DataWriterContext ctx; + + public DataBulkWriterTask(DataWriterContext ctx) { + super(ctx.getContext(), ctx.getCopyItem().getTargetItem()); + this.ctx = ctx; + } + + @Override + protected Boolean internalRun() { + try { + if (!ctx.getDataSet().getAllResults().isEmpty()) { + process(); + } + return Boolean.TRUE; + } catch (Exception e) { + //LOG.error("Error while executing table task " + ctx.getCopyItem().getTargetItem(),e); + throw new RuntimeException("Error processing writer task for " + ctx.getCopyItem().getTargetItem(), e); + } + } + + private void process() throws Exception { + Connection connection = null; + Boolean originalAutoCommit = null; + try { + connection = ctx.getContext().getMigrationContext().getDataTargetRepository().getConnection(); + originalAutoCommit = connection.getAutoCommit(); + connection.setAutoCommit(false); + SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(connection.unwrap(SQLServerConnection.class)); + SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions(); + copyOptions.setBulkCopyTimeout(0); + copyOptions.setBatchSize(ctx.getContext().getMigrationContext().getReaderBatchSize()); + bulkCopy.setBulkCopyOptions(copyOptions); + bulkCopy.setDestinationTableName(ctx.getCopyItem().getTargetItem()); + + try (Statement tempStmt = connection.createStatement(); + ResultSet tempTargetRs = tempStmt.executeQuery(String.format("select * from %s where 0 = 1", ctx.getCopyItem().getTargetItem()))) { + for (String column : ctx.getColumnsToCopy()) { + int targetColumnIdx = tempTargetRs.findColumn(column); + bulkCopy.addColumnMapping(column, targetColumnIdx); + } + } + bulkCopy.writeToServer(ctx.getDataSet().toSQLServerBulkData()); + connection.commit(); + final Stopwatch timer = Stopwatch.createStarted(); + int bulkCount = ctx.getDataSet().getAllResults().size(); + LOG.debug("Bulk written ({} items) for table '{}' in {}", bulkCount, ctx.getCopyItem().getTargetItem(), timer.stop().toString()); + ctx.getPerformanceRecorder().record(PerformanceUnit.ROWS, bulkCount); + long totalCount = ctx.getTotalCount().addAndGet(bulkCount); + updateProgress(ctx.getContext(), ctx.getCopyItem(), totalCount); + } catch (Exception e) { + if (connection != null) { + connection.rollback(); + } + throw e; + } finally { + if (connection != null && originalAutoCommit != null) { + connection.setAutoCommit(originalAutoCommit); + } + if (connection != null && ctx != null) { + connection.close(); + } + } + } + } + + private class DataDeleteWriterTask extends RetriableTask { + + private DataWriterContext ctx; + + public DataDeleteWriterTask(DataWriterContext ctx) { + super(ctx.getContext(), ctx.getCopyItem().getTargetItem()); + this.ctx = ctx; + } + + @Override + protected Boolean internalRun() { + try { + if (!ctx.getDataSet().getAllResults().isEmpty()) { + if(ctx.getContext().getMigrationContext().isDeletionEnabled()){ + process(); + } + } + return Boolean.TRUE; + } catch (Exception e) { + //LOG.error("Error while executing table task " + ctx.getCopyItem().getTargetItem(),e); + throw new RuntimeException("Error processing writer task for " + ctx.getCopyItem().getTargetItem(), e); + } + } + + private void process() throws Exception { + Connection connection = null; + Boolean originalAutoCommit = null; + String PK = "PK"; + boolean requiresIdentityInsert = ctx.isRequiresIdentityInsert(); + try { + connection = ctx.getContext().getMigrationContext().getDataTargetRepository().getConnection(); + originalAutoCommit = connection.getAutoCommit(); + // ORACLE_TARGET - START + String sqlDelete = ""; + if ("oracle".equalsIgnoreCase(ctx.getContext().getMigrationContext().getDataTargetRepository() + .getDatabaseProvider().getDbName())) { + sqlDelete = getBulkDeleteStatementOracle(ctx.getCopyItem().getTargetItem(), PK); + } else { + sqlDelete = getBulkDeleteStatement(ctx.getCopyItem().getTargetItem(), PK); + } + // ORACLE_TARGET - END + try (PreparedStatement bulkWriterStatement = connection.prepareStatement( + getBulkDeleteStatement(ctx.getCopyItem().getTargetItem() , PK));) { + connection.setAutoCommit(false); + for (List row : ctx.getDataSet().getAllResults()) { + int paramIdx = 1; + Long pkValue = (Long) ctx.getDataSet() + .getColumnValue("p_itempk", row); + bulkWriterStatement.setObject(paramIdx, pkValue); + + paramIdx += 1; + bulkWriterStatement.addBatch(); + } + int batchCount = ctx.getDataSet().getAllResults().size(); + executeBatch(ctx.getCopyItem(), bulkWriterStatement, batchCount, ctx.getPerformanceRecorder()); + bulkWriterStatement.clearParameters(); + bulkWriterStatement.clearBatch(); + connection.commit(); + long totalCount = ctx.getTotalCount().addAndGet(batchCount); + updateProgress(ctx.getContext(), ctx.getCopyItem(), totalCount); + } + } catch (Exception e) { + if (connection != null) { + connection.rollback(); + } + throw e; + } finally { + if (connection != null && originalAutoCommit != null) { + connection.setAutoCommit(originalAutoCommit); + } + if (connection != null && ctx != null) { + if (requiresIdentityInsert) { + switchIdentityInsert(connection, ctx.getCopyItem().getTargetItem(), false); + } + connection.close(); + } + } + } + + private List getListColumn() { + final String columns = "PK"; + if (StringUtils.isEmpty(columns)) { + return Collections.emptyList(); + } + List result = Splitter.on(",") + .omitEmptyStrings() + .trimResults() + .splitToList(columns); + + return result; + } + } + +} diff --git a/commercedbsync/src/com/sap/cx/boosters/commercedbsync/utils/MaskUtil.java b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/utils/MaskUtil.java new file mode 100644 index 0000000..650e735 --- /dev/null +++ b/commercedbsync/src/com/sap/cx/boosters/commercedbsync/utils/MaskUtil.java @@ -0,0 +1,15 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsync.utils; + +public class MaskUtil { + + public static String stripJdbcPassword(final String jdbcConnectionString) { + return jdbcConnectionString.replaceFirst("password=.*?;", "password=***;"); + } + +} diff --git a/commercedbsync/src/de/hybris/platform/azure/media/AzureCloudUtils.java b/commercedbsync/src/de/hybris/platform/azure/media/AzureCloudUtils.java new file mode 100644 index 0000000..9c28745 --- /dev/null +++ b/commercedbsync/src/de/hybris/platform/azure/media/AzureCloudUtils.java @@ -0,0 +1,39 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package de.hybris.platform.azure.media; + +import de.hybris.platform.core.Registry; +import de.hybris.platform.media.storage.MediaStorageConfigService.MediaFolderConfig; +import de.hybris.platform.util.Config; +import org.apache.commons.lang.StringUtils; + +public class AzureCloudUtils { + public AzureCloudUtils() { + } + + public static String computeContainerAddress(MediaFolderConfig config) { + String configuredContainer = config.getParameter("containerAddress"); + String addressSuffix = StringUtils.isNotBlank(configuredContainer) ? configuredContainer : config.getFolderQualifier(); + String addressPrefix = getTenantPrefix(); + return toValidContainerName(addressPrefix + "-" + addressSuffix); + } + + private static String toValidContainerName(String name) { + return name.toLowerCase().replaceAll("[/. !?]", "").replace('_', '-'); + } + + private static String toValidPrefixName(String name) { + return name.toLowerCase().replaceAll("[/. !?_-]", ""); + } + + private static String getTenantPrefix() { + //return "sys-" + Registry.getCurrentTenantNoFallback().getTenantID().toLowerCase(); + String defaultPrefix = Registry.getCurrentTenantNoFallback().getTenantID(); + String prefix = toValidPrefixName(Config.getString("db.tableprefix", defaultPrefix)); + return "sys-" + prefix.toLowerCase(); + } +} diff --git a/commercedbsync/src/de/hybris/platform/core/TenantPropertiesLoader.java b/commercedbsync/src/de/hybris/platform/core/TenantPropertiesLoader.java new file mode 100644 index 0000000..81a8bbe --- /dev/null +++ b/commercedbsync/src/de/hybris/platform/core/TenantPropertiesLoader.java @@ -0,0 +1,30 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package de.hybris.platform.core; + +import de.hybris.bootstrap.ddl.PropertiesLoader; + +import java.util.Objects; + + +public class TenantPropertiesLoader implements PropertiesLoader { + private final Tenant tenant; + + public TenantPropertiesLoader(final Tenant tenant) { + Objects.requireNonNull(tenant); + this.tenant = tenant; + } + + @Override + public String getProperty(final String key) { + return tenant.getConfig().getParameter(key); + } + + @Override + public String getProperty(final String key, final String defaultValue) { + return tenant.getConfig().getString(key, defaultValue); + } +} \ No newline at end of file diff --git a/commercedbsync/velocity.log b/commercedbsync/velocity.log new file mode 100644 index 0000000..e69de29 diff --git a/commercedbsynchac/.classpath b/commercedbsynchac/.classpath new file mode 100644 index 0000000..bf29992 --- /dev/null +++ b/commercedbsynchac/.classpath @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/commercedbsynchac/.externalToolBuilders/HybrisCodeGeneration.launch b/commercedbsynchac/.externalToolBuilders/HybrisCodeGeneration.launch new file mode 100644 index 0000000..4ab552e --- /dev/null +++ b/commercedbsynchac/.externalToolBuilders/HybrisCodeGeneration.launch @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commercedbsynchac/.springBeans b/commercedbsynchac/.springBeans new file mode 100644 index 0000000..fa78869 --- /dev/null +++ b/commercedbsynchac/.springBeans @@ -0,0 +1,16 @@ + + + 1 + + + + + + + resources/commercedbsynchac-spring.xml + + + + + + diff --git a/commercedbsynchac/buildcallbacks.xml b/commercedbsynchac/buildcallbacks.xml new file mode 100644 index 0000000..1750cbc --- /dev/null +++ b/commercedbsynchac/buildcallbacks.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/commercedbsynchac/extensioninfo.xml b/commercedbsynchac/extensioninfo.xml new file mode 100644 index 0000000..f8e32d5 --- /dev/null +++ b/commercedbsynchac/extensioninfo.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/commercedbsynchac/external-dependencies.xml b/commercedbsynchac/external-dependencies.xml new file mode 100644 index 0000000..4d5a2e2 --- /dev/null +++ b/commercedbsynchac/external-dependencies.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + de.hybris.platform + commercedbsynchac + 6.7.0.0-RC19 + + jar + + + + diff --git a/commercedbsynchac/hac/resources/jsp/dataCopy.jsp b/commercedbsynchac/hac/resources/jsp/dataCopy.jsp new file mode 100644 index 0000000..c206e8b --- /dev/null +++ b/commercedbsynchac/hac/resources/jsp/dataCopy.jsp @@ -0,0 +1,109 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="hac" uri="/WEB-INF/custom.tld" %> +<%-- + ~ Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + ~ License: Apache-2.0 + ~ + --%> + + + + Migrate Data To SAP Commerce Cloud + " type="text/css" + media="screen, projection"/> + "/> + + + + + + + + +
+
+

Data Migration

+ + + Incremental mode is enabled. Only rows changed after ${incrementalTimestamp} for specified tables will be copied. + + +
+ + +
+
+
+
+
Source Typesystem
+
${srcTsName}
+
Target Typesystem
+
${tgtTsName}
+
+
+
+
+
Source Table Prefix
+
${srcPrefix}
+
Target (Migration) Table Prefix
+
${tgtMigPrefix}
+
Target (Running System) Table Prefix
+
${tgtActualPrefix}
+
+
+
+
+
"> +
+
ID
+
N/A
+
Status
+
N/A
+
+
+
+
+
Total
+
N/A
+
Finished
+
N/A
+
Failed
+
N/A
+
+
+
+
+
Start
+
N/A
+
End
+
N/A
+
Duration
+
N/A
+
+
+
+
+
"> + + +
+
+ +
+

Migration Log

+
+

Migration not started.

+
+
+
+
+
" /> +
+
+ + + diff --git a/commercedbsynchac/hac/resources/jsp/dataSource.jsp b/commercedbsynchac/hac/resources/jsp/dataSource.jsp new file mode 100644 index 0000000..557a21f --- /dev/null +++ b/commercedbsynchac/hac/resources/jsp/dataSource.jsp @@ -0,0 +1,70 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="hac" uri="/WEB-INF/custom.tld" %> +<%-- + ~ Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + ~ License: Apache-2.0 + ~ + --%> + + + + Migrate Data To SAP Commerce Cloud + " type="text/css" media="screen, projection" /> + " type="text/css" media="screen, projection" /> + + + + + + +
+ +
+

Data Migration

+
+ + +
+
+ "> + + + + + + + + + +
PropertyValue
+
+ +
+
+
+ "> + + + + + + + + + +
PropertyValue
+
+ +
+
+
+
+ + + + + + diff --git a/commercedbsynchac/hac/resources/jsp/migrationReports.jsp b/commercedbsynchac/hac/resources/jsp/migrationReports.jsp new file mode 100644 index 0000000..191684b --- /dev/null +++ b/commercedbsynchac/hac/resources/jsp/migrationReports.jsp @@ -0,0 +1,46 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="hac" uri="/WEB-INF/custom.tld" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%-- + ~ Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + ~ License: Apache-2.0 + ~ + --%> + + + + Copy Schema To SAP Commerce Cloud + " type="text/css" media="screen, projection"/> + " type="text/css" + media="screen, projection"/> + " type="text/css" + media="screen, projection"/> + + + + + + + +
+ +
+

Migration Reports

+
+ + + + + + + + + + + +
Report idTimestampDownload
+
+
+
+ + diff --git a/commercedbsynchac/hac/resources/jsp/schemaCopy.jsp b/commercedbsynchac/hac/resources/jsp/schemaCopy.jsp new file mode 100644 index 0000000..82fad77 --- /dev/null +++ b/commercedbsynchac/hac/resources/jsp/schemaCopy.jsp @@ -0,0 +1,106 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="hac" uri="/WEB-INF/custom.tld" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%-- + ~ Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + ~ License: Apache-2.0 + ~ + --%> + + + + Copy Schema To SAP Commerce Cloud + " type="text/css" media="screen, projection" /> + " type="text/css" media="screen, projection" /> + " type="text/css" media="screen, projection" /> + " type="text/css" media="screen, projection" /> + + + + + + + + + +
+ +
+

Schema Migration

+
+ +
+ +
+

Target Schema

+

Target Schema is missing the following elements which are present in Source Schema

+ + + + + + + + + + +
Missing TableMissing Column
+

Source Schema

+

Source Schema is missing the following elements which are present in Target Schema

+ + + + + + + + + + +
Missing TableMissing Column
+
+
+
+
+

Schema Migration Configuration

+ +
+ checked="checked" > + +
+
+
+ +
+

Generate SQL Script

+ +
+
+ " alt="spinner"/> +
+ +
+ +
+
+

Execute SQL Script

+ + After the script generation check that your schema differences are correctly reflected by the SQL statements. + The checks may include completeness of 'add' and 'drop' statements as well as the corresponding data types. + Once verified, accept the box below and execute the script. The changes will only affect the target database. + + + +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/commercedbsynchac/hac/resources/static/css/dataCopy.css b/commercedbsynchac/hac/resources/static/css/dataCopy.css new file mode 100644 index 0000000..e5e9f10 --- /dev/null +++ b/commercedbsynchac/hac/resources/static/css/dataCopy.css @@ -0,0 +1,71 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +.placeholder { + color: dimgrey; +} + +.status dd { + font-size: 1rem; +} + +.completed { + color: green; +} + +.failed { + color: red; +} + +#copySummary .total, #copySummary .failed, #copySummary .completed { + font-weight: bold; +} + +#copyStatus .completed { + color: green; + text-transform: uppercase; + font-weight: bolder; +} + +#copyStatus .failed { + text-transform: uppercase; + font-weight: bolder; +} + +#copyLogContainer { + height: 600px; + overflow: auto; + font-family: monospace; + font-size: 1rem; + background-color: #FAFAFF; + padding: 1rem; + margin: 1rem 1rem 1rem 0; + border: 1px grey dashed; + border-radius: 3px; +} + +#copyLogContainer p + p { + text-indent: 0; +} + +#copyLogContainer .failed { + font-weight: bold; + font-size: 1.02em +} + +#copyLogContainer .completed { + font-weight: bold; + font-size: 1.02em +} + +button[disabled] { + cursor: default; + opacity: 0.5; +} + +button.control-button { + float:left; +} diff --git a/commercedbsynchac/hac/resources/static/css/database.css b/commercedbsynchac/hac/resources/static/css/database.css new file mode 100644 index 0000000..8c8565f --- /dev/null +++ b/commercedbsynchac/hac/resources/static/css/database.css @@ -0,0 +1,70 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +.nobox { + border: 0; + width: 100%; +} + +.textarea { + height: auto; +} + +#spinner { + margin: 100px auto; + opacity: 0.5; +} + +.spinner { + opacity: 0.5; +} + +#spinnerWrapper,#loggingSpinnerWrapper { + text-align: center; +} + +#tableWrapper { + display: none; + padding-bottom: 2em; +} + +#tableCopySchemaWrapper { + display: none; + padding-bottom: 2em; +} + +#tableCopyDataWrapper { + display: none; + padding-bottom: 2em; +} + +#loggingContentWrapper,#downloadLog,#slider-size,#downloadForm,#analyzeResults { + display: none; +} + +#loggingContentWrapper { + margin-bottom: 3em; +} + +#dataSourceInfos legend { + color: #005BBC; + font-size: 16px; +} + +.floatLeft { + float: left; +} +#copyStatusContainer { + +} + +#copyStatusContainer dd { + font-size: 1.2em; +} + +.progress { + font-weight: bolder; +} diff --git a/commercedbsynchac/hac/resources/static/css/schemaCopy.css b/commercedbsynchac/hac/resources/static/css/schemaCopy.css new file mode 100644 index 0000000..be85139 --- /dev/null +++ b/commercedbsynchac/hac/resources/static/css/schemaCopy.css @@ -0,0 +1,52 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +.CodeMirror { + height: 100%; +} + +.CodeMirror-line-numbers { + background-color: lightgray; + border-right: 1px solid #eee; + min-width: 2em; + height: 100%; + color: gray; + text-align: right; + padding: .4em .2em .4em .4em; + font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; +} + +.border { + background-color: #FAFAFF; + border: 1px solid darkgray; +} + +.textarea-container { + position: relative; + border: 1px dashed #666 !important; +} + +textarea { + width: 100%; +} + +#spinnerWrapper { + display: none; + margin-top: 100px; + width: 100%; + position: absolute; + z-index: 1000; + text-align: center; +} + +textarea { + width: 100%; +} + +button[disabled] { + cursor: default; + opacity: 0.5; +} \ No newline at end of file diff --git a/commercedbsynchac/hac/resources/static/css/table.css b/commercedbsynchac/hac/resources/static/css/table.css new file mode 100644 index 0000000..e6fb3fd --- /dev/null +++ b/commercedbsynchac/hac/resources/static/css/table.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead>table,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} \ No newline at end of file diff --git a/commercedbsynchac/hac/resources/static/js/customStatistics.js b/commercedbsynchac/hac/resources/static/js/customStatistics.js new file mode 100644 index 0000000..859886d --- /dev/null +++ b/commercedbsynchac/hac/resources/static/js/customStatistics.js @@ -0,0 +1,11 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +$(function() { + $('#statistics').dataTable({ + "iDisplayLength" : 50 + }); +}) \ No newline at end of file diff --git a/commercedbsynchac/hac/resources/static/js/dataCopy.js b/commercedbsynchac/hac/resources/static/js/dataCopy.js new file mode 100644 index 0000000..3b6a75e --- /dev/null +++ b/commercedbsynchac/hac/resources/static/js/dataCopy.js @@ -0,0 +1,271 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +'use strict'; +(function () { + function setupMigration() { + const startButton = document.getElementById("buttonCopyData") + const stopButton = document.getElementById("buttonStopCopyData") + const startUrl = startButton.dataset.url; + const stopUrl = stopButton.dataset.url; + const statusContainer = document.getElementById('copyStatus'); + const summaryContainer = document.getElementById('copySummary'); + const timeContainer = document.getElementById('copyTime'); + const statusUrl = statusContainer.dataset.url; + const logContainer = document.getElementById("copyLogContainer"); + const reportButton = document.getElementById("buttonCopyReport") + const reportForm = document.getElementById("formCopyReport") + const token = document.querySelector('meta[name="_csrf"]').content; + const switchPrefixButton = document.getElementById("buttonSwitchPrefix") + let lastUpdateTime = Date.UTC(1970, 0, 1, 0, 0, 0); + let pollInterval; + let startButtonContentBefore; + let currentMigrationID; + + startButton.disabled = true; + startButton.addEventListener('click', copyData); + stopButton.disabled = true; + stopButton.addEventListener('click', stopCopy); + switchPrefixButton.disabled = true; + switchPrefixButton.addEventListener('click', switchPrefix); + + resumeRunning(); + + function empty(element) { + while (element.firstChild) { + element.removeChild(element.lastChild); + } + } + function formatEpoch(epoch) { + if (epoch) { + return new Date(epoch).toISOString(); + } else { + return "N/A"; + } + } + function formatDuration(startEpoch, endEpoch) { + if(!startEpoch || !endEpoch) { + return "N/A"; + } else { + let sec_num = (endEpoch - startEpoch) / 1000; + let hours = Math.floor(sec_num / 3600); + let minutes = Math.floor((sec_num - (hours * 3600)) / 60); + let seconds = sec_num - (hours * 3600) - (minutes * 60); + if (hours < 10) {hours = "0"+hours;} + if (minutes < 10) {minutes = "0"+minutes;} + if (seconds < 10) {seconds = "0"+seconds;} + return hours+':'+minutes+':'+seconds; + } + + } + + function switchPrefix() { + let switchButtonContentBefore = switchPrefixButton.innerHTML; + switchPrefixButton.innerHTML = switchButtonContentBefore + ' ' + hac.global.getSpinnerImg(); + $.ajax({ + url: switchPrefixButton.dataset.url, + type: 'PUT', + headers: { + 'Accept': 'application/json', + 'X-CSRF-TOKEN': token + }, + success: function (data) { + switchPrefixButton.innerHTML = switchButtonContentBefore; + }, + error: hac.global.err + }); + } + + function resumeRunning() { + $.ajax({ + url: '/hac/commercedbsynchac/resumeRunning', + type: 'GET', + headers: { + 'Accept': 'application/json', + 'X-CSRF-TOKEN': token + }, + success: function (data) { + if(data && data.status === 'RUNNING') { + startButtonContentBefore = startButton.innerHTML; + startButton.innerHTML = startButtonContentBefore + ' ' + hac.global.getSpinnerImg(); + startButton.disabled = true; + reportButton.disabled = true; + stopButton.disabled = false; + currentMigrationID = data.migrationID; + empty(logContainer); + updateStatus(data); + doPoll(); + pollInterval = setInterval(doPoll, 5000); + } else { + startButton.disabled = false; + } + }, + error: function (data) { + startButton.disabled = false; + } + }); + } + + function copyData() { + startButtonContentBefore = startButton.innerHTML; + startButton.innerHTML = startButtonContentBefore + ' ' + hac.global.getSpinnerImg(); + startButton.disabled = true; + reportButton.disabled = true; + stopButton.disabled = false; + $.ajax({ + url: startUrl, + type: 'PUT', + headers: { + 'Accept': 'application/json', + 'X-CSRF-TOKEN': token + }, + success: function (data) { + currentMigrationID = data.migrationID; + empty(logContainer); + updateStatus(data); + doPoll(); + pollInterval = setInterval(doPoll, 5000); + }, + error: function(xht, textStatus, ex) { + hac.global.error("Data migration process failed, please check the logs"); + + stopButton.disabled = true; + startButton.innerHTML = startButtonContentBefore; + startButton.disabled = false; + } + }); + } + + function stopCopy() { + stopButton.disabled = true; + startButton.innerHTML = startButtonContentBefore; + startButton.disabled = false; + $.ajax({ + url: stopUrl, + type: 'PUT', + data: currentMigrationID, + headers: { + 'Accept': 'application/json', + 'X-CSRF-TOKEN': token + }, + success: function (data) { + }, + error: hac.global.err + }); + } + + function updateStatus(status) { + const statusSummary = document.createElement('dl'); + statusSummary.classList.add("summary"); + let dt = document.createElement('dt') + let dd = document.createElement('dd') + dt.innerText = "ID"; + statusSummary.appendChild(dt); + dd.innerText = status.migrationID; + statusSummary.appendChild(dd); + dt = document.createElement("dt"); + dt.innerText = "Status"; + statusSummary.appendChild(dt); + dd = document.createElement("dd"); + dd.classList.add('status'); + statusSummary.appendChild(dd); + if (status.failed) { + dd.innerText = "Failed"; + dd.classList.add("failed"); + } else if (status.completed) { + dd.innerText = "Completed"; + dd.classList.add("completed") + } else { + dd.innerHTML = `In Progress...
(last update: ${formatEpoch(status.lastUpdateEpoch)})` + } + empty(statusContainer); + statusContainer.appendChild(statusSummary); + + const progressSummary = document.createElement("dl"); + progressSummary.classList.add("progress"); + progressSummary.innerHTML = + `
Total
${status.totalTasks}
` + + `
Completed
${status.completedTasks}
` + + `
Failed
${status.failedTasks}
`; + empty(summaryContainer); + summaryContainer.appendChild(progressSummary); + + const timeSummary = document.createElement("dl"); + timeSummary.innerHTML = + `
Start
${formatEpoch(status.startEpoch)}
` + + `
End
${formatEpoch(status.endEpoch)}
` + + `
Duration
${formatDuration(status.startEpoch, status.endEpoch)}
`; + empty(timeContainer); + timeContainer.appendChild(timeSummary); + } + + function doPoll() { + console.log(new Date(lastUpdateTime).toISOString()); + $.ajax({ + url: statusUrl, + type: 'GET', + data: { + migrationID: currentMigrationID, + since: lastUpdateTime + }, + headers: { + 'Accept': 'application/json', + 'X-CSRF-TOKEN': token + }, + success: function (status) { + // Sticky scroll: https://stackoverflow.com/a/21067431 + // allow 1px inaccuracy by adding 1 + const isScrolledToBottom = logContainer.scrollHeight - logContainer.clientHeight <= logContainer.scrollTop + 1 + writeLogs(status.statusUpdates); + if (isScrolledToBottom) { + logContainer.scrollTop = logContainer.scrollHeight - logContainer.clientHeight + } + updateStatus(status); + if (status.completed || status.failed) { + startButton.innerHTML = startButtonContentBefore + startButton.disabled = false; + stopButton.disabled = true; + $(reportForm).children('input[name=migrationId]').val(currentMigrationID); + reportButton.disabled = false; + clearInterval(pollInterval); + } + }, + error: function(xhr, status, error) { + console.error('Could not get status data'); + } + }); + lastUpdateTime = Date.now(); + } + + function writeLogs(statusUpdates) { + statusUpdates.forEach(function (entry) { + let message = `${formatEpoch(entry.lastUpdateEpoch)} | ${entry.pipelinename} | ${entry.targetrowcount} / ${entry.sourcerowcount} | `; + let p = document.createElement("p"); + if (entry.failure) { + message += `FAILED! Reason: ${entry.error}`; + p.classList.add("failed"); + }else if (entry.completed) { + message += `Completed in ${entry.duration}`; + p.classList.add("completed"); + } else { + message += "In progress..." + } + p.textContent = message; + logContainer.appendChild(p); + }); + } + } + + function domReady(fn) { + document.addEventListener("DOMContentLoaded", fn); + if (document.readyState === "interactive" || document.readyState === "complete") { + fn(); + } + } + + domReady(setupMigration); +})(); + diff --git a/commercedbsynchac/hac/resources/static/js/dataSource.js b/commercedbsynchac/hac/resources/static/js/dataSource.js new file mode 100644 index 0000000..ac21ddb --- /dev/null +++ b/commercedbsynchac/hac/resources/static/js/dataSource.js @@ -0,0 +1,165 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +var tableDsSource; +var tableDsTarget; +var buttonDsSourceValidate = "Validate Connection"; +var buttonDsTargetValidate = "Validate Connection"; + +$(document).ready(function() { + + tableDsSource = $('#tableDsSource').dataTable({ + "bStateSave": true, + "bAutoWidth": false, + "aLengthMenu" : [[10,25,50,100,-1], [10,25,50,100,'all']] + }); + + tableDsTarget = $('#tableDsTarget').dataTable({ + "bStateSave": true, + "bAutoWidth": false, + "aLengthMenu" : [[10,25,50,100,-1], [10,25,50,100,'all']] + }); + + loadSource(); + loadTarget(); + + $( "#tabs" ).tabs({ + activate: function(event, ui) { + if ( ui.newPanel.attr('id') == 'tabs-1') { + + } + if ( ui.newPanel.attr('id') == 'tabs-2') { + + } + + //toggleActiveSidebar(ui.newPanel.attr('id').replace(/^.*-/, '')); + } + }); + + $('#buttonDsSourceValidate').click(validateSource); + $('#buttonDsTargetValidate').click(validateTarget); + + + +}); + +function validateSource() +{ + $('#buttonDsSourceValidate').html(buttonDsSourceValidate + ' ' + hac.global.getSpinnerImg()); + var token = $("meta[name='_csrf']").attr("content"); + + var url = $('#buttonDsSourceValidate').attr('data-url'); + + $.ajax({ + url:url, + type:'GET', + headers:{ + 'Accept':'application/json', + 'X-CSRF-TOKEN' : token + }, + success: function(data) { + debug.log(data); + if(data.valid === true) { + $('#buttonDsSourceValidate').html("Valid!"); + } else { + $('#buttonDsSourceValidate').html("Not valid!!"); + } + }, + error: hac.global.err + }); +} + +function validateTarget() +{ + $('#buttonDsTargetValidate').html(buttonDsTargetValidate + ' ' + hac.global.getSpinnerImg()); + var token = $("meta[name='_csrf']").attr("content"); + + var url = $('#buttonDsTargetValidate').attr('data-url'); + + $.ajax({ + url:url, + type:'GET', + headers:{ + 'Accept':'application/json', + 'X-CSRF-TOKEN' : token + }, + success: function(data) { + debug.log(data); + if(data.valid === true) { + $('#buttonDsTargetValidate').html("Valid!"); + } else { + $('#buttonDsTargetValidate').html("Not valid!!"); + } + }, + error: hac.global.err + }); +} + +function loadSource() +{ + $('#tableDsSourceWrapper').fadeOut(); + tableDsSource.fnClearTable(); + + //$('#buttonCopyData').html(buttonCopyData + ' ' + hac.global.getSpinnerImg()); + var token = $("meta[name='_csrf']").attr("content"); + + var url = $('#tableDsSource').attr('data-url'); + + $.ajax({ + url:url, + type:'GET', + headers:{ + 'Accept':'application/json', + 'X-CSRF-TOKEN' : token + }, + success: function(data) { + debug.log(data); + tableDsSource.fnAddData(["profile",data.profile]); + tableDsSource.fnAddData(["driver",data.driver]); + tableDsSource.fnAddData(["connectionString",data.connectionString]); + tableDsSource.fnAddData(["userName",data.userName]); + tableDsSource.fnAddData(["password",data.password]); + tableDsSource.fnAddData(["schema",data.schema]); + tableDsSource.fnAddData(["catalog",data.catalog]); + + $("#tableDsSourceWrapper").fadeIn(); + }, + error: hac.global.err + }); +} + +function loadTarget() +{ + $('#tableDsTargetWrapper').fadeOut(); + tableDsTarget.fnClearTable(); + + //$('#buttonCopyData').html(buttonCopyData + ' ' + hac.global.getSpinnerImg()); + var token = $("meta[name='_csrf']").attr("content"); + + var url = $('#tableDsTarget').attr('data-url'); + + $.ajax({ + url:url, + type:'GET', + headers:{ + 'Accept':'application/json', + 'X-CSRF-TOKEN' : token + }, + success: function(data) { + debug.log(data); + tableDsTarget.fnAddData(["profile",data.profile]); + tableDsTarget.fnAddData(["driver",data.driver]); + tableDsTarget.fnAddData(["connectionString",data.connectionString]); + tableDsTarget.fnAddData(["userName",data.userName]); + tableDsTarget.fnAddData(["password",data.password]); + tableDsTarget.fnAddData(["schema",data.schema]); + tableDsTarget.fnAddData(["catalog",data.catalog]); + + $("#tableDsTargetWrapper").fadeIn(); + }, + error: hac.global.err + }); +} \ No newline at end of file diff --git a/commercedbsynchac/hac/resources/static/js/migrationMetrics.js b/commercedbsynchac/hac/resources/static/js/migrationMetrics.js new file mode 100644 index 0000000..f0f3055 --- /dev/null +++ b/commercedbsynchac/hac/resources/static/js/migrationMetrics.js @@ -0,0 +1,135 @@ + +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +let charts = {}; + +$(document).ready(function () { + getData(); + window.setInterval(getData, 5000) +}); + + +function getData() { + var token = $("meta[name='_csrf']").attr("content"); + var url = $('#charts').attr('data-chartDataUrl'); + $.ajax({ + url: url, + type: 'GET', + headers: { + 'Accept': 'application/json', + 'X-CSRF-TOKEN': token + }, + success: function (data) { + data.forEach(function(metric) { + if($("#" + getChartId(metric)).length == 0) { + createContainer(metric); + createChart(metric); + } + drawChart(metric); + }); + }, + error: function(xhr, status, error) { + console.error('Could not get metric data'); + } + }); + +} + +function createChart(metric) { + chartId = getChartId(metric); + chart = new Chart($('#' + chartId), { + type: 'doughnut', + data: { + datasets: [{ + data: [], + backgroundColor: [], + label: metric.name + }], + labels: [] + }, + options: { + legend: { + display: false, + }, + tooltips: { + callbacks: { + label: function (tooltipItem, data) { + var dataset = data.datasets[tooltipItem.datasetIndex]; + var meta = dataset._meta[Object.keys(dataset._meta)[0]]; + var total = meta.total; + var currentValue = dataset.data[tooltipItem.index]; + var percentage = parseFloat((currentValue / total * 100).toFixed(1)); + return currentValue + ' (' + percentage + '%)'; + }, + title: function (tooltipItem, data) { + return data.labels[tooltipItem[0].index]; + } + }, + backgroundColor: "rgb(255,255,255,0.95)", + titleFontColor: "rgb(0,0,0)", + bodyFontColor: "rgb(0,0,0)" + }, + options: { + responsive: true, + maintainAspectRatio: false, + } + } + }); + charts[chartId] = chart; +} + + +function createContainer(metric) { + size = '100px'; + root = $('#charts'); + wrapper = $('
').css('margin-bottom','10px'); + root.append(wrapper); + title = $('

').text(metric.name); + canvasContainer = $('
').attr('id', getChartId(metric)+'-container').css('text-align','center').css('width',size).css('height',size); + wrapper.append(title); + wrapper.append(canvasContainer); + canvas = $('').attr('id', getChartId(metric)).attr('width', size).attr('height', size); + canvasContainer.append(canvas); +} + +function drawChart(metric) { + //debug.log(metric.primaryValue + " / " + metric.secondaryValue); + chart = charts[getChartId(metric)]; + chart.data.datasets[0].data = [metric.secondaryValue, metric.primaryValue]; + primaryLabel = metric.primaryValueLabel + ' (' + metric.primaryValueUnit + ')'; + secondaryLabel = metric.secondaryValueLabel + ' (' + metric.secondaryValueUnit + ')'; + chart.data.labels = [secondaryLabel, primaryLabel]; + chart.options.tooltips.enabled = true; + + primaryColor = metric.primaryValueStandardColor; + secondaryColor = metric.secondaryValueStandardColor; + if(metric.primaryValue < 0) { + primaryColor = '#9a9fa6'; + secondaryColor = primaryColor; + chart.options.tooltips.enabled = false; + } else { + if(metric.primaryValueThreshold > 0) { + if(metric.primaryValue >= metric.primaryValueThreshold) { + primaryColor = metric.primaryValueCriticalColor; + } + } + if(metric.secondaryValueThreshold > 0) { + if(metric.secondaryValue >= metric.secondaryValueThreshold) { + secondaryColor = metric.secondaryValueCriticalColor; + } + } + } + + chart.data.datasets[0].backgroundColor = [secondaryColor, primaryColor]; + chart.update(); +} + +function getChartId(metric) { + return 'chart-area-' + metric.metricId; +} + + diff --git a/commercedbsynchac/hac/resources/static/js/migrationReports.js b/commercedbsynchac/hac/resources/static/js/migrationReports.js new file mode 100644 index 0000000..956160b --- /dev/null +++ b/commercedbsynchac/hac/resources/static/js/migrationReports.js @@ -0,0 +1,66 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +var reportsTable; + +$(document).ready(function () { + reportsTable = $('#reportsTable').dataTable({ + "bStateSave": true, + "bAutoWidth": false, + "aLengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, 'all']] + }); + loadMigrationReports(); +}); + +function loadMigrationReports() { + $('#logsWrapper').fadeOut(); + reportsTable.fnClearTable(); + var token = $("meta[name='_csrf']").attr("content"); + var url = "/hac/commercedbsynchac/loadMigrationReports"; + $.ajax({ + url: url, + type: 'GET', + headers: { + 'Accept': 'application/json', + 'X-CSRF-TOKEN': token + }, + success: function (data) { + if (data.length > 0) { + data.forEach((report) => { + let strippedMigrationId = report.reportId; + reportsTable.fnAddData([ + strippedMigrationId, + report.modifiedTimestamp, + '' + ]) + }); + } + }, + error: hac.global.err + }); +} + +function downloadReport(migrationId) { + var token = $("meta[name='_csrf']").attr("content"); + var url = "/hac/commercedbsynchac/downloadLogsReport?migrationId="+migrationId; + $.ajax({ + url: url, + type: 'GET', + headers: { + 'X-CSRF-TOKEN': token + }, + success: function (data) { + debug.log(data); + var blob = new Blob([data], {type: "text/plain"}); + var link = document.createElement("a"); + link.href = window.URL.createObjectURL(blob); + link.download = migrationId; + link.click(); + }, + error: hac.global.err + }); +} + diff --git a/commercedbsynchac/hac/resources/static/js/schemaCopy.js b/commercedbsynchac/hac/resources/static/js/schemaCopy.js new file mode 100644 index 0000000..4cc22c3 --- /dev/null +++ b/commercedbsynchac/hac/resources/static/js/schemaCopy.js @@ -0,0 +1,161 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +var targetSchemaDiffTable; +var sourceSchemaDiffTable; +var buttonMigrateSchemaPreview = "Calculating Diff Preview"; +var buttonMigrateSchema = "Execute script"; +var buttonGenerateSchemaScript = "Generate Schema Script"; +var sqlQueryEditor; + +$(document).ready(function() { + $( "#tabs" ).tabs({ + activate: function(event, ui) { + } + }); + + + $("#sqlQueryWrapper").resizable().height("250px").width("100%"); + sqlQueryEditor = CodeMirror.fromTextArea(document.getElementById("sqlQuery"), { + mode: "text/x-sql", + lineNumbers: false, + lineWrapping: true, + autofocus: true + }); + + $('#buttonGenerateSchemaScript').click(generateSchemaScript); + $('#buttonMigrateSchemaPreview').click(migrateSchemaPreview); + $('#buttonMigrateSchema').prop('disabled', true); + + $('#checkboxAccept').change(function() { + if($(this).is(":checked")) { + $('#buttonMigrateSchema').prop('disabled', false); + } else { + $('#buttonMigrateSchema').prop('disabled', true); + } + }); + + // tab 1 + targetSchemaDiffTable = $('#targetSchemaDiffTable').dataTable({ + "bStateSave": true, + "bAutoWidth": false, + "aLengthMenu" : [[10,25,50,100,-1], [10,25,50,100,'all']] + }); + sourceSchemaDiffTable = $('#sourceSchemaDiffTable').dataTable({ + "bStateSave": true, + "bAutoWidth": false, + "aLengthMenu" : [[10,25,50,100,-1], [10,25,50,100,'all']] + }); + + // We do not want to submit form using standard http + $("#schemaSqlForm").submit(function() { + return false; + }); + + $('#schemaSqlForm').validate({ + submitHandler: migrateSchema + }); + +}); + +function migrateSchemaPreview() +{ + $('#schemaDiffWrapper').fadeOut(); + targetSchemaDiffTable.fnClearTable(); + sourceSchemaDiffTable.fnClearTable(); + + $('#buttonMigrateSchemaPreview').html(buttonMigrateSchemaPreview + ' ' + hac.global.getSpinnerImg()); + var token = $("meta[name='_csrf']").attr("content"); + + var url = $('#buttonMigrateSchemaPreview').attr('data-url'); + + $.ajax({ + url:url, + type:'GET', + headers:{ + 'Accept':'application/json', + 'X-CSRF-TOKEN' : token + }, + success: function(data) { + debug.log(data); + + $('#buttonMigrateSchemaPreview').html(buttonMigrateSchemaPreview); + + if(data.target.results.length > 0) { + targetSchemaDiffTable.fnAddData(data.target.results); + } + if(data.source.results.length > 0) { + sourceSchemaDiffTable.fnAddData(data.source.results); + } + + $("#schemaDiffWrapper").fadeIn(); + + }, + error: hac.global.err + }); +} + +function generateSchemaScript() +{ + $('#buttonGenerateSchemaScript').html(buttonGenerateSchemaScript + ' ' + hac.global.getSpinnerImg()); + $("#checkboxAccept").prop("checked", false); + $('#buttonMigrateSchema').prop('disabled', true); + + var token = $("meta[name='_csrf']").attr("content"); + var url = $('#buttonGenerateSchemaScript').attr('data-url'); + + $.ajax({ + url:url, + type:'GET', + headers:{ + 'Accept':'text/plain', + 'X-CSRF-TOKEN' : token + }, + success: function(data) { + hac.global.notify('Duplicate tables may have been found. Please review generated schema script carefully.'); + sqlQueryEditor.setValue(data); + $('#buttonGenerateSchemaScript').html(buttonGenerateSchemaScript); + }, + error: hac.global.err + }); +} + +function migrateSchema() +{ + if(sqlQueryEditor.getValue().length <= 1){ + return false; + } + $('#buttonMigrateSchema').html(buttonMigrateSchema + ' ' + hac.global.getSpinnerImg()); + $('#spinnerWrapper').show(); + var token = $("meta[name='_csrf']").attr("content"); + + var url = $('#buttonMigrateSchema').attr('data-url'); + + // Prepare data object + var dataObject = { + sqlQuery : sqlQueryEditor.getValue(), + accepted : $('#checkboxAccept').is(":checked") + }; + + $.ajax({ + url:url, + type:'POST', + data: dataObject, + headers:{ + 'Accept':'text/plain', + 'X-CSRF-TOKEN' : token + }, + success: function(data) { + $('#spinnerWrapper').hide(); + $('#buttonMigrateSchema').html(buttonMigrateSchema); + sqlQueryEditor.setValue(data); + }, + error: hac.global.err + }); + +} + + diff --git a/commercedbsynchac/hac/src/de/hybris/platform/hac/controller/CommercemigrationhacController.java b/commercedbsynchac/hac/src/de/hybris/platform/hac/controller/CommercemigrationhacController.java new file mode 100644 index 0000000..070d7d9 --- /dev/null +++ b/commercedbsynchac/hac/src/de/hybris/platform/hac/controller/CommercemigrationhacController.java @@ -0,0 +1,442 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package de.hybris.platform.hac.controller; + +import com.google.common.base.Joiner; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.microsoft.azure.storage.blob.CloudBlockBlob; +import de.hybris.platform.commercedbsynchac.data.*; +import de.hybris.platform.servicelayer.config.ConfigurationService; +import de.hybris.platform.servicelayer.user.UserService; +import org.apache.commons.lang.BooleanUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.exception.ExceptionUtils; +import org.apache.logging.log4j.util.Strings; +import com.sap.cx.boosters.commercedbsync.MigrationStatus; +import com.sap.cx.boosters.commercedbsync.constants.CommercedbsyncConstants; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.repository.DataRepository; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationService; +import com.sap.cx.boosters.commercedbsync.service.DatabaseMigrationSynonymService; +import com.sap.cx.boosters.commercedbsync.service.DatabaseSchemaDifferenceService; +import com.sap.cx.boosters.commercedbsync.service.impl.BlobDatabaseMigrationReportStorageService; +import com.sap.cx.boosters.commercedbsync.service.impl.DefaultDatabaseSchemaDifferenceService; +import com.sap.cx.boosters.commercedbsync.utils.MaskUtil; +import com.sap.cx.boosters.commercedbsynchac.metric.MetricService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * + */ +@Controller +@RequestMapping("/commercedbsynchac/**") +public class CommercemigrationhacController { + + public static final String DEFAULT_EMPTY_VAL = "[NOT SET]"; + private static final Logger LOG = LoggerFactory.getLogger(CommercemigrationhacController.class); + private static final SimpleDateFormat DATE_TIME_FORMATTER = new SimpleDateFormat("YYYY-MM-dd HH:mm", Locale.ENGLISH); + + @Autowired + private UserService userService; + + @Autowired + private DatabaseMigrationService databaseMigrationService; + + @Autowired + private DatabaseSchemaDifferenceService databaseSchemaDifferenceService; + + @Autowired + private ConfigurationService configurationService; + + @Autowired + private MigrationContext migrationContext; + + @Autowired + private DatabaseMigrationSynonymService databaseMigrationSynonymService; + + @Autowired + private MetricService metricService; + + @Autowired + BlobDatabaseMigrationReportStorageService blobDatabaseMigrationReportStorageService; + + + private String currentMigrationId; + + @RequestMapping(value = + {"/migrationSchema"}, method = + {org.springframework.web.bind.annotation.RequestMethod.GET}) + public String schema(final Model model) { + logAction("Schema migration tab clicked"); + // ORACLE_TARGET -- start + migrationContext.refreshSelf(); + // ORACLE_TARGET -- END + model.addAttribute("wikiJdbcLogging", "some notes on database"); + model.addAttribute("wikiDatabase", "some more note on supported features"); + Map schemaSettings = new HashMap<>(); + schemaSettings.put(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_COLUMNS_ADD_ENABLED, migrationContext.isAddMissingColumnsToSchemaEnabled()); + schemaSettings.put(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_TABLES_REMOVE_ENABLED, migrationContext.isRemoveMissingTablesToSchemaEnabled()); + schemaSettings.put(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_TABLES_ADD_ENABLED, migrationContext.isAddMissingTablesToSchemaEnabled()); + schemaSettings.put(CommercedbsyncConstants.MIGRATION_SCHEMA_TARGET_COLUMNS_REMOVE_ENABLED, migrationContext.isRemoveMissingColumnsToSchemaEnabled()); + model.addAttribute("schemaSettings", schemaSettings); + model.addAttribute("schemaMigrationDisabled", !migrationContext.isSchemaMigrationEnabled()); + model.addAttribute("schemaSqlForm", new SchemaSqlFormData()); + return "schemaCopy"; + } + + @RequestMapping(value = + {"/migrationData"}, method = + {org.springframework.web.bind.annotation.RequestMethod.GET}) + public String data(final Model model) { + logAction("Data migration tab clicked"); + // ORACLE_TARGET -- start + migrationContext.refreshSelf(); + model.addAttribute("isIncremental", migrationContext.isIncrementalModeEnabled()); + Instant timestamp = migrationContext.getIncrementalTimestamp(); + model.addAttribute("incrementalTimestamp", timestamp == null ? DEFAULT_EMPTY_VAL : timestamp); + model.addAttribute("srcTsName", StringUtils.defaultIfEmpty(migrationContext.getDataSourceRepository().getDataSourceConfiguration().getTypeSystemName(), DEFAULT_EMPTY_VAL)); + model.addAttribute("tgtTsName", StringUtils.defaultIfEmpty(migrationContext.getDataTargetRepository().getDataSourceConfiguration().getTypeSystemName(), DEFAULT_EMPTY_VAL)); + model.addAttribute("srcPrefix", StringUtils.defaultIfEmpty(migrationContext.getDataSourceRepository().getDataSourceConfiguration().getTablePrefix(), DEFAULT_EMPTY_VAL)); + model.addAttribute("tgtMigPrefix", StringUtils.defaultIfEmpty(migrationContext.getDataTargetRepository().getDataSourceConfiguration().getTablePrefix(), DEFAULT_EMPTY_VAL)); + model.addAttribute("tgtActualPrefix", StringUtils.defaultIfEmpty(configurationService.getConfiguration().getString("db.tableprefix"), DEFAULT_EMPTY_VAL)); + return "dataCopy"; + } + + @RequestMapping(value = {"/migrationDataSource"}, method = {org.springframework.web.bind.annotation.RequestMethod.GET}) + public String dataSource(final Model model) { + logAction("Data sources tab clicked"); + model.addAttribute("wikiJdbcLogging", "some notes on database"); + model.addAttribute("wikiDatabase", "some more note on supported features"); + return "dataSource"; + } + + @RequestMapping(value = {"/migrationDataSource/{profile}"}, method = {org.springframework.web.bind.annotation.RequestMethod.GET}) + @ResponseBody + public DataSourceConfigurationData dataSourceInfo(final Model model, @PathVariable String profile) { + model.addAttribute("wikiJdbcLogging", "some notes on database"); + model.addAttribute("wikiDatabase", "some more note on supported features"); + final DataRepository dataRepository = getDataRepository(profile); + DataSourceConfigurationData dataSourceConfigurationData = null; + + if (dataRepository != null) { + dataSourceConfigurationData = new DataSourceConfigurationData(); + dataSourceConfigurationData.setProfile(dataRepository.getDataSourceConfiguration().getProfile()); + dataSourceConfigurationData.setDriver(dataRepository.getDataSourceConfiguration().getDriver()); + dataSourceConfigurationData.setConnectionString(MaskUtil.stripJdbcPassword(dataRepository.getDataSourceConfiguration().getConnectionString())); + dataSourceConfigurationData.setUserName(dataRepository.getDataSourceConfiguration().getUserName()); + dataSourceConfigurationData.setPassword(dataRepository.getDataSourceConfiguration().getPassword().replaceAll(".*", "*")); + dataSourceConfigurationData.setCatalog(dataRepository.getDataSourceConfiguration().getCatalog()); + dataSourceConfigurationData.setSchema(dataRepository.getDataSourceConfiguration().getSchema()); + dataSourceConfigurationData.setMaxActive(dataRepository.getDataSourceConfiguration().getMaxActive()); + dataSourceConfigurationData.setMaxIdle(dataRepository.getDataSourceConfiguration().getMaxIdle()); + dataSourceConfigurationData.setMinIdle(dataRepository.getDataSourceConfiguration().getMinIdle()); + dataSourceConfigurationData.setRemoveAbandoned(dataRepository.getDataSourceConfiguration().isRemoveAbandoned()); + } + + return dataSourceConfigurationData; + } + + @RequestMapping(value = + {"/migrationDataSource/{profile}/validate"}, method = + {org.springframework.web.bind.annotation.RequestMethod.GET}) + @ResponseBody + public DataSourceValidationResultData dataSourceValidation(final Model model, @PathVariable String profile) { + logAction("Validate connections button clicked"); + model.addAttribute("wikiJdbcLogging", "some notes on database"); + model.addAttribute("wikiDatabase", "some more note on supported features"); + + DataSourceValidationResultData dataSourceValidationResultData = new DataSourceValidationResultData(); + + try { + DataRepository dataRepository = getDataRepository(profile); + if (dataRepository != null) { + dataSourceValidationResultData.setValid(dataRepository.validateConnection()); + } else { + dataSourceValidationResultData.setValid(false); + } + } catch (Exception e) { + e.printStackTrace(); + dataSourceValidationResultData.setException(e.getMessage()); + } + + return dataSourceValidationResultData; + } + + private DataRepository getDataRepository(String profile) { + if (StringUtils.equalsIgnoreCase(profile, migrationContext.getDataSourceRepository().getDataSourceConfiguration().getProfile())) { + return migrationContext.getDataSourceRepository(); + } else if (StringUtils.equalsIgnoreCase(profile, migrationContext.getDataTargetRepository().getDataSourceConfiguration().getProfile())) { + return migrationContext.getDataTargetRepository(); + } else { + return null; + } + } + + @RequestMapping(value = + {"/generateSchemaScript"}, method = + {org.springframework.web.bind.annotation.RequestMethod.GET}) + @ResponseBody + public String generateSchemaScript() throws Exception { + logAction("Generate schema script button clicked"); + // ORACLE_TARGET -- start + migrationContext.refreshSelf(); + // ORACLE_TARGET -- END + return databaseSchemaDifferenceService.generateSchemaDifferencesSql(migrationContext); + } + + @RequestMapping(value = + {"/migrateSchema"}, method = + {org.springframework.web.bind.annotation.RequestMethod.POST}) + @ResponseBody + public String migrateSchema(@ModelAttribute("schemaSqlForm") SchemaSqlFormData data) { + try { + logAction("Execute script button clicked"); + // ORACLE_TARGET -- start + migrationContext.refreshSelf(); + // ORACLE_TARGET -- END + if (BooleanUtils.isTrue(data.getAccepted())) { + databaseSchemaDifferenceService.executeSchemaDifferencesSql(migrationContext, data.getSqlQuery()); + } else { + throw new IllegalStateException("Checkbox not accepted"); + } + } catch (Exception e) { + return ExceptionUtils.getStackTrace(e); + } + return "Successfully executed sql"; + } + + @RequestMapping(value = + {"/previewSchemaMigration"}, method = + {org.springframework.web.bind.annotation.RequestMethod.GET}) + @ResponseBody + public SchemaDifferenceResultContainerData previewSchemaMigration() throws Exception { + logAction("Preview schema migration changes button clicked"); + LOG.info("Starting preview of source and target db diff..."); + DefaultDatabaseSchemaDifferenceService.SchemaDifferenceResult difference = databaseSchemaDifferenceService.getDifference(migrationContext); + SchemaDifferenceResultData sourceSchemaDifferenceResultData = getSchemaDifferenceResultData(difference.getSourceSchema()); + SchemaDifferenceResultData targetSchemaDifferenceResultData = getSchemaDifferenceResultData(difference.getTargetSchema()); + SchemaDifferenceResultContainerData schemaDifferenceResultContainerData = new SchemaDifferenceResultContainerData(); + schemaDifferenceResultContainerData.setSource(sourceSchemaDifferenceResultData); + schemaDifferenceResultContainerData.setTarget(targetSchemaDifferenceResultData); + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String timeStamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); + try { + InputStream is = new ByteArrayInputStream(gson.toJson(schemaDifferenceResultContainerData).getBytes(StandardCharsets.UTF_8)); + blobDatabaseMigrationReportStorageService.store("schema-differences-"+timeStamp+".json", is); + } catch (Exception e){ + LOG.error("Failed to save the schema differences report to blob storage!"); + } + return schemaDifferenceResultContainerData; + } + + private SchemaDifferenceResultData getSchemaDifferenceResultData(DefaultDatabaseSchemaDifferenceService.SchemaDifference diff) { + SchemaDifferenceResultData schemaDifferenceResultData = new SchemaDifferenceResultData(); + + Map missingTablesMap = diff.getMissingTables().stream() + .collect(Collectors.toMap(e -> getTableName(diff, e.getRightName()), e -> "")); + Map missingColumnsMap = diff.getMissingColumnsInTable().asMap().entrySet().stream() + .collect(Collectors.toMap(e -> getTableName(diff, e.getKey().getRightName()), e -> Joiner.on(";").join(e.getValue()))); + + Map map = new HashMap<>(); + map.putAll(missingTablesMap); + map.putAll(missingColumnsMap); + + String[][] result = new String[map.size()][2]; + int count = 0; + for (Map.Entry entry : map.entrySet()) { + result[count][0] = entry.getKey(); + result[count][1] = entry.getValue(); + count++; + } + + schemaDifferenceResultData.setResults(result); + return schemaDifferenceResultData; + } + + private String getTableName(DefaultDatabaseSchemaDifferenceService.SchemaDifference diff, String name) { + if (StringUtils.isNotEmpty(diff.getPrefix())) { + return String.format("%s", name); + } else { + return name; + } + } + + @RequestMapping(value = "/copyData", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public MigrationStatus copyData() throws Exception { + logAction("Start data migration executed"); + // ORACLE_TARGET -- start + migrationContext.refreshSelf(); + // ORACLE_TARGET -- END + this.currentMigrationId = databaseMigrationService.startMigration(migrationContext); + return databaseMigrationService.getMigrationState(migrationContext, this.currentMigrationId); + } + + @RequestMapping(value = "/abortCopy", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public String abortCopy(@RequestBody String migrationID) throws Exception { + logAction("Stop data migration executed"); + // ORACLE_TARGET -- start + migrationContext.refreshSelf(); + // ORACLE_TARGET -- END + databaseMigrationService.stopMigration(migrationContext, migrationID); + return "true"; + } + + @RequestMapping(value = "/resumeRunning", method = RequestMethod.GET) + @ResponseBody + public MigrationStatus resumeRunning() throws Exception { + if (StringUtils.isNotEmpty(this.currentMigrationId)) { + MigrationStatus migrationState = databaseMigrationService.getMigrationState(migrationContext, this.currentMigrationId); + prepareStateForJsonSerialization(migrationState); + return migrationState; + } else { + return null; + } + } + + @RequestMapping(value = "/copyStatus", method = RequestMethod.GET) + @ResponseBody + public MigrationStatus copyStatus(@RequestParam String migrationID, @RequestParam long since) throws Exception { + OffsetDateTime sinceTime = OffsetDateTime.ofInstant(Instant.ofEpochMilli(since), ZoneOffset.UTC); + MigrationStatus migrationState = databaseMigrationService.getMigrationState(migrationContext, migrationID, sinceTime); + prepareStateForJsonSerialization(migrationState); + return migrationState; + } + + private void prepareStateForJsonSerialization(MigrationStatus migrationState) { + migrationState.setStartEpoch(convertToEpoch(migrationState.getStart())); + migrationState.setStart(null); + migrationState.setEndEpoch(convertToEpoch(migrationState.getEnd())); + migrationState.setEnd(null); + migrationState.setLastUpdateEpoch(convertToEpoch(migrationState.getLastUpdate())); + migrationState.setLastUpdate(null); + + migrationState.getStatusUpdates().forEach(u -> { + u.setLastUpdateEpoch(convertToEpoch(u.getLastUpdate())); + u.setLastUpdate(null); + }); + } + + private Long convertToEpoch(LocalDateTime time) { + if (time == null) { + return null; + } + return time.toInstant(ZoneOffset.UTC).toEpochMilli(); + } + + @GetMapping( + value = "/copyReport", + produces = MediaType.APPLICATION_OCTET_STREAM_VALUE + ) + public @ResponseBody + byte[] getCopyReport(@RequestParam String migrationId, HttpServletResponse response) throws Exception { + logAction("Download migration report button clicked"); + response.setHeader("Content-Disposition", "attachment; filename=migration-report.json"); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String json = gson.toJson(databaseMigrationService.getMigrationReport(migrationContext, migrationId)); + return json.getBytes(StandardCharsets.UTF_8.name()); + } + + @RequestMapping(value = "/switchPrefix", method = RequestMethod.PUT) + @ResponseBody + public Boolean switchPrefix(@RequestParam String prefix) throws Exception { + databaseMigrationSynonymService.recreateSynonyms(migrationContext.getDataTargetRepository(), prefix); + return Boolean.TRUE; + } + + @RequestMapping(value = "/metrics", method = RequestMethod.GET) + @ResponseBody + public List getMetrics() throws Exception { + return metricService.getMetrics(migrationContext); + } + + private void logAction(String message) { + LOG.info("{}: {} - User:{} - Time:{}", "CMT Action", message, userService.getCurrentUser().getUid(),LocalDateTime.now()); + } + + @RequestMapping(value = + {"/loadMigrationReports"}, method = + {org.springframework.web.bind.annotation.RequestMethod.GET}) + @ResponseBody + public List loadMigrationReports() { + try { + List blobs = blobDatabaseMigrationReportStorageService.listAllReports(); + List result = new ArrayList<>(); + blobs.forEach(blob -> { + ReportResultData reportResultData = new ReportResultData(); + reportResultData.setModifiedTimestamp(getSortableTimestamp(blob)); + reportResultData.setReportId(blob.getName()); + reportResultData.setPrimaryUri(blob.getUri().toString()); + result.add(reportResultData); + }); + return result; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private String getSortableTimestamp(CloudBlockBlob blob) { + if(blob != null && blob.getProperties() != null) { + Date lastModified = blob.getProperties().getLastModified(); + if(lastModified != null) { + return DATE_TIME_FORMATTER.format(lastModified); + } + } + return Strings.EMPTY; + } + + @GetMapping( + value = "/downloadLogsReport", + produces = MediaType.APPLICATION_OCTET_STREAM_VALUE + ) + public @ResponseBody + ResponseEntity downloadLogsReport(@RequestParam String migrationId) throws Exception { + logAction("Download migration report button clicked"); + byte[] outputFile = blobDatabaseMigrationReportStorageService.getReport(migrationId); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.set("charset", "utf-8"); + responseHeaders.setContentType(MediaType.valueOf("text/plain")); + responseHeaders.setContentLength(outputFile.length); + responseHeaders.set("Content-disposition", "attachment; filename=migration-report.json"); + return new ResponseEntity<>(outputFile, responseHeaders, HttpStatus.OK); + } + + + @RequestMapping(value = + {"/migrationReports"}, method = + {org.springframework.web.bind.annotation.RequestMethod.GET}) + public String reports(final Model model) { + logAction("Migration reports tab clicked"); + return "migrationReports"; + } + +} diff --git a/commercedbsynchac/hac/testclasses/de/hybris/platform/hac/controller/CommercemigrationhacControllerTest.class b/commercedbsynchac/hac/testclasses/de/hybris/platform/hac/controller/CommercemigrationhacControllerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..9d976257943ba15f14d96cd9040b45e64eb9dd82 GIT binary patch literal 980 zcmbtSU279T6g{(>WZSsf4?k-CDx%Puii03N_=RnxCfWSRIScf@eYx`G;gI zQ^(MHp|o4#r@u*Y|j}QT{DmjD?O#<`!Y|YJrYSq zC+j_vimWfJ^7-_z;YO-pI9OQOzk}49g>>bFVe@0Doyuij6^hjMv^K8#Q4%8~cF4yi z^@s0E>Vu@hB`1X)m@k@Pt%mO%J821y9q}KEleaR<3^lxVWvbjhG$pm}K>4?B|G$&I za?w7yQPEN<6lEPgYfq>?a{@M=#?HaVFL8Q1!8K;%e+U%Ty zeWgu+HHsbvHn2`HKD&U+xI!7jRYHTR_!+_qi#tCMeLBVRH?-#*e(r&LWZ-^{C!X?L zBh0I8RGimmoKL9AYqvV=A8fm1{b7x*b&hSbV!JV8+pThPJ-2oCw5K%^c8=sG6$Q9e L#oPF6^bYU`YR={G literal 0 HcmV?d00001 diff --git a/commercedbsynchac/hac/testsrc/de/hybris/platform/hac/controller/CommercemigrationhacControllerTest.java b/commercedbsynchac/hac/testsrc/de/hybris/platform/hac/controller/CommercemigrationhacControllerTest.java new file mode 100644 index 0000000..b6a3e9e --- /dev/null +++ b/commercedbsynchac/hac/testsrc/de/hybris/platform/hac/controller/CommercemigrationhacControllerTest.java @@ -0,0 +1,55 @@ +/* + * [y] hybris Platform + * + * Copyright (c) 2018 SAP SE or an SAP affiliate company. All rights reserved. + * + * This software is the confidential and proprietary information of SAP + * ("Confidential Information"). You shall not disclose such Confidential + * Information and shall use it only in accordance with the terms of the + * license agreement you entered into with SAP. + */ +package de.hybris.platform.hac.controller; + +import de.hybris.bootstrap.annotations.IntegrationTest; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +/** + * Test for {@link CommercemigrationhacController}. + */ +@IntegrationTest +public class CommercemigrationhacControllerTest { + + /** + * Code under test. + */ + protected CommercemigrationhacController cut; + + /** + * Set up the code under test. + */ + @Before + public void setup() { + cut = new CommercemigrationhacController(); + } + + /** + * Clean up the code under test. + */ + @After + public void teardown() { + cut = null; + } + + @Test + public void testSayHello() { + /* + final String helloText = cut.sayHello(); + + assertNotNull(helloText); + assertNotEquals(0, helloText.length()); + */ + } +} diff --git a/commercedbsynchac/project.properties b/commercedbsynchac/project.properties new file mode 100644 index 0000000..44b5307 --- /dev/null +++ b/commercedbsynchac/project.properties @@ -0,0 +1,9 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# +commercedbsynchac.key=value +# Specifies the location of the spring context file putted automatically to the global platform application context. +commercedbsynchac.application-context=commercedbsynchac-spring.xml +migration.from.hac.enabled=true \ No newline at end of file diff --git a/commercedbsynchac/resources/com/sap/cx/boosters/commercedbsynchac/dummy.txt b/commercedbsynchac/resources/com/sap/cx/boosters/commercedbsynchac/dummy.txt new file mode 100644 index 0000000..e69de29 diff --git a/commercedbsynchac/resources/commercedbsynchac-beans.xml b/commercedbsynchac/resources/commercedbsynchac-beans.xml new file mode 100644 index 0000000..edc74ad --- /dev/null +++ b/commercedbsynchac/resources/commercedbsynchac-beans.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commercedbsynchac/resources/commercedbsynchac-items.xml b/commercedbsynchac/resources/commercedbsynchac-items.xml new file mode 100644 index 0000000..0549dc5 --- /dev/null +++ b/commercedbsynchac/resources/commercedbsynchac-items.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/commercedbsynchac/resources/commercedbsynchac-spring.xml b/commercedbsynchac/resources/commercedbsynchac-spring.xml new file mode 100644 index 0000000..2469c7e --- /dev/null +++ b/commercedbsynchac/resources/commercedbsynchac-spring.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commercedbsynchac/resources/commercedbsynchac-tab-config.json b/commercedbsynchac/resources/commercedbsynchac-tab-config.json new file mode 100644 index 0000000..9903dcd --- /dev/null +++ b/commercedbsynchac/resources/commercedbsynchac-tab-config.json @@ -0,0 +1,28 @@ +[ + { + "basePath": "/commercedbsynchac", + "mainTabLabel": "Migration", + "subTabs": [ + { + "path": "/migrationDataSource", + "label": "Data Sources", + "skipPrefix": false + }, + { + "path": "/migrationSchema", + "label": "Schema Migration", + "skipPrefix": false + }, + { + "path": "/migrationData", + "label": "Data Migration", + "skipPrefix": false + }, + { + "path": "/migrationReports", + "label": "Reports", + "skipPrefix": false + } + ] + } +] diff --git a/commercedbsynchac/resources/commercedbsynchac-without-migration-tab-config.json b/commercedbsynchac/resources/commercedbsynchac-without-migration-tab-config.json new file mode 100644 index 0000000..0d4f101 --- /dev/null +++ b/commercedbsynchac/resources/commercedbsynchac-without-migration-tab-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_de.properties b/commercedbsynchac/resources/localization/i2ihac-locales_de.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_de.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_en.properties b/commercedbsynchac/resources/localization/i2ihac-locales_en.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_en.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_es.properties b/commercedbsynchac/resources/localization/i2ihac-locales_es.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_es.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_fr.properties b/commercedbsynchac/resources/localization/i2ihac-locales_fr.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_fr.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_it.properties b/commercedbsynchac/resources/localization/i2ihac-locales_it.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_it.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_ja.properties b/commercedbsynchac/resources/localization/i2ihac-locales_ja.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_ja.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_ko.properties b/commercedbsynchac/resources/localization/i2ihac-locales_ko.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_ko.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_pt.properties b/commercedbsynchac/resources/localization/i2ihac-locales_pt.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_pt.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_ru.properties b/commercedbsynchac/resources/localization/i2ihac-locales_ru.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_ru.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/resources/localization/i2ihac-locales_zh.properties b/commercedbsynchac/resources/localization/i2ihac-locales_zh.properties new file mode 100644 index 0000000..e214d48 --- /dev/null +++ b/commercedbsynchac/resources/localization/i2ihac-locales_zh.properties @@ -0,0 +1,6 @@ +# +# Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. +# License: Apache-2.0 +# +# + diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/CommercedbsynchacStandalone.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/CommercedbsynchacStandalone.java new file mode 100644 index 0000000..65f6381 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/CommercedbsynchacStandalone.java @@ -0,0 +1,44 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsynchac; + +import de.hybris.platform.core.Registry; +import de.hybris.platform.jalo.JaloSession; +import de.hybris.platform.util.RedeployUtilities; +import de.hybris.platform.util.Utilities; + + +/** + * Demonstration of how to write a standalone application that can be run directly from within eclipse or from the + * commandline.
+ * To run this from commandline, just use the following command:
+ * + * java -jar bootstrap/bin/ybootstrap.jar "new commercedbsynchac.CommercedbsynchacStandalone().run();" + * From eclipse, just run as Java Application. Note that you maybe need to add all other projects like + * ext-commerce, ext-pim to the Launch configuration classpath. + */ +public class CommercedbsynchacStandalone { + /** + * Main class to be able to run it directly as a java program. + * + * @param args the arguments from commandline + */ + public static void main(final String[] args) { + new CommercedbsynchacStandalone().run(); + } + + public void run() { + Registry.activateStandaloneMode(); + Registry.activateMasterTenant(); + + final JaloSession jaloSession = JaloSession.getCurrentSession(); + System.out.println("Session ID: " + jaloSession.getSessionID()); //NOPMD + System.out.println("User: " + jaloSession.getUser()); //NOPMD + Utilities.printAppInfo(); + + RedeployUtilities.shutdown(); + } +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/constants/YhacextConstants.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/constants/YhacextConstants.java new file mode 100644 index 0000000..da69f92 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/constants/YhacextConstants.java @@ -0,0 +1,21 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ +package com.sap.cx.boosters.commercedbsynchac.constants; + +import com.sap.cx.boosters.commercedbsynchac.constants.GeneratedYhacextConstants; + +/** + * Global class for all Commercedbsynchac constants. You can add global constants for your extension into this class. + */ +public final class YhacextConstants extends GeneratedYhacextConstants { + public static final String EXTENSIONNAME = "commercedbsynchac"; + + private YhacextConstants() { + //empty to avoid instantiating this constant class + } + + // implement here constants used by this extension +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/MetricService.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/MetricService.java new file mode 100644 index 0000000..a0131e8 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/MetricService.java @@ -0,0 +1,16 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric; + +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +import java.util.List; + +public interface MetricService { + List getMetrics(MigrationContext context); +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/impl/DefaultMetricService.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/impl/DefaultMetricService.java new file mode 100644 index 0000000..b63be52 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/impl/DefaultMetricService.java @@ -0,0 +1,42 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.impl; + +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsynchac.metric.MetricService; +import com.sap.cx.boosters.commercedbsynchac.metric.populator.MetricPopulator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class DefaultMetricService implements MetricService { + + private static final Logger LOG = LoggerFactory.getLogger(DefaultMetricService.class); + + private List populators; + + public DefaultMetricService(List populators) { + this.populators = populators; + } + + @Override + public List getMetrics(MigrationContext context) { + List dataList = new ArrayList<>(); + for (MetricPopulator populator : populators) { + try { + dataList.add(populator.populate(context)); + } catch (Exception e) { + LOG.error("Error while populating metric. Populator: " + e.getMessage()); + } + } + return dataList; + } + +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/MetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/MetricPopulator.java new file mode 100644 index 0000000..3e328d4 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/MetricPopulator.java @@ -0,0 +1,26 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator; + +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +public interface MetricPopulator { + static String PRIMARY_STANDARD_COLOR = "#92cae4"; + static String PRIMARY_CRITICAL_COLOR = "#de5d70"; + static String SECONDARY_STANDARD_COLOR = "#d5edf8"; + static String SECONDARY_CRITICAL_COLOR = "#e8acb5"; + + MetricData populate(MigrationContext context) throws Exception; + + default void populateColors(MetricData data) { + data.setPrimaryValueStandardColor(PRIMARY_STANDARD_COLOR); + data.setPrimaryValueCriticalColor(PRIMARY_CRITICAL_COLOR); + data.setSecondaryValueStandardColor(SECONDARY_STANDARD_COLOR); + data.setSecondaryValueCriticalColor(SECONDARY_CRITICAL_COLOR); + } +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/CpuMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/CpuMetricPopulator.java new file mode 100644 index 0000000..34f0867 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/CpuMetricPopulator.java @@ -0,0 +1,44 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + +import com.sap.cx.boosters.commercedbsynchac.metric.populator.MetricPopulator; +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import org.springframework.beans.factory.annotation.Value; + +import java.lang.management.OperatingSystemMXBean; + +public class CpuMetricPopulator implements MetricPopulator { + + @Value("#{T(java.lang.management.ManagementFactory).getOperatingSystemMXBean()}") + private OperatingSystemMXBean operatingSystemMXBean; + + @Override + public MetricData populate(MigrationContext context) throws Exception { + MetricData data = new MetricData(); + double systemLoadAverage = operatingSystemMXBean.getSystemLoadAverage(); + int availableProcessors = operatingSystemMXBean.getAvailableProcessors(); + int loadAverage = (int) (systemLoadAverage * 100 / availableProcessors); + if (loadAverage > 100) { + loadAverage = 100; + } + data.setMetricId("cpu"); + data.setName("CPU"); + data.setDescription("The system load in percent"); + data.setPrimaryValue((double) loadAverage); + data.setPrimaryValueLabel("Load"); + data.setPrimaryValueUnit("%"); + data.setPrimaryValueThreshold(90d); + data.setSecondaryValue((double) 100 - loadAverage); + data.setSecondaryValueLabel("Idle"); + data.setSecondaryValueUnit("%"); + data.setSecondaryValueThreshold(0d); + populateColors(data); + return data; + } +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/DTUMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/DTUMetricPopulator.java new file mode 100644 index 0000000..c1cc45d --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/DTUMetricPopulator.java @@ -0,0 +1,42 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + +import com.sap.cx.boosters.commercedbsynchac.metric.populator.MetricPopulator; +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +public class DTUMetricPopulator implements MetricPopulator { + @Override + public MetricData populate(MigrationContext context) throws Exception { + MetricData data = new MetricData(); + int primaryValue = (int) context.getDataTargetRepository().getDatabaseUtilization(); + if (primaryValue > 100) { + primaryValue = 100; + } + int secondaryValue = 100 - primaryValue; + if (primaryValue < 0) { + primaryValue = -1; + secondaryValue = -1; + } + + data.setMetricId("dtu"); + data.setName("DTU"); + data.setDescription("The current DTU utilization of the azure database"); + data.setPrimaryValue((double) primaryValue); + data.setPrimaryValueLabel("Used"); + data.setPrimaryValueUnit("%"); + data.setPrimaryValueThreshold(90d); + data.setSecondaryValue((double) secondaryValue); + data.setSecondaryValueLabel("Idle"); + data.setSecondaryValueUnit("%"); + data.setSecondaryValueThreshold(0d); + populateColors(data); + return data; + } + +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariConnectionMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariConnectionMetricPopulator.java new file mode 100644 index 0000000..29b01b6 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariConnectionMetricPopulator.java @@ -0,0 +1,47 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + +import com.sap.cx.boosters.commercedbsynchac.metric.populator.MetricPopulator; +import com.zaxxer.hikari.HikariDataSource; +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +import javax.sql.DataSource; + +public abstract class HikariConnectionMetricPopulator implements MetricPopulator { + + @Override + public MetricData populate(MigrationContext context) throws Exception { + if (!(getDataSource(context) instanceof HikariDataSource)) { + throw new RuntimeException("Populator cannot be used for non-hikari datasources"); + } + MetricData data = new MetricData(); + HikariDataSource hikariDS = (HikariDataSource) getDataSource(context); + double activeConnections = hikariDS.getHikariPoolMXBean().getActiveConnections(); + double maxConnections = hikariDS.getHikariConfigMXBean().getMaximumPoolSize(); + data.setMetricId(getMetricId(context)); + data.setName(getName(context)); + data.setDescription("The proportion of active and idle hikari connections"); + data.setPrimaryValue(activeConnections); + data.setPrimaryValueLabel("Active"); + data.setPrimaryValueUnit("#"); + data.setPrimaryValueThreshold((double) maxConnections); + data.setSecondaryValue(maxConnections - activeConnections); + data.setSecondaryValueLabel("Idle"); + data.setSecondaryValueUnit("#"); + data.setSecondaryValueThreshold(0d); + populateColors(data); + return data; + } + + protected abstract String getMetricId(MigrationContext context); + + protected abstract String getName(MigrationContext context); + + protected abstract DataSource getDataSource(MigrationContext context); +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariSourceConnectionMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariSourceConnectionMetricPopulator.java new file mode 100644 index 0000000..b7b105f --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariSourceConnectionMetricPopulator.java @@ -0,0 +1,30 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + + +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +import javax.sql.DataSource; + +public class HikariSourceConnectionMetricPopulator extends HikariConnectionMetricPopulator { + + @Override + protected String getMetricId(MigrationContext context) { + return "hikari-source-pool"; + } + + @Override + protected String getName(MigrationContext context) { + return "Source DB Pool"; + } + + @Override + protected DataSource getDataSource(MigrationContext context) { + return context.getDataSourceRepository().getDataSource(); + } +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariTargetConnectionMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariTargetConnectionMetricPopulator.java new file mode 100644 index 0000000..f83041c --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/HikariTargetConnectionMetricPopulator.java @@ -0,0 +1,30 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + + +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +import javax.sql.DataSource; + +public class HikariTargetConnectionMetricPopulator extends HikariConnectionMetricPopulator { + + @Override + protected String getMetricId(MigrationContext context) { + return "hikari-target-pool"; + } + + @Override + protected String getName(MigrationContext context) { + return "Target DB Pool"; + } + + @Override + protected DataSource getDataSource(MigrationContext context) { + return context.getDataTargetRepository().getDataSource(); + } +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/IOMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/IOMetricPopulator.java new file mode 100644 index 0000000..580dd00 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/IOMetricPopulator.java @@ -0,0 +1,48 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceCategory; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceProfiler; +import com.sap.cx.boosters.commercedbsync.performance.PerformanceUnit; +import com.sap.cx.boosters.commercedbsynchac.metric.populator.MetricPopulator; + +public class IOMetricPopulator implements MetricPopulator { + + private PerformanceProfiler performanceProfiler; + + public IOMetricPopulator(PerformanceProfiler performanceProfiler) { + this.performanceProfiler = performanceProfiler; + } + + @Override + public MetricData populate(MigrationContext context) throws Exception { + MetricData data = new MetricData(); + int avgRowReading = (int) performanceProfiler.getAverageByCategoryAndUnit(PerformanceCategory.DB_READ, PerformanceUnit.ROWS); + int avgRowWriting = (int) performanceProfiler.getAverageByCategoryAndUnit(PerformanceCategory.DB_WRITE, PerformanceUnit.ROWS); + int totalIO = avgRowReading + avgRowWriting; + if (avgRowReading < 1 && avgRowWriting < 1) { + avgRowReading = -1; + avgRowWriting = -1; + } + data.setMetricId("db-io"); + data.setName("Database I/O"); + data.setDescription("The proportion of items read from source compared to items written to target"); + data.setPrimaryValue((double) avgRowReading); + data.setPrimaryValueLabel("Read"); + data.setPrimaryValueUnit("rows/s"); + data.setPrimaryValueThreshold(totalIO * 0.75); + data.setSecondaryValue((double) avgRowWriting); + data.setSecondaryValueLabel("Write"); + data.setSecondaryValueUnit("rows/s"); + data.setSecondaryValueThreshold(totalIO * 0.75); + populateColors(data); + return data; + } +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/MemoryMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/MemoryMetricPopulator.java new file mode 100644 index 0000000..8a75b38 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/MemoryMetricPopulator.java @@ -0,0 +1,35 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + +import com.sap.cx.boosters.commercedbsynchac.metric.populator.MetricPopulator; +import de.hybris.platform.commercedbsynchac.data.MetricData; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; + +public class MemoryMetricPopulator implements MetricPopulator { + @Override + public MetricData populate(MigrationContext context) throws Exception { + MetricData data = new MetricData(); + Runtime runtime = Runtime.getRuntime(); + double freeMemory = runtime.freeMemory() / 1048576L; + double totalMemory = runtime.totalMemory() / 1048576L; + double usedMemory = totalMemory - freeMemory; + data.setMetricId("memory"); + data.setName("Memory"); + data.setDescription("The proportion of free and used memory"); + data.setPrimaryValue(usedMemory); + data.setPrimaryValueLabel("Used"); + data.setPrimaryValueUnit("MB"); + data.setPrimaryValueThreshold(totalMemory * 0.9); + data.setSecondaryValue(freeMemory); + data.setSecondaryValueLabel("Free"); + data.setSecondaryValueUnit("MB"); + data.setSecondaryValueThreshold(0d); + populateColors(data); + return data; + } +} diff --git a/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/TaskExecutorMetricPopulator.java b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/TaskExecutorMetricPopulator.java new file mode 100644 index 0000000..7bbad47 --- /dev/null +++ b/commercedbsynchac/src/com/sap/cx/boosters/commercedbsynchac/metric/populator/impl/TaskExecutorMetricPopulator.java @@ -0,0 +1,49 @@ +/* + * Copyright: 2022 SAP SE or an SAP affiliate company and commerce-db-synccontributors. + * License: Apache-2.0 + * + */ + +package com.sap.cx.boosters.commercedbsynchac.metric.populator.impl; + +import com.sap.cx.boosters.commercedbsynchac.metric.populator.MetricPopulator; +import de.hybris.platform.commercedbsynchac.data.MetricData; +import org.apache.commons.lang.StringUtils; +import com.sap.cx.boosters.commercedbsync.context.MigrationContext; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +public class TaskExecutorMetricPopulator implements MetricPopulator { + + private AsyncTaskExecutor executor; + private String name; + + public TaskExecutorMetricPopulator(AsyncTaskExecutor executor, String name) { + this.executor = executor; + this.name = name; + } + + @Override + public MetricData populate(MigrationContext context) throws Exception { + if (!(executor instanceof ThreadPoolTaskExecutor)) { + throw new RuntimeException("Populator can only be used for " + ThreadPoolTaskExecutor.class.getName()); + } + ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) executor; + MetricData data = new MetricData(); + int activeCount = taskExecutor.getActiveCount(); + int maxPoolSize = taskExecutor.getMaxPoolSize(); + data.setMetricId(name + "-executor"); + data.setName(StringUtils.capitalize(name) + " Tasks"); + data.setDescription("The tasks running in parallel in the task executor"); + data.setPrimaryValue((double) activeCount); + data.setPrimaryValueLabel("Running"); + data.setPrimaryValueUnit("#"); + data.setPrimaryValueThreshold(-1d); + data.setSecondaryValue((double) maxPoolSize - activeCount); + data.setSecondaryValueLabel("Free"); + data.setSecondaryValueUnit("#"); + data.setSecondaryValueThreshold(-1d); + populateColors(data); + return data; + } +} diff --git a/docs/commercedbsync/after_save_listener_1.png b/docs/commercedbsync/after_save_listener_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f821af68793680492f957a9aad74f8f05de01d0c GIT binary patch literal 26652 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 +migration.data.incremental.tables= +migration.data.incremental.timestamp= +migration.data.truncate.enabled= +``` +example: +``` +migration.data.incremental.enabled=true +migration.data.incremental.tables=orders,orderentries +migration.data.incremental.timestamp=2020-07-28T18:44:00+01:00[Europe/Zurich] +migration.data.truncate.enabled=false +``` + +> **LIMITATION**: Tables must have the following columns: modifiedTS, PK. Furthermore, this is an incremental approach... only modified and inserted rows are taken into account. Deletions on the source side are not handled. + +The timestamp refers to whatever timezone the source database is using (make sure to include the timezone). + +During the migration, the data copy process is using an UPSERT command to make sure new records are inserted and modified records are updated. Also make sure to disable truncation as this is not desired for incremental copy. + +Only tables configured for incremental will be taken into consideration, as long as they are not already excluded by the general filter properties. All other tables will be ignored. + +After the incremental migration you may have to migrate the numberseries table again, to ensure the PK generation will be aligned. +For this, disable incremental mode and use the property migration.data.tables.included to only migrate that one table. + +## Configure logging + +Use the following property to configure the log level: + +log4j2.logger.migrationToolkit.level + +Default value is INFO. diff --git a/docs/configuration/CONFIGURATION-REFERENCE.md b/docs/configuration/CONFIGURATION-REFERENCE.md new file mode 100644 index 0000000..fdd6e6c --- /dev/null +++ b/docs/configuration/CONFIGURATION-REFERENCE.md @@ -0,0 +1,46 @@ +# SAP Commerce DB Sync - Configuration Reference + + +| Property | Mandatory | Default | Description | +|--------------------------------------------------------|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------| +| migration.ds.source.db.driver | yes | | DB driver class for source connection | +| migration.ds.source.db.url | yes | | DB url for source connection | +| migration.ds.source.db.username | yes | | DB username for source connection | +| migration.ds.source.db.password | yes | | DB password for source connection | +| migration.ds.source.db.tableprefix | no | | DB table prefix for source connection | +| migration.ds.source.db.schema | yes | | DB schema for source connection | +| migration.ds.source.db.connection.pool.size.idle.min | no | ${db.pool.minIdle} | Min idle connections in source db pool | +| migration.ds.source.db.connection.pool.size.active.max | no | ${db.pool.maxActive} | Min active connections in source db pool | +| migration.ds.target.db.driver | no | ${db.driver} | DB driver class for target connection | +| migration.ds.target.db.url | no | ${db.url} | DB url for target connection | +| migration.ds.target.db.username | no | ${db.username} | DB username for target connection | +| migration.ds.target.db.password | no | ${db.password} | DB password for target connection | +| migration.ds.target.db.tableprefix | no | ${db.tableprefix} | DB table prefix for target connection | +| migration.ds.target.db.schema | no | dbo | DB schema for target connection | +| migration.ds.target.db.connection.pool.size.idle.min | no | ${db.pool.minIdle} | Min idle connections in target db pool | +| migration.ds.target.db.connection.pool.size.active.max | no | ${db.pool.maxActive} | Min active connections in target db pool | +| migration.ds.target.db.max.stage.migrations | no | 5 | The maximum amount of staged table sets allowed. | +| migration.schema.enabled | no | true | Enable schema adaption features | +| migration.schema.target.tables.add.enabled | no | false | Allow adding missing tables to target schema | +| migration.schema.target.columns.add.enabled | no | true | Allow adding missing columns to target table schema | +| migration.schema.target.columns.remove.enabled | no | true | Allow removing extra columns from target table schema | +| migration.data.reader.batchsize | no | 1000 | batch size when reading data from source table | +| migration.data.workers.writer.maxtasks | no | 10 | maximum number of writer workers per table that can be executed in parallel | +| migration.data.workers.reader.maxtasks | no | 3 | maximum number of reader workers per table that can be executed in parallel | +| migration.data.workers.retryattempts | no | 0 | retry attempts if a batch (read or write) failed. | +| migration.data.truncate.enabled | no | true | Allow truncating the target table before writing data | +| migration.data.truncate.excluded | no | | If truncating enabled, exclude these tables. Comma seperated list | +| migration.data.maxparalleltablecopy | no | 2 | Tables copied in parallel | +| migration.data.columns.excluded.{table} | no | | Columns to be ignored when writing data to target table. The {table} value has to be replaced with the table name, the property value is a comma separated list of column names. | +| migration.data.columns.nullify.{table} | no | | Column values to be nullified when writing data to target table. The {table} value has to be replaced with the table name, the property value is a comma separated list of column names. | +| migration.data.indices.disable.enabled | no | false | Disable indices temporarily before writing data to target table and reenable them after the writing operation. | +| migration.data.indices.drop.enabled | no | false | Drop indices before writing data to target table. | +| migration.data.tables.excluded | no | SYSTEMINIT | Tables to be excluded in migration. If migration.data.tables.included is set, this property is ignored | +| migration.data.tables.included | no | | Tables to be included in migration. If migration.data.tables.excluded is set, this property is ignored | +| migration.data.report.connectionstring | yes | ${media.globalSettings.cloudAzureBlobStorageStrategy.connection} | target blob storage for the report generation | +| migration.data.incremental.enabled | no | false | enables the incremental mode | +| migration.data.incremental.tables | no | | enables the incremental mode | Only these tables will be taken into account for incremental migration +| migration.data.incremental.timestamp | no | | The timestamp in ISO-8601 local date time format. Records created or modified after this timestamp will be copied only. +| migration.data.pipe.timeout | no | 7200 | The max time the pipe can blocked if it is running full before it times out. +| migration.data.pipe.capacity | no | 100 | The maximum amount of element the pipe can handle before it starts blocking. +| migration.stalled.timeout | no | 7200 | The time after which the pipe (and hence the migration) will be marked as stalled. diff --git a/docs/developer/DEVELOPER-GUIDE.md b/docs/developer/DEVELOPER-GUIDE.md new file mode 100644 index 0000000..449a55c --- /dev/null +++ b/docs/developer/DEVELOPER-GUIDE.md @@ -0,0 +1,104 @@ +# SAP Commerce DB Sync - Developer Guide + +## Quick Start + +To install SAP Commmerce DB Sync, follow these steps: + +Add the following extensions to your localextensions.xml: +``` + + +``` + +Make sure you add the source db driver to commercemigration/lib if necessary. + +Use the following sample configuration and add it to your local.properties file: + +``` +migration.ds.source.db.driver=com.mysql.jdbc.Driver +migration.ds.source.db.url=jdbc:mysql://localhost:3600/localdev?useConfigs=maxPerformance&characterEncoding=utf8&useTimezone=true&serverTimezone=UTC&nullCatalogMeansCurrent=true +migration.ds.source.db.username=[user] +migration.ds.source.db.password=[password] +migration.ds.source.db.tableprefix= +migration.ds.source.db.schema=localdev + +migration.ds.target.db.driver=${db.driver} +migration.ds.target.db.url=${db.url} +migration.ds.target.db.username=${db.username} +migration.ds.target.db.password=${db.password} +migration.ds.target.db.tableprefix=${db.tableprefix} +migration.ds.target.db.catalog=${db.catalog} +migration.ds.target.db.schema=dbo + +``` + +## Running Integration Tests + +Make sure the junit tenant is installed +- set 'installed.tenants=junit' in local.properties +- run 'ant yunitinit' from platformhome + +Go to the commercemigrationtest extension, like so: + +``` +>cd commercemigrationtest +>ant all integrationtests +``` + +Alternatively go to the platformhome, and trigger it from there: + +``` +platformhome>ant all integrationtests -Dtestclasses.packages=org.sap.move.commercemigrationtest.integration.* +``` + +The integration tests are parameterized with predefined combinations of source and target databases. +Running the integration tests will bootstrap several database containers using docker and run tests annotated with '@Test', once for each parameter combination. + +> **PREREQUISITE**: Make sure docker is installed on your local machine and allocate sufficient memory (~6gb). Also ensure you provide all necessary jdbc drivers for the test execution. + +## Connect to existing DB servers for integration tests + +If env var `CI` is set, the integration tests will not start a Docker container for every DB, but +connect to existing servers instead. + +You can use the `*_HOST`, `*_USR` and `*_PSW` env vars to configure server and user credentials.\ +**User / password must be of an admin user! (that is allowed to create schemas/DBs, users etc.)** + +(Check out [direnv](https://direnv.net/) to automate setting up those environment variables for +local development) + + +```sh +export CI=true +# do not drop schemas after each test class -> faster CI runs +# only enable this property if you kill your DB containers regularly +# export CI_SKIP_DROP=true +export MSSQL_HOST=localhost:1433 +export MSSQL_USR=sa +export MSSQL_PSW=localSAPassw0rd + +export MYSQL_HOST=localhost:3306 +export MYSQL_USR=root +export MYSQL_PSW=root + +export ORACLE_HOST=localhost:1521 +export ORACLE_USR=system +export ORACLE_PSW=oracle + +export HANA_HOST=localhost:39017 +export HANA_USR=SYSTEM +export HANA_PSW=HXEHana1 +``` + + +## Contributing to the Commerce Migration Toolkit + +To contribute to the Commerce Migration Toolkit, follow these steps: + +1. Fork this repository; +2. Create a branch: `git checkout -b `; +3. Make your changes and commit them: `git commit -m ''`; +4. Push to the original branch: `git push origin /`; +5. Create the pull request. + +Alternatively, see the GitHub documentation on [creating a pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request). diff --git a/docs/performance/PERFORMANCE-GUIDE.md b/docs/performance/PERFORMANCE-GUIDE.md new file mode 100644 index 0000000..a291156 --- /dev/null +++ b/docs/performance/PERFORMANCE-GUIDE.md @@ -0,0 +1,136 @@ +# SAP Commerce DB Sync - Performance Guide + + +## Benchmarks + +### AWS to SAP Commerce Cloud + +Source Database: + +* AWS Mysql: db.m6g.large +* Tables: 974 +* Row Count: 158'855'795 +* Total Volume at source (incl. Indexes): 51 GB + +Results: + +| Tier | Mem | CPU | Duration | parTables | rWorkers | wWorkers | batchSize | disIdx | DB size at target | +|------|-----|-----|----------|-----------|----------|----------|-----------|--------|-------------------| +| S12 | 4GB | 2 | 2h11m | 2 | 5 | 15 | 2000 | TRUE | 72GB | +| S12 | 4GB | 2 | 3h4m | 2 | 5 | 15 | 2000 | FALSE | 92GB | +| S12 | 4GB | 2 | 2h59m | 2 | 5 | 15 | 4000 | FALSE | 92GB | +| S12 | 6GB | 2 | 2h53m | 2 | 10 | 20 | 3000 | FALSE | 92GB | +| S12 | 6GB | 2 | 2h09m | 2 | 5 | 15 | 3000 | TRUE | 72GB | +| S12 | 6GB | 6 | 1h35m | 2 | 5 | 15 | 3000 | TRUE | 72GB | +| S12 | 8GB | 6 | 1h30m | 2 | 10 | 30 | 3000 | TRUE | 75GB | + +> **NOTE**: DB size differs in source and target due to different storage concepts (indexes). + +## Technical Concept + + +![performance technical concept](performance_architecture.png) + + +### Scheduler + +The table scheduler is responsible for triggering the copy process for each table. +The set of tables the scheduler actually works with is based on the copy item provider and the respective filters configured. How many tables can be scheduled in parallel is determined by the following property: + +`migration.data.maxparalleltablecopy` + + + +### Reader Workers + +Each scheduled table will get a set of reader workers. The source table will be read using the 'keyset/seek' pagination, if possible. For this, a unique key will be identified (typically 'PK' or 'ID') and out of this the parallel batches can be determined. In case this is not possible, the readers will fall back to offset pagination. +Each reader worker is using its own db connection. +How many reader workers a table can have is defined by the following property: + +`migration.data.workers.reader.maxtasks` + +The size of the batches each reader will query depends on the following property: + +`migration.data.reader.batchsize` + +### Blocking Pipe + +The batches read by the reader workers will be written to a blocking pipe as wrapped datasets. +The pipe is a blocking queue that can be used to throttle the throughput and is configurable in this way: + +`migration.data.pipe.timeout` + +`migration.data.pipe.capacity` + +The pipe will throw an exception if it has been blocked for too long (maybe because the writers are too slow). +Default value for the timeout should be enough though. +If the pipe is running full by reaching the max capacity, it will block and wait until the writers free-up space in it. + + +### Writer Workers + +The writers will read from the pipe until the pipe is sealed. Each dataset will then be written to the database in a prepared statement / batch insert way. Each writer batch is using its own db connection and transaction (one commit per batch). In case the batch insert fails, a rollback happens. +How many writer workers a table can have is defined by the following property: + +`migration.data.workers.writer.maxtasks` + +The batch size for the writers is bound to the readers batch size. + +## Perfomance Tuning + +### Degree of Parallelization + +In most cases there are a lot of small tables and few very large tables. This leads to the fact that the duration of the overall migration mostly depends on these large tables. Increasing the number of parallel tables won't help to speed up large tables, instead the number workers should be increased. The workers influence how fast a single table can be migrated, since the more workers there are the more batches of the large table can be executed in parallel. Therefore, it makes sense to reduce the parallel tables to a rather low number to save resources on the infrastructure and in turn use the resources for increased batch parallelisation in the large tables. + +How many workers for both readers and writer should be set, depends on the power of the involved databases and the underlying infrastructure. +Since reading is typically faster than writing a ratio of 1:3 (3 writer workers for 1 one reader worker) should be ok. +Have a look at the benchmarks to see how far you can go with the parallelisation. +Keep in mind that processing 2 tables in parallel already leads to `2 * rWorkers + 2 * wWorkers` threads / connections in total. + + +### Memory & CPU + +By increasing the parallelization degree you can easily overload the system, which may lead to out of memory. + +> **NOTE**: On SAP Commerce Cloud, an out of memory exception can sometimes be hidden. Typically you know you were running out of memory if the pod (backoffice) immediately shuts down or restarts without further notice (related to SAP Commerce Cloud health checks). + +Have a close look at the memory metrics and make sure it is in a healthy range throughout the copy process. +To solve memory issues, either decrease the degree of parallelization or reduce the capacity of the data pipe as such. + + +### DB Connections + +Some properties may impact each other which can lead to side effects. + +Given: + +`migration.data.maxparalleltablecopy` + +`migration.data.workers.reader.maxtasks` + +`migration.data.workers.writer.maxtasks` + +`migration.ds.source.db.connection.pool.size.active.max` + +`migration.ds.target.db.connection.pool.size.active.max` + + +The amount of database connections can be defined as follows: + +`#[dbconnectionstarget] >= #[maxparalleltablecopy] * #[maxwritertasks]` + +`#[dbconnectionssource] >= #[maxparalleltablecopy] * #[maxreadertasks]` + +### Disabling Indexes + +Indexes can be a bottleneck when inserting batches. +MsSQL offers a way to temporarily disable indexes during the copy process. +This can be done using the property: + +`migration.data.indices.disable.enabled` + +This will disable the indexes on a table right before it starts the copy. Once finished, the they will be rebuilt again. + +> **NOTE**: Re-enabling the indexes itself may take quite some time for large tables and this may temporarily slow down and lock the copy process. + +> **NOTE**: Disabling the indexes can have the unwanted side effect that duplicate key inserts won't be detected and reported. Therefore only do this if you are sure that no duplicates are around. diff --git a/docs/performance/performance_architecture.png b/docs/performance/performance_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..4164152b9f45df321f7c1b8f97706feb0dd35aa9 GIT binary patch literal 50296 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 RhS~vtFvm>|YV@3A{ttCKPL==w literal 0 HcmV?d00001 diff --git a/docs/performance/template_for_scheduled_operational_activity.docx b/docs/performance/template_for_scheduled_operational_activity.docx new file mode 100644 index 0000000000000000000000000000000000000000..8417a4c565d58e3da208e7f7eb8aeec810bcfdbc GIT binary patch literal 15962 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 - User: - Time: ` + +Example: + +``` +CMT Action: Data sources tab clicked - User:admin - Time:2021-03-10T10:27:29.675351 +CMT Action: Validate connections button clicked - User:admin - Time:2021-03-10T10:27:32.258041 +CMT Action: Validate connections button clicked - User:admin - Time:2021-03-10T10:27:36.223859 +CMT Action: Schema migration tab clicked - User:admin - Time:2021-03-10T10:27:38.188141 +CMT Action: Preview schema migration changes button clicked - User:admin - Time:2021-03-10T10:27:40.492816 +Starting preview of source and target db diff... +.... +CMT Action: Data migration tab clicked - User:admin - Time:2021-03-10T10:28:31.993621 +CMT Action: Start data migration executed - User:admin - Time:2021-03-10T10:28:33.710384 +0/1 tables migrated. 0 failed. State: RUNNING +173/173 processed. Completed in {223.6 ms}. Last Update: {2021-03-10T09:28:34.153} +1/1 tables migrated. 0 failed. State: PROCESSED +Migration finished (PROCESSED) in 00:00:00.296 +Migration finished on Node 0 with result false +DefaultMigrationPostProcessor Finished +Finished writing database migration report +``` + +## Security of the external database + +For the use case for which the customer replicates data across its own database, due deligence is required to secure the external database: +* Customer should secure the customer DB with proper configuration so that it doesn’t lead to DOS or buffer overflow attack. +* Dedicated user who would be having access to external DB should have minimum privilege. +* Personal data should clean up external DB after the retention period is reached as per GDPR. +* Customer needs to be aware of the size of the data they are migrating and need to manage the limits of the DB accordingly. + +## Reporting + +In order to be able to track past activities, the tool creates reports against the following actions: + + * SQL statements executed during schema migration (file name: timestamp of execution); + * Summary of the migration copy process (file name: migration id) + +The reports are automatically written to the hotfolder blob storage ('migration' folder). +Sensitive data is not written to the reports (i.e.: passwords). diff --git a/docs/support/SUPPORT-GUIDE.md b/docs/support/SUPPORT-GUIDE.md new file mode 100644 index 0000000..d83ab96 --- /dev/null +++ b/docs/support/SUPPORT-GUIDE.md @@ -0,0 +1,79 @@ +# Commerce Database Sync - Support Guide + +Here you can find some guidelines for members of Cloud Support Team. + +## Staged migration approach + +In order to display a summary of source and target schemas, you can utilize following groovy script: + +``groovy/MigrationSummaryScript.groovy`` + +Or else copy the script from here: + +``` +package groovy + +import de.hybris.platform.util.Config +import org.apache.commons.lang.StringUtils + +import java.util.stream.Collectors + +def result = generateMigrationSummary(migrationContext) +println result +return result + +def generateMigrationSummary(context) { + StringBuilder sb = new StringBuilder(); + try { + final String sourcePrefix = context.getDataSourceRepository().getDataSourceConfiguration().getTablePrefix(); + final String targetPrefix = context.getDataTargetRepository().getDataSourceConfiguration().getTablePrefix(); + final String dbPrefix = Config.getString("db.tableprefix", ""); + final Set sourceSet = migrationContext.getDataSourceRepository().getAllTableNames() + .stream() + .map({ tableName -> tableName.replace(sourcePrefix, "") }) + .collect(Collectors.toSet()); + + final Set targetSet = migrationContext.getDataTargetRepository().getAllTableNames() + sb.append("------------").append("\n") + sb.append("All tables: ").append(sourceSet.size() + targetSet.size()).append("\n") + sb.append("Source tables: ").append(sourceSet.size()).append("\n") + sb.append("Target tables: ").append(targetSet.size()).append("\n") + sb.append("------------").append("\n") + sb.append("Source prefix: ").append(sourcePrefix).append("\n") + sb.append("Target prefix: ").append(targetPrefix).append("\n") + sb.append("DB prefix: ").append(dbPrefix).append("\n") + sb.append("------------").append("\n") + sb.append("Migration Type: ").append("\n") + sb.append(StringUtils.isNotEmpty(dbPrefix) && + StringUtils.isNotEmpty(targetPrefix) && !StringUtils.equalsIgnoreCase(dbPrefix, targetPrefix) ? "STAGED" : "DIRECT").append("\n") + sb.append("------------").append("\n") + sb.append("Found prefixes:").append("\n") + + Map prefixes = new HashMap<>() + targetSet.forEach({ tableName -> + String srcTable = schemaDifferenceService.findCorrespondingSrcTable(sourceSet, tableName); + String prefix = tableName.replace(srcTable, ""); + prefixes.put(prefix, targetSet.stream().filter({ e -> e.startsWith(prefix) }).count()); + }); + prefixes.forEach({ k, v -> sb.append("Prefix: ").append(k).append(" number of tables: ").append(v).append("\n") }); + sb.append("------------").append("\n"); + + } catch (Exception e) { + e.printStackTrace(); + } + return sb.toString(); +} + + +``` + +It prints information as follows: +* total number of all tables (source + target) +* number of source tables +* number of target tables +* prefixes defined as property (source, target & current database schema) +* all detected prefixes in target database with the number of tables + +You can use this information to remove staged tables generated during data migration process. + + ![support_groovy_preview.png](support_groovy_preview.png) diff --git a/docs/support/support_groovy_preview.png b/docs/support/support_groovy_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9582e8879d4338aa3a3cbada4ebda80adf7c03 GIT binary patch literal 454427 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

H-1c9*9zrp&-D_tfXW`Z7QO*p{JB9Qi(L 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 literal 0 HcmV?d00001 diff --git a/docs/troubleshooting/TROUBLESHOOTING-GUIDE.md b/docs/troubleshooting/TROUBLESHOOTING-GUIDE.md new file mode 100644 index 0000000..93409fc --- /dev/null +++ b/docs/troubleshooting/TROUBLESHOOTING-GUIDE.md @@ -0,0 +1,135 @@ +# SAP Commerce DB Sync - Troubleshooting Guide + +## Duplicate values for indexes + +Symptom: + +Pipeline aborts during copy process with message like: +``` +FAILED! Reason: The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo.cmtmedias' and the index name 'cmtcodeVersionIDX_30'. The duplicate key value is (DefaultCronJobFinishNotificationTemplate_de, ). +``` + +Solution: + +This can happen if you are using a case sensitive collation on the source database either at database level or table/column level. +The commerce cloud target database is case insensitive by default and will treat values like 'ABC'/'abc' as equal during index creation. +If possible, remove the duplicate rows before any migration activities. In case this is not possible consult Support. + +> **Note**: Mysql doesn't take into account NULL values for index checks. SQL Server does and will thus fail with duplicates. + +## Migration fails for unknown reason + +Symptom: + +If you were overloading the system for a longer period of time, you may encounted one of the nodes was restarting in the background without notice. + + +Solution: + +In any case, check the logs (Kibana). +Check in dynatrace whether a process crash log exists for the node. +In case the process crashed, throttle the performance by changing the respective properties. + + +## MySQL: xy table does not exist error + +Symptom: + +`java.sql.SQLSyntaxErrorException: Table '' doesn't exist` +even though the table should exist. + +Solution: + +This is a changed behaviour in the driver 8x vs 5x used before. In case there are multiple catalogs in the database, the driver distorts the reading of the table information... + +... add the url parameter + +`nullCatalogMeansCurrent=true` + +... to your JDBC connection URL and the error should disappear. + +## MySQL: java.sql.SQLException: HOUR_OF_DAY ... + +Symptom: + + +``` +Caused by: java.sql.SQLException: HOUR_OF_DAY: 2 -> 3 +at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.19.jar:8.0.19] +at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.19.jar:8.0.19] +at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.19.jar:8.0.19] +at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.19.jar:8.0.19] +at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.19.jar:8.0.19] +at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:85) ~[mysql-connector-java-8.0.19.jar:8.0.19] +at com.mysql.cj.jdbc.result.ResultSetImpl.getTimestamp(ResultSetImpl.java:903) ~[mysql-connector-java-8.0.19.jar:8.0.19] +at com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1243) ~[mysql-connector-java-8.0.19.jar:8.0.19] +``` + +Solution: + +Known issue on MySQL when dealing with time/date objects. Workaround is to add... + +`&useTimezone=true&serverTimezone=UTC` + +...to your source connection string. + + +## Backoffice does not load + +Symptom: + +Backoffice does not load properly after the migration. + +Solution: + +- use F4 mode (admin user) and reset the backoffice settings on the fly. +- browser cache reload + +## Proxy error in Hac + +Symptom: + +Hac throws / displays proxy errors when using migration features. + +Solution: + +Change the default proxy value in the Commerce Cloud Portal to a higher value. +This can be done on the edit view of the respective endpoint. + +## MSSQL: Boolean type + +The boolean type in MSSQL is a bit data type storing 0/1 values. +In case you were using queries including TRUE/FALSE values, you may have to change or convert the queries in your code to use the bit values. + +## Sudden increase of memory + +Symptom: + +The memory consumption is more or less stable throughout the copy process, but then suddenly increases for certain table(s). + +Solution: + +If batching of reading and writing is not possible due to the definition of the source table, the copy process falls back to a non-batched mechanism. +This requires loading the full table in memory at once which, depending on the table size, may lead to unhealthy memory consumption. +For small tables this is typically not an issue, but for large tables it should be mitigated by looking at the indexes for example. + +## Some tables are copied over very slowly + +Symptom: + +While some tables are running smoothly, others seem to suffer from low throughput. +This may happen for the props table for example. + +Solution: + +The copy process tries to apply batching for reading and writing where possible. +For this, the source table is scanned for either a 'PK' column (normal Commerce table) or an 'ID' column (audit tables). +Some tables don't have such a column, like the props table. In this case the copy process tries to identify the smallest unique (compound) index and uses it for batching. +If a table is slow, check the following: +- ID or PK column exist? +- ID or PK column are unique indexes? +- Any other unique index exists? + +If the smallest compound unique index consists of too many columns, the reading may impose high processing load on the source database due to the sort buffer running full. +Depending on the source database, you may have to tweak some db settings to efficiently process the query. +Alternatively you may have to think about adding a custom unique index manually. diff --git a/docs/user/SUPPORT-DELETE-GUIDE.md b/docs/user/SUPPORT-DELETE-GUIDE.md new file mode 100644 index 0000000..0c6c63e --- /dev/null +++ b/docs/user/SUPPORT-DELETE-GUIDE.md @@ -0,0 +1,89 @@ +# Commerce Database Sync - Deletion Support + +SAP Commerce DB Sync does support deletions. It it can be enabled for the transactional table using two different approaches: +- Default Approach using After Save Event Listener +- Alternative approach using Remove Interceptor + +## Approached for deletions + +### Default Approach using After Save Event Listener + +[After Save Event Listener](https://help.sap.com/viewer/d0224eca81e249cb821f2cdf45a82ace/2011/en-US/8b51226d866910149803df2610bb39a5.html), which will be enabled for the limited type code and only in a constraint violation. +* Activate the After save listener by defining the implementation of AfterSaveListener interface. + +``` + + + + + ``` + +* Configurable property for the list of type codes where we should manage deletion +``` + # Provide the typecodes in comma seperated + migration.data.incremental.deletions.typecodes=4,30 + migration.data.incremental.deletions.typecodes.enabled=true +``` +* Dedicated item type for deleted records (separate table with PK). +``` +For now, it is supported through **ItemDeletionMarker**. +``` +* Deletion activity is tied with incremental to avoid duplicates. + +**Disclaimer**: It will not support for the direct deletions via DB or JDBC Template. When SAP Commerce server is stopped, events published in the queue and that have not been handle by **AfterSaveEventPublisher** threads are lost. + +#### Technical Concept + +##### Publish after save event +When a transaction is committed, an after save event is either added to a blocking queue in case of asynchronous mode or notify directly After Save Listeners in case of synchronous mode. +![Publish after save event](after_save_listener_1.png) + +##### Event handling when event sent asynchronously + +The pool of **AfterSaveEventPublisherThread** is managed by **DefaultAfterSaveListenerRegistry**, each thread drains the blocking queue of after send event and call After Save Listeners. + +![Event Handle asynchronously](after_save_listener_2.png) + +Here are the **DefaultAfterSaveListenerRegistry** tuning parameters: +``` +core.aftersave.async=true //default true (asynchronous mode) +core.aftersave.interval=200 //sleep time in ms +core.aftersave.batchsize=1024 //draining batch size +core.aftersave.queuesize=1024 //maximum elements in the queue before blocking +``` + +### Alternative approach using Remove Interceptor + +**Note**: It is disabled by default, only enable if you face difficulties with _after save listener_ approach. + +Remove Interceptor which will be enabled for the limited ItemTypes and only in a constraint violation. +* Activate the Delete Interceptor by defining an InterceptorMapping for each tracked item type. + +``` + + + + ``` + +* Configurable property for the list of type codes where we should manage deletion +``` + # Provide the itemType for deletions + migration.data.incremental.deletions.itemtype=Media,Employee + migration.data.incremental.deletions.itemtypes.enabled=true +``` +* Dedicated item type for deleted records (separate table with PK). +``` +For now, it is supported by ItemDeletionMarker. +``` +* Deletion activity is tied with incremental to avoid duplicates. + +**Disclaimer**: Deletions will work with SL (legacy sync, legacy Impex, Service Layer Direct) +## When to use + +* Not required to be enabled for all the tables and few use-cases could be considered + - In case of Constraint validation failure + - Deletion is triggered by application, e.g. removing the entry from a cart. +* Don't enable for audit table or task logs +* It is covering deletions and migration together to avoid constraint validation. +* It can be toggle through properties. diff --git a/docs/user/USER-GUIDE-DATA-MIGRATION.md b/docs/user/USER-GUIDE-DATA-MIGRATION.md new file mode 100644 index 0000000..b559c4e --- /dev/null +++ b/docs/user/USER-GUIDE-DATA-MIGRATION.md @@ -0,0 +1,213 @@ +# Commerce DB Sync - User Guide for Data Migration + +Data migration use case is useful to migrate from SAP Commerce onPrem to SAP Commerce Cloud. + +![architecture overview for data migration from SAP Commerce OnPrem to SAP Commerce Cloud](data_migration_architecture.png) + +The tool can be used with three different approaches for migration: +1. Staged copy approach: this method allows you to use the SAP Commerce prefix feature to create a separate staged copy of your tables in the database. This way, while migrating, you can preserve a full copy of the existing database in your SAP Commerce Cloud subscription and migrate the data on the staged tables. When you are satisfied with the data copied in the staged tables, you can then switch the prefixes to shift your SAP Commerce installation to the migrated data. The main difference with the direct copy approach is in the configuration and usage of the prefixes within the extensions, and in terms of the cleanup at the end of the migration; +2. Direct copy approach: this method directly overwrites the data of your database in SAP Commerce Cloud; +3. Incremental approach: can be used after each of the previous approaches, to incrementally migrate some selected data. Please check the [Configure incremental data migration](../configuration/CONFIGURATION-GUIDE.md) section + +You can see more details below at [How to choose the best approach for my migration](#How-to-choose-the-best-approach-for-my-migration) + +## Prerequisites +Carefully read the prerequisites and make sure you meet the requirements before you commence the migration. Some of the prerequisites may require code adaptations or database cleanup tasks to prepare for the migration, therefore make sure you reserve enough time so that you can adhere to your project plan. + +Before you begin, ensure you have met the following requirements: + +* Your code base is compatible with the SAP Commerce version required by SAP Commerce Cloud (at minimum). +* The code base is exactly the same in both target and source systems. It includes: + * platform version + * custom extensions + * set of configured extensions + * type system definition as specified in \*-items.xml +* The attribute data types which are database-specific must be compatible with the target database +* Orphaned-types cleanup has been performed in the source system. Data referencing deleted types has been removed. +* The target system is in a state where it can be initialized and the data imported +* The source system is updated with the same \*-items.xml as deployed on the target system (ie. update system has been performed) +* The connectivity to the source database from SAP Commerce Cloud happens via a secured channel, such as the self-serviced VPN that can be created in SAP Commerce Cloud Portal. It is obligatory, and the customer's responsibility, to secure the data transmission +* Old type systems have been deleted in the source system +* A check for duplicates has been performed and existing duplicates in the source database have been removed +* The task engine has been disabled in all target nodes (cronjob.timertask.loadonstartup=false) + + +# Limitations + +* The tool only copies over table data. Any other database features like 'views', stored procedures', 'synonyms' ... will be ignored. +* Only the database vendors mentioned in the Compatibility section are supported + +## Install the extensions + +To install SAP Commerce DB Sync, follow these steps: + +Add the following extensions to your localextensions.xml: +``` + + +``` + +> **NOTE**: For SAP Commerce Cloud make sure the extensions are actually being loaded by the manifest.json + +Make sure you add the source db driver to **commercedbsync/lib** if necessary. + +## Configure the extensions +Configure the extensions as needed in your **local.properties**. See the [Property Configuration Reference](../configuration/CONFIGURATION-REFERENCE.md). + +At least you have to configure the connection to your source database. Here is an example for mysql: + +``` +migration.ds.source.db.driver=com.mysql.jdbc.Driver +migration.ds.source.db.url=jdbc:mysql://[host]:3600/localdev?useConfigs=maxPerformance&characterEncoding=utf8&useTimezone=true&serverTimezone=UTC&nullCatalogMeansCurrent=true +migration.ds.source.db.username=[username] +migration.ds.source.db.password=[pw] +migration.ds.source.db.tableprefix= +migration.ds.source.db.schema=localdev +``` + +> **NOTE**: If you are not running in SAP Commerce Cloud (i.e locally) make sure the target database is MSSQL. + +## Build and start the platform + +Build and start the on-premise SAP Commerce platform. + +For a local installation: +``` +> ant all initialize && ./hybrisserver.sh +``` + +On SAP Commerce Cloud: + +* Trigger a build and deploy to the respective environment with initialization (if not yet done). + +For Staged copy approach, each table prefix requires an initialization first. Imagine the following example scenario: + +* Commerce runtime uses the prefix 'cc' +* Data is being migrated to the prefix 'cmt' + +For this, the system has to be initialized twice: +1. ```db.tableprefix = cc``` for first initialization +2. ```db.tableprefix = cmt``` for second initialization + +Once finished, use the following properties to control which prefix is for the commerce runtime and which prefix is used to copy data to: +``` +migration.ds.target.db.tableprefix = +db.tableprefix = +``` +## Proxy Timeout +Some operations in the admin console may take more time to execute than the default proxy timeout in SAP Commerce Cloud allows. +To make sure you don't run into a proxy timeout exception, please adjust the value in your endpoint accordingly: + +![proxy_timeout](proxy_timeout.png) + +A value between 10 and 20 minutes should be safe. However, it depends on the components and systems involved. + +> **IMPORTANT**: make sure to revert the value to either the default value or a value that suits your needs after completion of the migration. + +## Establish a secure connection +It is mandatory to establish a secure connection between your on-premise and SAP Commerce Cloud environments. To do so, you can use the [self-service VPN feature from the SAP Cloud Portal](https://help.sap.com/viewer/0fa6bcf4736c46f78c248512391eb467/v2005/en-US/f63dfaed22d949ed9aadbb7835584586.html). + +## Data Source Validation +After having established your secure connectivity, validate the source and target database connections. For this, open the HAC and go to Migration->Data Sources + +![hac validate](hac_validate_ds.png) + +## Check Schema Differences +Check if there are any schema differences. For this, open the HAC and go to Migration->Schema Migration. By clicking the "Preview Schema Migration Changes" you will see a list of schema differences if any. + +![hac schema diff prev](hac_schema_diff_prev.png) + +In case there are schema differences switch to the right tab and generate the sql script to adjust the target schema. + +![hac schema diff exec](hac_schema_diff_exec.png) + +Make sure to review the script and execute it if you think it is all fine. + +## Copy Schema +After you have analysed all the schema differences and understood what data you want to migrate, you can use the "Migrate Schema" button to modify the target SAP Commerce Cloud schema and make it equivalent to the source schema. Please note, this operation executes the following in the target schema: +* Create tables +* Add/drop columns to existing tables + +In the event of a staged copy approach, the system detects how many stage tables already exist in the target database. If this number exceeds pre-defined config parameter value: +`migration.ds.target.db.max.stage.migrations` (by default set to 5), +there will be numerous queries generated that removes all tables and indexes corresponding with the identified staged tables. Please note, that current schema stays untouched so as to not disrupt your system. +When the system does not detect any more stage tables, you should see queries creating new tables respectively. + +> **NOTE**: no changes are made to the source database. + +## Start the Data Migration +Start the data migration. For this, open the HAC and go to Migration->Data Migration. Click on "Copy Source Data" to start the migration. + +![hac data migration](hac_migrate_data.png) + +The migration progress will be displayed in the HAC. It also shows some useful performance metrics: +* Current memory utilisation +* Current cpu utilisation +* Current DTU utilisation (if available) +* Current source and target db pool consumption +* Current I/O (rows read / written) + +Check the console output for further migration progress information, i.e.: +``` +... +INFO [hybrisHTTP7] [CustomClusterDatabaseCopyScheduler] Node {0}. Migration-ID {1814262805}. {mediaformatlp->mediaformatlp} finished in {513.6 ms}... +INFO [hybrisHTTP7] [CustomClusterDatabaseCopyScheduler] Node {0}. Migration-ID {1814262805}. {bundletemplatestatus->bundletemplatestatus} finished in {440.8 ms}... +INFO [hybrisHTTP7] [CustomClusterDatabaseCopyScheduler] Node {0}. Migration-ID {1814262805}. {cxusertosegment->cxusertosegment} finished in {1.644 s}... +INFO [hybrisHTTP7] [CustomClusterDatabaseCopyScheduler] Node {0}. Migration-ID {1814262805}. {triggerscj->triggerscj} finished in {410.8 ms}... +INFO [hybrisHTTP7] [CustomClusterDatabaseCopyScheduler] Node {0}. Migration-ID {1814262805}. {droolskiebase->droolskiebase} finished in {303.5 ms}... +INFO [hybrisHTTP7] [CustomClusterDatabaseCopyScheduler] Node {0}. Migration-ID {1814262805}. {306 of 306} tables migrated... +INFO [hybrisHTTP7] [CustomClusterDatabaseCopyScheduler] Node {0}. Migration-ID {1814262805}. Tables migration took {25.57 s}... +``` +> **NOTE**: The process will only take into consideration the intersection of the source and target tables. Tables that are in the source schema, but not in the target schema (and vice versa), will be ignored. + +## Verify the migrated data +Check the UI to verify that all tables have been copied successfully. All the logs from the migration will be available in the Kibana interface. At the end of the data copy, you can find a report in the HAC and there will be a button available, enabling you to download the report. + +![Report Blob Storage](hac_report.png) + +## Start the Media Migration +While you are migrating the database, use the process described in the [azcopy cxworks](https://www.sap.com/cxworks/article/508629017/migrate_to_sap_commerce_cloud_migrate_media_with_azcopy) article to migrate your medias. + +## Perform update running system +After both the database and media migrations are completed, perform an update running system. Do not skip this step as this is fundamental for the correct SAP Commerce Cloud functioning. + +### Direct approach +For a local installation: +``` +> ant updatesystem +``` + +On SAP Commerce Cloud: + +Execute a deployment with data migration mode "Migrate Data" (equivalent to system update). + +### Staged approach + +If you were using the staged approach, simply navigate to your properties file and invert the two prefixes configured at the beginning: +``` +migration.ds.target.db.tableprefix = +db.tableprefix = +``` +Execute a deployment with data migration mode "Migrate Data" (equivalent to system update). + +If you want to remove the set of pre-existing tables, you can: +* generate SQL schema scripts once again (the system will detect some staged tables, see property 'migration.ds.target.db.max.stage.migrations'). You can review such a script and run it by clicking the "Execute script" button; +* open a ticket to request SAP to remove such tables. + +## Test the migrated data + +Execute thorough testing on the migrated environment to ensure data quality. The data is copied in a one-to-one method, from the source database. So there might be some adjustments needed after the copy process. Some examples of adjustments can be, data sorted in the database that refers to particular parts of the infrastructure that might have changed in SAP Commerce Cloud (e.g. Solr references, Data Hub references, etc...). Also the passwords are migrated in a one-to-one fashion, if in your source system you have changed the default encryption key. Please reference the section "Key Management and Key Rotation" of [this guide](https://help.sap.com/viewer/d0224eca81e249cb821f2cdf45a82ace/2005/en-US/8b2c75c886691014bc12b8b532a96f58.html) to align it in SAP Commerce Cloud. + +## How to choose the best approach for my migration + +Staged copy approach: +* By having a separate migration prefix, the code base in SAP Commerce Cloud differentiates itself with the one on-premise by allowing you to be more flexible in terms of executing an upgrade and migration at the same time. This is only valid until you switch the prefixes, so be sure to have executed thorough testing before doing this; +* The original prefix tables can always be used as a safe rollback in case of issues; +* This approach is recommended to ensure that you do not lose any data in the target system + +Direct copy approach: +* This approach can be used when you are very sure about the successful execution of the data migration and are ok with potentially having to re-initialize the system in case of problems. + +Incremental approach: +* This should be used when the requirement for a short cutover time is critical and, for the tables that are not selected as part of the incremental migration, it is acceptable to either introduce some data freeze or ignore data changes after the initial bulk copy; +* This approach can be used on top of both the staged copy and direct copy approach. diff --git a/docs/user/USER-GUIDE-DATA-REPLICATION.md b/docs/user/USER-GUIDE-DATA-REPLICATION.md new file mode 100644 index 0000000..74a87f3 --- /dev/null +++ b/docs/user/USER-GUIDE-DATA-REPLICATION.md @@ -0,0 +1,139 @@ +# Commerce DB Sync - User Guide for Data Replication + +It allows you to synchronize the data you select single-directionally (from CCV2) across an external database (either hosted on-Premise or on Public Cloud). + +This external database can then be used for analytics and reporting purpose. + +![architecture overview for data sync between SAP Commerce Cloud to an external database](data_replication_architecture.png) + +It provides the following features: + +* The Sync Schema describes which data(table/items) is being synchronized. +* The Sync Direction is only single-directional, which is from CCV2 to Onprem or another cloud MS Database. +* The Sync Interval describes how often synchronization occurs. + +## Methodology for Data Sync + +* Identify the tables you would like to sync (limit to the minimum that is required and avoid large tables when possible). Ex: do not sync task logs! +* Define a strategy to manage deletion if required, see **Support for deletion** section +* Remove/Add indexes that are not necessary in the target db +* Create indexes on last modified timestamp for tables that supports incremental +* Full data migration with all tables +* Run incremental regularly (example every hour) +* Reconfigure full data migration cronjob to sync tables with no last modified timestamp +* Run full data migration cronjob regularly and during low activity (e.g. every day, 3PM) - this is to resolve any potential integrity issue during the regular incremental +* Ensure data migration cronjobs are running on the read-only database + +## Limitations to consider with Data Sync + +The following limitations should be considered when implementing Commerce DB sync for data sync use case: +* Not all Commerce tables contain last modified timestamp + * It will usually the case in SAP Commerce for system tables (ex: PROPS, AUDIT_LOGS,…) + * There is an additional feature in SAP Commerce DB sync to support incremental migration for ***LP*** system table. + * Other system tables will be usually relatively small and can be full sync each time + * You should ensure you do not have any large table that does not contain timestamp +* Incremental update may create data integrity issue between two runs + * During the cronjob execution, you may have some updates or creations that are not sync + * There is no guaranty that some tables with relations may be partially sync, example Orders vs Orders items, + * This should be acceptable for reporting or analytics use cases but it should be take into consideration for the application using the destination DB) +* Sync of master data (tables without last modified timestamp) may be delayed (e.g. 24 hours) +* Particular challenges comes with deletion managemement with incremental data sync and a strategy needs to be defined, see **Support for deletion** section +* Performance should be tested to tune batch size and number threads (memory and CPU on the application server) + +## Support for deletion + +SAP Commerce DB Sync does support deletions. It it can be enabled for the transactional table using two different approaches: +- Default Approach using After Save Event Listener +- Alternative approach using Remove Interceptor + +See [Deletion Support](./SUPPORT-DELETE-GUIDE.md). + +## Installation and Setup + +### Install SAP Commerce DB Sync on your source system + +- Add the following extensions to your **localextensions.xml**: +``` + + +``` +- Execute system update + +### Configure SAP Commerce DB Sync + +[Configuration Reference](../configuration/CONFIGURATION-REFERENCE.md) To get a high-level overview of the configurable properties by Commerce Database Sync. + +Properties require to reconfigure or readjusted for Data Sync. + +| Property | Mandatory | Default | Description | +|--------------------------------------------------------|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------| +| migration.ds.source.db.url | yes | | DB url for source connection , default value should be **${db.url};ApplicationIntent=ReadOnly** ApplicationIntent can be adjusted or removed for local testing | +| migration.ds.source.db.schema | no | dbo | DB schema for source connection | +| migration.ds.target.db.driver | yes | ${db.driver} | DB driver class for target connection | +| migration.ds.target.db.username | yes | | DB username for target connection | +| migration.ds.target.db.password | yes | | DB password for target connection | +| migration.ds.target.db.tableprefix | no | ${db.tableprefix} | DB table prefix for target connection | +| migration.ds.target.db.schema | no | dbo | DB schema for target connection | +| migration.data.tables.included | no | | Tables to be included in the migration. It is recommended to set this parameter during the first load of selective table sync, which will allow you to sync directly from HAC along with Schema. Eventually you can do very similar with full migration cron jobs by adjusting the list of tables. | +| migration.data.report.connectionstring | yes | ${media.globalSettings.cloudAzureBlobStorageStrategy.connection} | target blob storage for the report generation, although you can replace with Hotfolder Blob storage ${azure.hotfolder.storage.account.connection-string} | +| migration.data.workers.retryattempts | no | 0 | retry attempts if a batch (read or write) failed. | + +## CronJob Configuration reference Data Sync + +Commerce DB Sync for data replication is managed by Cronjobs which allow you to trigger full and regular sync based on sync interval. + +Following High-level details for the Cronjobs, +#### FullMigrationCronJob +It allows you to sync the full based on the list provided in CronJob settings. +List of attributes/properties can set during Full migration + +| attributes | Mandatory | Default | Description | +|--------------------------------------------------------|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------| +| migrationItems | yes | | Initially it can be set through impex file, and later it Adjusted through either Backoffice or Impex. You can set list of table with required full sync during initials, later adjust based on business case. | +| schemaAutotrigger | no | false | Adjust this value if you have any Data model changes, it can be changed to true, but it will add delay in every sync. | +| truncateEnabled | yes | false | Allow truncating the target table before writing data which is mandatory for the Full Sync, set **true** for full Sync | +| cronExpression | yes | 0 0/1 * * * ? | Set via impex file | + +#### IncrementalMigrationCronJob +It allows you to sync the delta based on modifiedTS hence tables must have the following columns: modifiedTS, PK. Furthermore, this is an incremental approach... only modified and inserted rows are taken into account. Deletions on the source side are not handled. + +List of attributes/properties can set during incremental migration + +| attributes | Mandatory | Default | Description | +|--------------------------------------------------------|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------| +| migrationItems | yes | | Initially it can be set through impex file, and later it Adjusted through either Backoffice or Impex. | +| schemaAutotrigger | no | false | Adjust this value if you have any Data model changes, it can be changed to true, but it will add delay in every sync. | +| truncateEnabled | yes | false | Set **false** for incremental sync | +| cronExpression | yes | 0 0 0 * * ? | Set via impex file | +| lastStartTime | yes | | Its updated based last triggered timestamp. Update manually for longer window. | + +_**Note:**_ It's better to create separate Cronjobs for Language(LP) and non Language tables. The frequency of updates for the LP table is much lesser than Non-LP. + +#### Default Impex file +``` +INSERT_UPDATE ServicelayerJob;code[unique=true];springId[unique=true] +;incrementalMigrationJob;incrementalMigrationJob +;fullMigrationJob;fullMigrationJob + +# Update details for incremental migration +INSERT_UPDATE IncrementalMigrationCronJob;code[unique=true];active;job(code)[default=incrementalMigrationJob];sessionLanguage(isoCode)[default=en] +;incrementalMigrationJobNonLP;true; +;incrementalMigrationJobLP;true; + +INSERT_UPDATE IncrementalMigrationCronJob;code[unique=true];migrationItems +;incrementalMigrationJobNonLP;PAYMENTMODES,ADDRESSES,users,CAT2PRODREL,CONSIGNMENTS,ORDERS +;incrementalMigrationJobLP;validationconstraintslp,catalogslp + +INSERT_UPDATE FullMigrationCronJob;code[unique=true];active;job(code)[default=fullMigrationJob];sessionLanguage(isoCode)[default=en] +;fullMigrationJob;true; + +INSERT_UPDATE FullMigrationCronJob;code[unique=true];truncateEnabled;migrationItems +;fullMigrationJob;true;PAYMENTMODES,products + +INSERT_UPDATE Trigger;cronjob(code)[unique=true];cronExpression +#% afterEach: impex.getLastImportedItem().setActivationTime(new Date()); +;incrementalMigrationJobLP; 0 0/1 * * * +;incrementalMigrationJobNonLP; 0 0 0 * * ? +;fullMigrationJob; 0 0 0 * * ? +``` + diff --git a/docs/user/data_migration_architecture.drawio b/docs/user/data_migration_architecture.drawio new file mode 100644 index 0000000..923775b --- /dev/null +++ b/docs/user/data_migration_architecture.drawio @@ -0,0 +1 @@ +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 diff --git a/docs/user/data_migration_architecture.png b/docs/user/data_migration_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..88634073115839f9977f510d766604425f4a4651 GIT binary patch literal 106325 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/user/data_replication_architecture.drawio b/docs/user/data_replication_architecture.drawio new file mode 100644 index 0000000..6192017 --- /dev/null +++ b/docs/user/data_replication_architecture.drawio @@ -0,0 +1 @@ +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 diff --git a/docs/user/data_replication_architecture.png b/docs/user/data_replication_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..81a3aa555e1329029c2e0aebb40a29bf7dec110b GIT binary patch literal 405825 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%0AjdB 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 P|Y>TLEmoMH_aMJ@o@ap~qV4PIn_C?;f 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

ayZc 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 ZMCrpO3A=y9;`xKR?A%BWskp6M4ETjr;i3 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 Dtr{B` literal 0 HcmV?d00001 diff --git a/docs/user/hac_migrate_data.png b/docs/user/hac_migrate_data.png new file mode 100644 index 0000000000000000000000000000000000000000..2c310a25c031166bcc5dc713e407518c9b939f5e GIT binary patch literal 174241 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

&*Y`txy*_?QT>0B}X`9%eYt!}z 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

s=)%My$pvf% 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 literal 0 HcmV?d00001 diff --git a/docs/user/hac_schema_diff_exec.png b/docs/user/hac_schema_diff_exec.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b6195b9ff91d69c236ea4d143891b501265d4e GIT binary patch literal 134366 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 literal 0 HcmV?d00001 diff --git a/docs/user/hac_validate_ds.png b/docs/user/hac_validate_ds.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd6b5f6233e45b90ff498d670b2953b7a435056 GIT binary patch literal 60217 zcmb5WWmsIx(l(4s2o?xz+}+*X-Q7Y6GH7sjOCY$ryTjn_?(Xgu90q&I*~vc7+2614 znx1QVrq}9KT~%FORekq-SCp4Pe24uG3=9lWN>WrA3=A>=3=BdW4(9C_XTHKk1CTqD-!2mF*UzfbSvESZrw`YQbLB4&0|N1Qx;!i7N zKqlm$I)wJG3k||JsldPl!K6fmR9(PN(qKK%`)~R)+$!MUi9#X+4rU$vZNXQzF>suD ztZn;S=NF_-dTe{iY#)|w>$m-Q&U_B@Io>WrF)zGx1GRHFyD#aSrpX7B23+It_n(f* zKaZUN*4sF2T0n>?)3R`cU=aT*t>He-6~|26@BiIEmnAf;-sa z+lVZ327#I{-yr`poJ!Ql^+E1-%HsD}(wkwh-;PQKKLbpXDz^i>HZsAuz2=ly-84TS zVy$EZA>+wDZ)H=_>=Uwaa7-83n<~0!GVbnS;!WLu>u~Lpswo7v_)(Xbuh1V~qebLz zbbt-R2(5FRn0xG)9G;CUqohy{gS>6epJoFkL5arE-BA}12EiMw_4nVJs({591mu)hh_6Y3}uJm^1$ zwt)Q5fGGcx?JRbz2>VN*xLHuN3KV#DN15~wgZ*w}#e7ha5j zr@|;`I(QN-`$Pjp(Uf`(WlLFfxpYQh_)l`Q8&-15GFVBCWdmbhtaN2F;KJ{+lb5u$ z>)cpo=h!9+H$@6dTSA0IAOND~#IyFEhD4oT0Cf|4R?TXwM4i5@7E7G(-os^rKrolL zc4sw~pI$YoDQUA9=RSp)s4$>}6Y#~tAb#7%a8c6pY;6rwp$N~7j3j*bxhw}R`lFhf z17Sg=vI&z$t3np_n`lH5CT0)aiGExP#?+d{kEwlTXbw)UDo)q1cvjFlEZ*jvR&^Nhaf zv^@5Hh=JB|;BFR~#!T~)a5f*z+q>8J24rPEl5guREaKl-CNwk9bvQ3j4!rva`+G)B z#6h(@oTsVn+231}Kj^G&Y}?q4((-MMaQPuLd_uaOOi-tWnfLJIt8Y0t(+)DMBo zPmoUwQ0xJL<)4>Q9DTZkMa&i^ge>in<%~bZ#isT!FgE_^5Cr59Na5tIdS-V6`pZ34 zRn_Go(Y7eR$yq%&5>(R)PbuJXsKS3K;jqlvnzF+l^3yj`fkY@0B}d_=s+t<4m9)RKOBb(uP80gqT{)v?zd#g|3SpyG`BZ? zitbxk*$|6V*{6I=(Z+Lz4=z*LgWK`;`f7ue*xvQ=iX7@cX31BCqT~3%MTx*0sg=?b zezEjayUm2OH$R>mrK#i+3&4OeAdcj zLh#Hc)~qbbG0?Egyh)iJjV`pvHXQllD-T7(fYBoAGx7;s3JRE4!k)4hGk|JIzqGKB z8&IKF=jc_vr_i+#;3fT4uhAOEN@iFQFay2pP3-dA#uQeY?mojk_yOZmbU|jl#sF|G zO2`JIMM2qBFqfb>XNm2<6I1JL!Ja$GJoob5q}nf#6BX`eX_$@v$rmqk3_3{9dVOXhnUC)oaPo?uv#R4?JMfxyJN{o;R*`S>-5W;leSEkoM`EMOB#S2~jA4X_6xvfxU; zL*ii_Efe;~EM`TNKBFOKB_4)jMTz>muI4a(+rS+&$QprX@PA1xBu|fUyv(>4herEVjhxQh19)U7I!A1M=R8<;ySCcK^E{x9zoD& zlJ+vhHI!>hvLHI8v~V=swL*&F(6hrzLX(g-G(#n$;i)wi-V3D))SC)Y)L-U^!s|{9 zM0c7YK1S*dV2OdIdazt-lL0)6BjJ>?#&0!<;WkKS^kB)G2HUR89mYtguvL_e3=ApF zvTNz!ID5+vO#~V(E;ncULJSw0VUP>bu^We6x<}6+C1jzAD=rd2;A>zH#`w~9aKQMLlgBKS~vL@bCRLJZZQ;w zBHt76>sYSo#pMGt>Wac_S@zQrQ@H|%jRh>UnPeGHRGz83swdMML2l<;^jjD6k6k3W z-c26W;?;$@vSsJ74%vZv-8z1f8D(X5tL&a>oWDIk-!bBiS)2RRIq#@@WV0`#V0nlw z#WhD_jlZ}tu?_!z{T18BU9nS}*dU&ur^L8FWi!+@zjPC=Ms9M33qje_r7*Wd72Ptl6jvznZW&Rrxn{H3@=KQ%x5mZiw!?mR__?oKdLKpoDV70d$0T|B zhI{)o%VNM%iKE$P^o>&`@lmQI-JgemEijY5S`qu;(C=L*!4rie>JN-#+1 zKMt`jDoUpeZWi#PD9vtoq{euD#^nX8L%;;dC{4QP$bPAXEsQm%9I-#ip>8tp} zz@BtmBi(LLAKC*9Ftz@!F#b`a#GV`_X<_X{6S=2pWo*1gWjD-oi6;$Y%5Lo=kXl;JFc3;) z98Y=nvW$V262ohHr_>4a$b7Chv`rQ-r0(n$_5w8o&ME$5pQzHd?dsc{sKTTz7de~t zo&{9Bs`HEVWse((wx&8W?l`t@G}16cH&jeML&P2x@qM zfGZ>SWhG^VlR%gCLGeNB2q0*Nw)(Y?v)E|x+v7 z$q^Z}i&W~G`Rh10tt==?VDZdP*a)=DrX>f~{aO}&tqiDgnTWoXX`VITewt*-?1eLq z{DOsJEA%ib6{n4ai`dDHG+J=D4$D^?=@($X9+?xOmUqZKFY4Q_+chf;2 zB0Ba#&Mk+9^DA;3fyH02y@8W_`wDd&+I`v6P{QS60iBNwsh=yxg$Tct%?3TQv0il= z(=xKhR77A}4N%q;^n$}R5HoHE3{wJnXybY|cBYt8TGj!lGD}Qh7o{nC7newxxluJP z$b#7)1%xPBk#NTTo@;^~Xb^ZbDC{$e(jKH@L3J%<^pqtzT;5tjhC*#XLmR*`dvzq^ zQG5nfVqk!4k=OM+jmg6F2+n-HDSW^R3o1Xi3RqS5aXze0&C+eqLGfYmP{ns>22YgE z78ZXq7`?!wCUWg`^%H9Na$g@R-+&#dnTft9=FtU6;=FSx-%8jYq)mUv)Dw7cKq8bO zi!G;sd~R;XCB@+P=L`aZI@Qz;wq?UBUL8&Av*#&SxKLdx!td(2@1nM? zQAhg5Xv=f3E!69Jh#dHQ(>X9k^LW82CNDuoaLhS?Pg-sQ99qk&celhAape z1{GtODg{VY2~kr50Z#ksi{q<&g;b{f40%{{JK(xrC_Ky;TQ?SLrD0KJ^rSBKcOsw5 z`iW0e33iMQSuGr0T2pY32uer|dpkXK=@T})PjC0_*lhBV9=Nj5r+c2!mdV=%i7ynj z$Ng;6_GSXMyJ5Z(>!2`vvy+>$@a3pc-+c@=XFBubU_95J>obQ)iI;(@?~t@ssKgN2 zp|z5EcZ^!m?tU7t#Y$gJs;eZ^4I?@^0afnbT@INCwAKLU zyKjHLq}Q=+FlzJ}liKPz;bOvFKaMM#Dbh&GsDO!I)r*<@ax(BJS~ney7t`OUwCdyH z)98(KByb7?O9Ea=q;#FxMoiEotU-h^JRyrdt}gl<_AtgfF)q+^>_Qf8ys4B)BP)dO zCPV}~EKu|vvcYXf$*5LR|HldaPg{nL}<)ROTJXI_J! z{Vv6Y*4Z3wn_MQy;Q;N|%SE&!B;Ikf4?7}8K~R&$r*jFuO~P_Wd`11ae~J43J?+8Z z5G%4D9cwn2tyzn)h&GcY9A7v_dAqQMD&XZ|SO134wO5J+ zAn5^hN_Cqbp^mA@W`G9XB}DiG!PqwvI@KwNqMSE*CnxaETdDx(r8z;`y!Eh%reLCK z8|G(CU0}6z%3;JSNRJGMkMYM^>ptm+eYDQbPKPxW8ZJZu%cHJ34Th?W(?O~nWUt|D z*q8dZJVvrqhQS9d%}?0uj3L?G5P-vQ;$+Xed575+Ri`GF_#@Yxt;z`$Y{%t_Cq-`` z4_e3T39@OkPOa@Y7Q8_QLmO)>zNZ%qH`6#Ho>C3D7fhlo<_!7tXvqkD?l^K}G&&0z z&1RMe{1?i!w$(0+S<$~7qUy*J9OJ(+a#GD!@zRBn|7E^^N#~d4F($ws7es%bAU*qfEMRmV!E#uB6<%#hM_HD?AXze@t*$1);87cc|3n(&%Z^9fK3DVH+N`i~ zVVym?SnDuLlM*Xfds-_~nBCW8^$wXvED)MfNCUgDB|F|&<=vgdW*EiP_ZXPvWja{% z7XAhC^U^QAeLF8&pm703v#%(v*WF%jR<=#usqpXKWrwD(3+mJtP#M1X!^-EoN+9M_ zrolT&8RL1j^QVj%G^B;zi`WN!cbM9_4GYB1xV@gwB0I|%D4pg%+c)PiPV3xMTjnaIg6XTO zDIXGdD(!hfQgOLl>Qo&QK8%)2Pl>E=OF>pKRiyh9nr%X9LeEwiE`7uB&1#s+FZ(3d zD}kIU{L-e59P|2OO)+THaa=!MtI=k1UIFAQiEq=56GGPGoy8Y0(nR;HS9&F1_A1hY z#l%gJHXV`7k3`_lI%*Q<9;zej`%;FE5$*^11h9;jQ|Y-ttX>=GRgtiJg=>0kVJfYK z&xKuE70nXzLVBpp-sRz*DSp60#}P+U)x=U-dk5p$jp8AX32vM?60sZHYO#*djdey>`emWPKOM#)}Wig!lhIk#0heC=lQB z4kHU zcCLePQ6o-K=rLGTie+5ZU^^B7b4fRNW!O!FId%VKmA7h^yleBxC>pSk*~Yqgdp;Wq zy-apvZ29<5qhfZyp_%-3{(~p;e*f8==kn(d8IpM!`WD*pD>%p_1QL@`s1DtsGJ~f~ zFX!fJ={0s@2QlL_kMWbqWmwXh2G3m{)9gSt4CcuqBhVp(tgtXuaLJV<2fyoO;7+yrf-5Pg0a&7`GX5em>9wAB~MQ_N;yN|z? z<*(Q6ElgJ!^$Xp#B#4{xgW~w)k+6GR5yqi&6sct2FB}jUoMa_AdrceU(&=(wQS?81b-_6vR=SB?qn{xpI=k4xC;#4!ffNbtpXOQ+)1l%}~-NrtS=d7d%6 zV4ya>>3Y7S_gs@TyFnUrc6+%AaZ)|Abz`r``f}F|1$naFSMEO9ojQ98^TpXaw%0}3 z{*_%$0{nI#J}i5kbIy9P8rtv6EEpjf0B^lYr@m3G77+#RTT%Tsm&+(FasiQO4*tG~ zbiGK)ij^c;XZ=LMSLatnZVUC;)|Hg8LkXLe6k+F|we#mvSqW#7*^dk|W-RB9rZ+i( z^<;~~s1|#e)_B798IS#|;*f5-x@1I))hy?Mefe5c zg+N{`C%XcWRasfUYoIRBL1(#jM@Rt^!>c}Get35>IgQSk^Gfw$BDlG*EB|>Zburs_ z>SF;?FR2oN{yn|_)NR64vp{ne>WpcuQ9Gl)N#F6b!)9$p&B4`2cLyfXLEDzLA0ndP z)a;A&o>FVQDm8|u~|Kjop z&EDk);4Rw%FllS|F36NwQ)NN)(az#_c+6=Jztp0IB;7{1>D?&c8NuC43phC=| z+e$NDyuQ_&i`f7(NKTx(RD2%czyet!^-pF!nJ@Zp*q|vxJmGQ(V}==swdO=}umz4P zdzaLi1C{C`Nhu}bFb+rusVVmQ`zEi?!;7F91uv}>|Xy#?tbt2 z-8AMglCp@1znhPR?aoy6G^oL379H5*6hXp77PEn5#4YM&6{ZB1QqKjo*ZlL57UXxw z5Gz+52cw0%TbZxn(dHmN;c@_NV|rue?%5PGr-cP_QRBFK5D+k(c1{T`do(@L2RoQH zr}ezYx1cfeH0SFpBMPedsUZ(Z$?V7WP>0gBJk#*5Y}hfbX*YSUJbY_j*{+{pmdlo! z*6%nC z3~GhsEd^=j5^Yu^+kd?#-E0zya3phHWt4#6N|(Vufa9vAF?Bh!r5VKg9;mBAA^&1O zVmeA<8-Ag0HLgCI84F)^P1%3^w*9b1mOM1~FuI+K?mU&8dvR-eo;s`S z!?$8LB?$T?M!))OoeWxFDCE{2OT{xL7|1$l-9^VgQ7D2W21t7|6qgz@l$7}a`~Q+% zGF##pG>xCr@}S7G;t(*(2s<@D<~}C_Y}4?ib%jUgSMGk1^W;3QJuI|h+s|QG*L2o7 zxpw7~qH$e%x99i;bN=cjiS~ZUzu79`{i)7y0vPSu` zRb*X=qIqAZ;Om)1KiNXMGwyRl8`guhy_;HZpgBsOkt~=< zOP&+t(0rvOX&=8Hsa{*a2e`r8@HjLEA1cXvOAg}AC9E|%QR+Q?sF`eDnBTW|qSaxU zNvMGxS#*GOXK}<@ISodiS_6(vHCslWX78{K+r%eKH;#^%>KdhLwSqV=wvOlxC{Al7 zaE{{g5mtQ8(CzpaAf6|NKyMu zF`=$q+&GPqHTDR{ZuX)jhj`|$?uYqOf`$xc2D*gO$yf4rps%nN4GzYM2&@*-g8EvN zh~KQDnU(CJ4I5;9JNz7HiDI$dT`uwfQ%&*XX>Md;Oq}11Dl#n`j$1(i4?KyX(p2uEgsh%TvrAhh zdbbp+m=7NQhb!LYc9cJf=W^rQT(R-k6oK;E`W$Vp7D2;{hf*nBnZK9+{mx(p8mVbaY!(SxsWng9X;z**G}DRWTHJ4Ua9%mZ zYZ9An&I6FJF!Y^SpI`1(Lq46yh2Qy$Ft4)xx}u+**S7b)`O6u3v`zn~lji3A@H~f| zq(sAH&z|=x1U9@HR-aCF#cBgDLyi^^tWfkErD^5xFof&VGcsA7*Du*QUhirho%kdtF-r%T>Vi%{e5o{eF{2Dnq^c^y?ed;74Beum!a{jNOcPRlU~P4k&{H8 zgsAzV3MHW;we791s1*394Tq<#z@Iu25|Y(wvWF=YDxcR0BZf`@Nk=$Z4a^U$e{KEP zAJUC6lw2#xSQ&Nyz&@EV9#RnKoT~_x62kxU+!J^uh_@TdI#ok}t9bn0COxA=C-LOy339|yUG;~ClkN*p#rIxXHXrA>I|KBiTE z%6MfmOPj+krJGITtgh6p0Rpnqb>v||i#m7wrsDVKo zhYr?H{{$n(5)EbG%xd%+ZJAbTd^^jKnSv+XO?!K_;Kk#i7sXSo=|cSV96!#n`C}7j z-$ZcPBhBn#`U-PM*bD+qUo}~h)&poNb(bmBSv_4#+o%=9ebe9PU}6k7T$Qs>57J6C z^0s!PNo&*fj>K3OkSkI2G;R5c+rD!jA2B+_7&<)^X91evJ}nVAElBVhP=4G7P?e3@ z{cx=e!$dbtyR2)*aYSELQytP{K-Ib-45ye;&&QzeSKvDycZqbrcIwm zJ>#CJ?iEw^XyD76zVVOlQfs{ZU(^pAgZcB@u9BRzZ<$x)Bf4Y3q z^k!zNmtxdQrf2JGE=MjoWh^jkF!oConwr|ywS`5jpE?s$FjAurJove2<~2j4nogp% zmj-ltO82b9f#cO_EoSob`A&E^$0r^3s6(;>rGfU}IMP#ghN-MG@n~_Eu58n5TUL86 zPOPq*y~8pK%5g*mc=@DVXP?J0UFRI??Ce7{q4TKN%f)#hH%Oj%#RuJ; z`47wOdU><;>*<|tg!0nT%-Z~RV~)s;w+PhK2}Tx-y9eyBWnN{hr^^H4TRhZdHPy9E zwKk@Qsl65tmh1HQhbr0+uAJgdh(+t?#E8* z`9y6&c>M?GuxEE|+2q&`5AI0t3`ubv`zEqLCvH+_p0djyy8R4B)JQ)mf(v<<<27jN zTi5%X95xzzCvhxb<4Z$^jLOyw)&_Emu@Uf`RngCt76dt7EI7{L0khwn9XwB|D`Fnk z%IgUKv%C1VHGsPbrR$DmWwZa}_fS^74Ks%+ADVSOSKZOA!x!l+TZ8mu;;YF1q5b}TMm@F!==;Lqqo5F#)rqCZD@oy_Z<%1=k5g2n z$~&j=bfydGW1pIio{yaPlW7S_^@~|3SgME#}&!z;Mb4g1t6ln6lZM=6&j{JJ%|oE`=A+L%yXIwOLU?}Vt2ndL_70&Um{ zZYOO4tSv1mN2Q4>0d(h9I##snZSo1M_tR&o%xir_!p7HkH~H=Q{Azfwo|F1b=iPeY z(3e-2A*N$aKWfriX~s-eto%0{b&_I|cGWNp=6Xt|N7p?nKJ3#)C(L8HxpKWzu~&XB z%;!wKPUmeUwZd^MqAzj?DzA=I);&Fty6Hpve3(JTg&>3Fl#Rn;8y5FlXZ#=^9X1ivDnwGNE>=%`4pV>rh1C z`Ks7fR5n?QgDbV({T+ds0bK==u~WFCG`CK3Ev@h7&ak~UL3uis7+|qQ>ba6rk98m6 zM{YHC3JcKVdJI7CPgRlJW-scd0! z>jz+TENzC*BU6pVbi8Y&wYB7=!0wZiO(9hN=_XCtR^tV^{nU>NJ9cAc3~zq!SbjbH z9wXF};`mpOT!pfu>e=($_U&lU!c__6;JK}$e^=w~vaKZ_{ZxDv(;W*&xHiImu(tKx z_<9v?v$yx8@b5_XfENO;ueYwrH;a%sVoUbC?g1( zf09@%xVA;lnNjKHGHca1JY6ND;WPKS61$$kJL77ulg%z`=7doc6AKMz@RRR)=mWsbb^mQK>#}2BrS~Cu2l9 zog$>P*ZyOJbzObYyNvbd9RY-JD=sEnzB?H#I?kG8m|mz78isYwlpT`J;})@_=2`De z$ik-bC_l*3`h6{yXi0vM;;8jg+87r_>h(h!ezOh-W+i$5#eVn6+WlAK^ao98$dRSN zyOm{&lEXs_ZEdr@JKu%HBUk;ICwQ>We8CVZ)#2Wf8ZTqQ_xHZ;mT}R&AAa;_wjH%*f zMKQcMbe;|*fow;)zOFG3(`L$+?C=a;?HShY78C|dmG*Wov+?FlyX^oZGOhPrwq}`e z-8?13hfKRO{X~t=qC*enkOGRq$k`K-ita5pKFdbm=7-2?E*Nvwj1w7^jJ`;g46#X- zyro$MEUB1*<8IW?%@=Z;hP%$&-pcvG(TPvGHTY{N^~ovc2b&Fn%86J)3ovj9Fb$mFhG!&>NUazZjX$>q*t!o!$#TgI8Tt+{%jkwjRHQLvKAH_*QZ#fL-JL zw#siynN{Ksd~iO_SaNnQ?jKRvC-~yXdAd8${|gm)!+ZJoRFoDU)n;WS*SAPI9kg9C z9-;W7{W2LpQ+-+-Ys&R+THf#c7iIDbfO9}Tp(&$~fZ;08sX|`QnHE*6a5OkN0KWfU zrvKjkhJ?Sij!|+F%lKfk%AnNeG;3{N5zhB@Ws>Yq`t1)vg!9;4NNb{vIv3Wlqa&@j zw}iUG%X$vieUq!j<7V%F2YL8}rrc`2VE+|7>Mme}J$u zgL7wuepO8715}E@-r-xGI?fP*%l`xD_+80_Mg2;LatX7`$9{i5>0T0gP``RSBYyS5 zzox3WIG~=(*D%iK#5l?HFQOHGB~|#SF5re@^mHXIh5iM^dCM3}X5N((orL9t{TC4P zdk8+^f;ia1i3&%Wn<&4f_77QZ=-_XJ&wR~h`8Pv1_`wSx3~Ta|o@g}<_W7lA{{z~? zfbfckF|X6qCjJWbCm{g_u^Q>4;#-+DDC|3{wOTo7_Td)~9lRlYXCDjOqWCb;WY3#l z&9VZ2KV!ljo>Na`L2+J`No=@~-UVgW9rjjV_<-xzZNM0x_PjaJqt-N-ZDra?B<>%Q zGcDi~E#SE7vWk)lStDSKp9lig&PZSLi_5LB%zr7fFUb#|C;6fCyeDh+gdIhHGq_eQ z5z5Du(j!y zp$cqO&hs9^1azHoCYquB0#A}}kO?H=-s>P~a>jbo;^ChKWqJKqLm0_6bO~d3o=~=X zt*29Vv&2WzHF*XY+ED)%v+f({U#5f-&T!%*h3-GIp7R7s7a?GZ7xkSQix!(%6+Ygr zdJg!1#-0XG8Au59TXp?5!T!%vXngCSg?XsF8al7S(qNGO(V*Xz4M_?x)N@G!At1pY zf&Dq0!AlC}J0bFQ0Or36^S2^MaK9a@kO0ADKmS&Yf862?qPG@&Kau}F{x=<*Q}AyP z#3>1sQ`kS#`Oj29ervf#!L9xWVDMZ0JEG*lAU31;{mcY@>DT`)E|OpnS-~5Ti2o)z z+yMdwF5((h^zk31`901Kk+&8;s9?)~ll(Oo%}3BBH-c~p`QPKje>+ohK*agwAKw2a z*_R{@462L76KeAR2=ni@pOIit!pNOOIR8WM8|}Dp5#GBSpS2t`@=gZ;gNrHALSqqiV)>?%2%TP-z)=zAlmz1 zzQ6TztqjqoH+$Y8=$*`ILdnLaHPGK5%)uR-hJ=dlyJvE_iAU7h+6p)Y;i>AW?1PCf z$YCc)>wB~oMLBFsbVc?rhVgs96w{T|UAxX{ zEsUPuqzgJzOc-N#RZe^|H!~x&fn&+H&#r2Vl9nElt$@CNRB{#jD1{vmPC{s3m7iay z=DV@_POAP}hl?xw`;9#;4%5ce3x|08i{CPzScP{;64X>v>kcWSFDY-f=dd#PBy~MEsj_@ zJB`Lze`loJ1rR6<9Td5;l3$kDPTi@6PEQ?HY%Z`sV9T)VZJc6FkBtOgT>hZ{yEhHq zv|SQT197<%`p^9Nr!s-?Myg8EZKah-KMRI_ivlTu#m^6;#1#*hw}2=^x)XF! z)^HFfT`SKzMtMPFQX258#~Wcjfftw`Hfc1D@|s=hbibC^q87-V z{ZP=j&gNNzUE+0ePOtaIcNeZRK694yOb4R6{#MmYceDd1h%DaBxCBfUF;^^sFZFN% zTfQumoB>^3IRg=CrJ4)Nd!2reCuGc#T_i@b1U)wgyM|d=S?Nz)t-KSgY}IH9TmGtQ zTKO&ReRm3^2HxJD@g!%O_{7692u0P^epnAGvgX-uBmahNmWPPnAvYHhsY>Q|rcn6QVBDT$_^F@OSjBPCt_jj9G35}ia@ z=vcG!hV(ddyyF#-X+x|+7!DS?CcBswOZIcwd4~$ zSHR+?=;C|l{I;z4r{@P}QsQI?NdJL;g}t*)1m=Q}(07H4Q=*>tZAVCVLhk#nU{|!X zBaZHG{L&G)+dUU|Kf_Tt62bp%5D$u=n$iT#48v9fn2K1vPT-E0-6of+K56RcNa)m^ zX66mgE53qD(e^w{#3iK5G~a%ixYgt0<)=#)+5R-xEewz%g1)rZCqamBd#cnMMfPVY z2+PruP}r^ZI1F>fRPwhx{0ap-=_Jo(jvj`eBrVpPcfC4pK{-LOP<~@(Zk}soBAaVi zBn9-^W?za?ljNsws0|c8N^xI#9}@B|r&r)v9?`K@RXtI{^Yiw=)Xp$+H8FM*!S$}^ z>lOFbv((DCN1`&j4()Y6%bt>K24#8%0BEE^f42{q^wBmz>9__w|6Q4Ec8Nj`&+x7NRPQ=ku}avuidP;qibdOcXF)Hfh6@r(}- z9j~PKpW+LSeM)^)4r;y&qqreL{yo*Mzd*D}rx~4OQSR+<0X@gB`jm0U^JpK;cDZR% zwkZhM!o?%7%khU;ZLFg``mU)QUK&lO_>cv}vNoewjW0z*Lc()To3#jcpfJ30)>cSi zK3PJL&sJ%u*vv(;v2jdZQ*9q?U5#fy61ayaYpQU%e4^EJc;QMN&^Z;-7)PE*BLAZ6 z$9!P~uI$I_L+P0}rET{>Tgs|)pTaO)KWd`bI+_sdhANz=lcMC1?r{0iDkxIst7msQ{gL3v)>C;)@*Zm&!@yHtS)mu1Q2E}GDM zY7Fyb*jYoj)d_doQ(>0uBUaJ3?(RjlYCiYSzFq_}hIGkdy#_856KUJIVCQT^=YICNL02*Ih!0=d(%{s+-oJ}X=fwI8WS3f8X<9++3R*e?OZNE4vj$eF zOM}Xza$bX9p7^HR4zAm_vy!RosX4!S>5oAWWi&TM054O$oWbgE$F4?~S#bBNu7!-K zPGi?mdd2p5y+xP%of+0QhG;p9yF&6LdxwM_PXx^*5J=J9Nh~I zOAR8BDhhw3LDtAJ+*DU#_bPNh>z$ANsWNQYC9<#*K8#tWDP;?ea9nlNkXRdp_%uO> z>=mu?m+O_k3xFx5K0cwcV@sxsk&rSV-StHcV{Zq1GE~k$rco~s9p$f)ZSC@aBrx{F z<7Eb+q<5hml&La{*BTf5%+JsMh2NpG?*lr|-~-+M!p9%>FXgR;g@IAd7(gj5ucuVe zV|w6mJ*z^>8yfa+3gR|4(bmu@3*eYk9DWM@Y_H-f`LY}{Ud3g^$HwknLr$ZUv^qPh z#?tL}Lr8a}yqA&4OM!&lvCE;NFOOj{7F^iWvr<{@Cs*#8{s?`4rFo;VS4y0?k3Yal zr!W*7d<|OCF0hK}>ZKiD^oV?5K)(HGd8wy9bcZ^Q<6SP`_xQ1oe25rKEjFRL?j^Hn zZy5PGidUlRem7hPqUC5c>zTsH?s*oo2E!BTba*JsS>PqPco9VC108}>k*;9WAD%zi z&7ovsje7p5CD9xBpsJ=+KF9iKkIl4+KKg9HVdUfI_Ne)s@V%Ha1rc+BuNnx5O#?Z?38 zF+oTC3uWBGB*biUxMF%_aoTJQzUG0bFkOzyJ5O$zMXL~A8Cke^ivC_f*0KPXEgj>v zTAa@^l#y}&UP~H>7^gx8#hN%)4qITQWj$);{AyhFko5Wf!YDTX^XWOx!S;B&2E^51 zzrsH3v>C{3GQ#0>HbIh^`|3J|s?FOQ^i+~T#XOT>?S3GCw9FAiaBB|OEv~(87Yn5- zUk77fOv_}ge`LP1*P)n-KjkS3C-`9W88o3o;2}3n5uq`k@KTp7&*O>@U4=n!WI*2f zb7-IEd-0$D0?I%JInSI zi6cufnkJXw@jzo=&A$?k!xH_5Eai`cCV}s2$p-qAHy;s8OW_L>r503IhqOJJGg&QF zDFCd;dG_BgwQ_`d>4JFp9LD8e*qlDlz2+dx$@$Wc0v*`rEUxs`Zh|{WMnS1;DEETUgOW5pjdkMH>Lo&-LGA~}f^vf71C_8ri z-+Yvnl!QrCU?!<3^n^T(jLg>Cp09T~LJvPl)qXG!$|Ie4;wd*|nU{2o@VuYg2eObP z7~oe54nYW+!c0~Vf);bge;CJHXoK!_URC^(XSDk7j&ROB#_SJ2C$l>;pFZyBko_=l zSR+{YY}n#*@JKNyMId)_O`E@+GSvXuls6mU7TN-loD( zBprgp-F|+5Cyp?+hmCJFVPJ2E*<4thN z=%0gQj_}s53lF)pKbQ&~%eJNcIy@Xh;Pn*9rI1ZFtX>1S=6AbaOPOuu@mxZ`={ogS zXwNItsZU&^z^Oa6;=40&Th40pYk}N3T!4lSzT_iga7Fp!emkQatWZ>n7!Dw#2e$B2 z^H^{go1Em1v;tU-j$Ceno2rZFHaC^<`Cl9c8y!FZiVG3fzjk*qs~gqeMom;&?Z-I3 z6Lh(r5~hR{aF0rOQdT9`tORPN-?<3fo@Ts_JWrJU>!Q$juv! z3d17^J)sEDl6{whEKs(ytDbTa{Rw#*+3CLkb%l(}5nyhP1NfOKbbZ%fDA3+ewBZ^G>n{$x--3!31nAOGmedpmE@VeTMCV?zqgM_*=t#+ z6-C114lo%_mG8%+>BxNM3>o34fm} zf!`7u-Jn0|A|@s_4Ja7NS+;KR!*iXfTC|2BL&BHsC*aZH(mBkC>^R0zQFYA@!DY=9 zK$Mcr70`1cdZ-Z`o$Iia=Jh*keCB2+v&gL^G-!H`Kc;d#P>kjxGP0*e2>4U|by!0~LrY>^87itlT3Y@d1`6s2{>n=6$(ELHm4alYb+hamS6SbASg9Qu^_)*X z#`fHaN@;xz`-1Ph>O^waoF0yyB8_0(5VW=ZsA8)H?cF~;%Aqe}B=O#m$j8vZ4n9zlZzcNiqNyF+kK2=11U;O-V|aQDFp5Zv7%xI4@sXXkvc zkoUXy{<(j6_A~71?&_}Uu3ELa2BKJQ-^IemCS;L+*m#b7ZvTq2RN-;VCwZ>0JBQMll(024^2Hik}8Ut#R1!bN6++c!KbcIj`^oPw=K9b%8qW7H>N;r z+9rBmt5@ANH{SsUI+O|j_;$k1C!4hY^kiIFPK9Z16%1`4KgD zf|@CokCe9_>(}8wSGLcn5EisVTsCbu^H97;tbcT#n^cy-aWI|bl6&bElkHUb;^3yg z5W&f>%MLkc+-y9ue-FWfY4>{gUUSn0QAAg=KxB}U)crRw9cyLe~;r8H~ z_RQ_QbK4`oU*RF%&b8W5<`e9v*S_QRgq=$Lu5>Y_&z&B|Yf5)p@Mgp5 zuEGIR_8D&!%!SSBu{Zc*)|Y~6XF&$dPNIR80;i`1qAn5V{v}Wbtl^=S6UKEi`i($t zJGWmYRu=tRD^)sBWAq7j$Fpt1;Oo%4&##G^Vq5I8cJCb+lc8=SZ%VyI6H!hkh%zB| z^(m)7-H7GGBJOKw1-=?^QDc-)$K6*g`xaU%tv+@sJ(+iNx#UHOzI%K_Z|C`#BG={K z;|`O6nXcYjufQe@$zkBRvpdvGN)}@LseFenlv{hV(UQ?rVak|~pFEYX zH>~8gKU_i&9-D%Z@0qSQaHwJy?yv#VxQl9=c@Qv-`yg77x zQN z0HRZ~U#ps|>ScDiQaho&Eli*%HW*diFuLelq}Xy0bh_o>^_1CU)tnMr-*JEcM(K-e zkt@S5D<;8C*TKvd{!{OQy}=uKdQ7Si;+%r%_{0Gw%d6odDVb@FD=~3n7gWs6c-+ro zlxJtbc7@fcuat4O{RGp5)%BbNN?C7YVvV{^XeP4{1wSYhFX*&=f+5uqMX*D{1wMe? z9#dQ<^IoPF_-N`m&UobXctB_3%@?|g3q0?kFn`OYBXH4YLipT5Hm!rfPZLge@}h+X zcMN1byH=H0zec6)Jo>Yi#R$`#Suo9{u{?({IkC`{uo`L$UTd zB|Jy0YxcLNdpxV{_b=2=+x6g|{C!}c;A~AItoXn`8ut&oi7YjXF4>#+;84Bs?WHRq z`69fSxpY5_TcrB@C)Q-+AoGi~_eMslM4Dq8JZzP$F$&dp@?;uG8km%tJFWxLZEgMq zBm*(BRnIhMT%VAkuCHhZfF8SEBNh36&B}Q*mG88Pk5_Q@_3MZ8h1mP`@`yK7N#e33 z^7*o}kw8`6iYE9FcLpv_Au~}|( zzcA5GJnp!RW8l>o<4Gh(R#tJc==;K8AxCb$4u#6{?oCNc^=WJ!6rOY)KbtDM)&UuQ zqiad4ZtC3AWoKcL(LJ2K*Fe3uVL%U1)6+7V(ntav^)nfQbG%)`N=E9JSmCAO=h2IpJ z+J6LBur{DQW^t!UU17>9*OyrY+~_pD_eD5(L%R#C)DSuQlKHcrWEPR^9)>h2rn)UJ@=b9X&Tkp+0Gtc} zmC!ulx~Z|}N4M#L8sE70G0j?^b}iIzDfsLgb7?b3969V+cP^vnx)ZRu(*NO>Qo{F$4pkirnZSnwqeQ3$zQ5noU`BcM_YLX}NJRrgaO2 z_q|fmu@|CY)dp)5K|u=JIJAk{4XuCuFZA37X_n=pQ5$m+$et7lq5c27rh5hp(U z+o&gjLJ~Thyf0{JRZWY(J@!?NoQ0PaNc; z#Pp|c(z`WgDJ~6+MrknB~-OfwM&)5-Cy9OZtGTs;%lbcoRMsU&AXhP~~e~ zqM=$HBP^ovEVjOfYP~{yb4f!Z_APfr-)W4GqB@Ajz9@TKv zE}k;mg?@U0NgOAWH9gK9%N|x~c91RKay?NDlVkUp+Z$rikJ;4Gi>G;#V4N9qY^VIT zh2$wi(J8NZ?C{EcHTzH~{yXtgolOPB!LaWEl$>0gmp(-IaaDT(fm5SW5lg2$oST_( zdhQm~n~{-|gdfsEQh$m6oiHkXyuic1nGI*JuZa% zk?U{*N7pW@`LuM?&@S%8CkN>%#X7v*&xp3Y;-> z!%q7us;#xS{B-y9OSx|PO|xhHi>jK68Y@I##jcyUhrX*8Dgmq`!jmcll_F2|ovf8Q zs6x$-PcsM)r{Y1!AJyQyaKla%^g4-#P&rzPXa>MI7gAc<+9p$EZb}>9HzM!s<{P5J zjARq6EtH0=XfG?A9BvZu+(*W!lEd=+|j7{*4^y0?90 zahAVtoCk{mY60GGZEF*D+xzwz@5e6x?lkXiF{i!=cRdQeGuY(#vxr@?V_~RQx#x_P zF@bwHh8d_ZOwW7WVz$|+_NRBR_9p2iUuNUsq>B1T4q-|gRjJ|2R}PYSMguM8XC}p# z)()tLf(e})De!xBIZ=ZGx1!Z0#f_Fs>*Vw%aeCG}ym5zF6TQD!Uk?X1%^@qqg;rJ~ z_qqJkOYa^^6214_G@{EdGGXmPZMeJ;9FyQc_uBO@oo_z;g!{ z$c{ykz5bf7!*&Sc$n$37HLTOu#bxDl&BKuokGj}n-B8jfW0&I>_>h7HX&IVL@0<0* zzIgBU3R9k}l?;)v%(mLw<~-R^px|~=kM8|svy_;W;!DTg8j71Q z>AO*j@`-F|$d}>Y@vS&$_jio27JI@(qPBMWHkC&sMAt{k8?>t25X9`Kr8Zfz>30K5 zX&(2u4L(*~#{uuG9j1GkU=`fl?g^4*1#hIwF$ut&$#MyBg<`?c_sTX?v;DUkUAZ4d zOX2(ZQm39sxi`AX7Mv+mnPqxL9U|(X^zcygSk8Z_uFXA@tYMF!Frhn$>Qk#}pqRSS z$yw$J_}o~Ay6j3Poab^D<0@b*@lx0E+I2_3W$SLvWnfEUT|#olQ7uge7fe?&J4w%^ zrqhoyf^fLO@l|{VV%roKh1^~KD1(^hE9q{Lv2ssH(W9L-x1+RVi=RHvpt$a-d}*op zV&%w^7pc2J6gP`5uutqvhmcRcTBkf#JBW@g>DPhEF|2u5g1R!>?w6JIpQ2AR+&eor zhkv}yKO6R}&0q3km>ZpF{M4n?rQbgrc-l}uXImc^mDrIH@QiX?GO+?*Li>_bo``*t zr6s;}F>e+&+*CUjFp}TPdzeEw0Dd7UGChKw-0B31c%FZ*9;Q3+XKp$^Q8YhpB?Fu={xF?O>Zbo3^ z{-CGH2j4h^NFu(XG_WmNDNK%}aydWg?4mr<%CxU0Pp%uiJSq5ID{vE30vmI+ME~~o z295!X(0%6kNAjU}8 zBK}kBNBF$n?m%d4d>r@0Xr^$Lz=~KysJwGRytrqMXL-F2OgsIYqG^cT0zKx$R=JFZEE8U2fxI zE35eg3GAzyzoL5|OVLd|$`K%QW^$4^S!0r(HvC+4$&)50@R6}Jvd9p=E@%wVURM`4 z;JaWgxV%UG*m{{=;U&h8vWQBDb!5sdMCLb!uMhS*9l^(W`M{Sw9$%^PM>RaEs(@)OCM@h++;pA zWjmcq^0o;!!s#%u?rq#=faoq;&BM{lM6=oi*Rq||RxuHksxFl7aU5-5$M&hqL2ryl zHq<{s*z2fgYVXB(L2j%KO-WtC=gBqGv5(!FO*@R5MZe9tz*7XO%T$;$DxgUcn+PPjBGdO>K4s z-VS;e3(&49bd|jEDulf6|DO_tKw7>|y49*R54Tueuz_T9^Mzh&X4TUM^uQ0#`rUtq zlBNB$YY^*rl@ugG(=Rp&-}te~yvuS&Yf={|GIa{Y83~x4%G_o;DYsT2C7csaT;i5C z`f0xf=0m8MlqO57&D~cX)Ia;|gairObCyvFzzG_kB%6PF?3CCV#)UR5oxgWE`LwM) zDJ~y3u)M1$eDT&i5(m%9l5Tt5?7j;t)~ollP`Wr8eM7fR`@sM1_PuK{k-L8NV~RBU z$M0F+tth;tYOTR0BKa{#Sq7KntPpGugS?uhI?cCBmvBNf(G3Qd&WDpvcfM6{l1qbm z9%dio*o+%2id20~eX6RGXf@Y9b0SoPW$)UQMQw;3uis{Mcea)lJC+8Mn@wt+51LM{ zKrOZXEVsI$wooJLwWqUH6m2&0a?y%4nt{>SrrLV*)!dE8^#YDoQyA$b*R}T8qz+p$ z3|d3FGrirX)XnHpBNdGLHO-6zOnzFNB6ZKI!+^)e!;)>^DiSLepV55w?xK9R~e?J=ap0ra`&+D1KkIKor zt&`)|4x)3$0^AV7buo~0efO`Nq2^m|#<#JR88qbb{)Npoo6XTRJVrYfa}6)``48i{ z(`rSY3(&_l>)zldbHT<^*1{F3hJfU;JspPB+-y>?=_maqum~xyr{+JkvC^b6f{}#1 zn&`-oJb$rUQRkzE|BS5oIKtgvv4B~|%5wdykDQjCE#_T${`!x{YZFPCHWu#NYhr># z(Mc(_og|I28Khk_A@OEMSc05yTkd0I9pn@EWA9up$j3`{TwU>-?k>9bUW1M3k@<|) zBui>s+?1$J{^Fmsu22qFBfMx?sc|`8)R(np*%|QGcv^(0AyM-+n?CJh3R0PsSnl_> zcH)40`OaWXONb29-1{es#V+KNs6d}rkjJ&v#5E^cqs5j3M)8TO?(g~?fi4;bLks_= zcrZM6$QPoS1ATqO>6B7Jg6SarGB8U~>WQ&o;x!k#!DdJZ`{K-nhuo*?Hj>8FC|*87 zX1%nJD4aue+#utYKN(rf2y3R&53ZcZ(%@WR~ZGs+&moS|n&W#b?#H4#NqVg4Dy(_{kzEMxB3f zhl?vR-aOyh27P=axYFUlI9hXr>OS^B7MgC&$^T1r^6?2oG_I%kUu;VsAtr!PRz~=Q zr{Mt``hONq_&3=I{=Y2&WFu@;_wClKx&N}Z;C!(^{moPRhcD$u3$V|c9F|9H{$aoU z_247)mHQuV&EF4AF#wB8kLPHMb~d~Q)D7JG zC=&GKzuY_@cSMikx#48WxXyt8huYBmv2bhw{Eo&WO#cUc)oJ_5dS8BCUY;t_;^HD69-b&r zIf%`Cm_kZI!aO!N>t#}Ma!+4hVOEfps+_GYW3et|l1$Kco{NajrR;WoFQcR+jDShc zx`oXX>aa6cTgoFZEuD3C<`DGtYsO5a+1!{z?IYHbSr=+*>ajeGh)5tS5b#-MRgPW4uhV-Wb_#TL4 z^sxn)>OR3j2Y(vm4zz{rb2w^FPV&R{DorKBzjA33(i-+eQOeB~>f4#e(NIynORTS{ zelkLTxDpn9p7B1jusD!!ejoH-CT7WFhi_ko9dRWr#;9ZxgfcbfYHWz{2?>=Q9I8ZW z&UdFqwwG6#F>cArHcQYY1l#oEx^*HW~NlKEkYdl5!K7Y08TcMeAPd6|HbwK!X-RK*#tCo5e;=S69!CL^Hfcj;TmJcFouC9*>N6fz#ZA zLQFI48QV8chXmzU&(C__l&T;dOqcs#94^^0q}<0tDZeVvf&yH>;Zk!$DTJ@*>{^P$ zGkbfbCIl?jsw~E~Hj?eA$jQlLbBl^p-eR{YAZl3z6TD8Z(iXrHxS|Lp}oIujm_$61%)oQSl;jpIfOYGoxs#iVbsDny_g{92} z&w9#TTuI-)55P(I9O=S?Z?ghyL-Lzx?ujl2Kyrb>rot`&n(v?Z68x zx&Q3o^VGvOh{A96$NdsMTY~zZQ(};CMcCG_6Ts5^DkkL+OQe~aR35Xxq>zfR{{@5! zPiaK2MoPP_>|6_moo=WR@)P8OX7Umocbf7o7sV)L-P<$8f@9vvp6~%`?1Y(Ou9)rx zwZN&A8W5e-tk2XPw;B^o2Jb(mCDZIQR!4uC(&Hu}TS%=1no(EK*x8MIJ5o7uvfGmG ze!%TWhmemNHOm#;J=0C*9zy1_438tb3_EO*&t#vF@vdh1fv3thYzeBNqNS%-p(=}# z@6zaf_xE}5*V3B{!XI9kZQqcrep5zYtv@+{9Ofq5HuNxJSWX#tTpMA4PgG5@`;vW3TvKp5EhDj2E{$&nc=_7j-#^xfY=3@FJAkPPs0?d-n}%xq zzJQiU)d+i&SE&uZ_#eTA41)*Kd0csFuKn&Sqwd zjo1CjC+U}_lQ%=kTPq-eXJ>0Brlzyc%~Dnb8z$SY0tFY(w#TS>@>=akOwG*hx80E` zeBcmJ|N0{|f~b^h(OIjOKkb$gB=7biTon`;1g0y;DioG@jiYkeUw{uDy@R(=&2&~?0`dS^dQp>I~2>!5lb%< zZ{PGeDK&{fV2ko|a@SvxR~?4!OR-(B{oiV2tT02 zNM2}dn~Kv`7MtD5D9M(N%C$<>)AHUQy4x9{g(Y&^B=JUI3hz4UGx3T(B*@6%w0|%trOu=q4#_J+#G8J0^mHkc{ngbqa{4$X>&*{2O!bJBM?viepT_)UJ?KJjJoJ*?7QF9o z7ie}k3Jyx7yb@pvA>J4BpX50&65blkAJTuJo_M5x*0J9y3zY>?Ccg6rVcr9q@7Zcp z!wfVVrR}OJKX70ROn1Yh{2aG9Yf9gH!Hn=eKk^E0@edtOM6>3CFm=r2IqpIZn?vtu zr-$Wf`Jh`_2h_M8A2I{ew>Tepjt-GrWiNH03o0rx_^*&#PKlVcOSWi&*_`$?2-$W} z2JQi{sWJFOPag5S=ib}{ESGwd@xF;p;$nNJu+&MgK0{5lUe|R!_Q03-4wl)xv%({_ zQ^M_bwsmEUc9P}=-M+FD+zBo#Zis?r!>L~0+R!ue?G{zeZ@EbfEI2Qb>Ib4dQAP1U zFKdA3v|F4v8+h}Nl>%lF<1bV{FOuhDzTC>o*}w&rh5X*D79bnq2nWa2+}*A79(ZKDvn>@PM!LP@wskxJ1h*h>&TO*~#QQC;xuX!G>N zxcXO%fhQ9xg_Ow{pbIl$TJF8-?E;rq0)hyVKbp*q z!yV-4@D6bNh8Em6TTXrDBu`JTMfE%So?&*i>xyD=QA~awm)HN$fGH<{b-&XcKc?%v zV4~aL@UgFC#Zr;~pl(eV%lqx6|A`k-y10wp9q;YnvPrxy0l7YWHRr7JlIQ+PAUVf9 z9LWMu54Pcyjtdi|cEv|=?fQDBX`?uBiU#{kkfPK_uPtM8h>-FLV#Izb4Jqwe6rsbqvQm6=c{-o^4N0Fl+JaRc4C(ynS@j+M z`3gOB`w>I1R*MIx5`KC1b?nHh4V$)Ot%^Z59G#+1wmV+B$BATocQ8|P!iSW0Qwn(` z^Q1s6WBlyEM-A<{V@EmC@ks|v^hG+~awpi_euj~8RpzJnNwD#E{Jop~-qJG85PN^` z1bDS_sXVzYtGVw&i6~RDv#%-pi$YN7ek#97MX2$KzzhIEqNIPvvG6c`z1Vv=^=X0TvBJ9r7}=V`3T8f1i`T52grX zc!c)XrEsR<{~lAo(`#uTA7;&ye!_<$VM|oN!5c=Y!&L&A*9W3TQ3?U2x?DGa>qZZn zeys^K(euV<=G7kt(t|@mArr@UD)wg+^gt88@LTtQD~kU%?Q8rP8=Fcx?fSt<0W>B_ z05oxeW^nPKHwqu23Pe=YXv!gvKbv@s4m9D4#O(fHz}P|*nh1yiJyB-Oe>M??1T@iz zkih>?5Q+$TV2+G?SoQyGq6b0qc_adjaDOny+N(dl;3L$DoAJ49wOBb0^c= z0wWWiJ^tg zgnukSh6>;{WI8`Z#zGvxaC3~?_yn4ejfrbh($qKh`$HLHl7!eu=&M6|{#*|sifW|Z zb+UGvwiL>GwMwZlRaNEJw8cpFr!3Z;4LdcC9fImP00c5yVbbRkp^#K;SiLb-s6Ir* zZW&`r39kEhWjgV%PBlF~exlj9LPHiGD6zaJY5L62Q=-(L|D1mUk!W1Q?(i(hMp|t{ z(|>kiwNsfnZ|S==5dZsv2fDdu9Gs3$o!j%2NN# zmTweVjJps}mAeWf&cQKf!$B*3$X{J+yc30NilTTfvBc=))TAxfcd)~Kz+08j zI4jYG%nIHehX(+@bgRW!ZvE22?o8!odIc}w2-^V4dAyQrQHRv0Pc( zA|A+knF}2I6KS3onziN~Uob1f1)x6)p5C?Rf{tQ_tJ^Ayt0X+cpnG7{kQsT?LL{k{QQQUKfBF7HxPK1hYr~M6lHo5kq z(Hs00hSpot295W~>l&V^Gd3ul2<>SgvY|7~4g470?f4A#vi&Sm{ZvvI-v(c$h@a~u z212jsngxAlK#QJfjViWiiH4QaUa;xm5b8-0epO}~8NKpaMt_?`pWg{78RD@1ovD+% z!LYYoWf8?vY#W-Yz)I8eJ7q0~_%Ey8l+?AKoSf|KRSwmJk@C(G>U$Wf>w8uwZvY-vjlTEo z#Koe!T{4?Rl$ERXWKm+%*{JjdfZ8-H+bwxsR--f4wRVM(T9JEQeebIU+!Uv~>rKez ziuX9(R^Mc{BrfM6fcY#8^6b)&vE5$}d0UU?DKZ+&JI&ebA9~+I&`CP3(>``Rf81>~ zPLt;Yf}V}Z>k6erM;ifPXjQ(6(l+pQ$FYG_-YL9i=>Xz6330X?b8(*k82F~;OQGX2 z@IDsfGvn#4k*xg@aq?=w!I}-@Jup|-bIrNFu9LY&`PT$}1rb?v9loP>+#|Kg-*}?E z#k`?M#q*o2T%SsiZThj7M$t;dH@UYsQZ7vQY;V4OFD~4FndU1owCWoY2-7lQ;xRk( z_NRTzatk6P`0nk(Xe!W{-R2D3DUKjVucrP|$>>sEL{>!quZ1=brg66!H;1+fW zFHImq35wq}A^U)y=_DU&W6T#4Tyzcj$6D<7r`4Lf1OBdi&u=`jVRul2X8j=s55CYG zwe}(de%;$NO+9R%W-`QbsUZ|(y18|`RreO_>)xUMT>YnxBRAySt}0L6XV*( z+Ijn6+U2I}jbvRi07tG$$1MHV%2DyKf6^V%eg?^@uUoj5}5M=`QvEB7!yf=~8)rNB%4hc=k2iTG;UYqA&AgCfa zG%(ql53_*JY|H2irw9ZV$HmHzp~!v3aV_U%-Du^;L-YOB@~z{keILTHNwC7#vVNmokyt4+vzEimg=Eag{Q7Z%r4 z@Hp<&sc}_*WzfWdyNetj1*^3muXRHVwt-OFX)O)NeK<|1s@In718+QMCM#F?EJD#?`96VER+7Q!r@P^z%3$Sf}zhR>U!A&lYJ`7P+2o)O=VG zp6Y!*SX*|i^R7+MeZM+>zvce!Aj_{wUf}x2c&OU?5`f3g+wYf&6pa>ZJXOh~DAuVT z1$JY?srS&UweUG$gRm`aJPERr9KVgQWZ>J*j+O!CG-U6vK5!9z%YCyx#eN8O-6;JX4}=eYLkFHuR0K^kNCIZPXN0 zMu2E6uyE$Ox1cPZtcs3MI5c#;^aG(DGo9m3?oyyYx**E0KYS3Q0Vv3ihOBCPD>l~E zHRgbZ9E&GGM=}5QtD+aC-y~spup_(blxirLF-M9MnIZgsR?z%8A03Cshhd(4+gd4p zr;yuDfyDih_7>?-bw|wKnz`WVj)v^Wq<@tL=?W!=_!WpLfU@plfb7J+-g)@JwRWRR z`R@B26uQ!=Y_Z_?iuD`Xm8P-~00`EZ8ZRoMCk&y*4#|}bovN{!yLt`Ts|ZFvQxT{Z zE=bNJvsP~L`mjzRq2+{BVfp;_vgLmN4sQ=Y)R!2*9^G4<(@hRUS&rBg3>x?l zCPtDEHn_atFcX}cLIRF-Q>0M2Ih3($hfVml9_J%a@fS!M4&A@ixpHnG>@iWIE${T6Ur8JP=T}Aom);gm>tClwX@>QV zyFC-dG@C2P%xPA>8_NmmRs)5nFupznXN`LKVy<`4Lh2IZWLxH`sx_2T~jEJ z-2z)&3A?hc(8Pi=R_ToA<-&q}{)Fy!(^2lTKfmCAkPRx# zAS1~V+S}DMW%W0ZEB1>=TH42UNZf0ZUI~WnxK!@@2_610NMRg!uPZj81csr{v9a@V zCZwO--q2TqK-@T#jvaiI=6l?4>Im(Y;Z1R2oe0f+Uy>(EpC+%4JvYtr%Q*U`*ES@M zxK>#GVI^tWnO_U(6jh5Z7AKStMzuxe?y~30d_T`rb29_NR%icdP;OHuKK#Sum z<`{o87THrs_tC^MWXS9XKsaI`Cagzln@K^MdU8c@2lz+yTae zHX1jDV6DD0g;?`hx7}i3N1rwdpBc|r)@5Gro-s@Joc9bstEi}~+y_AWiWeeZ>Pjcv z!0z|$f=nymu|lnFJe5#l&cQq2{FnvOg8O+{VfMwoy;gve`Vsi`UD_nDD|$lJUl)iG6)utW2hfN<*I@YZP&yW3fO-9FW6Ye;5WpF8In6NF@)=cfBnB&x zkfRbd#*+hFVr}_DpeEtBD6PY^ePY-l?r6GI=n{<(6acZT`eZiw}b> z($ULl-3EM~&96||rq+?#3|_2x3UW@apI%WctN0XA`=_0{(H{mjvp{m)izXBo#LSTU z3Ib6ww`j^;PA5)7pR9R_xqSj8I_k3J=!HmEEouJ5fI2qsv%n)$1sr8)Nyyx z5o>xxS@RqWds*F|6c+GroGYY4ku_o4g{sx&#HpCA2y3Y{p-}tr2 zQdT2uAY#(3z|h%4y(SGS3qT6bf8DE(nzH+;wI+dDpCjszjJs57sHGrxwJM1qf(apN>&Lig3OA|JMXT419m=nmJIISI>BSNj+P8#^4bB>UkZ2g z5lUC7Y*_o^nZobc#9W{snu&?!$INv?vnaSy)JpaCd*f*G-dMX_T&FL*aKAWPFPaW3?VJAuM z64On6M61drKeVd+7)TUtGAE6*B+xt?cd39`IynSQZ(8J(8+@x|jQx&wbXHrQZJ;PP zm9a!H?*-f62a>C?s%&e2nbw0Z`PI{bEthWKib)Zlv}j7 z>^>t)e-Nah1|W?xQeY6KU80I2ooRm-ygBj*YWo4ua+kwB=>uN@9uem^;N@g!o`jYM z$vGfByTr=fey?Et4-^28*egcyrfxmtf#&?42ZhH-@5Akj0?-Fv{u$WE>iYPURZPLf zk^dVZz$4NX15j3u?m0cz-#EqZV^+n90e^{w7QIKNPn@FBt9JT5It(C{^qF<_ z=g1&dJ?Yr3k}(y|{nyQv#HWe(QIO8dQ1F(zel(AMuR`OihHq)1@$7;8bU@m{;dwDe z1pS||U4$)w!)@1e(J(y}i9$gN_&5hqlH=cQfG44b$B38MJDk*i!gFv4v9c6}WgjAP zJ9^ddHS`{Ii=AhU@WV6KCbY8gkCs}=f%a999=<7*5ru}0tu~53^#0GaKnxgvxCj6O z9)*S||Gb#QVl_LT!+p?0yTwa)l(0@JmfmWy=-Ynd*o7n$I?^AYYVR8bS_EMv|J~D* zBA9@?27q%!H`jdn^vULATwiAWC5;SpCj;)m5LL8%rA8R|2Ec#U0{9I^@!Br+R#dz{ zw)668)?VpxQ{`46iw*u$r(R1_Y%>JxPLk!GHQ#Z^_ z<}_`{C_yi)G9d4bhIZ?Yl!?W6*4~9VqA)%l-@g^(!U@31q5l$n4~;s@*U6r^&Njdy~dHy z65_HLeVq)%gQ3sfw&O`S?oE%RdEdFJckS(2D;F*RqzN7Db@UPgDNvI98?~Y%JDcm1 z_2bKx6|W4eSv$GX|jN4gC{`$ zV7%hluNsrV(mvkqBDQmYAKsg(+y`8fYJIQkPTRT_U{9UB;%W| z?mgcg>mC=b@#wUNT&B720}$J#X1zMnyJo9AJ^VaUx2^9$jQY!^FLmR4tBNH2_mi)3 z;F6pbkDE;(O6c>tT0u!>w~D(39Ge<|^HhIK=KAX?VSr8bgc_p(`sSu79#niyE`@6Z z?-wbM{&xEDRD2ppFYfnFS6L{-fFNowADm`i94dHsl?8BNX5WR8SQvGMlmnA73;bsX zVWZg-Haoz%v==80e-^8*XOX0*_uC^{TXLMztyv4>{jxEr{m=pdTa`pdtzC4p0$c#t z9`KcNAR|2qz%iV#O~HE$AS86yT?X*BkB375W}~c-C-gJ?@}!SxE|A>IJdnixtJQ>Z zUm`+3zz6B6&L(wP_Vv~Zw@f^3OV%Uiur^P&Yp&1FQG!ovRxdQHG#${v&I3mltTXWF zW*R75Z-d?fe5z)CAf3wy=W(?XsQY~U!C4M zH=+^6#(TGhCHr_kG`b8WwAaObd0J~koVI&f70q{0tK9`i?SjLY>~U;HtBhpn&Q9KB z*?w*Kt?kki-o0h5zHu?7juwEDHiedJ8)Nx)7tnD&^80tbDGhq>^v|2VY?lI%m#rQV zle)W2b#8m_!qcQ)Xu(Bmu2T5@#Oz14RmlP0|8D-eQDPwwmIYvsM<;FScFDR;&29)>RMMNt$VJw3>6>Ox0!P z`t5pME&J=nD^~C1yBo9RPsqY+o~i0`or70)Cb_+CTrR!ZuO2f#3k_?@AF^~+F3d&H zyxnd>=oB6M+&5jK%Uh^jTe1MS`MC!bp+xKz090GAm`UI!oPTmE>9vx5P_hFpXjRfx z$7e2}R9TS1rzkjAykv{|V-w9;*nFt^3T}panp8T+Z_82bIbO ztRI$zI777_PgH;jxT;C0EJ;=L(2#K{tB+_Y#xHH=Y8yx6|n44D=&VUu^n$E3dJhVFEKdvcjBebUtX{UlH4kMI3XENZG9%`g!6 zDo!6^8f6baQk`cPspOI@qrrn1T4%cHq`;PlYfXpIQx(28;nPRb zM>H@Ak@+LT8KH&{o7rcsRs0m~&rEAfG~kMHgII|lN+3irfmo6G)NqlUvPh^FJ2#1Y z{m%rok}!qECAOCUC1qT?@Sho;ST%}SAq|Tc8Xx{>F{1)V$Eww^51#y)l)MFV;^=o)G)kp+P8b&QcI;t5F zmAS=bIp~$>7;pBmuCHA$7OleP=4ZxqC*Q;|I63lBo7wnk-tt)#-Ex^4`x<&YaOpC* z5G=^C2d^CqWbZ!4u$wo2_Pk&J01!&T0Vkk7H+oa`O*~I<<1(WA`Of;s_>>fD?eyB_ zR%Xw7)AQadE~}}M$0t9Zd|{})7hoTzx?}ETlW~2s&3i8(@YIejMChP_54H}@sbS);U(fB(mG-B)HPgiI<+S%(X754jQ)FC*};Q{u>X?H0$KY?lU1hZ5dP6An~I9tzmK zy1T4WE!65@th<1BU*0&KhwVFU8-sNmqWN79Cu$4^G5Q7us>2rCrWL_Drc8n#A-60h zMH9tKKL?xNNAP=H#&TFeMdzGgx;CrROncx%f$GlFO$|A0ybJzaBFK7$fYU{+zjgAY z&FE-|u$_*D-NGp>=Sv72!=Lo}l9_Ou-%M+oD~H%UEG2 z=sk3?wfM%I(qp{K6IRZk%eN%A@BGQbHXZZ6lz4J;yw9eUGH`C4Q^15ZH?$IKiR3-I z-?#V$Uc#!UCu2cyYlMlCvxNZUN>sH zP9K(*AytPTcL`Ic@Nj?j7Fg;+E^9W)ng#NrQIOj7J&9e;zd3zKuPhSlOI3NXMmgBu zi?(wrH5JP3uDS<)I}X)l&Fh{!7=B@XZu^Wpp7X(;5P(EyEgG#!Nw9l>k7%n*9a6r_ z$oFH`VTbH+_4>TKbZ%dr)GCnNJCc3Qjd%Csnd=3V^>R9V$%6zjTAS-ty7(GHZFxNM z(jM7K`6j&h%*~RS25k9tYJiX?+Fs3O8zXGc{nDY7w`#6K!2OUi`TA5IL^$GFu8Bg( zueCqC*i3ev%kKuGR5Pjsex&1>)7kc|&6%0q4D}&KwHsz~jLF*`;=kuth$0k;#c6Ba zT|`-=jKYoLvsTCN6lF42I>T|MY!X`!5Cf=fou$juo)xlO3uE~x76y-IJ-Rn_Cm)}3 zvRq<+rp6%9a>RA)>)kjaVyQ;2ZA^~o-nB7wJHZI;?if+L3IP(@zc!GI=T$k!H3dZ` z7U%%Vw|Vs-I$28gGIMmC_0W%h8B9W=8Nv?FL+O>b<3 zvLU6u86cPD>JAwEAhqCt$q_U6y#>;4sC@W-imu!`g$jaV(J4W`F z9D5g%3RxkMnZ1tDu~K)*-ef1q9?721`|A7L;rsml`Tf)FzHnUUe6G)Xy~c-iP9c!o z*skczp=E>yorS3r;uz?QuD~SkKwRfCLubhmSIGO_xJPs!>CEN1r|_K zZ|u=Sxx%s5yyzciMMmtpRoXznshd^fJy(XK&=!5Zr3G30fI1dZZ6JNlx<@a3upND=48@5APJ>F zE~q0rwSehT8t@+uO&QB&dzH$(9K!1agT<}RGKRM z1>@h%j(qarbT}-dW*CENk9@sMoGPlD8H2dQcZ{H#CHu)OJKuUL>QQiEEpz=1O zHPt-U-OO|(z0hloaHw;H!2cHV*z{JEmblChtZ2(cojXY)kX5!;9av%|Byelaw6{t(sl$Nbt;#)JBCx9J+WFHAez3! zXD>2EkN;2>Mt&u7;`j?G0P$Gs+-Z_=w=Rt&8+4&q0D{caxyy-WL0CUj(%ih2(@!8TCC&fwk;+* z^_nX_g2DGw$gdPSid!r65{b9rt`d+>Aze_w;WziOiV_r=9@kgS;phK$%Q-^ zn$;d?wd&T)CiJrAi3gy*`M+<9xmd)J*w{%GcCUi(6+G4#e!8b&qGb-xN}hD+r{aU= zKwa5C4TjIjG3*pLF^P!^*QEsyN_lA-_y{pN8f4tGcon|aX?xF`iU0i@OAsp!0*=h@ zVEl`;WX0sI-;cIr27Z3+a!XJC1hoJDQRjjemo59Cqkm*2-b4KKIBjrr9b~UU`_`bz z7kaeQbUTi7_gdXS#z$USxdAVmd&GM3xKG^geYZ&Zss_Tn+lv?>pvYs2)n8I;_v6y=g8V z@jF!M-vkUrJ8@SZs9~j>Nb=}`rdpb%mKi@|qB3h7VU7ujaDw^uzmLzA4Z93}s&8&+ zC<+ta`%*TL9q36b>=Q5#VBW9A&@J82EM!Kgxe1?5;B9rXa#zOc9z6!AP2){ zYRXVbvj08Vh7h~Rv)JRMfTb78ZSQua)?RpP>TD0m}zASljsXO%SALh)uh)&9nwdeWNH5Yr$ z&>o?OdbXx(&bDqKj|`YM&UsYh<4rm7wJ6Ie->`O1ss63{>q zrjL_fH$ph}Q;o$$V|1Bm!};>zto)X^oAumt4~c~eVK_Q8)0<}l4{R~eFIw#u8T)H3 zj~jx@7LiGyyk7*akq_iQDXC@QQokX&(p2D~_bP3-whFU2=+wj!debVR9#!p8D!8{X ze*fmXth1JeTGZ%@FZeRoQ_4z!t<>+Gx?6e&VYtE!Q?aUwdL%=Eh6aeVgOfRPFzPN9 z;EYOB^afUxCQv|JbCm`4LBm?TyEeG+GSy@Yrgh`bZ;pMpw-xBQU%Z|#P8p_mq{t&PXxomy!Wn^3u3T5?H4(f_job^UC@ zOfS?~w%`8^;Whq%r$w*9*5#$(=8wqM*$64RqC}U0hTA?X z9l`m{i`AWS{n7?g)wQmW4kUXA(|LeGskbG+cF&_+ zk;ne)Eo_oH6?ZM}S-$s)uWWXvgk)xW`fhvEE9jc-kzTW(^`?((K?T8_vj=xR|*nXNRvX)`vN z`2Fo6G5>h1p^uJXWtvyDQi>gKRX&e@j8r|j0_Cpa=(dUWhIYzW$Aku5lNP&c{UxfI z#c;8+9dGUF_%j}bvBi%#BvCVY*>+7X)ztUtMQco~tm=$Q%mxPqM%HL`Ixp`4c}rn1 zslY~HvACpi<30jS&6kfZz`aqU_%uaQc7s&8>4^rv@+R+K=-WTh>r9#IGA#{glG^n( zDzVIEqYJijgcUN=jQ6~qx9?xZ+kfElk0q0hu6rDqA2{VU!T3xaE3Oudp+@u`S(=}wtkxtIP^94wQ0G# z->lx6Z}Ba-AFYHD3TjHdpE8|SKJtWk3jkCgCtCH^czbF|;`>#5u9v||wU7Ajd#f?H zeh*>7GOWSG*|m!?Tdl*%jmA)`bhojOesTdj%SjoYl>L z_vEbKh>c#Sn@52#Eluf}4)snC`j+6fiEH5#_v)s+$muhrJEMgXxu*$g73VPH9U5jD zUUs89C9j#M_`&+R@7p}iYO=#I92Z*5JI_vbbT(Hj5_xki7JVT^iiAG4-swlkcJounZ zaF`o#!2-axD&DW~7ioxO{tQIpbrKCwL8mA zD7JUPFAY4V(-#=tctI*rgB%gwq_uCk?FohKaP$tmiMHyXaua+e)-+sEmnn^( z#(An3j%msAq6Pz|rZoW4-r+_onmR{opTK74&&!?kEm~((t_EK++K8gM}ZG9J2hs zA_E&!&D5HfOZyCFf2Oj1*X1oe??#zNS?UwCZblH(dJ0E<%1o@#g6MUU|oEn(ldY zN`B0>+YOvmO4x4!ghM{+d9M6*nzKc^PF|fp>Xe=M?BBUp;tE_#Q*QDnrSA;_Sr>1-{G547vBA zP|)ks6YI*Bkeui|jmQ9qE5AQs+4_lV{6Q z9pfbBBV^1hR)W(%=AZ#QTQfVx=`{p6R0f50t#_m7ET5OH+TNIV80XLzBenWmAd2iO zt%^3ivHQ0Vl{l9z&u^ZS&!LBHj@GG5a`-d?m?aRDw-e@pqx_4I^waPOj89Zj8GZk( zxYl+EsUqK{F_%1a-UMM~cC<>;M5>7Vpo7~!nP6LZiQ*4(k(}1)mj!J?^VRDkoFYBT zHlFRSx&>UPX{Nm-wkdiV6=*Vrh^qH&8qMGJX8v zbK#Dyx8t%Eca}pIw5p6ZG`973t%M7T&CSi@air#5OGh+#byy{4)l=s04(hoHKAKGb zg*I3NV&^cCCaUjx>D}OU8|+l_ygFKMJALWb`^n7Z!17ym>-;CC_0=dVFr!mFIk5u! z-CR=wrLS##FO>D}@nPw^iUhnCavp>@3U=ISeSDEdy}op>^fjhN-Q2ExAd|VU_lDAT z7a)zT_!%_@Gj8XE3N&@dNMFKJ4zgEH ze@@U3^;0y$;HpU=nqRvx!8J#ww*xG5#Z8zxYW}P20nkPiL>{>A|iXxeddv#XtK*yf`8EMJKbwz zQ#Wl)G&iF#k!O{JfqUS3FON1(xbEu}yvyp+$7%V{5^87($_whjQO*qWUyD)&vQ+$1 z9|q+Iuo-nU6uiiPoMR@!beX`-`Cjr4Z%%bwWp);BsiHm&fV=sfGk)2T=Ub#!HBK`0 z7$;$V_sNvKP?SU$E*DT|M9L*LTl3RSVTfiPi44a6OlPaZ8l}w3pR}iC_EseU67}S} zhu8pWl(S0H>(S>u$h?h?%*f z!DPfgru^+qvGwrm6-TIKPK7Ou%x34hcKAp#aq*w~z0H;Qv~hqb&xCd*wFZeKcx28t zwb_yC_!R_eyFxN%T|UL0>kA9wa!hCVWtL>R8uYfWp-=Y8gegippA(tYc}-yNyzDy` zNQvdojC4dzg{Q84S2T|v5uWLbkGK?x|BpSJq437YE9V_ z?PWQdKKQHHsnlMrymiZgZr)_S!on!a%3g_|Z*u~!;hXE8Y*b>}7~55I-c~Up%`eEl zW=xz%$dMUi_!FC)PWZJ(ackLHpuH?@rw6US?Nut7MaRP2ZpT6}^I`Cw^T?Q;#5NPk zs2i*0NHuK8ytHQa%j|ItMHy-q$ILB`T;vrn4i-}01xUw9mbY1YKYbnAaAodlsADH~ zebB(IVr2Gf#%`t(zvf%74*ql#S}`yoHi39V~fr_X015K65Na%?-kIJ3?& zP`|aCMa}YIRdrBeqe{2_AJmmO7;FfbSKy!CW3j5%LNPKLGN=XL-ltrlM>qKHjhm<% zVj>FKLU~l$UJ8BGaMaM(xaW)WmW>sA??AN;xNb2eMnz-E@2sFqBW7u{H-Hj&ot4_!G`1J}{_zCnDG zj#hfV809_u3x_|h{d%Gsi?W)x*4E~v)k5-Qy;`+ur-s_ZMA^e+)*QCv00xwTrVw^H zQ}ZmEMSZusLEBj7Bt7k!og8|liT2}KGF`JuT6xj6is5Jtl$Ix2wZM;4zufyaxi+(v zK$o+RfTm3dXZ)0P1r82JXwABesDIhzL`xgbE`KE^HU3l9mAx*xi#$sBMNVDIGk)pz zDg+nEou?jjtNs2p5z4={$#y|2^tB=Z8H0H2P3*Jn=??|gX6-W7F&f*hVQaC%j<7&e`E9H{@MTaQcxp)8nm+!(o!MNy}%$QhVR!vg+h3 zW)HDkT1V9tRCi#q4f!j5tRa=Upq>skE=L0Nvj<-)>j1gKU?*xn(C-u=h_u`RatUX_}q(BqM=-H)~d;SE&%2NN?H2VT#n>XC2sP zc=HKe2|Rjm$n%<5Gp~h?Fv;qk3@MwP@|s99dAf#**GiecsY{TCqK>Z)i(u;|x$Q)$5=0&oEQ|`?fOv>~eMvfo=EJPhzK# z6*3ZQYP4FHzuvGQ+1!+MwIbbWB6cw=`ZE(PL$|kS`7nP4MGnlHTB~O~dyG-l>P^Y{ zc(d>Gi{GZJpp-FoD917Ug)3@ISFBZ(`J1zi+BQ~Q$CW`ZzB|XKe0w&3sl6X)18?ukMu$}plH}E^MZ92Ao z#wyI-d_~5claROP+##Y>)$>da74ajVv#BF(LenN%SB6``SvcEWeAWPs-tSX5w0VZ=a5>h_^!Gv-vaGGvUwQWZMvE zV)m82dqOf}6wvykvp4~Ye5)w#Bn3O%nx`FH+hZMCcJ#(t_~)%J_1@R#bsFtnBh4!y z_=@&9uUOo(oU|*|r{qnE;_cxmy}+W}USl{If2-3yXsu(w9%H!nU*eJKxrT~TgY(^^ zt<)L>f@U!pA+1`2F=cl1P2GvhX^~3BnMoe}K3>uoZ^@>}w{)8^>iGEsOfwHs(&%pR zQ>r_h!hbZQnI$5uo9X=YamJL#(&)CCmcw~kIrS59(|5zylpy~IPpT0|iPz)i6->QL zTUM*#>Z%!J8Wn3fX{s_S{(Grwt8Yq3ui8JQ{=}x`9sFhfpVkTTQ7Nlj9emW#hb6_x zR$pWH4T>!gkxa;!s=xN}8ON^Y)6i*T6*nVp1Hf;Gtlf#N} z(HtX};#=V)wpC2ij z==Z3ckv3O-eV3PHPqAxjOeo2*y3Zwj5gq8RCesyIJ}y3}=C+CEQQZsKy9J*iM~SK%)rZm9>Wd$ILi9h_$6vM9`Ffp5DeC-uWK`zf z2QwLNyA`hA~RqI6X=0P2VavD)F1J?G}ID{;Rh>8;c(bI#ypZFHY_3al+4(Jgv`wd)^wd9Mj8x?!ibr}#SB8b|5rONT-lY1Z05(V`rcLouz# zKh}9Uk8E9hUBaG1;(q-fso z{Zv#~g*NK^D8!3Cms&VYWpD%UE0f04Rc%c<(OqUXo#i}voSOljXVFQS0iva>v1>)O zTspDOR(zm@SrI|LtIS@YgM6bCpBLm(dSoe;)A0tuD>g`hM7WKcNwEDrZ5CienB z2bOob%w$I{E3d(2Gl%9QTy22J$pF1+=(+pm$ZPu-Q+_E9sAajh^Ir41T40E~nec<3 z2()+riZF!V@t6Pfa7=jA^ujaJNG_x;G)6k4+ad{ z_V)HH6OxBn`B8Zyn*HX6ZVMm>xwZS))j-HwjZo`*g7djA&0jD8DClWw#(+fn)|7i* zP2XV*NL7!)>bNmb*?vcyM@&If%J&Kk;iotYK z!l${57C(LTGS@jE9FS^q9o!FsAE_ELuw53VA|;Z$PW}IYW7+_YaT~ak9XtmJsIorrdZz3}BC`Ke!rx2KUm7^uk!X zX8?ovByCqp1lKb?u0ll82p#;j+xOF+;M!=54AVbvAoIqdiu?FMzmES0mx(0rAiJTv z!4ynDyq6o8fc5PG7+qc-0P8TawwmqDd+<>_HX(t=w_wq`bAwGQA5&FzNBFT89`F{K znCd~=LwhZB20K&nVy0wf9sD_lES|+C75v;Ll0obF3K1JFemwqiBxm6oKu{BtnQMcO zex@F?2P*y^Te;mPv0My$5dcU7os4qxFkW?X-`KQ#HN|E56^!NVnmEcaFfi{%peSJK zcNuAEawx&A<%&K$u}~6Z6Biw(`c>rPicXXCfmDv!+dsFnt=Rd&4q`CziP8`Q>~k2Y zm$D84qqqz_2?qhLxMz`wjzK8u$mE=c&oOyBHzovpqO<`)o&%hv+;?Z39zhueU{If@ zkieU+C*mZQ{0OIpT)|%rApaqW=ZKQIFH(`eq1!rhE8jyOu+2fQ-z|0>DH6!AL{O+6 zEIvnw`pVjiOr+G7dduwewn0fX_k=Cqky6#bXVZ*Q-M)IYm$R*M0o!EYInR>-U?(At zD=0&{v)w4Mqr`hBmP4~T=8c}dV7Mb9A)MCyQy&0XM2-f z|2;xY?}8EDy0BImjGyYTF7wtfB*Vnrw7}ZAf_8(~Yr_%YL$ejc=+tGO0hr7T;pfu{ zdQ@0_kNbV%;K5MGQ>_Vf1emTDv806|=Ws|-3|6ba02zm#EQCp80=6WpM>LOx|Ar=; zEZ`;bb!pf-tBq&3Mx?K6vuXs%%gTL&S-cBcZ`BjD-8?<3fV2&8RxRD_a+M``(kifc zM{9jG+wc0TZYL0x#r6XlGQC`Z3}LIaj;+GVeFe`u+mrNOg*L`&Y(sGtudM*%d%)oh z{m@JD7{Gic0$OUpBftfi`SntjFsIai*F(--bp~+(3?ubUO;*i&GGI{3F@vK7zd7uZ zy^w0Xi)g_Sc&|5GgYA~SXi6uP2Gt!-l9QhfJg59q2=O=`jb+wvWHwl8ySa7TWS_s$ zGc12RQSqL4wp!+MUmGeasz2lBKZp+K3kyA z!efb1IExH6`iN^q|xz6*0SHG2GYCOwX+kdy5Q>7aO1dU1&PW~Dk(b5yy zfoe?`6$i|dJZ4z>Bs7}disN$teFfaHs8|ll96K;o5}7`o<`vsv^8EH^G)gU; zQjlux%*l(6eh7B>N0(2kUdmgw+{m_Is+o8B3ZANpNL_pQB{6*x*RRIGI*TLKsB(Gq zggV{E&uM3vHIXgv6c)9-C4;*Wyb1F?$Pj?f)+re^4O06nZh8j}!M>0SdI_TG07 zEN;EPWtcc>RS`=}rg!qcO7oM| zI++pdx9t7CMPbzU{sUUxCwJ*bx(v?uvU|f)u9n)ivudkzd}iY~E_h60_)=&*riJD0 zvOh{@#v{d@1BLCT^Vu-&8^)-lO4^eNzLd!e7s{GI5r=Mq{fNB(OC{YC!kE5ne z^(`)K*Q#cK3GDz7UTlOes2hwKDJPNtm>#JCym{K>&h&`haOIR5--Yh$^ryBKQ=7g8 z$F7uO&dBonX8fhPu||q$rU*RlKC87-R?+zHr{aHr+T*$K&LV;!+waCjZtIk1rE`=l zYLW-R6NnGrYY^hYU+(B1QUo&!C<~pdS8g52mkf50FT2b&RFscgPIiXuD%Te|bhP@w zK)#eu(2x*4nnpVj-X2QH>F-_t`K?Y#;O*IIlH(uEg|b=H`#T3akA8FXN7pflL;dBg2N-xGF+;PcA2G zet=!31EC}ICe`>MW=A-ge=-PjX3y_3rr&8M^T$v?k#hBd{49_3*ne-&zmYLK%JUQ( zp)ppXi^ z|KIKZeQA-3i0DnI9R?9KUc`+J0{<6;xrVhPl20!fdl1!LbAK*>nE3w-ulUI=kIk?| zAmnWoErJ;DPrmUBLRb_K0Zlcs)r+8<(<{0c$Ya_59%7yy5Fr-uDuHrkk40i+TO$+D zu7qr1nIHqNy3rw3$Rdv|SbZZ7E5MA1w|h4cGg14kx#$Do8PMY`)b9Ie`Dz63Zod}v z)Z8$$IDYUpRK*x3a6f>IYXlKc4T2EJ4sj+ypjJfNgz(o8E*m)X3RTWz=hy;HSb~_p z->;{&P!e2?>M1ZB9VoN2K}dFpdhJWZWjiRS5MLkIOOv^Ps;_~w`@3(yfbUm=n9jh- zH+F&^D}@jubhwk1+XOLdIDkdp z*xe-aSq%Plh_3`}>9iKXNAB+Kt)h8>1T)=tzk(vTj~ubi#!ztR{?Q+zXS$1;I4hf< z<@8n~4p~Bb8zz)fb~T$n*Wh+5d;di$u>7~yaXL_1(inDSH)UbdjtH!PM9djZ!SN{U z&hlfMIsvd>u?^)YD}-XL4XKMLzf6y?q0jX!0r9R5jOylq%;>aE=`z#ZP`V5sK@+~e zhhy*pO}Dqd_twgNlv2-Kw+6=83eHsBeggLBddNL9*yQZ=h(i=x*jVb~{!dZsGYN~7 z^2Dgqd$&qIXHD34Z!2vVJlW+3gr|?EAw%zu&XWNBQF$Lx3-to!68CfZzFK?Rivgkqhq&FyU90;? zIpEBK@q|RF#k+$C2fp%8BS@3HX{37kgVV95Py+m zqX~yG#1NL=S*`D0X2o?cd9{a6Zw*(2~SPpKGwOXXp=cNy{3T4jIs!dJn zZM=Cavp9a-6#vEX|LG$8mLKjP7JsKU%sL^+3;viQenYmFLrUg&^8;;sGN^8IxsiSU25&o^`kws-T z@&Cq>O3s9E=nxY-ASUPa6pX$HT9plSRmDL>G@7phO=XTgQmW@++WcW?NWW_oj@uai zrvPFaR?kiWWVq3Bg41=$IqQ$@3B z#ecSeq`o6C0tTY~U=`P6-uBwAc5f>u(RXi?*Q_xLXH|!iPra?D(R&!(*Uysq>U_aA z1nDHChb|j(k^>cOXwG`~FVj4k18>!|0+GgYk|%3O&>Tpx*Ljr+T=!^?1Va`CToA3MhCDZdsiQE!c z>Nenhoakx`{VPRY8^MW>C~*zG9`AHSG3!wq3HQ08 z`drZNx&V`gQo9O{vKRzfvoS(Y%X{RZ5QStfPk?lXb~Tw^yWLAsxez4sj__@b4~%8= z4HketQ3iYl%C~LUByd=x#{kcKFRN!8s9;5i`wrn{gfgd6-{ie|L+tO?ynD*jd1$@D ztM-buT~k|AIa)O5BX;P{_Pq_#qr`6OO=ej{n`{fjfI{H^>q5rZ=MJGui8#moKoam* zDfSt+j%g6t+{YvPSE7>L!PY~NPZC`Y!fkturC`r`$V|0l?^-s+hYuOUU%fWZ9@|vk+AVH6zs_PcC?sX~aO-U^cY#P^k--(-9J~b(HDR$L?BcVP8CvJh_?&`T!UxIV1LJD_3fi=2B zY)IQFuvURj65*A}V&n&e5CZnb(iksD5rA5vAF^!x&)>J_|AZx+!g%!ir%MWq(LC$jkm{Z3c{!?1P~{2IW+(|awh zB}sS`@!h*M4Auk)MgPAK*}sv4b%OjnE?zD?wW@UhRc>42_@%Mi3kXTv~Yg zv_bMd2gQ0Rl;b*JAFfLCuv3HC9|n1YFkVCEqzM0Z04zN15UT*NqScvfO&pdu)6)hf zcv_1|?mww+>7zH1;ukr!=Wqjop?w9O551{U#A?Uffc858VCN$YtG=g~jvKQx zmi^sfdnD2uEUEFk6=0%gtEnt3G6{w#eu@vp6LB*8Nq3iWuO%u{p2ADBXnW0j`K@Rg z#qPJr`Nnhc&j|7Uq})p8oqo9 z2jgHZcUiP-midMK-%0yl5T6?LPFA+xCvZv`9D8*v8vbQs8nD>_(~~S`j!HOJEE%m^ zVvb!!FcYf*OxA9I2|WAD12zTyb1B+)fqd)Q?0k2ok6OcfBQ9tUYYz{s>&@AN04GFx z>JvfM`FSm-s^fYJLOYt2XJ*`c{W=HB+FFG_J}dDvc*yhabxyWg&)Q6o#C7dNlEuFY zJY=~&Pwn2PzHn5qro0ZR5AD!;SPltW>k$bA?8jXqOb2fmzVgQcoRjPM;Q2uhfaK3B zk3_!Q(P5O7YA$;@XrgXLdL+5}iKr5UUy^U^lFaQ!oQZ-gbK{{ZEw69F$GBQL*EmIjf^m3w=shrzokoHuUh>*qtHp*sJL zc6%QB-k6e^mG#Ao7w0`uH_4wrR}(^dXPH{|1B_yyUNbpK+<-@@&G z`b$l`yXR+JF(!67(I2~*|K1gn7X3u3@V=0ImV148TEGo4yccLFSc<;2t&c+H)ZS1fYg6 zjJXPiSm8jmRV=d~wjQL0sD`khJK+t;$jB7gF_uwO%U$(HbQ_?qy=L+1eh^GE)K%5g z7_VJZ0s~nluyidvp6o+)1LD69NKL0=FGH$}GP*uiTQ8H*C1Ut@n-~&a`NSl*e$uFA zVLJE+v`8}hd%F{$Ly7?Hrfgq6Y6663rA!atU_&nR<_ncWkU(jM6q1AlJyL>+={e^I zN+X+_gE zNte2flyP}22FyV?y!&kjR9RmD=(z%5O1aKmqJdXg>HYov9mi)r6dHg05pR=URA;!C z;nk6w>O<0Jq;fL|HfU#O=bYiNR#=vQvX69MvndE@t_TVao1bRmX@=*5IXP|~I&R6# zpqS|Bej7wpyNAvYnJsnF> zwF6lKa~$fp;d=v9>QxBC%bbYD?AH0+_B^#^Xn3xIwj`gceHIQosdk-3JhZx2L1D4- za=zr8zu39<=|*HQsFt`oqM68*ZKyou{1g052iV{Eu%z@=``muBPp^FN@gPCpe=l=~ zE8gW)!kI_rml~TssNM_6&~XrUZ?A9nOo0kCXK2(tTr!$m-(jj+jk^1`#KXJZ)4}GM zmf@LkHSuJ$slBe{n_}DUVf$ie_qI`-Eryp5iN03##TkspQ#ohI(|_SvSS)!z_4hHt zvu0H;IhCD}*P|-v@GXPbts}OwoBKky_lj6qxq_?S$OLZI>~Jg^e(qa!>)8qFg6SJs z2Rhtu4*qFwZ=cpGol8ABSFx62xZ;0-$mZn*8_%cNwnwKcB+`n?(XcdVa>nT?WqM##hcqeE)vW@Yqf1{Zo8>7=ux=Lm~Ht=zDppyzTR+ z)a9jyEAFR0x;%zmJSHXn?K&YIu4qF;Lj;^~+A+)j|KyJQr%#cmgP=3SUTpu+YD1Ru z;2ylG-kO>S62!I_;V|o+KBOomvnCGH|OOC`g2sLdL*g#AmRY z1_`YY&GJ^Dczaep-~(iVJ*>WC9sV+mK*UFpW7bmV-*$i~^n&-I2xaz6ZJC~~u19i< z$`Nt(3uT52*Aw$+G!n*j;1o%AonmoBLgo&GrwLHoMk2@uo$5`K__#r+Z`04{@LhzE zP$phkYEu7v%E{Q+*jcB1^5@S+0CvUK`>Q?6y{(Q-wr)%d#U~Cyx=A0m6oc+75~N#w z#a^4smX)mmCvwy>cXQTo-+Is;Bv$FrZ$yuTYH|@S_T(#&MV zEmnf%IriP(w4pcBi#y_t$1sh@DzsVuW)Q+~F{I*6INVg?VFsLIRiSD=1Fmd^qC+r0 zFzrl}DZclK;2mh;(%{49UFtNlf)gEHm z!=hkW24+}TSk@MQG(?&KTcZ;&rpkq#-;m22;5g89==gi5;I+$nM}FDRC+>yO-PDx~ zqvpuU%38Z9|B6p##BH1?4h$Tt0NHu*`n5goS2)N`W~CZAItL3e{+wOXk$BR;Mp8U2 z>afparrnedkHd1i7;ytzLDfB640NxWK5#;U95lf55x|&ns`LVqM#zakIMcux^ZEoU zf3y=M&t-Vm{qI$9<%v?b38z}KtxTwwc42{w=g(faF2b$04hu8L{>uDg>+Q*l+po7F z3vN|tv2m==^>>{x;cwA+SO}kNe{;O~8o~$}G|<)6P4{+w@)KT{qb1>10S5I@ZgGzq zEN0A^6OG#YWlAy;PtmC;Rfi6{+Ko@w(qKrMQkQ=M9q+#S+z|I3(bdv@#SU+tZ{5jC zCBAS*%iBB4UoP{K0{h2x;G6eImAgyh3^ZYRmFAQ@U(*kVWf3QWf9JcZ%y&R6e~H=_ zTD`s#s`2R$WZ{6I`INmLt3>Lj7t!4+E(zwF6ztkYnSnEFw;%lc0_Ut6m1sdx6ppZN ztUm9}kJi?01{1ESy^AY93{=2cdmW!r;%eO z)U<~O(eJKqSFXnidd9qhBmH>Cr$_ResE=72x%Q!48$jlGsWnP>aieVx>w?lb1Oo+oXJYb%Rj+Sdfgge$C=}=jtEyXsVtUvjeBOgd4w&Z`iz{BN)V(y4KQN3a#`v*Mo9+vSbFo^ za<04J?5c?s?$~{8E|N1K+{Jh*R-DR=3a(`s~71}{>>xasG&WVY` z#R7@6y?=$-DOz5lWNYd(GeW`CXRK+cE2hb$TV|}@KbTIBrE|RgcAl>;nR8Z+pE&*E z%-(`Y-<1p9TMK)Y>#o;42Rnn8_=M%g^6R+{J#VM3B#FS8Rc;Z})h=5phj-X993S$> zgJNbo1g#ZElDxk-!VihMDJp!l_TZ;DrLlMaTe z@gwyI!zCE)l78oIKYiqK@&bOdnq+mPBy{Gb!|qA7M=CWa%GgN;uF*OBWW08}9@oa^ zeY950CO2xdEEQKjT4Ky(0`$3ir{F2Uks9SKVlk!r59`r4zp4gTeO_xx2L5Su|NBRs z4JPay=l+*>;}#3avXH!bU!vCTMXuEURhlY8WvYMj$o=~%;Uk@Jf&6Zo2nFXLs{6Ib5YC5N7L;G=LtWK{xe{xsvubqHspr&g zES5hXc8Lu(>rJ6O&--h)o%A#T8!9sQ&^rqE!?{m*YLcBLs&g6lnf7_*aL#$Az*lJ?%>VovT%9Mg|4 z_)I*JzHI~lbp5m)WJ47xWok}yEqq@~=~CO?Rf^%Zx%eW7URNip)h^a0-27SdT5#gL z=jh1xsyCOUw)nSx46LLoI!S&RVh#^mP^&dYLaoc+JdvX{By2j(a>< zOo3bU-WRO$CdB*4>DM=k7q!*uF}XveXt&v}y!^!Kd5=DnMr!B?|H!JP1jXT}mZ1*+ z`&yKWcX+dZjSFRT)4;P&oo|hwaJR}9ZSSX9l!?pBr_>q2Nw}Vq@(sL;HiL{mU-NPp ztBrkZD{pw(RwfnJ&v2P}+A4mSt9&p{Skchg&`xZSm1jGQFYg`3A&ygrh;^Xb!!ABk za#mn_dUTDW)7CM&Nll0|JWrr$0%jb0v1 zA2gZS8wd;ER0+>`rk0jB>4vTD82MEhHu}aao;JtcW|&>W$@A6=UWKkSBdNG%RIwOE z!CN=Ku$s{nnJ>>r`)jj(_!jA>3<;Zr4=o%+cstJhCK8I+i~8o%^Gf9nFOy1R9{3E2 zzxH7>)Q$6-+}^o&yUlc>wbkzYr`H?iuXDe!mCcTEMMU~`YscS`iMGhFdr@S*KVwDU98tTx?*dg%2c9jJi|4!ky$u=~yX$Xh7O+*RL%jE&SxOcen?H$)+ooqyXo_{E zv@Kshe{!cq@o^&x<7rZ#Xi?!E)BTmRkl9e{#;uSvo~Cl8zMBJ z_HbOL>-U8Gc&Y?$XI`M0)7>yzo$?~_-XGClc1;B2%1%3$=JHCG-zmd3`h1l=1f)Vk zxT^a8M;-UK$E(@HzbN9^d+Mr2^ePk@6|VP|>&3kC@VZPRUTx-6b8qrBS4UFO%cU8Q z!CyXCkFoZ9Uen8RpG$vGpF;P$zTUKHJ>khj`Ud1!fdlxCF1{^;f z_tHwkAj0z4t=?|I{Y(YMo0lc>6AL@dhg)wbbvlQ=$%^yHHd~7woL^H2Oke(7uV>cu zT$Rexm}Ywlewg63Zg{`z4&6&ONQTOGo=9a6+6k|y}wM=zPRzC{X;Odl}oTNV-)TJ%` z`OHrxlFYyNrbvLpE;@9a7W~Y4`Ci>y2(6rswVOy2x}72#MbVNQy@2ZV<4j3Vc-7M@ zpWbcc&{1A#+7on-Wk`dQ-`iQ~zBcydHog*foH)^YTbir-oE>H*qd^?$op~m>q*Wnz z9L+4Yed12@g|7GZ5G9mH$6F=Eb*{e+TCTGQ>}n`HIm$grtEVkG$s z#vGR>I<@`Gs~7YgihcToi@Eq2Caq%QRdP3!OsC`j5g1m>e0r99{VNYI)$Nvg^x{h^ z+#IVUiZ8SDb|Za~?;4WgnR9baQ^Xbwn%wlb^)h+3Bwb*FkW?L8zts2?r*f2hvb1QO zZqH2JV%jX=7LnwtkWeDEhwkX-t6g84hh~|$dgOh3&b+C?&}P z_i*aDPR|TGRmRn1A0NN?z~S4IRZrVNrug>@69U)ywZF zVzj`7=lB{#ly;w7{&yzW)3((~p*5`cXp#RN8Ebd5>*vOr53wpJJXKljVib^|zn(hr z&Xu>HeK^IzWq>7$)Sj>Ngb=mYZ6&TeAWta<(f$6keoMyWcY91ii=ek+kPWm7dM=CEZW^#riH@@>XzJWcwXXv3@~l(>nN_uR|*L z_5SyUi5;Da`>)J1idy%af}h@8pSHTXv^6&0jEhn=TNa=(+s-exWXPDG^FE=7QKC-E z3MA^44=Y<>kBs{{#y2c*D_lUzg)6RwEUwxu^Ul_mWWO<&|2XF~!}PRh93P_+FIm*r z%vW>{TkiJ?KD*qRS&E(PZSWwKKKp-Wy|$I-)pX@z-}(2WBP2GSQhHvse7fFXjTv(Pt_9zMP!mCEg?sfYs=WKljJoUG5o8{YeX7;rUk4ApKcKz$qXa8Ju?^#Ky>^h#V zUHR|hyT`HNyJf$*zyJPrMd_T6uYo6DRB6xMxp>#bP_uk7LhbguNGByYuA^(wrT5M&*&1z`dG4_UiqQxaGxeurE@v z6SZCA=TQIV-}L1sru?s82E>NmLvFk_vVg2vk^KLzs_a{BMwu5($ZbG{2iA=fcI1D* z6wiHOd5?wu{X&BTWH&k-uxEN#aKV0Y+7jfF1z2fK{nT85)XoEnaQyI4c=AuyO4fX{ zYi-FlNiAfHend5BF5YMNmj`9N+8^Mh(=VQHK7RwbLvY|aaEOm?N&~VP6AdJ$Y}#aG zf7_@G#qSCWS+jH%fG62a1g<3$5>fl|a(OXwC_G4S49Ml(mwI~Ir1|spfm7!b3M^ux z+ZV>7n8MK5EW)ufxJ7Ck>o>C}e{4^bz0H#ndDV@Q>41xSDwy6?7<{a9??-Mhf(9Oa zfgOiy8JQ9&oeYm0&`g}2{TI{;x)r9NnYhJE6H%O?un{y9_xsNUYZT!H*MME6?A~c@ z$f3{Bctp%#zq7<^b~VuWbf>LE6=EGnlx$nmQXupVgG>#HwQ43LAU z!Qm{>>g+sMUsRjpfUA(Mt-gFR0mZY8v$$KdY^~i6AMU99XftybcaSiur-K@2NIKoU zu{c`&TM zE3S$8cC1;5hb86Imz$g3+`hUg<7BxIpSwy@97;zSI1K(v@c}1?uSG^t+d&V9pe9Go zR;5p8KW&{fZI;$U4qzY9;%N^Pic41rtPl}k1J0&TZcww9FkwtwwQ}*yLj@`so10ZQ zcIKe^`j>J5@Scdon+yS)Thc5AIJ^$HbgEfq%(Ii4xFKu-S|+=~-T0TuNp`BR$gB7M zOJ3}4-gWWM7S}T3qHqb>Rn&5J`b7+r7&t6a?^U zpai4CUtx}$GuHp>?G}VDxPT}KQC@JqZy}nCegpuIx@=dUs|cU22P@VRFya?NseVC4 zL_h=2LVkZMXVlUEkcNf{uR-JZhz|CLl?;pv{rznYqpIZK*vW>Z3aEZQaPH;Tmm|i= z_iG6_01eC@JO;L?Jh(g&&4mY^Go^6U)-f8?pm=*d(A)LrZIzMBaK`!EEiN6LwROB` zidQmRTtI#pDI8hvS0IQQoBu=Fy3abaUvw8-?Hh{dPax zG48nU9q$JQu=hIati9G=bI#|P&s;$uIdL=;LKG+{C^Sh45k)8{7%C_z=t?96;L3@7 zEiUj2+D=jYJyhus@fPrph`|R*Ls?lUTHtRaDCj^FD7c3vzz-qt0|f<}4h;nh{DywG zmJaiD7ltYw_UUiv%7=y%+}GMrP=ZjBB0|c}(7TK9?l{wUh%49_%;Y|B@<{uNRe~8@ zIA#U4I5Z9(4o*(A%G4m!x<+XmRJm}>WOBjhNXWmOHx>+H7Y#TQ$dhm(tq0E$8^2K&Xd}?Y<0}V&@)`15^@OTsGYlY|G zYag0=OCytU*%ZwC^!@uJ9GUkD-11XDaGFw3?LpFu=*kEW-98Ktj_Lyasp*O$Fig#D z$8?sbMUo;D=*Y2S-b)7UHSyoo2PI}oP9~~bp;sXsm zQDuUyWiZ>Ptm#ne&~j5#rd1j1d2y-MaKF@8@VNuw(xCSGZt}h)M^rktz!vf3K)Tv& zvf}z3i0t1I31U;%tcZAa#3B}^o{adN@1V<>$2i@4oR3tQu;w3FcnnnBbYq;2=V5Q2 z`P}x7E9nSFWbIh0e#X}{nXG_k{{vN_S#OJ@l_eHo_95O)aWyIv>hFSB6Zz<(%E`bZ zoE?Z~WUR?>CNOZCOpKT}GtpsKTfe@iAEzs8m5h6>RfsY18SSFRxn!u&hfx@>P@-zc~JmMBv({9Dd_Ulb|)a5zd)$)Q3wh3(zG z?m2L39pp5_^51mYLkGf9`4_DBD&-mf$)>5&>z0#}ZtT%x*dAvf;Q@7{@0H+jdR)oO z)p+on?vAF+Ra*$N8V=TviKEGFQeYWuK%5oJ$IpaON z>vmAL1VTmWhw|VW^TodDaJg!;>FnRaFEa~OiZq?nx1`h?%-;>Bw0eh<@W|oz#pO}T z5{_#*E!k*k&stxdm|O)l4*vZ4b2A|?HQj=l+5JXpuG|jaz`#IZk-OUYdmo>2rD4@1 zSV>9AWWD%ZmE)qTl!Qd~;US80k*e(WXvvNPSUoaIX*20SEHW&NvH7&Cs0-3^v#r7H z^_#aDGKLx*VH1Q$uP&oeYnheR9jc(LPrhh#4P`ps5X0Qcx*v43`r+R`sKv7GT_Jz< z%7>H~!qiKTCHYFIoy}~B_w=ATPKWJ}ZO2#Uy}8P`m%FG1p0`)T$(Vafm4WMwn)(Z6 z47KK?O*6hxySwHpfl@KFinXO$#usnGj)i&rczJmx)Su~M?B-Drd*7UP9}ttPa8AkM ziQV21gs?gpq?Jt89+()XQyg7bi0P=iV9^Z?Oz3NA57ZR88HUED^S9x#c(5 z&?g$MzHft8|6z@M%kKFs3_EBHT`A4P#Dwk7DAm@;?+#NwF6ytLDO^HHT=7Y4E`)ri zt9mCZx95amy>-zULn?jC%k*3kZR<#gub;y;-!38AAA*vPZUVt!BNe!GTUqDJYu@Ea zwEYC%6a?*RbWc^qj)u!fW8{Bqh&zjHH zc_!ATMI#}0_Nf=irKKD~A^lu3}Fi+!uS z;kM;9tne05aM^Ze7|#;Am(gUJZlg@Gz5=CTs#sHM+2a0uV z+5Mc)$s@k?+nQgPfXbz|*Qx0C$Ztb1bBJ^LA%2>NjML(^w@p&bO1qYFWH!5KgWNAE zX$6Id69z;i4@C4#SVWA7_$7X8?>Pp?`x31@bxkqP>lhnaM=1IB*dumHqoEP5RG7Pd ztJd+dEYFePs;h#@S4`BPl;z=J`86{yJ04n%8hSL+E2b1V8Bk>oty-zbSp$_SonOdb zBVyfw#6`|kewNfq`60#&%z-9%_L3{#aW?VFZ908kQrrHi+{YVRexE8%0KpD^`U%`i_yCuM`9nk-ahT{PD$RW8r8nZ-hd zFK9IJF#SmIl@JT7v_irx(B479`uVUPE4j)#*`R8_Ty>$!@iRI7!-8tS0-;sE8zSeL z#c$NHDEiEdF3O|bkeb~u(N&iG=e%Px!9XPtaZH`Eo`YuR<_q}cmVkW<>> z8!&$e{O6i+)Z3UOGDiaE?*$32$s`+aigR#MVcgzOBtXB}`svS>6c>}6Y;LDxX^D=J zI9S!7llw_}Ox;}nqdF^j@62-zn$xECx<8Y#q#Bn$NdC<%h#2NAezJ0@?u#U{gQXv_ z<`%WF(I6ZZppSy1+~KsWSun3@aSl42l|IIQt9ofFqJ=8AeJH3RSu|bDDtDwpRC@Qp{S@P- z*ISiu2W`SrTp)mY>QOZKn&tPJU~eDqT*`Z8M!; zvwPL*V?VX)lA8q4JUc(8Dw$tB{M_*&mKWnkMJ1U-t*vuQQePZKmNs8Qp}UU9F-dQd zMm2fKiC!tt)uhO^MzBk3lM!- zd%iIR2cS`NamDjruL^4fYSuQBIkfJ7N+Ak3qT8c*F<ZVhag0nW zV_aU#i$k6@6|FRAv^t7@~wL^(VBkuF({iEs0%uDe*C1sX;v)r=oF+!msIQ?Tk^{SA{B zAMC0kC>meKIaJ$up8y3FEyv^fyr^|HGSW6x?Ago0B^JV;&;jHwu%@1pz6obH{MYoJ zv(Zk~Z$?yXIIcf;kaMYRpNc68%?llP-nXh|0&RP4qR@^1=kvcwAI;uv+j zn$=2I$MDlUWnizD#oQbZa)P4r3fn}~WtKdT*-htbP93J-cnOPZw@u{>d2qWxaAXts zg`49UzUbJW4@8BHV|rp+*-$#wQFXf9QWO2%5D>h>6(`HOP2*?6oof^ZA7?)*Pn;(u zw_5uc{n7+^frh89MIgDh1KKWHx5#%qoVaviAnox811O7SXg}rJNw1qeXGvSSu$KZt z+DqCvLtgHn;drbq?&sj}@K2}WaHqt2jL1&)RA&v^(f@$J6);^TS!J|ScD?b>+{jHV zM%6WU6|`+)UM-RW&cL5m`>rj$y45*Z?K5QQg?KBESW#Hx0(MEu#h1TUp&O}Azcy6w zEs4=n0N;iS4*-!rT0$w0=z`({fDee4-CYENn=DBmZL0MfLw%{_6cYpq5!~zj6)9of4V@DgK)k_e}XZ@ z)Bx=9nc>3y7m`E4T%wY3^)4g5dmJ04bvgiq5Ou-IPmp7k(R+pb|LGvmQRT*1SvGAA z4e!`#--j+NXwFqSz1&-KEYs}s1-#2ZXh+>ooC*_*H>IB2@ZYQ7&z za-3VG>-1p^8PMhQ+u?d~3SiTN+RRqMe^j+ zTK3g*Ea%uI7r|k~%te)|PJ673_jbL#>Kq1n4xMEM|#c$APK~6G0bzM-9vP}f;FnMJ!2*JkIVJCCFvQW z)=qP6o7vpPn;;~(PLj4Mu^SN%1%6u|Y<&D>2bm`P^uiA>)EDpR#^hkIh;%GN9{S$A zf{62lL+ACy1xQ5Xi%sKA_hp#Cy{aAt%NVQiq?g%5U62?WQF!;{`rUBrRY0Fz+~5QO z>!jDOJlV8fpEim~kBBblj^bInOK8u?`wn-XNTtXE)j{JcNYX*R!MAntjVLy&yZ7o% z_5^F%y*UmGi~=5A<_$YTLK8nc`6BPRypB$5CoW?{yIgyJt`>~n0vHuUX2mH>#9>L<`v$rXxy34mP80+JVP2PJ(~KKhf73wN zo2i!$afq<>C|eSqW%Ow~NvNFgQ*C*ZnmVm(UcW9602=k$rru&yDbk@d_cMy>jZ&K4 zwB>V))v&C5tlF!K>uaJShSSAfNA(mb?sEDWzp>n1O&g;O8LX0 z3yKchuY62JM8`In!TGM$g?&nnrJAQNZ&_`gPyc@I6%x{i4}@75IzGH$>=7nQ_4}5W=Du(NN@cO&mgIX=q{cdE zYBxJR?pJd#Bh(Ryt^igi*Bdw^x$zFo+eq~YZo0^D;t?RulS>mCD;dpd%-D~G-+tHS z*RNiq3(p5Rv_>y|R=bs_XR%fv{I=b&Oua-71-zMUI#eHy`=$Lh9ba^E5 zl=tPl{rA5alp3l^6*(;zWSZU1*!t&7c1jlBmk-wMLDpnUr)#Qhv`A-0*)uO{N4dZ? zO?a!EH{8{x1TRM-YvuOlZZxign$Rm}HiQy1G2WHMuC^}+X=so$MUZ3cPcdi|ri=FL zT^4M-ARwKqlEl{g^xB~3BBa?(PsL^|gkn(&2tiD>JbOACEHp@s-A{j0&1ZL}^Jthd zfGSEvk8`US3ZqmWenE>4lP-o}D9{vnHaFNu zl#S2$cWuPtQJDDzIquh3sE^N8?^LUt)?0RnHPmYnRco&7u+weL1=~+gl&T!hA<#(+ zEo4SU+jrH8BYZKtZw>#bGUkhG&(0Jf6GF(I4ek!p*&(f}(>C!5{`2Vy3d4133>v+u zNVU{lHMB-v-OX}me0)Gz-7qurwF(~JvSsx#+RVg;>Wd2dr^w_s=4(_4yNC&sKxYJpuw^!RzN}4?IN|{g|v$j+6no zA=Q67Vseo5WGwNG?AaKxRiggX_mb@Mcoa3S`Ki8${e-9m_}7wMj1xr~;`0VK^Z@xY zl&4Kp^vZFJ#4r)qv_;0Z)*v-?!H*$|8egy z+tEQcBDr5P1_QlS(L)!cL|wc2>*&Lat@ZHoS7U!b{x4TtTdiDT%J#750k+DtNLAo~ z)E@D+UyJq_pI(u*JJFgc)4`$dv~PxjKwdwQmyfr8hc-gvq_Ai(cABm|?t4_BUA37J zAENf&93c$jxGex15fIM~jOu6WO3xdOd7)4rA~a$$5Pf^lL?idTqf_#IN0N^9pS?ZV zkE#eVQUs(o0-`^9BN>8soe4vYsu98S=P@9ypCcxQZWKIkg=0wZP}n zsTxUe0I!5?d-b|WR8cqqgV!yq5FdGtzsMhq@sF61Du!>P!S_GR7AYtL@l6#B-@(Dd zD^8cD)W2Nzvosy`CEfTa>`AOC5qU46^V_GM#jk^ngwIvx?%Ik~1>ByB@67wXYWu@o zr32`5XgNKduf|(|u(4izmJ-EV+07=|AGId)dmU>*Zg~GnGn~XLk5Z+hCbmv!@&;BfCAFd*Wv_yGa>&gN= z_&m7LSd~omA-bOtN(cB;AZQtr9ZWj53I?m-e^FISfVm+Wmizj>*f3diJjaeIk;^3b zNQe$&VvE&K0iUM@v9o_%dT>9y9F^U9;Ojs<6PkNAu8_KN&5_q`HF+hIOt-1=ysW@{ zwV5od;UEWUsXk^Nu^Aoi`iuUG?0)eEYsaHqEQa1_a0)Nf7@MTouZ7Fwka68k$J+qe zi3l&ZX+@h0M7ZcbZ#g@nE%$gYJ(dPaNbJ@V5vy2u3P}+OpY!68_rhu#a>)L1+7l6< zWFOs{yOF*&ss{q&4-R#W zB}svOS?Z!mXW=9-iBlpW8C@${A5I^~g3;T1n@L50(Vt|SW^BC+UF95*zTpot;v^ zx%;xeiNWh4ame?K)RS9zfugMn7OhIndKP=CF!moYD0bfsK0*#jI97#N2AVz=H1NT| z!n(K%>71f?F|>Z4+?ptVOji4DM)s7k7U>BVf!b@6}S`#8@fx zOMQ`Eph&Gqtl8x(X2Gw`TX28BUr{d(0T<$L3mNg;S;W|U;NW>;fVo`}Y4BfiJ@+W= zV&EQ2e6_sc7l@t^6EhubKM#ipKd!bMsytr5=Klo}KHcz1-+HH`BXHzPkkSN?MN=KB zSgymyBt?FTd>7W*s(#Ty$;6;)aPar+(ppE=@o&w|O_z(z8wI)|aEo@+WDXKQ$aHz% zldmIQlpuH+QdX{lX#PO2fk4n0mK?)bfY^C}G>|1AedWAKY zL}(8dMk2qzisy2n#o#UOV|_PQF!=M8pGeNIK&vWt3GtqiC(r4|C$ch17lyL4kMVj{ zde!m-ZYz6xIbC7K^HsxYI$q!SZ!ci0X?=n+G&;^c;JICW%Xx+uYlp`c^zCNW$9D;K z{J00T`|f7vrR&)il`Llx!-i9{E+uRLs;&H>oV9~!skr*VYRbE*NY`>gH|!;xm-oYY8YG2eKfZKGH7fDHK%w z2~OziwL3FN>ED8QSHhv-Ca>bge?Xw#d zQq4`CTxV(!?bEg{B?G0eh{%7^r3-T`hc}Tdf971pa)|s$O16d2rSou=I2$ zWU-Jwpg5~r{;2jW>HNhTX!0#+Dg+GHV_jz!cwzQ548gYdZKgP%OD0$6Y+}LU&vpXZ ze*O4fnrx>2!S`|X(m%m8sLPdBC&nXEs$*tV$K&iy^q~ExDJjLTd&@Nn6S`BGXvJ*5 zff>fgJkawy=;u1Y4}||3p}exzvex|=P@;;>@Pe7dPS=Hg>VFVb%CR90dd}|BdAiVGw4Q{0t zwI1|mPevUI`WD6ofojef`}hyUl6}+{|5)#T8Po~#DnYUY)|4;Wj?g#9_f@&Z&mXCB zB*F9*m`enzTv+Wv*q9wZ%;Q`5vS*=B?=uuI>DW6ZZ(N+VB*^@r;B{!9mOc3OCsr;R z;|z6>E?+*4u}KfW!~PwOpd>C60#!{emd4K)zF|9!_N8n6X3N!@|I4#X!F_KJs!qwB zuZqPQw^;Ar9AiFjBYc_)f2u3iB$ngN;z*ZHumfF1jTA>7DX*Yks?-)Gr-r1Z;( z4}OoU1_k2^UyMKnPcq?J;@@clmev0*V`*7>l(vNW*0|+B>`o%h>(W68qcTB&j_#YH zqN4eJ?R02IAlT$2zMRdg{WUiLDA7pnkoIO9hqXKBtBKu+=BsU~pZ$Hih~KWHoD-1X zo3Cnx?VPt9O*K|oA3X=7TQOP{Vrr*yFD!%t`5Q4H)5*L~*Y|$=Qn|r?%T^&6)IF5Q z7Z>|hLoTV-Qe|zjkU*BR)=WB#m-qY4%}uaoiwQKqw2ydTpl9F>CY1-i1hgPZwzen+ z+AaEtgEalKv$IuZ({Bs48ad$M;PSa=`e$hHzeN4Zn=Qigvaqn!Vg2Mq8daB*snyXq zTak+2i0d$DMLdXHOHUVURGX-1n_hMgJnP)g%S&~Z+3Tx|7IHh^%_s8tnH)NamJhV(8Q|0p@Kip4khOC5E>7ZJ58t%$vn=!8wuFfqO8C zuUT-~{Ssn;p8Qr}Yb*!VUQ>uAjmswTYSEKQ_UfE5xD-nzTsQ*%@8n5+^`1_$YPl?3 zt2S*9T664ZfTN1-#VnSve(m!Oa8U*bjb)5lHNLjCwwv`vso4PORj5@&3218q9?0Ye zxcpfdAu2B~V_HfbZL0XAG%6lL?w2njv^p)kF|=z|#Y%>TlnmMx-(#)&#oTYOP>`Ob zvlu*MVBDFqN`E6Bs#tBR5_0*Fdg_lY%f>BIEqa?st3n$U7Z+#Ky7hCNL1T*@J$t`- zN6vL)k27CxPhGiO7mnRz;VZYpwqO#6l>!5?kdV+e(-!1or6UQ$%6>ffhO7+4KQQx? zjKFXxRrt=cB|0@CLp@Yi*AbK>g&X2BRjMIxx51cRg=(_RpPieUXS>!1z~&wYL`bzH zcfTB+YH?<#bew{%6pId+nUMbvGi`^DWK3U-$$ryip{CcpnH(zKTh(@He-vD5cJ>&6 zFO^p*RL#JpQyUEkNy@j$3Mkwq;c+ToW10IoO}YH6URzR9(#W{0c(%$x;~AphtG;UO z=7uWI4zZ%HezoH4HO=nTRXgQsQ}(QK$NgPwPSw}AO$USREen-z$?|k(7^uQ@8p$v{-%$;>J)W`I?CjJHC(M42Yj40`V zQnskiOG7Qoy<*Y{7R$BY;-njhyQV0}$Qkh@Jez?py)pvOwvRhXQEnkS2jm#@q>GIO zkkwbb?!Uk{Z8EvLyYz`%E`%j_R%i|fbN=q`?gQJe>7w#vvapE-wd5L|IrF_pp5HjaUv>o5@&qIk(|hHqExupBW|OyaMss(vux4y@Br( zGX#A;V-%LXlKgQpdiNL7@Jx#hONA{OL6VXu6P5Q$C9(o`m(MjHat5;TObPqMY$LCh z1qR{L{yMZzUeJwqi8NZ=p)xcDG*yurjN~~s=@kb39O~T+h*m8}iRFa+H{ng!Lqcrs zo5HkQ;oi9#Wi3_4z0U!upxfq3hHzEX%dz`A_D~HS(*m$=%|SXqOT6eG0l3n$4IOv? z{dzM@zJ3Od$RUWI`x`{qxeH_fz}1_bTbj1{gqFnOGNic!0<fM-v5SSrl`|1c zxgR3N*a;1Gy?Ex%K{qoA^lWjUi z#gP2`o#41O@L=t7)^B$bdEUGHIj?XH@c`Z%YS~0y{{S?S_u8oes)Z#QwWF&+UPXfY zs|89EPHkikjDV!aS*w2LpEKHj^U0w`?sH+9lN#u=)WChb^S-6aQ4HrqYwhx_po0sW z)#!H(URnZ-SiEqoh1X;ycw^jq9eH4FW*%#4kwN`Ob9U|7k}yr)ExOqC%KGYn+jq*CmvvUmR7X&Gb&dmr@>)+ zB;DuMq|Mut7L%zt7hun5!j0l58s>iLHVjYMmTVF(aAO;p)!JPDzHqKyC^o?cb9_X? zC`+HhevTc&fEGg=khB(InPH9&carPsuw%`{AzghXVePQGsgNpEIX|PAQA^ybmef5G zPf3vVri3f0j(uzM2;8Oh{KdAU4KY_xxj{YdyNeG6fV>wq_$$+l@fyN$b95{@`QH%4 z+6ua{I+-h}eR?{O&{l2Wc$im~h24QK3@w7Z(zWX--rv*1ZG0KrJz8k+ZNgq}{Hn%c zJ~3A|K@i*>nwwO&wl>b#l4}FLXBo_l^%M4;6r4acF`3@0tQKmpcifv3-r6Eit(4gD zCASC|ph$JlPkd{jsaP}?oJoPvFlV1`LA|mO-i}eY)!BT#BzG>r6}{i$#I!h8&bQbu zlwi`Jiv{X=f#0v(w>(@&6VQF$!-bP@bUc+*HW~?UXL7wJ#GhZN^fh7gT? zX}t$6GT9l)=3p$jb);Z?sUze zqnM&}1Ddq%W{!?A!LXC%Z{WR<4%6Tp<*VsNI$Y|DlSNndJ;r$rkj82gOweM?#WJXm zD9Q61CiAiW`JG{E`lIQBj+{C^0L|@d-tCgq#;^{kyV_(txaQD}Q`_?tEpnfbCQta< z@#L3Yn5G({i$v@FzQ)NU=bJ5f(yw%WA97TL)eZFtD@rEHtX@uLk{uXc+Dw$$Gv8(= zqOo1HUmG97o)c-%2OP`bxYT)dElRO;WxGxmo@{n>n52t3eJeTMTzq?AK%?{Od+3qb zUhPpeRqDGegpz>cYiUoCQ`p|S?#nB$wKiQY`O46IOgYBZ6JFVPu8(N8)efY{OZ$ZO zfra<}RjAv9%fF$(fD&wdt0kazR|?a<+xyOxwo2xmHk((?N1Nwd9+1)Nlis|vaUe$N zz1AeOnV!K4%VhK>(>1TJL}547d7NGW8M>4C#v1*uLm!Y3(0-KCN3n z&PJgu<_L=ZFA8i!dj--}m$UrZXb|`E~3pYljwQxvHoFopZ7p%2Mtcr^-FRut4->#cM*8lTLDovl%136;5+p?n19wd z8xTo}n}Ri;0RAeSbw~3C`7)gt!apPmu%GG=RUpfx%IN=?0uThKA&G8s3#I$3k_41P zRX`_kEqwXJ|A1!t>cdyNoD-`(`v*I%O&*F+JlsI<{`D!?i!Era2-$yE`r==gD`O9( zBv)tYwvU64r1DTh4>@>|{@9?GegS$V0VD_BL+R>Hh1|TN;pm*=)`G z^*u5oQmKHVEYfM%rt|U9;_v{5cB~dL<`MEn^8$mSI7kHtKQaq%86FC0tT1R1|Bag3 z1!k$!rnk43rc;5w@1H0RK>Bb!fZ^l!^jU4%3a)=IeYQvy)?_Z=K3j_<`BiR7_k+N(yCf7Qg?pgStTs4RUzM z6q^zrFA<2|r693|88f{ML=5s8J*&KK0q8lJ{7zFr*j42g8ihAAddd#JkQh+^v)54WV0OH69*ets8TpG=de>CwbsXW;d8CLWB{Ne zW8-|@E@$45Uk328#b@(SQ?RS7Mc_pMinx=_ub%-~KCE(@#wR?+k75`{ z5I!fg%q8N(-8DQMNkB=PiyW0VCXB%^2#a`!igTK+)uMZG# zyPXx!t#2I20|I%q{#b$6maQqYC)=Xh?d=o#b8LTFUiH&Isp0{yb0q*tZZ)yNVM`{> z;}UIeuDN^n`EV*V>B{4k-T~$Zo^yK(6Ey)>`=u3xs=INa{a`1Zqj$? z&IUB1-tms8yYq!{Q_N!f!Qv0~++GB9?_R(DNyEdF)adF85)|}~A)bMIq6`(_Ex$5T z5x)PnE=%*J5i|vv&|-*LCty$2PK}O<8N9D>cJGNSYDD3`%i_fdj}fXKHyX;dPko&n z6_wT1@M~WnJq7(AE(QP^j>1X+id^uHzJZ(fg%~J^L_ivmR zFC;!D%y#j*;%7@6Z3<%?#z)&<9Yzgroz^bp0EkqZQ%T&)rRUL_dbgdzkn&zc1uDna zzBWEM8L1(1)KNIN8mURZGng@ak@Tv6s>>mM-Kh&gL5j4qv0--B5}7$6+~AbG_G|cH z?jkxfI#BP)G%_JAFzLxb8Z)M}qhptuUG~n`+e;xBj}l}k=xdY(K=yW)BV_XQQvH84 z4O4e|J&heXG%^=5Pkq;8)Ay&4%1wNinaacs!hdyuXWg~3|ZVCromC( z%cRPt@YG}=IG6&JY+unU!LXC#Fx(qp!$=nZ8 z80>D3ZtKV9f~cz2vcbi}7j8&ExhBo{1<`>(L+_K#bdl~nvAa0I|2h77)GWidrvWBVG7(Ybc0u8onC?VHiM%Rs!>4N@} z6iIbu%Z37Yn5ds^e_s53E37qqo?|EXkUYRhLi=t(@Zi-^o{sVF%ud7h-cqeblk=r! zfC&`M5q|&ul2NAxsDbPRE&T3K1~BG>6?SoPAviZfMMg$WwrVuJL_$HyTwTSP zt8k!80r1qejWs#Ia&cJ9W%hjwE|&X-$CxuvEF;AoCDI+5mVQdap*Xl{JXf!W@9)&C zLYEjy$|I&x+m(L`(Dn+Gg(?#ja4bCa`)=o*ii>mA`9KZs>Y!IH;p2V=DfKww{ZMPlIry1Ftm>n!4|o@|5!A#(xDVnOuDBrarxK zsn+T8;XS_jR*1U38KK7pxlY^6QPWl{A<0#X2dawYd2fjU2N6lm6ciSg2ko>Vt5+|o z51{Fj!z}qoduB;)=S@sNZ=MIHk{<=AZWAIzw#WyrQ{9mq>1uPFaf0KrTz8GO;dmd> z_-M?47LXL9X8$2NNN=K>n35x1A_GWTvrxRVfF-WUH!A1LS)7{2XEmj25D z0oH=a#^sUoTFM++d-%B!y?Zh_O`y zs2JRCUn-LKn(Kj8Y;@TB+1^La?Q}*wnDEXY1_oyHIU)xYSNkyobI*DpP!_!^utrnOxp*Y+0e7@992W)tT%{PqWYP6c?+O`r*GR&EOiX6-gc z!C@ikgbE5(HsgkRvp}Kt$@Y%bI8j-%%$0e5sHpM^fEn zHcVOwdi7nkE~4#m%RpLLo|edNA)-R7mNC$uAhsK|AT^e8JJ{vW z?+>IZj=7=>?Gw9`BrwS<&4%pa!r^dKiU_*=dzhi2bAURGF(3nC`B5Zw2RSGRhxmoa zD@wgjRj@;l4|oMd_J}40o{QW#xVQx+e;y&m3I_}@obo2RQFgO@<~K&eDOnx7EqaSr zAwW^BfO5SpMT|o~M~A!B$AVs$+Jl+Tcnk5d(}ioYY>*_zt%MEj^as&b<2UV`kr5F4 zkF%LkFwV#3hCa_^#Kykpb>saS8i~T8?lk#ELGe&h_ShT}ok~Nt&O_%|H60g)`7iSS z91dW+b>)*CXI9kAV(1lMb+Mx&H$e-ZNxu?`v)ru$!fVxbVLnR(Bs5edA1R=$Wo>o! za5tf|P+BbaTxxr<2p>pVFbpQMCv_L<+d7TBy>eW|=z=c)O#HQHH{NO4B}&zL_IRC9 zx%+f$GRpJLp~_VDH zf2N+hsP*?^=WQ+{M=39^=2$O>+(bl14sB8se0+?2*I`&L*so@tOtwNj)_I7lR5N{} zmb>qS0FoVQ(PP=~WENj1Dy$acmU*3%oum$3zLjLAm64Ch`Gv!t4biagtfW?>eQrPT zSBXgc%wEAsfv$VmJ??b;JFu0=<{)4qW8q@j%SCwZq7tamhtzC#BcsNW!E070cXx9{j15N3 z^zfAxm=q0lz3k3TQY+UO?mj-q>1lH*I;77{K%kX($7@mOk<6!17t~f`-0JY*+uT~J zEu5ZCD($am>fkm{k8I8_7F!EDet)lg(>#`9mB~gs-WHyVRmQMjLHQ zFrn@t9zokv<>w*qU7kF>P`c`eca{C&c+sF#t?lA3vDikv;79!iG(OhMO)s74p;-*5 zqfs{7O#JR0-77AeSl%JjN9y5~&)bll1{sTy5->|G4DM4co8ZGa7;cZw`2YSKj5Z5D z?3bP@O*aOg|B;|TZeLSJFm)EPI~BFS!SxWMId+py*o8brN8a91@T&<7!f)7#7;cr}y@@1mdQKf^e)yf&f|^ z2)%5+una*z#$x}c!9O$h|JFRH6|k_fZfV+9SaRwAM-4dxXPD&8{9$ys`ziVmZx!m4 zl^*HOJMCuI)o~Gyw7zt4cFx};ARu5fT7qe)9%sNIR3D0;w*3tl+C(-3!sg?3v)IPs z(w97*$x~J{`U@L7JJK<9D$1wGNJvbU-T!-x(&9mR>l!DFK-Hdt*gK#b$>* ze;yE26#%D@Yyuofp(j88lKm!#*umJVvM&iZGXUKd72`nJfm(aXRFrI%*Gp+0 z$Gvsch!I6gni06;b^Ot)E`qLgrs^yKGl+yYJMzxJn*w zw6dbN_`O!vdYyW<|Bb>5-JZNIk=G)zk4k9zi=@&;of5!R3E$uFM9A5BXHpQnJf0T7 z?g6yy{|z3XiC1dcB@l_K`TiGf7o_8r21d4D{5A3?{MXv|}uY5A$AfRhvvkY8b7* zINzuaPfF@9Ar9Pvs_hdIQ&sxd+{CLwH^eH>CkMFc!0oFD8;0`*2P!lYNP3}gBS*=@ z87ze@9F!3RPen51ec6&05sJD8mNGT8~{WC1~txA;GQJAeT_&)#R(Hz%d z!94)h!<~uX+>Qm7*BBRE`*(Ff8BZ`01{E?+_Ri{Sr$J{|S4H611(opE(ESOlMw`2{ zmD@{~m)CY?oi>%%GgXp$)o)=g{1Mfxi->66e@AK zvWYJ$rD{RO?>Yn*fa7|U7lHFrEEaSc9U0V5mkApH)doB~{3xFjMrOI!O^$DjI4NnN zx-z-l&J@F>_o6mmBOrpow*afA57pYU#rnbj+Zk;kudQ#fr$b8V6C2G82NFws1A$u5 zO`q$1Rj|CN*ffX%k41vLK`h%f9;g8of~RHa7n5#T&{70wB8wRPF4+RbobNjZebK5y z?}18OoBQK!>zH1qnFT>-TmkcOc86x3;x+?=`jwH2K6c;k#O9$0YEJr zd3vN*uAb!fRDtXgakKnu#&)G~ILN;bap5w&OX{h3|8twB=YQ2Hg-xx|NYe?4*grh6b zSj;v=QYn1Vz9>KVy@YmK@KG~^v_J-9$+IqU;|BvFv#!G@DY~y@NGvJ<~%+gk#|sZTQ4-R2PPDx?|E9 zd_%)P3Yfw_G~K8Z&hY>ggET5~C|2f%r~slYOWfINGmKO4R6O*pWmY^%BQ*!dl=D(7 zXEo?_vF$X{;L+K)g;1|dwFfO=65u5M0!x@`qy1m)U1vPi;oFZ$Mu;etz4y%C5$D*W zBgZT&d*oPUhsemWXEw(!j=jnz)FE3G5+V`FIG$VRdHKA0{-5W?^X9xbzx#LJzkB?y zb6wx-dwq|hWf~q%{mmz;_QCFGRpeqenM~WfBIcv}?AWYNlE=n~3C$8CB#3G`C{~c0 z-tU0McmFVEy5aMXf}$CEmQF5@^mZMo%@FHwBM1z0{bRxL zEWpqAAro0vf-ln2+yUh60pONpx@#RHnSE-214;@MFp*#cxW^%IaBCSzm71s;LWPcmo7cBfSKqu*Z zZH{G;Q&!N;=Vv~dCxy$t6Rqc4J_nQhPRn=WKjV?9P%^R`x>=)%Z!;;oPm#}bR&Az6 zM0!Zn)*0#pL;&Fb7i#>S4)^wcMXJSnedWnFQD??J55fMoa(f#Zz z+I?mQYry-9ZCe=sNqNOoHnLbha;`NY_lWGQF9UddcX!zNIB0P#^N;kdU3w3q$6Prl*I0-Ia)N$9{9aGd#!fX)rzI$S!^Q`)xtf1r!D zD3%v)f^lCc`4%2SkSd$h28u4a#;-X}7?BKfp}2x!g9|iSsz9_ULYPsUQ`02=lw<6| z94HjnGJ=9wQ9Ze5ukZnvvX|NWIfx24`3&RFqJrBvMmQ0cMUcQ|j(7d19rFJTPO3Nl*VaK}Fg7hs?eWffE>O9P zD_cip5Di2c^rf0+L1`&Z+IGTYHz3yl!0U(s>G6|yA)0c-V;c3{zX1O^^>7HW zZLv8SSq>oT=~!AKiZ4^y9>q~*b@V;&z;s%(}Q zdi6%?bZ!HJ-?xe8G*=lmYpGj~n5Up5*x0eZx0ey67p%Lj-^OGjO~uT_A;TQ}<;$0% z2b~v-X=uynkdJpdH~+jn&UIIfM*er)R@8*W`gLtVeutp#<4D|ik5hry;hKxB?#sx@ zQQ&t=x@<6HNF}{Ph^rgarR9QJ(k>x1*iGBxFw)1pL%_n9f})Nu>`PC3zaIJ?K*_SK zmSAPXAYx+d>mA4jxh~xlOn%h9B_p=yvZT*1aeM*-U7$31_XX!ve%j)0IOP?3|9DV6 z`Uh(Qg5+J-PyQi&iJThyJM;|xa&mTUvpD?x{1W=CgaV+BxhQdUOLmwA`{hM?dd|&- zM#kwRXip;{Q(`&hZ?oTtNtEBEg*b43IN1%K<-X~m2tU*o!4e1+Gr zCY_W{T4`YSJ`Y)^nM%weEJ~G2uYiPB+Wi?8>&b*z8P61To`LS~tQpMEO!j_#XCx0m zTs<-s$F#+z;*Uo<05j4DCDLeaVd1!zqn|cZr9Hu(UlussH%B;uq5 zv#KRMB2UnG{%6bWtJU4mD-3T2cU!Ta34F-crkleO-42aJoS`i(E$RHjU(t|_?Ip9L zO+-Qgl97FGzJE!${!kHw1;WV>vvt#xEb$9abNoKQ&fQkCE3c4LgBmJ7RWS?47E zvC;z|@w8UVEky`#ImEKJ5GaL*Lqswf8}igj9420`-0PKc?BZ!5z+SoPuY~qMKOBv$ zXb&p@!W~s!{^sWAAZh~*+c$v5>fVZ9uT0EDOGb^;)F7|8q1~)x%Pgqv$X&0+;|BtV z=f{?Uh@xTTa1EN9yO47<)YNxcV-ADQzq);;?YG~Jq^ie5batOgQN?l7WD?FQI~$^e z9wVBkfkYVLF@XRTFFie0YNC?8*!QztYFzxANV1V^C@D=ToheW*$oZb`@DY8iG0^;Y zJBv(qFTPRO!z}<4zc(|Q#-^2_sU?f$h`F5%0cs{CbTws0H2_@ROW||tkB}Czl3&$a z$EA_|&N$3<#mf*^mXN}dBm$4z|KN|d3MbRYJi&nxd($w##H-fL8{)g|bAc0pQN{AppuV7&A zl|WgM|LoL=H)~yrh*c^)F|Y}flapc4HI!%4RJ79@vpEfAU1WFbkFTygAut3y!kd;A zk4+4@Wj|I@ettRe1$D^f_Rv(@(K0KiT;(`Hb zh~f!FFcQo6iH-=w&*&9 z4BNcR3%zt*+ui*VS_?MDf|IiZ<}7Hat7mNxEiQ}HBDaN>VR4dnkcL(}H`*ht z4HMdFB4|ad$a(Z*UV~>{(YdMzqW;*$!M zM;XN)Vmdv-gKzK}dfc!J%vgvmmsoDV=w7T%g@~mjhLZU{129fOL#Xw;%>FW|wIcr7 zL|YU|%sfQqW${_ADxCrFox-cFd$PKkC~8M;#6{MsLZL$C{XrxQA8{|!EHoq&jC}GO z%8+JzAgU!-R@M;C@{;6chKwg2ZFG#m8?{;4X3MH}BuP)gdL95It`WqfW=gl($0eR$ z-oqe`?G=#jk5x;eY>|&hzs(xR%pGNjr@+chZyy6wMA}YvpVTjjiVpDiQ#|=TUT=hN zk{DQUgKu(1bVyrE))-bLhOJ70*)=zJ&G5wi)-D zt$8~)OQ|56;|KpvaO<=xy&q_Ud^IlOhUHs z@rhe~NOu@L7UZ#0`p<{5o;C%tc7tmkVznbYj-@IUSZ!MeNF0qMrT4pNJRYQ*H+3wF zvva#TJ)nW54%1kDwviA6uR2k>&Id3IL+URaR=t6e^xXf*fo(WSQ2zt>dX= zvhPzT(QBbIp<-cnQ|hZ0fcbQTv0sSeBP~*0Fk!g^D1h8nhVz+v|Mc%tD8-lfWa^#& zSOukI=kTYx`ofDp_DxcOv|cnm)ViJwux7>k4G(x z<)oZAAQ%s7TpNwDSHPw89tWm-25+X(1HJcNn76SmDIfg?X3n%UxH{>8&*qlSH3l`$ zS!>*i4it$aKtcm@Sy5qV^E*5J?X#fSem-|E{2b%{X2XSvmj*}+#{_N!lA30?O{pOx z`jLV57+=N~7xn(%{8k$dE~}(C=d&N8e#=Qsv}lX{w2x{-L~h@s;>98gDa4#cS&5r3rLVa^_OD8j5$oIjEO~r?U7CFO`lxGdTFBlhpacy9coOujN!P8@FQ!$G z^(tq0^r=n)er<|lCiBzANc+=NOkFGp?8O=ki?~j>OIa+(&&Dbe-$%Pr@)12I^ zwC|n-oAQuj!Y#$RQ28lZGIs~SE7RYsvx~`h{U86PgIm#dyB-MFgr|`jY1Yb#dh*<# zG`4&*vKV5eF9a+Xa>C$0v`=kBC%%$&$3$6UEOP&fqoS*y|USOr^ZUqLeP+M82 z#IBX`!ODK-Dh2LEhJbUp7pwVks^HD+GIu2=4&xnoYgXAp)<|Bl2^cnhHd-X5$$A%Q zsxGzub&QSdZ9ls}H1 zP2(EKcd+UJ?W2u{2AanGuXxdotON%z$`-YbiAm<8_dU}F$Bmn;Nr0d7U^67 zoga@7#3t`TAp&=b{Co8rZs0}GJm(J0>G&5@L2vIL)(f641s)S<{_MKd$hXas|KV8(w? zulmT$#}M$ZeCDuzK>R&H*6^TyR#^P+`hpKn+{?pmul)|ku4jnpg1-pR)%jWBC;2J# z0z&g!Dd*6Y-3(7sQAe!ivaPMp@3lW3_C3!&$Jlv&n)i4i?4=zIgX3snJAV53b%`|g zG#jRHCGVxPEo!~b2oE209A`RN^#J0)XSNb4QZ|WQQMAn54ZCE|e>+!5A|h&s4D|K; zR=4*SIctJa?vpL1Dr2b(5ZM zM;+y}~Wk{I?~vHjj7I4IE9H>1`by%cL{iOB`N5$g$8j_~Abjc@A2& zhk9{(!sbTtE^3zhNH9C!YzghU(->DOvEwBz=`ts_glwK^^lYVim&Yk73D5i`LM!dn z<9Qf#Yi|jtWkS_7wlgdUPEYwXp_00b+m1uXJ7d;u7_q9w?c8SPXbtVx_G5G!nL--C z_rDu_%dN2bR{*TSurNEAU?L(WiZ0)A%5P*{CS*sNtprx_%5+&|qCG+*G<;MwBflTk zLt;=~Tt50%nSLcUENr5TYu)dH8{_GQGm{I_K47O(Pw=Li&ue1unrxh^b<#P)PV9AF zj}_kU^e#rB?jk?de)#dTt*u#*?uOVN0l}i8~O@wf080Dy)2vYeKog? za7^~Q1n%-C= zzgo|cQuc@C-lI@Fspg}fZp}i42-Dc3EkgtXv4Y9(zvOHiO4Hq4ODfeO8@GJU-Z~q> z=G=&t>^^z_lwJo+HAsOsa2hK-%_AWAyH3aaL3s+6{p)STWAg;;OB+5@!4PClDPHOH z3vD9u^ryOMHm55gp9Tz$BSkFE=~gIm0t*6l%nUg-IF6usHALycnZd~i28RRfP5tjk z%DZ6LF4LSDoOs;(H_|)0I>sq8LnxmA8^j#f8mX)2*$4qwy)b%+Z{x0F{>4Z4$&oq_{w1qBgkRF%fe8Zhval3!y=r2Q2_ zI$1&1Ig-z)1TXHiyDVSAWCMwU&JH}b-WjB^Z+#`Hrtx8j<=K){Qe2!Glf0k*E=l=h zO>oA*8kD1Yo}JD)o18(MFhpqR%mn?9mydAe@TPG-yM#v^|H}?USyQQ8(LCtC0A2YO A!~g&Q literal 0 HcmV?d00001