package com.med.sql;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
public class MSSqlUtils {
// MS SQL internal schemas -- format is database_name.schema_name
static final String[] MSSQL_SCHEMAS = {
"alineo_mssql_db.db_accessadmin",
"alineo_mssql_db.db_backupoperator",
"alineo_mssql_db.db_datareader",
"alineo_mssql_db.db_datawriter",
"alineo_mssql_db.db_ddladmin",
"alineo_mssql_db.db_denydatareader",
"alineo_mssql_db.db_denydatawriter",
"alineo_mssql_db.INFORMATION_SCHEMA", // views
"alineo_mssql_db.db_owner",
"alineo_mssql_db.db_securityadmin",
"alineo_mssql_db.dbo",
"alineo_mssql_db.guest",
"alineo_mssql_db.sys", // views
"alineo_mssql_db.\"SYSTEM\""
};
// MS SQL 2008 reserved words
static final String[] MSSQL_RESERVED_WORDS = {
"ADD",
"ALL",
"ALTER",
"AND",
"ANY",
"AS",
"ASC",
"AUTHORIZATION",
"BACKUP",
"BEGIN",
"BETWEEN",
"BREAK",
"BROWSE",
"BULK",
"BY",
"CASCADE",
"CASE",
"CHECK",
"CHECKPOINT",
"CLOSE",
"CLUSTERED",
"COALESCE",
"COLLATE",
"COLUMN",
"COMMIT",
"COMPUTE",
"CONSTRAINT",
"CONTAINS",
"CONTAINSTABLE",
"CONTINUE",
"CONVERT",
"CREATE",
"CROSS",
"CURRENT",
"CURRENT_DATE",
"CURRENT_TIME",
"CURRENT_TIMESTAMP",
"CURRENT_USER",
"CURSOR",
"DATABASE",
"DBCC",
"DEALLOCATE",
"DECLARE",
"DEFAULT",
"DELETE",
"DENY",
"DESC",
"DISK",
"DISTINCT",
"DISTRIBUTED",
"DOUBLE",
"DROP",
"DUMP",
"ELSE",
"END",
"ERRLVL",
"ESCAPE",
"EXCEPT",
"EXEC",
"EXECUTE",
"EXISTS",
"EXIT",
"EXTERNAL",
"FETCH",
"FILE",
"FILLFACTOR",
"FOR",
"FOREIGN",
"FREETEXT",
"FREETEXTTABLE",
"FROM",
"FULL",
"FUNCTION",
"GOTO",
"GRANT",
"GROUP",
"HAVING",
"HOLDLOCK",
"IDENTITY",
"IDENTITYCOL",
"IDENTITY_INSERT",
"IF",
"IN",
"INDEX",
"INNER",
"INSERT",
"INTERSECT",
"INTO",
"IS",
"JOIN",
"KEY",
"KILL",
"LEFT",
"LIKE",
"LINENO",
"LOAD",
"MERGE",
"NATIONAL",
"NOCHECK",
"NONCLUSTERED",
"NOT",
"NULL",
"NULLIF",
"OF",
"OFF",
"OFFSETS",
"ON",
"OPEN",
"OPENDATASOURCE",
"OPENQUERY",
"OPENROWSET",
"OPENXML",
"OPTION",
"OR",
"ORDER",
"OUTER",
"OVER",
"PERCENT",
"PIVOT",
"PLAN",
"PRECISION",
"PRIMARY",
"PRINT",
"PROC",
"PROCEDURE",
"PUBLIC",
"RAISERROR",
"READ",
"READTEXT",
"RECONFIGURE",
"REFERENCES",
"REPLICATION",
"RESTORE",
"RESTRICT",
"RETURN",
"REVERT",
"REVOKE",
"RIGHT",
"ROLLBACK",
"ROWCOUNT",
"ROWGUIDCOL",
"RULE",
"SAVE",
"SCHEMA",
"SECURITYAUDIT",
"SELECT",
"SESSION_USER",
"SET",
"SETUSER",
"SHUTDOWN",
"SOME",
"STATISTICS",
"SYSTEM_USER",
"TABLE",
"TABLESAMPLE",
"TEXTSIZE",
"THEN",
"TO",
"TOP",
"TRAN",
"TRANSACTION",
"TRIGGER",
"TRUNCATE",
"TSEQUAL",
"UNION",
"UNIQUE",
"UNPIVOT",
"UPDATE",
"UPDATETEXT",
"USE",
"USER",
"VALUES",
"VARYING",
"VIEW",
"WAITFOR",
"WHEN",
"WHERE",
"WHILE",
"WITH",
"WRITETEXT"
};
static boolean isReservedWord(String name) {
if (name != null) {
for (String word : MSSQL_RESERVED_WORDS) {
if (word.equalsIgnoreCase(name))
return true;
}
}
return Sql2003Utils.isReservedWord(name);
}
static boolean isMSSqlSchema(String name) {
if (name != null) {
for (String word : MSSQL_SCHEMAS) {
if (word.equalsIgnoreCase(name))
return true;
}
}
return false;
}
/**
*
* @return Alineo system schema names regex pattern
*/
public static String getMSSqlSchemaNamesPattern() {
return StringUtils.join(MSSQL_SCHEMAS, '|');
}
/**
* Prefixes schema names with Alineo schema prefix and generates regex pattern.
* @param targetSchemas
* @return regex pattern
*/
public static String getSchemaNamesPattern(
Set<String> targetSchemas) {
final String schemaPrefix = "alineo_mssql_db.";
String schemaNames[] = new String[targetSchemas.size()];
int i = 0;
for (String name : targetSchemas) {
if (isReservedWord(name)) {
// escape with double quotes
name = "\""+name+"\"";
}
schemaNames[i++] = schemaPrefix+name;
}
return StringUtils.join(schemaNames, '|');
}
}