diff --git a/spring-batch-core/pom.xml b/spring-batch-core/pom.xml
index 8c4ef7143..145cb0478 100644
--- a/spring-batch-core/pom.xml
+++ b/spring-batch-core/pom.xml
@@ -140,7 +140,7 @@
-
+
@@ -154,7 +154,7 @@
-
+
@@ -168,7 +168,7 @@
-
+
@@ -182,7 +182,7 @@
-
+
@@ -196,7 +196,7 @@
-
+
@@ -210,7 +210,7 @@
-
+
diff --git a/spring-batch-core/src/main/sql/schema-upgrade.sql.vpp b/spring-batch-core/src/main/sql/schema-upgrade.sql.vpp
index 55527615b..d326186d5 100644
--- a/spring-batch-core/src/main/sql/schema-upgrade.sql.vpp
+++ b/spring-batch-core/src/main/sql/schema-upgrade.sql.vpp
@@ -1,5 +1,7 @@
-- Autogenerated: do not edit this file
+-- Upgrades an existing 1.0 schema to version 1.1.
+
#parse("${includes}/tables-context.sql.vpp")
#parse("${includes}/upgrade.sql.vpp")
diff --git a/spring-batch-core/src/main/sql/sqlserver.properties b/spring-batch-core/src/main/sql/sqlserver.properties
new file mode 100644
index 000000000..9ab4484cb
--- /dev/null
+++ b/spring-batch-core/src/main/sql/sqlserver.properties
@@ -0,0 +1,10 @@
+# SQL language oddities
+BIGINT = BIGINT
+IDENTITY =
+GENERATED =
+DOUBLE = DOUBLE PRECISION
+BLOB = IMAGE
+TIMESTAMP = DATETIME
+VARCHAR = VARCHAR
+# for generating drop statements...
+SEQUENCE = TABLE
diff --git a/spring-batch-core/src/main/sql/sqlserver.vpp b/spring-batch-core/src/main/sql/sqlserver.vpp
new file mode 100644
index 000000000..1c798e451
--- /dev/null
+++ b/spring-batch-core/src/main/sql/sqlserver.vpp
@@ -0,0 +1,3 @@
+#macro (sequence $name)CREATE TABLE ${name} (ID BIGINT IDENTITY);
+#end
+#macro (notnull $name $type)ALTER COLUMN ${name} ${type} NOT NULL#end
diff --git a/spring-batch-core/src/main/sql/sybase.properties b/spring-batch-core/src/main/sql/sybase.properties
new file mode 100644
index 000000000..35d7c8d06
--- /dev/null
+++ b/spring-batch-core/src/main/sql/sybase.properties
@@ -0,0 +1,11 @@
+# SQL language oddities
+BIGINT = BIGINT
+IDENTITY =
+GENERATED =
+DOUBLE = DOUBLE PRECISION
+BLOB = IMAGE
+TIMESTAMP = DATETIME
+VARCHAR = VARCHAR
+NULL = NULL
+# for generating drop statements...
+SEQUENCE = TABLE
diff --git a/spring-batch-core/src/main/sql/sybase.vpp b/spring-batch-core/src/main/sql/sybase.vpp
new file mode 100644
index 000000000..1c798e451
--- /dev/null
+++ b/spring-batch-core/src/main/sql/sybase.vpp
@@ -0,0 +1,3 @@
+#macro (sequence $name)CREATE TABLE ${name} (ID BIGINT IDENTITY);
+#end
+#macro (notnull $name $type)ALTER COLUMN ${name} ${type} NOT NULL#end
diff --git a/spring-batch-core/src/main/sql/tables-context.sql.vpp b/spring-batch-core/src/main/sql/tables-context.sql.vpp
index da13284d6..f588b355f 100644
--- a/spring-batch-core/src/main/sql/tables-context.sql.vpp
+++ b/spring-batch-core/src/main/sql/tables-context.sql.vpp
@@ -1,11 +1,11 @@
CREATE TABLE BATCH_EXECUTION_CONTEXT (
- EXECUTION_ID ${BIGINT} NOT NULL ,
- DISCRIMINATOR ${VARCHAR}(1) NOT NULL ,
- TYPE_CD ${VARCHAR}(6) NOT NULL ,
- KEY_NAME ${VARCHAR}(1000) NOT NULL ,
- STRING_VAL ${VARCHAR}(1000) ,
- DATE_VAL ${TIMESTAMP} DEFAULT NULL ,
- LONG_VAL ${BIGINT} ,
- DOUBLE_VAL ${DOUBLE} ,
- OBJECT_VAL ${BLOB}
+ EXECUTION_ID ${BIGINT} NOT NULL,
+ DISCRIMINATOR ${VARCHAR}(1) NOT NULL,
+ TYPE_CD ${VARCHAR}(6) NOT NULL,
+ KEY_NAME ${VARCHAR}(1000) NOT NULL,
+ STRING_VAL ${VARCHAR}(1000) $!{NULL},
+ DATE_VAL ${TIMESTAMP} DEFAULT NULL,
+ LONG_VAL ${BIGINT} $!{NULL},
+ DOUBLE_VAL ${DOUBLE} $!{NULL},
+ OBJECT_VAL ${BLOB} $!{NULL}
) $!{VOODOO};
diff --git a/spring-batch-core/src/main/sql/tables-main.sql.vpp b/spring-batch-core/src/main/sql/tables-main.sql.vpp
index f3365b18d..b54c5eeac 100644
--- a/spring-batch-core/src/main/sql/tables-main.sql.vpp
+++ b/spring-batch-core/src/main/sql/tables-main.sql.vpp
@@ -1,33 +1,33 @@
CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID ${BIGINT} $!{IDENTITY} NOT NULL PRIMARY KEY $!{GENERATED},
- VERSION ${BIGINT},
- JOB_NAME ${VARCHAR}(100) NOT NULL ,
- JOB_KEY ${VARCHAR}(2500)
+ VERSION ${BIGINT} $!{NULL},
+ JOB_NAME ${VARCHAR}(100) NOT NULL,
+ JOB_KEY ${VARCHAR}(2500) $!{NULL}
) $!{VOODOO};
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID ${BIGINT} $!{IDENTITY} NOT NULL PRIMARY KEY $!{GENERATED},
- VERSION ${BIGINT},
+ VERSION ${BIGINT} $!{NULL},
JOB_INSTANCE_ID ${BIGINT} NOT NULL,
CREATE_TIME ${TIMESTAMP} NOT NULL,
- START_TIME ${TIMESTAMP} DEFAULT NULL,
- END_TIME ${TIMESTAMP} DEFAULT NULL,
- STATUS ${VARCHAR}(10),
- CONTINUABLE CHAR(1),
- EXIT_CODE ${VARCHAR}(20),
- EXIT_MESSAGE ${VARCHAR}(2500),
+ START_TIME ${TIMESTAMP} DEFAULT NULL $!{NULL},
+ END_TIME ${TIMESTAMP} DEFAULT NULL $!{NULL},
+ STATUS ${VARCHAR}(10) $!{NULL},
+ CONTINUABLE CHAR(1) $!{NULL},
+ EXIT_CODE ${VARCHAR}(20) $!{NULL},
+ EXIT_MESSAGE ${VARCHAR}(2500) $!{NULL},
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) $!{VOODOO};
CREATE TABLE BATCH_JOB_PARAMS (
JOB_INSTANCE_ID ${BIGINT} NOT NULL ,
- TYPE_CD ${VARCHAR}(6) NOT NULL ,
+ TYPE_CD ${VARCHAR}(6) NOT NULL ,
KEY_NAME ${VARCHAR}(100) NOT NULL ,
- STRING_VAL ${VARCHAR}(250) ,
- DATE_VAL ${TIMESTAMP} DEFAULT NULL,
- LONG_VAL ${BIGINT} ,
- DOUBLE_VAL ${DOUBLE},
+ STRING_VAL ${VARCHAR}(250) $!{NULL},
+ DATE_VAL ${TIMESTAMP} DEFAULT NULL $!{NULL},
+ LONG_VAL ${BIGINT} $!{NULL},
+ DOUBLE_VAL ${DOUBLE} $!{NULL},
constraint JOB_INST_PARAMS_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) $!{VOODOO};
@@ -38,16 +38,16 @@ CREATE TABLE BATCH_STEP_EXECUTION (
STEP_NAME ${VARCHAR}(100) NOT NULL,
JOB_EXECUTION_ID ${BIGINT} NOT NULL,
START_TIME ${TIMESTAMP} NOT NULL ,
- END_TIME ${TIMESTAMP} DEFAULT NULL,
- STATUS ${VARCHAR}(10),
- COMMIT_COUNT ${BIGINT} ,
- ITEM_COUNT ${BIGINT} ,
- READ_SKIP_COUNT ${BIGINT} ,
- WRITE_SKIP_COUNT ${BIGINT} ,
- ROLLBACK_COUNT ${BIGINT} ,
- CONTINUABLE CHAR(1),
- EXIT_CODE ${VARCHAR}(20),
- EXIT_MESSAGE ${VARCHAR}(2500),
+ END_TIME ${TIMESTAMP} DEFAULT NULL $!{NULL},
+ STATUS ${VARCHAR}(10) $!{NULL},
+ COMMIT_COUNT ${BIGINT} $!{NULL},
+ ITEM_COUNT ${BIGINT} $!{NULL},
+ READ_SKIP_COUNT ${BIGINT} $!{NULL},
+ WRITE_SKIP_COUNT ${BIGINT} $!{NULL},
+ ROLLBACK_COUNT ${BIGINT} $!{NULL},
+ CONTINUABLE CHAR(1) $!{NULL},
+ EXIT_CODE ${VARCHAR}(20) $!{NULL},
+ EXIT_MESSAGE ${VARCHAR}(2500) $!{NULL},
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) $!{VOODOO};
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 6524a3cab..1ba00bee1 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
@@ -24,6 +24,8 @@ import org.springframework.jdbc.support.incrementer.HsqlMaxValueIncrementer;
import org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer;
import org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer;
import org.springframework.jdbc.support.incrementer.PostgreSQLSequenceMaxValueIncrementer;
+import org.springframework.jdbc.support.incrementer.SqlServerMaxValueIncrementer;
+import org.springframework.jdbc.support.incrementer.SybaseMaxValueIncrementer;
/**
* Default implementation of the {@link DataFieldMaxValueIncrementerFactory}
@@ -38,6 +40,8 @@ import org.springframework.jdbc.support.incrementer.PostgreSQLSequenceMaxValueIn
*
mysql
* oracle
* postgres
+ * sqlserver
+ * sybase
*
*
* @author Lucas Ward
@@ -57,15 +61,19 @@ public class DefaultDataFieldMaxValueIncrementerFactory implements DataFieldMaxV
static final String DB_TYPE_POSTGRES = "postgres";
+ static final String DB_TYPE_SQLSERVER = "sqlserver";
+
+ static final String DB_TYPE_SYBASE = "sybase";
+
private DataSource dataSource;
- private String incrementerColumnName = "id";
+ private String incrementerColumnName = "ID";
/**
- * Public setter for the column name (defaults to "id") in the incrementer.
- * Only used by some platforms (Derby, HSQL, MySQL), and should be fine for
- * use with Spring Batch meta data as long as the default batch schema
- * hasn't been changed.
+ * Public setter for the column name (defaults to "ID") in the incrementer.
+ * Only used by some platforms (Derby, HSQL, MySQL, SQL Server and Sybase),
+ * and should be fine for use with Spring Batch meta data as long as the default
+ * batch schema hasn't been changed.
*
* @param incrementerColumnName the primary key column name to set
*/
@@ -96,6 +104,12 @@ public class DefaultDataFieldMaxValueIncrementerFactory implements DataFieldMaxV
else if (DB_TYPE_POSTGRES.equals(incrementerType)) {
return new PostgreSQLSequenceMaxValueIncrementer(dataSource, incrementerName);
}
+ else if (DB_TYPE_SQLSERVER.equals(incrementerType)) {
+ return new SqlServerMaxValueIncrementer(dataSource, incrementerName, incrementerColumnName);
+ }
+ else if (DB_TYPE_SYBASE.equals(incrementerType)) {
+ return new SybaseMaxValueIncrementer(dataSource, incrementerName, incrementerColumnName);
+ }
throw new IllegalArgumentException("databaseType argument was not on the approved list");
}
@@ -103,7 +117,8 @@ public class DefaultDataFieldMaxValueIncrementerFactory implements DataFieldMaxV
public boolean isSupportedIncrementerType(String incrementerType) {
if (!DB_TYPE_DB2.equals(incrementerType) && !DB_TYPE_DERBY.equals(incrementerType)
&& !DB_TYPE_HSQL.equals(incrementerType) && !DB_TYPE_MYSQL.equals(incrementerType)
- && !DB_TYPE_ORACLE.equals(incrementerType) && !DB_TYPE_POSTGRES.equals(incrementerType)) {
+ && !DB_TYPE_ORACLE.equals(incrementerType) && !DB_TYPE_POSTGRES.equals(incrementerType)
+ && !DB_TYPE_SQLSERVER.equals(incrementerType) && !DB_TYPE_SYBASE.equals(incrementerType)) {
return false;
}
@@ -113,6 +128,7 @@ public class DefaultDataFieldMaxValueIncrementerFactory implements DataFieldMaxV
}
public String[] getSupportedIncrementerTypes() {
- return new String[] { DB_TYPE_DB2, DB_TYPE_DERBY, DB_TYPE_HSQL, DB_TYPE_MYSQL, DB_TYPE_ORACLE, DB_TYPE_POSTGRES };
+ return new String[] { DB_TYPE_DB2, DB_TYPE_DERBY, DB_TYPE_HSQL, DB_TYPE_MYSQL,
+ DB_TYPE_ORACLE, DB_TYPE_POSTGRES, DB_TYPE_SQLSERVER, DB_TYPE_SYBASE };
}
}
diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java
index 9ae585c29..0c427b87d 100644
--- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java
+++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/DefaultDataFieldMaxValueIncrementerFactoryTests.java
@@ -26,6 +26,8 @@ import org.springframework.jdbc.support.incrementer.HsqlMaxValueIncrementer;
import org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer;
import org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer;
import org.springframework.jdbc.support.incrementer.PostgreSQLSequenceMaxValueIncrementer;
+import org.springframework.jdbc.support.incrementer.SqlServerMaxValueIncrementer;
+import org.springframework.jdbc.support.incrementer.SybaseMaxValueIncrementer;
/**
* @author Lucas Ward
@@ -52,6 +54,8 @@ public class DefaultDataFieldMaxValueIncrementerFactoryTests extends TestCase {
assertTrue(factory.isSupportedIncrementerType("oracle"));
assertTrue(factory.isSupportedIncrementerType("postgres"));
assertTrue(factory.isSupportedIncrementerType("hsql"));
+ assertTrue(factory.isSupportedIncrementerType("sqlserver"));
+ assertTrue(factory.isSupportedIncrementerType("sybase"));
}
public void testUnsupportedDatabaseType(){
@@ -103,5 +107,13 @@ public class DefaultDataFieldMaxValueIncrementerFactoryTests extends TestCase {
assertTrue(factory.getIncrementer("postgres", "NAME") instanceof PostgreSQLSequenceMaxValueIncrementer);
}
+ public void testMsSqlServer(){
+ assertTrue(factory.getIncrementer("sqlserver", "NAME") instanceof SqlServerMaxValueIncrementer);
+ }
+
+ public void testSybase(){
+ assertTrue(factory.getIncrementer("sybase", "NAME") instanceof SybaseMaxValueIncrementer);
+ }
+
}