diff --git a/dbdeploy-core/src/main/java/com/dbdeploy/DbDeploy.java b/dbdeploy-core/src/main/java/com/dbdeploy/DbDeploy.java index cad2748..74561a4 100644 --- a/dbdeploy-core/src/main/java/com/dbdeploy/DbDeploy.java +++ b/dbdeploy-core/src/main/java/com/dbdeploy/DbDeploy.java @@ -3,9 +3,7 @@ import com.dbdeploy.appliers.DirectToDbApplier; import com.dbdeploy.appliers.TemplateBasedApplier; import com.dbdeploy.appliers.UndoTemplateBasedApplier; -import com.dbdeploy.database.DelimiterType; -import com.dbdeploy.database.LineEnding; -import com.dbdeploy.database.QueryStatementSplitter; +import com.dbdeploy.database.*; import com.dbdeploy.database.changelog.DatabaseSchemaVersionManager; import com.dbdeploy.database.changelog.QueryExecuter; import com.dbdeploy.exceptions.UsageException; @@ -102,9 +100,12 @@ public void go() throws Exception { new PrintWriter(outputfile, encoding), dbms, changeLogTableName, delimiter, delimiterType, getTemplatedir()); } else { - QueryStatementSplitter splitter = new QueryStatementSplitter(); - splitter.setDelimiter(getDelimiter()); - splitter.setDelimiterType(getDelimiterType()); + QueryStatementSplitterExt splitter = new QueryStatementSplitterExt(getDelimiter(),getDelimiterType()); + + + splitter.addDelimiter("SQL",new Delimiter(";",DelimiterType.normal)); + splitter.addDelimiter("PLSQL",new Delimiter("/",DelimiterType.row)); + splitter.setOutputLineEnding(lineEnding); doScriptApplier = new DirectToDbApplier(queryExecuter, databaseSchemaVersionManager, splitter); } diff --git a/dbdeploy-core/src/main/java/com/dbdeploy/appliers/DirectToDbApplier.java b/dbdeploy-core/src/main/java/com/dbdeploy/appliers/DirectToDbApplier.java index 663caca..d7ed570 100644 --- a/dbdeploy-core/src/main/java/com/dbdeploy/appliers/DirectToDbApplier.java +++ b/dbdeploy-core/src/main/java/com/dbdeploy/appliers/DirectToDbApplier.java @@ -1,7 +1,7 @@ package com.dbdeploy.appliers; import com.dbdeploy.ChangeScriptApplier; -import com.dbdeploy.database.QueryStatementSplitter; +import com.dbdeploy.database.QueryStatementSplitterExt; import com.dbdeploy.database.changelog.DatabaseSchemaVersionManager; import com.dbdeploy.database.changelog.QueryExecuter; import com.dbdeploy.exceptions.ChangeScriptFailedException; @@ -13,9 +13,9 @@ public class DirectToDbApplier implements ChangeScriptApplier { private final QueryExecuter queryExecuter; private final DatabaseSchemaVersionManager schemaVersionManager; - private final QueryStatementSplitter splitter; + private final QueryStatementSplitterExt splitter; - public DirectToDbApplier(QueryExecuter queryExecuter, DatabaseSchemaVersionManager schemaVersionManager, QueryStatementSplitter splitter) { + public DirectToDbApplier(QueryExecuter queryExecuter, DatabaseSchemaVersionManager schemaVersionManager, QueryStatementSplitterExt splitter) { this.queryExecuter = queryExecuter; this.schemaVersionManager = schemaVersionManager; this.splitter = splitter; diff --git a/dbdeploy-core/src/main/java/com/dbdeploy/database/Delimiter.java b/dbdeploy-core/src/main/java/com/dbdeploy/database/Delimiter.java new file mode 100644 index 0000000..45dd185 --- /dev/null +++ b/dbdeploy-core/src/main/java/com/dbdeploy/database/Delimiter.java @@ -0,0 +1,38 @@ +package com.dbdeploy.database; + +/** + * Created with IntelliJ IDEA. + * User: jesuspg + * Date: 5/25/12 + * Time: 12:37 AM + * To change this template use File | Settings | File Templates. + */ +public class Delimiter { + + public String getDelimiterString() { + return delimiterString; + } + + public void setDelimiterString(String delimiterString) { + this.delimiterString = delimiterString; + } + + public DelimiterType getDelimiterType() { + return delimiterType; + } + + public void setDelimiterType(DelimiterType delimiterType) { + this.delimiterType = delimiterType; + } + + private String delimiterString; + private DelimiterType delimiterType; + + + public Delimiter(String delimiterString, DelimiterType delimiterType) { + this.delimiterString=delimiterString; + this.delimiterType=delimiterType; + } + + +} diff --git a/dbdeploy-core/src/main/java/com/dbdeploy/database/QueryStatementSplitterExt.java b/dbdeploy-core/src/main/java/com/dbdeploy/database/QueryStatementSplitterExt.java new file mode 100644 index 0000000..2e9a850 --- /dev/null +++ b/dbdeploy-core/src/main/java/com/dbdeploy/database/QueryStatementSplitterExt.java @@ -0,0 +1,77 @@ +package com.dbdeploy.database; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.text.StrBuilder; +import org.apache.commons.lang.text.StrMatcher; +import org.apache.commons.lang.text.StrTokenizer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class QueryStatementSplitterExt { + + private Map delimitersMap=new HashMap(2); + + private Delimiter defaultDelimiter; + private LineEnding lineEnding = LineEnding.platform; + + public QueryStatementSplitterExt(String delimiter,DelimiterType delimiterType) { + defaultDelimiter=new Delimiter(delimiter,delimiterType); + + } + + public QueryStatementSplitterExt() { + defaultDelimiter=new Delimiter(";",DelimiterType.normal); + } + + public List split(String input) { + List statements = new ArrayList(); + StrBuilder currentSql = new StrBuilder(); + + StrTokenizer lineTokenizer = new StrTokenizer(input); + lineTokenizer.setDelimiterMatcher(StrMatcher.charSetMatcher("\r\n")); + + Delimiter currentDelimiter= defaultDelimiter; + + for (String line : lineTokenizer.getTokenArray()) { + String strippedLine = StringUtils.stripEnd(line, null); + if (!currentSql.isEmpty()) { + currentSql.append(lineEnding.get()); + } + + if (strippedLine.startsWith("--//#")) { + currentDelimiter=delimitersMap.get(strippedLine.substring(5)); + + }else { + + currentSql.append(strippedLine); + + String delimiter=currentDelimiter.getDelimiterString(); + DelimiterType delimiterType = currentDelimiter.getDelimiterType(); + if (delimiterType.matches(strippedLine, delimiter)) { + statements.add(currentSql.substring(0, currentSql.length() - delimiter.length())); + currentSql.clear(); + } + } + } + + if (!currentSql.isEmpty()) { + statements.add(currentSql.toString()); + } + + return statements; + } + + + + public void setOutputLineEnding(LineEnding lineEnding) { + this.lineEnding = lineEnding; + } + + + public void addDelimiter(String key, Delimiter delimiter) { + delimitersMap.put(key,delimiter); + } +} diff --git a/dbdeploy-core/src/test/java/com/dbdeploy/appliers/DirectToDbApplierTest.java b/dbdeploy-core/src/test/java/com/dbdeploy/appliers/DirectToDbApplierTest.java index 32b4bf8..12840d6 100644 --- a/dbdeploy-core/src/test/java/com/dbdeploy/appliers/DirectToDbApplierTest.java +++ b/dbdeploy-core/src/test/java/com/dbdeploy/appliers/DirectToDbApplierTest.java @@ -1,11 +1,11 @@ package com.dbdeploy.appliers; -import com.dbdeploy.database.QueryStatementSplitter; import com.dbdeploy.database.changelog.DatabaseSchemaVersionManager; import com.dbdeploy.database.changelog.QueryExecuter; import com.dbdeploy.exceptions.ChangeScriptFailedException; import com.dbdeploy.scripts.ChangeScript; import com.dbdeploy.scripts.StubChangeScript; +import com.dbdeploy.database.QueryStatementSplitterExt; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,7 +15,7 @@ import java.sql.SQLException; import java.util.Arrays; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; @@ -24,7 +24,7 @@ public class DirectToDbApplierTest { @Mock private QueryExecuter queryExecuter; @Mock private DatabaseSchemaVersionManager schemaVersionManager; - @Mock private QueryStatementSplitter splitter; + @Mock private QueryStatementSplitterExt splitter; private DirectToDbApplier applier; @Before diff --git a/dbdeploy-core/src/test/java/com/dbdeploy/database/QueryStatementSplitterExtTest.java b/dbdeploy-core/src/test/java/com/dbdeploy/database/QueryStatementSplitterExtTest.java new file mode 100644 index 0000000..a718f52 --- /dev/null +++ b/dbdeploy-core/src/test/java/com/dbdeploy/database/QueryStatementSplitterExtTest.java @@ -0,0 +1,50 @@ +package com.dbdeploy.database; + +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +/** + * Created with IntelliJ IDEA. + * User: jesuspg + * Date: 5/24/12 + * Time: 11:10 PM + * To change this template use File | Settings | File Templates. + */ +public class QueryStatementSplitterExtTest { + + + + @Test + public void shouldSupportTwoDelimiters() { + + //Given + + QueryStatementSplitterExt splitterExt=new QueryStatementSplitterExt(";",DelimiterType.normal); + + splitterExt.addDelimiter("SQL",new Delimiter(";",DelimiterType.normal)); + splitterExt.addDelimiter("PLSQL",new Delimiter("/",DelimiterType.row)); + final String expectedItem1="SELECT 1"; + final String expectedItem2="CREATE PROCEDURE\\n select 1;\\nEND;\n"; + final String inputWithSQLandPLSQL=("--//#SQL\n"+expectedItem1+";\n--//#PLSQL\n"+expectedItem2+"/"); + + //When + + List statements= splitterExt.split(inputWithSQLandPLSQL) ; + + //Then + assertThat(statements.size(),is(2)); + assertThat(statements ,hasItems(expectedItem1,expectedItem2)); + + + } + + + + + +}