Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions dbdeploy-core/src/main/java/com/dbdeploy/DbDeploy.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down
38 changes: 38 additions & 0 deletions dbdeploy-core/src/main/java/com/dbdeploy/database/Delimiter.java
Original file line number Diff line number Diff line change
@@ -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;
}


}
Original file line number Diff line number Diff line change
@@ -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<String,Delimiter> delimitersMap=new HashMap<String, Delimiter>(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<String> split(String input) {
List<String> statements = new ArrayList<String>();
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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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.*;
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String> statements= splitterExt.split(inputWithSQLandPLSQL) ;

//Then
assertThat(statements.size(),is(2));
assertThat(statements ,hasItems(expectedItem1,expectedItem2));


}





}