/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.core.util;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Utilities for dealing with SQL strings.
*/
public class SqlUtil {
private static TreeSet<String> updateKeywords = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
static {
updateKeywords.add("insert"); //$NON-NLS-1$
updateKeywords.add("update"); //$NON-NLS-1$
updateKeywords.add("delete"); //$NON-NLS-1$
updateKeywords.add("drop"); //$NON-NLS-1$
updateKeywords.add("create"); //$NON-NLS-1$
}
private static Pattern PATTERN = Pattern.compile("^(?:\\s|(?:/\\*.*\\*/))*(\\w*)\\s", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); //$NON-NLS-1$
private static Pattern INTO_PATTERN = Pattern.compile("(?:'[^']*')|(\\sinto\\s)", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); //$NON-NLS-1$
private SqlUtil() {
super();
}
/**
* Determines whether a sql statement is an update (INSERT, UPDATE, or DELETE).
* Throws exception if SQL statement appears to be invalid (because it's null, has
* 0 length, etc.
* @param sql Sql string
* @return True if INSERT, UPDATE, or DELETE, and false otherwise
* @throws IllegalArgumentException If sql string is invalid and neither a
* query or an update
*/
public static boolean isUpdateSql(String sql) throws IllegalArgumentException {
String keyWord = getKeyword(sql);
return updateKeywords.contains(keyWord);
}
public static String getKeyword(String sql) {
Matcher matcher = PATTERN.matcher(sql);
if (!matcher.find()) {
return sql; //shouldn't happen
}
String keyword = matcher.group(1);
if (keyword.equalsIgnoreCase("select")) { //$NON-NLS-1$
int end = matcher.end();
Matcher intoMatcher = INTO_PATTERN.matcher(sql);
while (intoMatcher.find(end)) {
if (intoMatcher.group(1) != null) {
return "insert"; //$NON-NLS-1$
}
end = intoMatcher.end();
}
}
return keyword;
}
public static SQLException createFeatureNotSupportedException() {
StackTraceElement ste = new Exception().getStackTrace()[1];
String methodName = ste.getMethodName();
return new SQLFeatureNotSupportedException(methodName + " is not supported"); //$NON-NLS-1$
}
}