From b4fdea260503fcd75302b9a8a1d4f3428c586fbd Mon Sep 17 00:00:00 2001 From: ribeaudc <ribeaudc> Date: Tue, 12 Jun 2007 06:44:59 +0000 Subject: [PATCH] change: - 'DBRestrictions' and 'SQLCommandTokenizer' (with corresponding Unit tests) moved from package 'ch.systemsx.cisd.common.parser' to package 'ch.systemsx.cisd.common.db' - [DBRestrictions] 'findInArray' method uses 'ArrayUtils.indexOf' method. - [DBRestrictions] better diagnostics when command starts correctly but can not be parsed because it is ill-formed. SVN: 457 --- .../common/{parser => db}/DBRestrictions.java | 83 +++++++++++-------- .../{parser => db}/SQLCommandTokenizer.java | 2 +- 2 files changed, 50 insertions(+), 35 deletions(-) rename common/source/java/ch/systemsx/cisd/common/{parser => db}/DBRestrictions.java (74%) rename common/source/java/ch/systemsx/cisd/common/{parser => db}/SQLCommandTokenizer.java (99%) diff --git a/common/source/java/ch/systemsx/cisd/common/parser/DBRestrictions.java b/common/source/java/ch/systemsx/cisd/common/db/DBRestrictions.java similarity index 74% rename from common/source/java/ch/systemsx/cisd/common/parser/DBRestrictions.java rename to common/source/java/ch/systemsx/cisd/common/db/DBRestrictions.java index 2bd630eadef..3f956f16fd8 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/DBRestrictions.java +++ b/common/source/java/ch/systemsx/cisd/common/db/DBRestrictions.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ch.systemsx.cisd.common.parser; +package ch.systemsx.cisd.common.db; import java.util.ArrayList; import java.util.HashMap; @@ -25,6 +25,7 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -43,11 +44,18 @@ public class DBRestrictions private static final Pattern VARCHAR_PATTERN = Pattern.compile("varchar\\(([0-9]+)\\)"); - private static final Pattern CREATE_TABLE_PATTERN = Pattern.compile("create table ([a-z,0-9,_]+) \\((.+)\\)"); + /** The prefix each <code>create table</code> statement starts with. */ + private static final String CREATE_TABLE_PREFIX = "create table "; + + private static final Pattern CREATE_TABLE_PATTERN = + Pattern.compile(CREATE_TABLE_PREFIX + "([a-z,0-9,_]+) \\((.+)\\)"); + + /** The prefix each <code>alter table</code> statement starts with (to add a constraint). */ + private static final String ALTER_TABLE_PREFIX = "alter table "; private static final Pattern CHECK_CONSTRAINT_PATTERN = - Pattern - .compile("alter table ([a-z,0-9,_]+) add constraint [a-z,0-9,_]+ check \\(([a-z,0-9,_]+) in \\((.+)\\)\\)"); + Pattern.compile(ALTER_TABLE_PREFIX + + "([a-z,0-9,_]+) add constraint [a-z,0-9,_]+ check \\(([a-z,0-9,_]+) in \\((.+)\\)\\)"); private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, DBRestrictions.class); @@ -137,15 +145,22 @@ public class DBRestrictions { for (String line : ddlScript) { - final Matcher createTableMatcher = CREATE_TABLE_PATTERN.matcher(line); - if (createTableMatcher.matches()) + if (line.startsWith(CREATE_TABLE_PREFIX)) { - final String tableName = createTableMatcher.group(1); - final String tableDefinition = createTableMatcher.group(2); - final String[] columnDefinitions = StringUtils.split(tableDefinition, ','); - for (String columnDefinition : columnDefinitions) + final Matcher createTableMatcher = CREATE_TABLE_PATTERN.matcher(line); + if (createTableMatcher.matches()) { - parseColumnDefinition(columnDefinition, tableName, domains); + final String tableName = createTableMatcher.group(1); + final String tableDefinition = createTableMatcher.group(2); + final String[] columnDefinitions = StringUtils.split(tableDefinition, ','); + for (String columnDefinition : columnDefinitions) + { + parseColumnDefinition(columnDefinition, tableName, domains); + } + } else + { + operationLog.warn("line \"" + line + "\" looks like table definition, but is ill-formed."); + continue; } } } @@ -186,40 +201,40 @@ public class DBRestrictions { assert array != null; assert term != null; - - for (int i = firstIndex; i < array.length; ++i) - { - if (term.equals(array[i])) - { - return i; - } - } - return -1; + return ArrayUtils.indexOf(array, term, firstIndex); } private void parserCheckedConstraints(List<String> ddlScript) { for (String line : ddlScript) { - final Matcher checkedConstraintMatcher = CHECK_CONSTRAINT_PATTERN.matcher(line); - if (checkedConstraintMatcher.matches()) + if (line.startsWith(ALTER_TABLE_PREFIX)) { - final String tableName = checkedConstraintMatcher.group(1); - final String columnName = checkedConstraintMatcher.group(2); - final String alternativesStr = checkedConstraintMatcher.group(3); - final String[] alternatives = StringUtils.split(alternativesStr, ','); - final Set<String> alternativeSet = new HashSet<String>(); - for (String alternative : alternatives) + + final Matcher checkedConstraintMatcher = CHECK_CONSTRAINT_PATTERN.matcher(line); + if (checkedConstraintMatcher.matches()) { - if (alternative.charAt(0) != '\'' || alternative.charAt(alternative.length() - 1) != '\'') + final String tableName = checkedConstraintMatcher.group(1); + final String columnName = checkedConstraintMatcher.group(2); + final String alternativesStr = checkedConstraintMatcher.group(3); + final String[] alternatives = StringUtils.split(alternativesStr, ','); + final Set<String> alternativeSet = new HashSet<String>(); + for (String alternative : alternatives) { - operationLog.warn("Invalid alternatives definition \"" + alternative + "\" for column " - + columnName + " of table " + tableName); - continue; + if (alternative.charAt(0) != '\'' || alternative.charAt(alternative.length() - 1) != '\'') + { + operationLog.warn("Invalid alternatives definition \"" + alternative + "\" for column " + + columnName + " of table " + tableName); + continue; + } + alternativeSet.add(alternative.substring(1, alternative.length() - 1)); } - alternativeSet.add(alternative.substring(1, alternative.length() - 1)); + getTableRestrictions(tableName).checkedConstraintsMap.put(columnName, alternativeSet); + } else + { + operationLog.warn("line \"" + line + "\" looks like constraint definition, but is ill-formed."); + continue; } - getTableRestrictions(tableName).checkedConstraintsMap.put(columnName, alternativeSet); } } } diff --git a/common/source/java/ch/systemsx/cisd/common/parser/SQLCommandTokenizer.java b/common/source/java/ch/systemsx/cisd/common/db/SQLCommandTokenizer.java similarity index 99% rename from common/source/java/ch/systemsx/cisd/common/parser/SQLCommandTokenizer.java rename to common/source/java/ch/systemsx/cisd/common/db/SQLCommandTokenizer.java index 519423f749a..1b6419ab2fe 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/SQLCommandTokenizer.java +++ b/common/source/java/ch/systemsx/cisd/common/db/SQLCommandTokenizer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ch.systemsx.cisd.common.parser; +package ch.systemsx.cisd.common.db; /** * A class keeping the state when normalizing a SQL script. -- GitLab