/* * DBeaver - Universal Database Manager * Copyright (C) 2013-2015 Denis Forveille (titou10.titou10@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.db2.model.security; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.db2.model.DB2DataSource; 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.cache.JDBCObjectCache; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import java.sql.SQLException; /** * Cache for DB2 Groups and Users * * @author Denis Forveille */ public final class DB2GranteeCache extends JDBCObjectCache<DB2DataSource, DB2Grantee> { private DB2AuthIDType authIdType; private String authIdTypeName; public DB2GranteeCache(DB2AuthIDType authIdType) { this.authIdType = authIdType; this.authIdTypeName = authIdType.name(); } @Override protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull DB2DataSource db2DataSource) throws SQLException { JDBCPreparedStatement dbStat = session.prepareStatement(getSQLStatement(db2DataSource)); dbStat.setString(1, authIdTypeName); dbStat.setString(2, authIdTypeName); dbStat.setString(3, authIdTypeName); dbStat.setString(4, authIdTypeName); dbStat.setString(5, authIdTypeName); dbStat.setString(6, authIdTypeName); dbStat.setString(7, authIdTypeName); dbStat.setString(8, authIdTypeName); dbStat.setString(9, authIdTypeName); dbStat.setString(10, authIdTypeName); if (db2DataSource.isAtLeastV9_5()) { dbStat.setString(11, authIdTypeName); } if (db2DataSource.isAtLeastV9_7()) { dbStat.setString(12, authIdTypeName); } return dbStat; } @Override protected DB2Grantee fetchObject(@NotNull JDBCSession session, @NotNull DB2DataSource db2DataSource, @NotNull JDBCResultSet resultSet) throws SQLException, DBException { DBRProgressMonitor monitor = session.getProgressMonitor(); switch (authIdType) { case G: return new DB2Group(monitor, db2DataSource, resultSet); case U: return new DB2User(monitor, db2DataSource, resultSet); default: throw new DBException("Structural problem. " + authIdType + " type not implemented"); } } // ------- // Helpers // ------- private String getSQLStatement(DB2DataSource db2DataSource) { // DF: could be put in a cache "per version" StringBuilder sb = new StringBuilder(1536); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.TABAUTH"); sb.append(" WHERE GRANTEETYPE = ?"); // 1 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.INDEXAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 2 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.SEQUENCEAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 3 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.TBSPACEAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 4 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.SCHEMAAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 5 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.PACKAGEAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 6 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.COLAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 7 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.ROUTINEAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 8 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.DBAUTH"); sb.append(" WHERE GRANTEETYPE = ?");// 9 sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.XSROBJECTAUTH"); sb.append(" WHERE GRANTEETYPE = ?"); // 10 if (db2DataSource.isAtLeastV9_5()) { sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.ROLEAUTH"); sb.append(" WHERE GRANTEETYPE = ?"); // 11 } if (db2DataSource.isAtLeastV9_7()) { sb.append(" UNION "); sb.append("SELECT DISTINCT GRANTEE"); sb.append(" FROM SYSCAT.MODULEAUTH"); sb.append(" WHERE GRANTEETYPE = ?"); // 12 } sb.append(" ORDER BY GRANTEE"); sb.append(" WITH UR"); return sb.toString(); } }