diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbasemysql.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbasemysql.sql new file mode 100644 index 0000000000..852211838b --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbasemysql.sql @@ -0,0 +1,11 @@ +-- Autogenerated: do not edit this file +DROP TABLE IF EXISTS BATCH_STEP_EXECUTION_CONTEXT; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_CONTEXT; +DROP TABLE IF EXISTS BATCH_STEP_EXECUTION; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_PARAMS; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION; +DROP TABLE IF EXISTS BATCH_JOB_INSTANCE; + +DROP SEQUENCE IF EXISTS BATCH_STEP_EXECUTION_SEQ; +DROP SEQUENCE IF EXISTS BATCH_JOB_EXECUTION_SEQ; +DROP SEQUENCE IF EXISTS BATCH_JOB_SEQ; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbaseoracle.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbaseoracle.sql new file mode 100644 index 0000000000..852211838b --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbaseoracle.sql @@ -0,0 +1,11 @@ +-- Autogenerated: do not edit this file +DROP TABLE IF EXISTS BATCH_STEP_EXECUTION_CONTEXT; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_CONTEXT; +DROP TABLE IF EXISTS BATCH_STEP_EXECUTION; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_PARAMS; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION; +DROP TABLE IF EXISTS BATCH_JOB_INSTANCE; + +DROP SEQUENCE IF EXISTS BATCH_STEP_EXECUTION_SEQ; +DROP SEQUENCE IF EXISTS BATCH_JOB_EXECUTION_SEQ; +DROP SEQUENCE IF EXISTS BATCH_JOB_SEQ; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbasesqlserver.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbasesqlserver.sql new file mode 100644 index 0000000000..852211838b --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-kingbasesqlserver.sql @@ -0,0 +1,11 @@ +-- Autogenerated: do not edit this file +DROP TABLE IF EXISTS BATCH_STEP_EXECUTION_CONTEXT; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_CONTEXT; +DROP TABLE IF EXISTS BATCH_STEP_EXECUTION; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_PARAMS; +DROP TABLE IF EXISTS BATCH_JOB_EXECUTION; +DROP TABLE IF EXISTS BATCH_JOB_INSTANCE; + +DROP SEQUENCE IF EXISTS BATCH_STEP_EXECUTION_SEQ; +DROP SEQUENCE IF EXISTS BATCH_JOB_EXECUTION_SEQ; +DROP SEQUENCE IF EXISTS BATCH_JOB_SEQ; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbasemysql.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbasemysql.sql new file mode 100644 index 0000000000..7ad368b4ff --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbasemysql.sql @@ -0,0 +1,78 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE IF NOT EXISTS BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +); + +CREATE TABLE IF NOT EXISTS BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME DATETIME(6) NOT NULL, + START_TIME DATETIME(6) DEFAULT NULL , + END_TIME DATETIME(6) DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME(6), + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +); + +CREATE TABLE IF NOT EXISTS BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + PARAMETER_NAME VARCHAR(100) NOT NULL , + PARAMETER_TYPE VARCHAR(100) NOT NULL , + PARAMETER_VALUE VARCHAR(2500) , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE TABLE IF NOT EXISTS BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + CREATE_TIME DATETIME(6) NOT NULL, + START_TIME DATETIME(6) DEFAULT NULL , + END_TIME DATETIME(6) DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME(6), + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE TABLE IF NOT EXISTS BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +); + +CREATE TABLE IF NOT EXISTS BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE SEQUENCE IF NOT EXISTS BATCH_STEP_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE IF NOT EXISTS BATCH_JOB_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE IF NOT EXISTS BATCH_JOB_SEQ MAXVALUE 9223372036854775807 NO CYCLE; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbaseoracle.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbaseoracle.sql new file mode 100644 index 0000000000..209ea31c77 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbaseoracle.sql @@ -0,0 +1,78 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID NUMBER(19,0) NOT NULL PRIMARY KEY , + VERSION NUMBER(19,0) , + JOB_NAME VARCHAR2(100 char) NOT NULL, + JOB_KEY VARCHAR2(32 char) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +); + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , + VERSION NUMBER(19,0) , + JOB_INSTANCE_ID NUMBER(19,0) NOT NULL, + CREATE_TIME TIMESTAMP(9) NOT NULL, + START_TIME TIMESTAMP(9) DEFAULT NULL , + END_TIME TIMESTAMP(9) DEFAULT NULL , + STATUS VARCHAR2(10 char) , + EXIT_CODE VARCHAR2(2500 char) , + EXIT_MESSAGE VARCHAR2(2500 char) , + LAST_UPDATED TIMESTAMP(9), + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +); + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL , + PARAMETER_NAME VARCHAR(100 char) NOT NULL , + PARAMETER_TYPE VARCHAR(100 char) NOT NULL , + PARAMETER_VALUE VARCHAR(2500 char) , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , + VERSION NUMBER(19,0) NOT NULL, + STEP_NAME VARCHAR2(100 char) NOT NULL, + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL, + CREATE_TIME TIMESTAMP(9) NOT NULL, + START_TIME TIMESTAMP(9) DEFAULT NULL , + END_TIME TIMESTAMP(9) DEFAULT NULL , + STATUS VARCHAR2(10 char) , + COMMIT_COUNT NUMBER(19,0) , + READ_COUNT NUMBER(19,0) , + FILTER_COUNT NUMBER(19,0) , + WRITE_COUNT NUMBER(19,0) , + READ_SKIP_COUNT NUMBER(19,0) , + WRITE_SKIP_COUNT NUMBER(19,0) , + PROCESS_SKIP_COUNT NUMBER(19,0) , + ROLLBACK_COUNT NUMBER(19,0) , + EXIT_CODE VARCHAR2(2500 char) , + EXIT_MESSAGE VARCHAR2(2500 char) , + LAST_UPDATED TIMESTAMP(9), + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR2(2500 char) NOT NULL, + SERIALIZED_CONTEXT CLOB , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +); + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR2(2500 char) NOT NULL, + SERIALIZED_CONTEXT CLOB , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbasesqlserver.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbasesqlserver.sql new file mode 100644 index 0000000000..1c40ab45c9 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-kingbasesqlserver.sql @@ -0,0 +1,78 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE IF NOT EXISTS BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE IF NOT EXISTS BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME DATETIME2 NOT NULL, + START_TIME DATETIME2 DEFAULT NULL , + END_TIME DATETIME2 DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME2, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE IF NOT EXISTS BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + PARAMETER_NAME VARCHAR(100) NOT NULL , + PARAMETER_TYPE VARCHAR(100) NOT NULL , + PARAMETER_VALUE VARCHAR(2500) , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE IF NOT EXISTS BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + CREATE_TIME DATETIME2 NOT NULL, + START_TIME DATETIME2 DEFAULT NULL , + END_TIME DATETIME2 DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME2, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE IF NOT EXISTS BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE IF NOT EXISTS BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE IF NOT EXISTS BATCH_STEP_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE IF NOT EXISTS BATCH_JOB_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE IF NOT EXISTS BATCH_JOB_SEQ MAXVALUE 9223372036854775807 NO CYCLE; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/builder/JdbcPagingItemReaderBuilder.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/builder/JdbcPagingItemReaderBuilder.java index 408263ea42..7da76c11d1 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/builder/JdbcPagingItemReaderBuilder.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/builder/JdbcPagingItemReaderBuilder.java @@ -34,6 +34,7 @@ import org.springframework.batch.item.database.support.SqlServerPagingQueryProvider; import org.springframework.batch.item.database.support.SqlitePagingQueryProvider; import org.springframework.batch.item.database.support.SybasePagingQueryProvider; +import org.springframework.batch.item.database.support.KingbasePagingQueryProvider; import org.springframework.batch.support.DatabaseType; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.DataClassRowMapper; @@ -361,6 +362,7 @@ protected PagingQueryProvider determineQueryProvider(DataSource dataSource) { case MARIADB -> new MariaDBPagingQueryProvider(); case ORACLE -> new OraclePagingQueryProvider(); case POSTGRES -> new PostgresPagingQueryProvider(); + case KINGBASE -> new KingbasePagingQueryProvider(); case SYBASE -> new SybasePagingQueryProvider(); case SQLITE -> new SqlitePagingQueryProvider(); }; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java index ef9c279cf8..c5861d9bd4 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactory.java @@ -48,6 +48,7 @@ import static org.springframework.batch.support.DatabaseType.SQLITE; import static org.springframework.batch.support.DatabaseType.SQLSERVER; import static org.springframework.batch.support.DatabaseType.SYBASE; +import static org.springframework.batch.support.DatabaseType.KINGBASE; /** * Default implementation of the {@link DataFieldMaxValueIncrementerFactory} interface. @@ -120,6 +121,9 @@ else if (databaseType == ORACLE) { else if (databaseType == POSTGRES) { return new PostgresSequenceMaxValueIncrementer(dataSource, incrementerName); } + else if (databaseType == KINGBASE) { + return new PostgresSequenceMaxValueIncrementer(dataSource, incrementerName); + } else if (databaseType == SQLITE) { return new SqliteMaxValueIncrementer(dataSource, incrementerName, incrementerColumnName); } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/KingbasePagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/KingbasePagingQueryProvider.java new file mode 100644 index 0000000000..c6a503e5df --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/KingbasePagingQueryProvider.java @@ -0,0 +1,27 @@ +package org.springframework.batch.item.database.support; + +import org.springframework.util.StringUtils; + + +public class KingbasePagingQueryProvider extends AbstractSqlPagingQueryProvider { + + @Override + public String generateFirstPageQuery(int pageSize) { + return SqlPagingQueryUtils.generateLimitSqlQuery(this, false, buildLimitClause(pageSize)); + } + + @Override + public String generateRemainingPagesQuery(int pageSize) { + if (StringUtils.hasText(getGroupClause())) { + return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, buildLimitClause(pageSize)); + } + else { + return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); + } + } + + private String buildLimitClause(int pageSize) { + return new StringBuilder().append("LIMIT ").append(pageSize).toString(); + } + +} diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java index 608e0f2e5b..2d2f58c520 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryProviderFactoryBean.java @@ -30,6 +30,7 @@ import static org.springframework.batch.support.DatabaseType.SQLITE; import static org.springframework.batch.support.DatabaseType.SQLSERVER; import static org.springframework.batch.support.DatabaseType.SYBASE; +import static org.springframework.batch.support.DatabaseType.KINGBASE; import java.util.HashMap; import java.util.LinkedHashMap; @@ -85,6 +86,7 @@ public class SqlPagingQueryProviderFactoryBean implements FactoryBean nameMap;