/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jkiss.dbeaver.ext.oracle.model; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPRefreshableObject; import org.jkiss.dbeaver.model.DBPSystemObject; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement; import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCCompositeCache; import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectCache; import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectLookupCache; import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCStructLookupCache; import org.jkiss.dbeaver.model.meta.Association; import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureContainer; import org.jkiss.dbeaver.model.struct.rdb.DBSSchema; import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; /** * OracleSchema */ public class OracleSchema extends OracleGlobalObject implements DBSSchema, DBPRefreshableObject, DBPSystemObject, DBSProcedureContainer { private static final Log log = Log.getLog(OracleSchema.class); final public TableCache tableCache = new TableCache(); final public MViewCache mviewCache = new MViewCache(); final public ConstraintCache constraintCache = new ConstraintCache(); final public ForeignKeyCache foreignKeyCache = new ForeignKeyCache(); final public TriggerCache triggerCache = new TriggerCache(); final public IndexCache indexCache = new IndexCache(); final public DataTypeCache dataTypeCache = new DataTypeCache(); final public SequenceCache sequenceCache = new SequenceCache(); final public PackageCache packageCache = new PackageCache(); final public SynonymCache synonymCache = new SynonymCache(); final public DBLinkCache dbLinkCache = new DBLinkCache(); final public ProceduresCache proceduresCache = new ProceduresCache(); final public JavaCache javaCache = new JavaCache(); final public SchedulerJobCache schedulerJobCache = new SchedulerJobCache(); final public SchedulerProgramCache schedulerProgramCache = new SchedulerProgramCache(); final public RecycleBin recycleBin = new RecycleBin(); private long id; private String name; private Date createTime; private transient OracleUser user; public OracleSchema(OracleDataSource dataSource, long id, String name) { super(dataSource, id > 0); this.id = id; this.name = name; } public OracleSchema(@NotNull OracleDataSource dataSource, @NotNull ResultSet dbResult) { super(dataSource, true); this.id = JDBCUtils.safeGetLong(dbResult, "USER_ID"); this.name = JDBCUtils.safeGetString(dbResult, "USERNAME"); if (CommonUtils.isEmpty(this.name)) { log.warn("Empty schema name fetched"); this.name = "? " + super.hashCode(); } this.createTime = JDBCUtils.safeGetTimestamp(dbResult, "CREATED"); } public boolean isPublic() { return OracleConstants.USER_PUBLIC.equals(this.name); } @Property(viewable = false, order = 200) public long getId() { return id; } @Property(viewable = false, order = 190) public Date getCreateTime() { return createTime; } @NotNull @Override @Property(viewable = true, editable = true, order = 1) public String getName() { return name; } public void setName(String name) { this.name = name; } @Nullable @Override public String getDescription() { return null; } /** * User reference never read directly from database. * It is used by managers to create/delete/alter schemas * @return user reference or null */ public OracleUser getUser() { return user; } public void setUser(OracleUser user) { this.user = user; } @Association public Collection<OracleTableIndex> getIndexes(DBRProgressMonitor monitor) throws DBException { return indexCache.getObjects(monitor, this, null); } @Association public Collection<OracleTable> getTables(DBRProgressMonitor monitor) throws DBException { return tableCache.getTypedObjects(monitor, this, OracleTable.class); } public OracleTable getTable(DBRProgressMonitor monitor, String name) throws DBException { return tableCache.getObject(monitor, this, name, OracleTable.class); } @Association public Collection<OracleView> getViews(DBRProgressMonitor monitor) throws DBException { return tableCache.getTypedObjects(monitor, this, OracleView.class); } public OracleView getView(DBRProgressMonitor monitor, String name) throws DBException { return tableCache.getObject(monitor, this, name, OracleView.class); } @Association public Collection<OracleMaterializedView> getMaterializedViews(DBRProgressMonitor monitor) throws DBException { return mviewCache.getAllObjects(monitor, this); } @Association public Collection<OracleDataType> getDataTypes(DBRProgressMonitor monitor) throws DBException { return dataTypeCache.getAllObjects(monitor, this); } public OracleDataType getDataType(DBRProgressMonitor monitor, String name) throws DBException { OracleDataType type = dataTypeCache.getObject(monitor, this, name); if (type == null) { final OracleSynonym synonym = synonymCache.getObject(monitor, this, name); if (synonym != null && synonym.getObjectType() == OracleObjectType.TYPE) { Object object = synonym.getObject(monitor); if (object instanceof OracleDataType) { return (OracleDataType)object; } } return null; } else { return type; } } @Association public Collection<OracleSequence> getSequences(DBRProgressMonitor monitor) throws DBException { return sequenceCache.getAllObjects(monitor, this); } @Association public Collection<OraclePackage> getPackages(DBRProgressMonitor monitor) throws DBException { return packageCache.getAllObjects(monitor, this); } @Association public Collection<OracleProcedureStandalone> getProcedures(DBRProgressMonitor monitor) throws DBException { return proceduresCache.getAllObjects(monitor, this); } @Override public OracleProcedureStandalone getProcedure(DBRProgressMonitor monitor, String uniqueName) throws DBException { return proceduresCache.getObject(monitor, this, uniqueName); } @Association public Collection<OracleSynonym> getSynonyms(DBRProgressMonitor monitor) throws DBException { return synonymCache.getAllObjects(monitor, this); } @Association public Collection<OracleSchemaTrigger> getTriggers(DBRProgressMonitor monitor) throws DBException { return triggerCache.getAllObjects(monitor, this); } @Association public Collection<OracleDBLink> getDatabaseLinks(DBRProgressMonitor monitor) throws DBException { return dbLinkCache.getAllObjects(monitor, this); } @Association public Collection<OracleJavaClass> getJavaClasses(DBRProgressMonitor monitor) throws DBException { return javaCache.getAllObjects(monitor, this); } @Association public Collection<OracleSchedulerJob> getSchedulerJobs(DBRProgressMonitor monitor) throws DBException { return schedulerJobCache.getAllObjects(monitor, this); } @Association public Collection<OracleSchedulerProgram> getSchedulerPrograms(DBRProgressMonitor monitor) throws DBException { return schedulerProgramCache.getAllObjects(monitor, this); } @Association public Collection<OracleRecycledObject> getRecycledObjects(DBRProgressMonitor monitor) throws DBException { return recycleBin.getAllObjects(monitor, this); } @Override public Collection<DBSObject> getChildren(@NotNull DBRProgressMonitor monitor) throws DBException { List<DBSObject> children = new ArrayList<>(); for (OracleTableBase table : tableCache.getAllObjects(monitor, this)) { children.add(table); } for (OraclePackage pack : packageCache.getAllObjects(monitor, this)) { children.add(pack); } return children; } @Override public DBSObject getChild(@NotNull DBRProgressMonitor monitor, @NotNull String childName) throws DBException { final OracleTableBase table = tableCache.getObject(monitor, this, childName); if (table != null) { return table; } return packageCache.getObject(monitor, this, childName); } @Override public Class<? extends DBSEntity> getChildType(@NotNull DBRProgressMonitor monitor) throws DBException { return DBSEntity.class; } @Override public synchronized void cacheStructure(@NotNull DBRProgressMonitor monitor, int scope) throws DBException { monitor.subTask("Cache tables"); tableCache.getAllObjects(monitor, this); if ((scope & STRUCT_ATTRIBUTES) != 0) { monitor.subTask("Cache table columns"); tableCache.loadChildren(monitor, this, null); } if ((scope & STRUCT_ASSOCIATIONS) != 0) { monitor.subTask("Cache table indexes"); indexCache.getObjects(monitor, this, null); monitor.subTask("Cache table constraints"); constraintCache.getObjects(monitor, this, null); foreignKeyCache.getObjects(monitor, this, null); } } @Override public synchronized DBSObject refreshObject(@NotNull DBRProgressMonitor monitor) throws DBException { tableCache.clearCache(); foreignKeyCache.clearCache(); constraintCache.clearCache(); indexCache.clearCache(); packageCache.clearCache(); proceduresCache.clearCache(); triggerCache.clearCache(); dataTypeCache.clearCache(); sequenceCache.clearCache(); synonymCache.clearCache(); schedulerJobCache.clearCache(); recycleBin.clearCache(); return this; } @Override public boolean isSystem() { return ArrayUtils.contains(OracleConstants.SYSTEM_SCHEMAS, getName()); } @Override public String toString() { return "Schema " + name; } private static OracleTableColumn getTableColumn(JDBCSession session, OracleTableBase parent, ResultSet dbResult) throws DBException { String columnName = JDBCUtils.safeGetStringTrimmed(dbResult, "COLUMN_NAME"); OracleTableColumn tableColumn = columnName == null ? null : parent.getAttribute(session.getProgressMonitor(), columnName); if (tableColumn == null) { log.debug("Column '" + columnName + "' not found in table '" + parent.getName() + "'"); } return tableColumn; } public static class TableCache extends JDBCStructLookupCache<OracleSchema, OracleTableBase, OracleTableColumn> { TableCache() { super("TABLE_NAME"); setListOrderComparator(DBUtils.<OracleTableBase>nameComparator()); } @NotNull @Override public JDBCStatement prepareLookupStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner, @Nullable OracleTableBase object, @Nullable String objectName) throws SQLException { final JDBCPreparedStatement dbStat = session.prepareStatement( "\tSELECT " + OracleUtils.getSysCatalogHint(owner.getDataSource()) + " t.OWNER,t.TABLE_NAME as TABLE_NAME,'TABLE' as OBJECT_TYPE,'VALID' as STATUS,t.TABLE_TYPE_OWNER,t.TABLE_TYPE,t.TABLESPACE_NAME,t.PARTITIONED,t.IOT_TYPE,t.IOT_NAME,t.TEMPORARY,t.SECONDARY,t.NESTED,t.NUM_ROWS \n" + "\tFROM SYS.ALL_ALL_TABLES t\n" + "\tWHERE t.OWNER=? AND NESTED='NO'" + (object == null && objectName == null ? "": " AND t.TABLE_NAME=?") + "\n" + "UNION ALL\n" + "\tSELECT " + OracleUtils.getSysCatalogHint(owner.getDataSource()) + " o.OWNER,o.OBJECT_NAME as TABLE_NAME,'VIEW' as OBJECT_TYPE,o.STATUS,NULL,NULL,NULL,'NO',NULL,NULL,o.TEMPORARY,o.SECONDARY,'NO',0 \n" + "\tFROM SYS.ALL_OBJECTS o \n" + "\tWHERE o.OWNER=? AND o.OBJECT_TYPE='VIEW'" + (object == null && objectName == null ? "": " AND o.OBJECT_NAME=?") + "\n" ); int index = 1; dbStat.setString(index++, owner.getName()); if (object != null || objectName != null) dbStat.setString(index++, object != null ? object.getName() : objectName); dbStat.setString(index++, owner.getName()); if (object != null || objectName != null) dbStat.setString(index, object != null ? object.getName() : objectName); return dbStat; } @Override protected OracleTableBase fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { final String tableType = JDBCUtils.safeGetString(dbResult, "OBJECT_TYPE"); if ("TABLE".equals(tableType)) { return new OracleTable(session.getProgressMonitor(), owner, dbResult); } else { return new OracleView(owner, dbResult); } } @Override protected JDBCStatement prepareChildrenStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner, @Nullable OracleTableBase forTable) throws SQLException { String colsView = "ALL_TAB_COLS"; if (!owner.getDataSource().isViewAvailable(session.getProgressMonitor(), "SYS", colsView)) { colsView = "ALL_TAB_COLUMNS"; } StringBuilder sql = new StringBuilder(500); sql .append("SELECT ").append(OracleUtils.getSysCatalogHint(owner.getDataSource())).append("\nc.* " + "FROM SYS.").append(colsView).append(" c\n" + // "LEFT OUTER JOIN SYS.ALL_COL_COMMENTS cc ON CC.OWNER=c.OWNER AND cc.TABLE_NAME=c.TABLE_NAME AND cc.COLUMN_NAME=c.COLUMN_NAME\n" + "WHERE c.OWNER=?"); if (forTable != null) { sql.append(" AND c.TABLE_NAME=?"); } /* sql.append("\nORDER BY "); if (forTable != null) { sql.append("c.TABLE_NAME,"); } sql.append("c.COLUMN_ID"); */ JDBCPreparedStatement dbStat = session.prepareStatement(sql.toString()); dbStat.setString(1, owner.getName()); if (forTable != null) { dbStat.setString(2, forTable.getName()); } return dbStat; } @Override protected OracleTableColumn fetchChild(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull OracleTableBase table, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleTableColumn(session.getProgressMonitor(), table, dbResult); } @Override protected void cacheChildren(OracleTableBase parent, List<OracleTableColumn> oracleTableColumns) { Collections.sort(oracleTableColumns, DBUtils.orderComparator()); super.cacheChildren(parent, oracleTableColumns); } } /** * Index cache implementation */ class ConstraintCache extends JDBCCompositeCache<OracleSchema, OracleTableBase, OracleTableConstraint, OracleTableConstraintColumn> { ConstraintCache() { super(tableCache, OracleTableBase.class, "TABLE_NAME", "CONSTRAINT_NAME"); } @NotNull @Override protected JDBCStatement prepareObjectsStatement(JDBCSession session, OracleSchema owner, OracleTableBase forTable) throws SQLException { StringBuilder sql = new StringBuilder(500); sql .append("SELECT ").append(OracleUtils.getSysCatalogHint(owner.getDataSource())).append("\n" + "c.TABLE_NAME, c.CONSTRAINT_NAME,c.CONSTRAINT_TYPE,c.STATUS,c.SEARCH_CONDITION," + "col.COLUMN_NAME,col.POSITION\n" + "FROM SYS.ALL_CONSTRAINTS c, SYS.ALL_CONS_COLUMNS col\n" + "WHERE c.CONSTRAINT_TYPE<>'R' AND c.OWNER=? AND c.OWNER=col.OWNER AND c.CONSTRAINT_NAME=col.CONSTRAINT_NAME"); if (forTable != null) { sql.append(" AND c.TABLE_NAME=?"); } sql.append("\nORDER BY c.CONSTRAINT_NAME,col.POSITION"); JDBCPreparedStatement dbStat = session.prepareStatement(sql.toString()); dbStat.setString(1, OracleSchema.this.getName()); if (forTable != null) { dbStat.setString(2, forTable.getName()); } return dbStat; } @Nullable @Override protected OracleTableConstraint fetchObject(JDBCSession session, OracleSchema owner, OracleTableBase parent, String indexName, JDBCResultSet dbResult) throws SQLException, DBException { return new OracleTableConstraint(parent, dbResult); } @Nullable @Override protected OracleTableConstraintColumn[] fetchObjectRow( JDBCSession session, OracleTableBase parent, OracleTableConstraint object, JDBCResultSet dbResult) throws SQLException, DBException { final OracleTableColumn tableColumn = getTableColumn(session, parent, dbResult); return tableColumn == null ? null : new OracleTableConstraintColumn[] { new OracleTableConstraintColumn( object, tableColumn, JDBCUtils.safeGetInt(dbResult, "POSITION")) }; } @Override protected void cacheChildren(DBRProgressMonitor monitor, OracleTableConstraint constraint, List<OracleTableConstraintColumn> rows) { constraint.setColumns(rows); } } class ForeignKeyCache extends JDBCCompositeCache<OracleSchema, OracleTable, OracleTableForeignKey, OracleTableForeignKeyColumn> { ForeignKeyCache() { super(tableCache, OracleTable.class, "TABLE_NAME", "CONSTRAINT_NAME"); } @Override protected void loadObjects(DBRProgressMonitor monitor, OracleSchema schema, OracleTable forParent) throws DBException { // Cache schema constraints if not table specified if (forParent == null) { constraintCache.getObject(monitor, schema, null); } super.loadObjects(monitor, schema, forParent); } @NotNull @Override protected JDBCStatement prepareObjectsStatement(JDBCSession session, OracleSchema owner, OracleTable forTable) throws SQLException { StringBuilder sql = new StringBuilder(500); sql.append("SELECT ").append(OracleUtils.getSysCatalogHint(owner.getDataSource())).append(" \r\n" + "c.TABLE_NAME, c.CONSTRAINT_NAME,c.CONSTRAINT_TYPE,c.STATUS,c.R_OWNER,c.R_CONSTRAINT_NAME,rc.TABLE_NAME as R_TABLE_NAME,c.DELETE_RULE, \n" + "col.COLUMN_NAME,col.POSITION\r\n" + "FROM SYS.ALL_CONSTRAINTS c, SYS.ALL_CONS_COLUMNS col, SYS.ALL_CONSTRAINTS rc\n" + "WHERE c.CONSTRAINT_TYPE='R' AND c.OWNER=?\n" + "AND c.OWNER=col.OWNER AND c.CONSTRAINT_NAME=col.CONSTRAINT_NAME\n" + "AND rc.OWNER=c.r_OWNER AND rc.CONSTRAINT_NAME=c.R_CONSTRAINT_NAME"); if (forTable != null) { sql.append(" AND c.TABLE_NAME=?"); } sql.append("\nORDER BY c.CONSTRAINT_NAME,col.POSITION"); JDBCPreparedStatement dbStat = session.prepareStatement(sql.toString()); dbStat.setString(1, OracleSchema.this.getName()); if (forTable != null) { dbStat.setString(2, forTable.getName()); } return dbStat; } @Nullable @Override protected OracleTableForeignKey fetchObject(JDBCSession session, OracleSchema owner, OracleTable parent, String indexName, JDBCResultSet dbResult) throws SQLException, DBException { return new OracleTableForeignKey(session.getProgressMonitor(), parent, dbResult); } @Nullable @Override protected OracleTableForeignKeyColumn[] fetchObjectRow( JDBCSession session, OracleTable parent, OracleTableForeignKey object, JDBCResultSet dbResult) throws SQLException, DBException { OracleTableColumn column = getTableColumn(session, parent, dbResult); return column == null ? null : new OracleTableForeignKeyColumn[] { new OracleTableForeignKeyColumn( object, column, JDBCUtils.safeGetInt(dbResult, "POSITION")) }; } @Override @SuppressWarnings("unchecked") protected void cacheChildren(DBRProgressMonitor monitor, OracleTableForeignKey foreignKey, List<OracleTableForeignKeyColumn> rows) { foreignKey.setColumns((List)rows); } } /** * Index cache implementation */ class IndexCache extends JDBCCompositeCache<OracleSchema, OracleTablePhysical, OracleTableIndex, OracleTableIndexColumn> { IndexCache() { super(tableCache, OracleTablePhysical.class, "TABLE_NAME", "INDEX_NAME"); } @NotNull @Override protected JDBCStatement prepareObjectsStatement(JDBCSession session, OracleSchema owner, OracleTablePhysical forTable) throws SQLException { StringBuilder sql = new StringBuilder(); sql.append("SELECT ").append(OracleUtils.getSysCatalogHint(owner.getDataSource())).append(" " + "i.OWNER,i.INDEX_NAME,i.INDEX_TYPE,i.TABLE_OWNER,i.TABLE_NAME,i.UNIQUENESS,i.TABLESPACE_NAME,i.STATUS,i.NUM_ROWS,i.SAMPLE_SIZE,\n" + "ic.COLUMN_NAME,ic.COLUMN_POSITION,ic.COLUMN_LENGTH,ic.DESCEND\n" + "FROM SYS.ALL_INDEXES i, SYS.ALL_IND_COLUMNS ic\n" + "WHERE ic.INDEX_OWNER=i.OWNER AND ic.INDEX_NAME=i.INDEX_NAME AND "); if (forTable == null) { sql.append("i.OWNER=?"); } else { sql.append("i.TABLE_OWNER=? AND i.TABLE_NAME=?"); } sql.append("\nORDER BY i.INDEX_NAME,ic.COLUMN_POSITION"); JDBCPreparedStatement dbStat = session.prepareStatement(sql.toString()); if (forTable == null) { dbStat.setString(1, OracleSchema.this.getName()); } else { dbStat.setString(1, OracleSchema.this.getName()); dbStat.setString(2, forTable.getName()); } return dbStat; } @Nullable @Override protected OracleTableIndex fetchObject(JDBCSession session, OracleSchema owner, OracleTablePhysical parent, String indexName, JDBCResultSet dbResult) throws SQLException, DBException { return new OracleTableIndex(owner, parent, indexName, dbResult); } @Nullable @Override protected OracleTableIndexColumn[] fetchObjectRow( JDBCSession session, OracleTablePhysical parent, OracleTableIndex object, JDBCResultSet dbResult) throws SQLException, DBException { String columnName = JDBCUtils.safeGetStringTrimmed(dbResult, "COLUMN_NAME"); int ordinalPosition = JDBCUtils.safeGetInt(dbResult, "COLUMN_POSITION"); boolean isAscending = "ASC".equals(JDBCUtils.safeGetStringTrimmed(dbResult, "DESCEND")); OracleTableColumn tableColumn = columnName == null ? null : parent.getAttribute(session.getProgressMonitor(), columnName); if (tableColumn == null) { log.debug("Column '" + columnName + "' not found in table '" + parent.getName() + "' for index '" + object.getName() + "'"); return null; } return new OracleTableIndexColumn[] { new OracleTableIndexColumn( object, tableColumn, ordinalPosition, isAscending) }; } @Override protected void cacheChildren(DBRProgressMonitor monitor, OracleTableIndex index, List<OracleTableIndexColumn> rows) { index.setColumns(rows); } } /** * DataType cache implementation */ static class DataTypeCache extends JDBCObjectCache<OracleSchema, OracleDataType> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT " + OracleUtils.getSysCatalogHint(owner.getDataSource()) + " * FROM SYS.ALL_TYPES WHERE OWNER=? ORDER BY TYPE_NAME"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleDataType fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet resultSet) throws SQLException { return new OracleDataType(owner, resultSet); } } /** * Sequence cache implementation */ static class SequenceCache extends JDBCObjectCache<OracleSchema, OracleSequence> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { final JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT " + OracleUtils.getSysCatalogHint(owner.getDataSource()) + " * FROM SYS.ALL_SEQUENCES WHERE SEQUENCE_OWNER=? ORDER BY SEQUENCE_NAME"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleSequence fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet resultSet) throws SQLException, DBException { return new OracleSequence(owner, resultSet); } } /** * Procedures cache implementation */ static class ProceduresCache extends JDBCObjectLookupCache<OracleSchema, OracleProcedureStandalone> { @NotNull @Override public JDBCStatement prepareLookupStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner, @Nullable OracleProcedureStandalone object, @Nullable String objectName) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT " + OracleUtils.getSysCatalogHint(owner.getDataSource()) + " * FROM SYS.ALL_OBJECTS " + "WHERE OBJECT_TYPE IN ('PROCEDURE','FUNCTION') " + "AND OWNER=? " + (object == null && objectName == null ? "" : "AND OBJECT_NAME=? ") + "ORDER BY OBJECT_NAME"); dbStat.setString(1, owner.getName()); if (object != null || objectName != null) dbStat.setString(2, object != null ? object.getName() : objectName); return dbStat; } @Override protected OracleProcedureStandalone fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleProcedureStandalone(owner, dbResult); } } static class PackageCache extends JDBCObjectCache<OracleSchema, OraclePackage> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT " + OracleUtils.getSysCatalogHint(owner.getDataSource()) + " * FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE='PACKAGE' AND OWNER=? " + " ORDER BY OBJECT_NAME"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OraclePackage fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OraclePackage(owner, dbResult); } } /** * Sequence cache implementation */ static class SynonymCache extends JDBCObjectCache<OracleSchema, OracleSynonym> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT s.*,O.OBJECT_TYPE \n" + "FROM ALL_SYNONYMS S, ALL_OBJECTS O\n" + "WHERE S.OWNER=? AND O.OBJECT_TYPE NOT IN ('JAVA CLASS','PACKAGE BODY')\n" + "AND O.OWNER=S.TABLE_OWNER AND O.OBJECT_NAME=S.TABLE_NAME\n" + "ORDER BY S.SYNONYM_NAME"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleSynonym fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet resultSet) throws SQLException, DBException { return new OracleSynonym(owner, resultSet); } } static class MViewCache extends JDBCObjectCache<OracleSchema, OracleMaterializedView> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT * FROM SYS.ALL_MVIEWS WHERE OWNER=? " + "ORDER BY MVIEW_NAME"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleMaterializedView fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleMaterializedView(owner, dbResult); } } static class DBLinkCache extends JDBCObjectCache<OracleSchema, OracleDBLink> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT * FROM SYS.ALL_DB_LINKS WHERE OWNER=? " + " ORDER BY DB_LINK"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleDBLink fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleDBLink(session.getProgressMonitor(), owner, dbResult); } } static class TriggerCache extends JDBCObjectCache<OracleSchema, OracleSchemaTrigger> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema schema) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT *\n" + "FROM " + OracleUtils.getAdminAllViewPrefix(schema.getDataSource()) + "TRIGGERS WHERE OWNER=? AND TRIM(BASE_OBJECT_TYPE) IN ('DATABASE','SCHEMA')\n" + "ORDER BY TRIGGER_NAME"); dbStat.setString(1, schema.getName()); return dbStat; } @Override protected OracleSchemaTrigger fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema oracleSchema, @NotNull JDBCResultSet resultSet) throws SQLException, DBException { return new OracleSchemaTrigger(oracleSchema, resultSet); } } static class JavaCache extends JDBCObjectCache<OracleSchema, OracleJavaClass> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT * FROM SYS.ALL_JAVA_CLASSES WHERE OWNER=? "); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleJavaClass fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleJavaClass(owner, dbResult); } } static class SchedulerJobCache extends JDBCObjectCache<OracleSchema, OracleSchedulerJob> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT * FROM SYS.ALL_SCHEDULER_JOBS WHERE OWNER=? ORDER BY JOB_NAME"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleSchedulerJob fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleSchedulerJob(owner, dbResult); } } static class SchedulerProgramCache extends JDBCObjectCache<OracleSchema, OracleSchedulerProgram> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement( "SELECT * FROM SYS.ALL_SCHEDULER_PROGRAMS WHERE OWNER=? ORDER BY PROGRAM_NAME"); dbStat.setString(1, owner.getName()); return dbStat; } @Override protected OracleSchedulerProgram fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleSchedulerProgram(owner, dbResult); } } static class RecycleBin extends JDBCObjectCache<OracleSchema, OracleRecycledObject> { @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner) throws SQLException { final boolean isPublic = owner.isPublic(); JDBCPreparedStatement dbStat = session.prepareStatement( isPublic ? "SELECT * FROM SYS.USER_RECYCLEBIN" : "SELECT * FROM SYS.DBA_RECYCLEBIN WHERE OWNER=?"); if (!isPublic) { dbStat.setString(1, owner.getName()); } return dbStat; } @Override protected OracleRecycledObject fetchObject(@NotNull JDBCSession session, @NotNull OracleSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException { return new OracleRecycledObject(owner, dbResult); } } }