/* * 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 org.jkiss.dbeaver.model.struct.DBSEntityConstraintType; import java.sql.SQLException; import java.util.List; public final class ExasolTableUniqueKeyCache extends JDBCCompositeCache<ExasolSchema, ExasolTable, ExasolTableUniqueKey, ExasolTableKeyColumn> { private static final String SQL_UK_TAB = " select\r\n" + " *\r\n" + " from\r\n" + " EXA_ALL_CONSTRAINTS c\r\n" + " inner join\r\n" + " EXA_ALL_CONSTRAINT_COLUMNS\r\n" + " using\r\n" + " (\r\n" + " CONSTRAINT_SCHEMA, CONSTRAINT_TABLE, CONSTRAINT_NAME, CONSTRAINT_OWNER, CONSTRAINT_TYPE\r\n" + " )\r\n" + " where\r\n" + " CONSTRAINT_SCHEMA = '%s' and\r\n" + " CONSTRAINT_TYPE = 'PRIMARY KEY' and\r\n" + " CONSTRAINT_TABLE = '%s'\r\n" + " order by\r\n" + " ORDINAL_POSITION"; private static final String SQL_UK_ALL = " select\r\n" + " *\r\n" + " from\r\n" + " EXA_ALL_CONSTRAINTS c\r\n" + " inner join\r\n" + " EXA_ALL_CONSTRAINT_COLUMNS\r\n" + " using\r\n" + " (\r\n" + " CONSTRAINT_SCHEMA, CONSTRAINT_TABLE, CONSTRAINT_NAME, CONSTRAINT_OWNER, CONSTRAINT_TYPE\r\n" + " )\r\n" + " where\r\n" + " CONSTRAINT_SCHEMA = '%s' and\r\n" + " CONSTRAINT_TYPE = 'PRIMARY KEY' \r\n" + " order by\r\n" + " ORDINAL_POSITION"; public ExasolTableUniqueKeyCache(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_UK_TAB,ExasolUtils.quoteString(exasolSchema.getName()), ExasolUtils.quoteString(forTable.getName())); } else { sql = String.format(SQL_UK_ALL,ExasolUtils.quoteString(exasolSchema.getName())); } JDBCStatement dbStat = session.createStatement(); ((JDBCStatementImpl) dbStat).setQueryString(sql); return dbStat; } @Nullable @Override protected ExasolTableUniqueKey fetchObject(JDBCSession session, ExasolSchema exasolSchema, ExasolTable exasolTable, String constName, JDBCResultSet dbResult) throws SQLException, DBException { //SQLs only return primary keys. no unique constraints in exasol DBSEntityConstraintType type = DBSEntityConstraintType.PRIMARY_KEY; return new ExasolTableUniqueKey(session.getProgressMonitor(), exasolTable, dbResult, type); } @Nullable @Override protected ExasolTableKeyColumn[] fetchObjectRow(JDBCSession session, ExasolTable exasolTable, ExasolTableUniqueKey object, JDBCResultSet dbResult) throws SQLException, DBException { String columnName = JDBCUtils.safeGetString(dbResult, "COLUMN_NAME"); ExasolTableColumn tableColumn = exasolTable.getAttribute(session.getProgressMonitor(), columnName); if (tableColumn == null) { log.info("Column '" + columnName + "' not found in table '" + exasolTable.getFullyQualifiedName(DBPEvaluationContext.UI) + "' ??"); return null; } else { /* verify that the column is not null -> even though it is not in the meta data * Exasol always verify not null for columns in a PK * this is necessary for the automatic unique identifiers detection to work */ tableColumn.setRequired(true); return new ExasolTableKeyColumn[]{ new ExasolTableKeyColumn(object, tableColumn, JDBCUtils.safeGetInteger(dbResult, "ORDINAL_POSITION")) }; } } @Override protected void cacheChildren(DBRProgressMonitor monitor, ExasolTableUniqueKey constraint, List<ExasolTableKeyColumn> rows) { constraint.setColumns(rows); } }