001: package liquibase.change;
002:
003: import liquibase.database.Database;
004: import liquibase.database.sql.RawSqlStatement;
005: import liquibase.database.sql.SqlStatement;
006: import liquibase.exception.UnsupportedChangeException;
007: import liquibase.util.StringUtils;
008:
009: import java.util.ArrayList;
010: import java.util.List;
011:
012: /**
013: * A common parent for all SQL related changes regardless of where the sql was sourced from.
014: *
015: * Implements the necessary logic to choose how it should be parsed to generate the statements.
016: *
017: * @author <a href="mailto:csuml@yahoo.co.uk">Paul Keeble</a>
018: *
019: */
020: public abstract class AbstractSQLChange extends AbstractChange {
021:
022: private boolean stripComments;
023: private boolean splitStatements;
024: private String sql;
025:
026: protected AbstractSQLChange(String tagName, String changeName) {
027: super (tagName, changeName);
028: stripComments = false;
029: splitStatements = true;
030: }
031:
032: /**
033: * @param stripComments true if comments should be stripped out, otherwise false
034: */
035: public void setStripComments(Boolean stripComments) {
036: this .stripComments = stripComments;
037: }
038:
039: /**
040: *
041: * @return true if stripping comments, otherwise false
042: */
043: public boolean isStrippingComments() {
044: return stripComments;
045: }
046:
047: /**
048: * If set to true then the sql will be split around any ; and \ngo\n entries in the sql and
049: * each line provided as a separate statement.
050: *
051: * @param splitStatements set true if the SQL should be split, otherwise false
052: */
053: public void setSplitStatements(Boolean splitStatements) {
054: this .splitStatements = splitStatements;
055: }
056:
057: /**
058: *
059: * @return true if a multi-line file will be split, otherwise false
060: */
061: public boolean isSplittingStatements() {
062: return splitStatements;
063: }
064:
065: public String getSql() {
066: return sql;
067: }
068:
069: /**
070: * The raw SQL to use for this change.
071: */
072: public void setSql(String sql) {
073: this .sql = sql;
074: }
075:
076: /**
077: * Generates one or more statements depending on how the SQL should be parsed.
078: * If split statements is set to true then the SQL is split on the ; and go\n entries
079: * found in the sql text and each is made a separate statement.
080: *
081: * If stripping comments is true then any comments after -- on a line and any comments
082: * between /* and \*\/ will be stripped before the splitting is executed.
083: *
084: * The end result is one or more SQL statements split in the way the user requested
085: */
086: public SqlStatement[] generateStatements(Database database)
087: throws UnsupportedChangeException {
088:
089: List<SqlStatement> returnStatements = new ArrayList<SqlStatement>();
090:
091: String processedSQL = isStrippingComments() ? StringUtils
092: .stripComments(getSql()) : getSql();
093:
094: if (isSplittingStatements()) {
095: String[] statements = StringUtils.splitSQL(processedSQL);
096: for (String statement : statements) {
097: returnStatements.add(new RawSqlStatement(statement));
098: }
099: } else {
100: returnStatements.add(new RawSqlStatement(processedSQL));
101: }
102:
103: return returnStatements
104: .toArray(new SqlStatement[returnStatements.size()]);
105: }
106: }
|