package com.med.sql;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Set;
import java.util.TreeSet;
import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
public class OracleUtils {
static final int ORACLE_MAX_LEN = 30; // Oracle name length limit
static final String[] ORACLE_SCHEMAS = {
"ANONYMOUS",
"APEX_030200",
"APEX_PUBLIC_USER",
"APPQOSSYS",
"AURORA$JIS$UTILITY$",
"AURORA$ORB$UNAUTHENTICATED",
"BI",
"CTXSYS",
"DBSNMP",
"DIP",
"DMSYS",
"EXFSYS",
"FLOWS_FILES",
"FLOWS_XXXXXX",
"HR",
"IX",
"LBACSYS",
"MDDATA",
"MDSYS",
"MEDDBA", // only appears on AIX
"MGMT_VIEW",
"MTSSYS",
"OASPUBLIC",
"ODM",
"ODM_MTR",
"OE",
"OLAPSYS",
"ORACLE_OCM",
"ORDDATA",
"ORDPLUGINS",
"ORDSYS",
"OSE$HTTP$ADMIN",
"OUTLN",
"OWBSYS",
"OWBSYS_AUDIT",
"PERFMON",
"PM",
"SCOTT",
"SH",
"SI_INFORMTN_SCHEMA",
"SPATIAL_CSW_ADMIN_USR",
"SPATIAL_WFS_ADMIN_USR",
"SYS",
"SYSMAN",
"SYSTEM",
"TRACESRV",
"TSMSYS",
"WEBSYS",
"WKSYS",
"WK_PROXY",
"WK_TEST",
"WMSYS",
"XDB"
};
static final String[] ORACLE_SCHEMAS_REGEX = {
"ANONYMOUS",
"AURORA\\$JIS\\$UTILITY\\$",
"AURORA\\$ORB\\$UNAUTHENTICATED",
"BI",
"CTXSYS",
"DBSNMP",
"DIP",
"DMSYS",
"EXFSYS",
"FLOWS_XXXXXX",
"HR",
"IX",
"LBACSYS",
"MDDATA",
"MDSYS",
"MEDDBA", // only appears on AIX
"MGMT_VIEW",
"MTSSYS",
"OASPUBLIC",
"ODM",
"ODM_MTR",
"OE",
"OLAPSYS",
"ORACLE_OCM",
"ORDPLUGINS",
"ORDSYS",
"OSE\\$HTTP\\$ADMIN",
"OUTLN",
"PERFMON",
"PM",
"SCOTT",
"SH",
"SI_INFORMTN_SCHEMA",
"SYS",
"SYSMAN",
"SYSTEM",
"TRACESRV",
"TSMSYS",
"WEBSYS",
"WKSYS",
"WK_PROXY",
"WK_TEST",
"WMSYS",
"XDB"
};
static final String[] ORACLE_RESERVED_WORDS = {
"ACCESS",
"ADD",
"ALL",
"ALTER",
"AND",
"ANY",
"ARRAYLEN",
"AS",
"ASC",
"AUDIT",
"BETWEEN",
"BY",
"CHAR",
"CHECK",
"CLUSTER",
"COLUMN",
"COMMENT",
"COMPRESS",
"CONNECT",
"CREATE",
"CURRENT",
"DATE",
"DECIMAL",
"DEFAULT",
"DELETE",
"DESC",
"DISTINCT",
"DROP",
"ELSE",
"EXCLUSIVE",
"EXISTS",
"FILE",
"FLOAT",
"FOR",
"FROM",
"GRANT",
"GROUP",
"HAVING",
"IDENTIFIED",
"IMMEDIATE",
"IN",
"INCREMENT",
"INDEX",
"INITIAL",
"INSERT",
"INTEGER",
"INTERSECT",
"INTO",
"IS",
"LEVEL",
"LIKE",
"LOCK",
"LONG",
"MAXEXTENTS",
"MINUS",
"MODE",
"MODIFY",
"NOAUDIT",
"NOCOMPRESS",
"NOT",
"NOTFOUND",
"NOWAIT",
"NULL",
"NUMBER",
"OF",
"OFFLINE",
"ON",
"ONLINE",
"OPTION",
"OR",
"ORDER",
"PCTFREE",
"PRIOR",
"PRIVILEGES",
"PUBLIC",
"RAW",
"RENAME",
"RESOURCE",
"REVOKE",
"ROW",
"ROWID",
"ROWLABEL",
"ROWNUM",
"ROWS",
"SELECT",
"SESSION",
"SET",
"SHARE",
"SIZE",
"SMALLINT",
"SQLBUF",
"START",
"SUCCESSFUL",
"SYNONYM",
"SYSDATE",
"TABLE",
"THEN",
"TO",
"TRIGGER",
"UID",
"UNION",
"UNIQUE",
"UPDATE",
"USER",
"VALIDATE",
"VALUES",
"VARCHAR",
"VARCHAR2",
"VIEW",
"WHENEVER",
"WHERE",
"WITH"
};
static boolean isValidLength(String name) {
return name != null && name.length() <= ORACLE_MAX_LEN;
}
static boolean isReservedWord(String name) {
if (name != null) {
for (String word : ORACLE_RESERVED_WORDS) {
if (word.equalsIgnoreCase(name))
return true;
}
}
return Sql2003Utils.isReservedWord(name);
}
static boolean isOracleSchema(String name) {
if (name != null) {
for (String word : ORACLE_SCHEMAS) {
if (word.equalsIgnoreCase(name))
return true;
}
}
return false;
}
/**
* @return Oracle system schema names regex pattern
*/
public static String getOracleSchemaNamesPattern() {
return StringUtils.join(ORACLE_SCHEMAS_REGEX, '|');
}
/**
* Analyzes dataSource metadata to generate regex pattern of schema names.
* If excludeTargetSchemas is false, the pattern contains all schema names in targetSchemas.
* If excludeTargetSchemas is true, the pattern contains all non-system schema
* names that are not in targetSchemas.
* @param dataSource
* @param targetSchemas
* @param excludeTargetSchemas
* @return regex pattern
*/
public static String getSchemaNamesPattern(
DataSource dataSource,
Set<String> targetSchemas,
boolean excludeTargetSchemas) {
Set<String> names = new TreeSet<String> ();
Connection cn = null;
try {
cn = dataSource.getConnection();
DatabaseMetaData dbmd = cn.getMetaData();
ResultSet rsSchemas = dbmd.getSchemas();
while (rsSchemas.next()) {
String schemaName = rsSchemas.getString(1);
if (OracleUtils.isOracleSchema(schemaName))
continue;
boolean addName = (targetSchemas == null) || targetSchemas.isEmpty();
if (!addName) {
boolean inTargetSchemas = targetSchemas.contains(schemaName);
addName =
(inTargetSchemas && !excludeTargetSchemas)
|| (!inTargetSchemas && excludeTargetSchemas);
}
if (addName)
names.add(schemaName);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
cn.close();
} catch (SQLException e) {
}
cn = null;
}
String schemaNames[] = new String[names.size()];
int i = 0;
for (String name : names) {
if (isReservedWord(name)) {
// escape with double quotes
name = "\""+name+"\"";
}
schemaNames[i++] = name;
}
return StringUtils.join(schemaNames, '|');
}
}