/* * DBeaver - Universal Database Manager * Copyright (C) 2016-2016 Karl Griesser (fullref@gmail.com) * 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.exasol.model.cache; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.exasol.model.*; import org.jkiss.dbeaver.ext.exasol.tools.ExasolUtils; import org.jkiss.dbeaver.model.DBPEvaluationContext; 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.exec.JDBCStatementImpl; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import java.sql.SQLException; import java.util.List; /** * @author Karl */ public final class ExasolTableForeignKeyCache extends JDBCCompositeCache<ExasolSchema, ExasolTable, ExasolTableForeignKey, ExasolTableKeyColumn> { private static final String SQL_FK_TAB = "select\r\n" + " CONSTRAINT_NAME,CONSTRAINT_TABLE,CONSTRAINT_SCHEMA,constraint_owner,c.constraint_enabled,constraint_Type," + "cc.column_name,cc.ordinal_position,cc.referenced_schema,cc.referenced_table,cc.referenced_column," + "PK.CONSTRAINT_NAME AS REF_PK_NAME\r\n" + " from\r\n" + " EXA_ALL_CONSTRAINTS c\r\n" + " inner join\r\n" + " EXA_ALL_CONSTRAINT_COLUMNS cc\r\n" + " using\r\n" + " (\r\n" + " CONSTRAINT_SCHEMA, CONSTRAINT_TABLE, CONSTRAINT_NAME, CONSTRAINT_OWNER, CONSTRAINT_TYPE\r\n" + " )\r\n" + " inner join \r\n" + " EXA_ALL_CONSTRAINTS pk\r\n" + " on REFERENCED_SCHEMA = PK.CONSTRAINT_SCHEMA AND REFERENCED_TABLE = PK.CONSTRAINT_TABLE AND PK.CONSTRAINT_TYPE = 'PRIMARY KEY'\r\n" + " where\r\n" + " CONSTRAINT_SCHEMA = '%s' and\r\n" + " CONSTRAINT_TYPE = 'FOREIGN KEY'AND CONSTRAINT_TABLE = '%s' \r\n" + " order by\r\n" + " ORDINAL_POSITION"; private static final String SQL_FK_ALL = "select\r\n" + " CONSTRAINT_NAME,CONSTRAINT_TABLE,CONSTRAINT_SCHEMA,constraint_owner,c.constraint_enabled,constraint_Type," + "cc.column_name,cc.ordinal_position,cc.referenced_schema,cc.referenced_table,cc.referenced_column," + "PK.CONSTRAINT_NAME AS REF_PK_NAME\r\n" + " from\r\n" + " EXA_ALL_CONSTRAINTS c\r\n" + " inner join\r\n" + " EXA_ALL_CONSTRAINT_COLUMNS cc\r\n" + " using\r\n" + " (\r\n" + " CONSTRAINT_SCHEMA, CONSTRAINT_TABLE, CONSTRAINT_NAME, CONSTRAINT_OWNER, CONSTRAINT_TYPE\r\n" + " )\r\n" + " inner join \r\n" + " EXA_ALL_CONSTRAINTS pk\r\n" + " on REFERENCED_SCHEMA = PK.CONSTRAINT_SCHEMA AND REFERENCED_TABLE = PK.CONSTRAINT_TABLE AND PK.CONSTRAINT_TYPE = 'PRIMARY KEY'\r\n" + " where\r\n" + " CONSTRAINT_SCHEMA = '%s' and\r\n" + " CONSTRAINT_TYPE = 'FOREIGN KEY' \r\n" + " order by\r\n" + " ORDINAL_POSITION"; public ExasolTableForeignKeyCache(ExasolTableCache tableCache) { super(tableCache, ExasolTable.class, "CONSTRAINT_TABLE", "CONSTRAINT_NAME"); } @SuppressWarnings("rawtypes") @NotNull @Override protected JDBCStatement prepareObjectsStatement(JDBCSession session, ExasolSchema exasolSchema, ExasolTable forTable) throws SQLException { String sql; if (forTable != null) { sql = String.format(SQL_FK_TAB,ExasolUtils.quoteString(exasolSchema.getName()),ExasolUtils.quoteString(forTable.getName())); } else { sql = String.format(SQL_FK_ALL,ExasolUtils.quoteString(exasolSchema.getName())); } JDBCStatement dbStat = session.createStatement(); ((JDBCStatementImpl) dbStat).setQueryString(sql); return dbStat; } @Nullable @Override protected ExasolTableForeignKey fetchObject(JDBCSession session, ExasolSchema ExasolSchema, ExasolTable ExasolTable, String constName, JDBCResultSet dbResult) throws SQLException, DBException { return new ExasolTableForeignKey(session.getProgressMonitor(), ExasolTable, dbResult); } @Nullable @Override protected ExasolTableKeyColumn[] fetchObjectRow(JDBCSession session, ExasolTable ExasolTable, ExasolTableForeignKey object, JDBCResultSet dbResult) throws SQLException, DBException { String colName = JDBCUtils.safeGetString(dbResult, "COLUMN_NAME"); ExasolTableColumn tableColumn = ExasolTable.getAttribute(session.getProgressMonitor(), colName); if (tableColumn == null) { log.info("ExasolTableForeignKeyCache : Column '" + colName + "' not found in table '" + ExasolTable.getFullyQualifiedName(DBPEvaluationContext.UI) + "' ??"); return null; } else { return new ExasolTableKeyColumn[]{ new ExasolTableKeyColumn(object, tableColumn, JDBCUtils.safeGetInt(dbResult, "ORDINAL_POSITION")) }; } } @Override protected void cacheChildren(DBRProgressMonitor monitor, ExasolTableForeignKey constraint, List<ExasolTableKeyColumn> rows) { constraint.setColumns(rows); } }