提交 b50901a0 编写于 作者: S Serge Rider

Exasol metadata read fix

上级 43eaae0a
......@@ -17,7 +17,7 @@
*/
package org.jkiss.dbeaver.ext.exasol.model;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
......@@ -28,153 +28,137 @@ import java.sql.SQLException;
public class ExasolCurrentUserPrivileges {
private static final String C_CONNECTIONS = "SELECT CONNECTION_NAME FROM EXA_DBA_CONNECTIONS WHERE FALSE";
private static final String C_USERS = "SELECT USER_NAME FROM EXA_DBA_USERS WHERE FALSE";
private static final String C_OBJECT_PRIV = "SELECT OBJECT_NAME FROM EXA_DBA_OBJ_PRIVS WHERE FALSE";
private static final String C_CONNECTION_PRIV = "SELECT GRANTEE FROM EXA_DBA_CONNECTION_PRIVS WHERE FALSE";
private static final String C_ROLES = "SELECT ROLE_NAME FROM EXA_DBA_ROLES WHERE FALSE";
private static final String C_ROLE_PRIVS = "SELECT ROLE_NAME FROM EXA_DBA_ROLE_PRIVS WHERE FALSE";
private static final String C_VERSION = "select TO_NUMBER(\"VALUE\") AS VERSION from \"$ODBCJDBC\".DB_METADATA WHERE name LIKE 'databaseMajorVersion'";
private static final String C_ALTER_USER =
"SELECT\r\n" +
" CASE\r\n" +
" WHEN SUM( ANZAHL )> 0 THEN TRUE\r\n" +
" ELSE FALSE\r\n" +
" END AS HAS_ALTER_USER\r\n" +
"FROM\r\n" +
" (\r\n" +
" SELECT\r\n" +
" COUNT(*) AS ANZAHL\r\n" +
" FROM\r\n" +
" sys.EXA_ROLE_SYS_PRIVS\r\n" +
" WHERE\r\n" +
" PRIVILEGE = 'ALTER USER'\r\n" +
" UNION ALL SELECT\r\n" +
" COUNT(*) AS ANZAHL\r\n" +
" FROM\r\n" +
" SYS.EXA_USER_SYS_PRIVS\r\n" +
" WHERE\r\n" +
" PRIVILEGE = 'ALTER USER'\r\n" +
" )";
private final Boolean userIsAuthorizedForConnections;
private final Boolean userIsAuthorizedForUsers;
private final Boolean userIsAuthorizedForRoles;
private final Boolean userIsAuthorizedForRolePrivs;
private final Boolean userIsAuthorizedForObjectPrivs;
private final Boolean userIsAuthorizedForConnectionPrivs;
private final Boolean userIsAuthorizedForSystemPrivs;
private final Boolean userIsAuthorizedForSessions;
private final Boolean userHasAlterUserPriv;
private final int ExasolVersion;
public ExasolCurrentUserPrivileges(DBRProgressMonitor monitor,
JDBCSession session, ExasolDataSource exasolDataSource)
throws DBException
{
userIsAuthorizedForConnections = ExasolCurrentUserPrivileges.verifyPriv(C_CONNECTIONS, session);
userIsAuthorizedForUsers = ExasolCurrentUserPrivileges.verifyPriv(C_USERS, session);
userIsAuthorizedForRolePrivs = ExasolCurrentUserPrivileges.verifyPriv(C_ROLE_PRIVS, session);
userIsAuthorizedForRoles = ExasolCurrentUserPrivileges.verifyPriv(C_ROLES, session);
userIsAuthorizedForObjectPrivs = ExasolCurrentUserPrivileges.verifyPriv(C_OBJECT_PRIV, session);
userIsAuthorizedForConnectionPrivs = ExasolCurrentUserPrivileges.verifyPriv(C_CONNECTION_PRIV, session);
userIsAuthorizedForSystemPrivs = ExasolCurrentUserPrivileges.verifyPriv("SELECT GRANTEE,PRIVILEGE,ADMIN_OPTION FROM SYS.EXA_DBA_SYS_PRIVS WHERE FALSE", session);
userIsAuthorizedForSessions = ExasolCurrentUserPrivileges.verifyPriv("SELECT * FROM SYS.EXA_DBA_SESSIONS", session);
userHasAlterUserPriv = ExasolCurrentUserPrivileges.verifyPriv(C_ALTER_USER, session);
JDBCPreparedStatement dbStat;
try {
dbStat = session.prepareStatement(C_VERSION);
ResultSet rs = dbStat.executeQuery();
rs.next();
ExasolVersion = JDBCUtils.safeGetInt(rs, "VERSION");
rs.close();
dbStat.close();
} catch (SQLException e) {
throw new DBException(e,exasolDataSource);
}
}
public int getExasolVersion()
{
return ExasolVersion;
}
public Boolean getatLeastV5()
{
return ExasolVersion >= 5;
}
public Boolean getatLeastV6()
{
return ExasolVersion >= 6;
}
public Boolean getUserIsAuthorizedForRoles()
{
return userIsAuthorizedForRoles;
}
public Boolean getUserIsAuthorizedForRolePrivs()
{
return userIsAuthorizedForRolePrivs;
}
public Boolean getUserIsAuthorizedForSystemPrivs()
{
return userIsAuthorizedForSystemPrivs;
}
private static Boolean verifyPriv(String sql, JDBCSession session)
{
JDBCPreparedStatement dbStat;
Boolean hasPriv;
try {
dbStat = session.prepareStatement(C_CONNECTIONS);
ResultSet rs = dbStat.executeQuery();
rs.close();
dbStat.close();
hasPriv = true;
} catch (SQLException e) {
hasPriv = false;
}
return hasPriv;
}
public Boolean getUserIsAuthorizedForConnections()
{
return userIsAuthorizedForConnections;
}
public Boolean getUserIsAuthorizedForUsers()
{
return userIsAuthorizedForUsers;
}
public Boolean getUserIsAuthorizedForObjectPrivs()
{
return userIsAuthorizedForObjectPrivs;
}
public Boolean getUserIsAuthorizedForConnectionPrivs()
{
return userIsAuthorizedForConnectionPrivs;
}
public Boolean isUserAuthorizedForSessions()
{
return userIsAuthorizedForSessions;
}
public Boolean UserHasAlterUserPriv()
{
return userHasAlterUserPriv;
}
private static final Log LOG = Log.getLog(ExasolCurrentUserPrivileges.class);
private static final String C_CONNECTIONS = "SELECT CONNECTION_NAME FROM EXA_DBA_CONNECTIONS WHERE FALSE";
private static final String C_USERS = "SELECT USER_NAME FROM EXA_DBA_USERS WHERE FALSE";
private static final String C_OBJECT_PRIV = "SELECT OBJECT_NAME FROM EXA_DBA_OBJ_PRIVS WHERE FALSE";
private static final String C_CONNECTION_PRIV = "SELECT GRANTEE FROM EXA_DBA_CONNECTION_PRIVS WHERE FALSE";
private static final String C_ROLES = "SELECT ROLE_NAME FROM EXA_DBA_ROLES WHERE FALSE";
private static final String C_ROLE_PRIVS = "SELECT ROLE_NAME FROM EXA_DBA_ROLE_PRIVS WHERE FALSE";
private static final String C_VERSION = "select TO_NUMBER(\"VALUE\") AS VERSION from \"$ODBCJDBC\".DB_METADATA WHERE name LIKE 'databaseMajorVersion'";
private static final String C_ALTER_USER =
"SELECT\r\n" +
" CASE\r\n" +
" WHEN SUM( ANZAHL )> 0 THEN TRUE\r\n" +
" ELSE FALSE\r\n" +
" END AS HAS_ALTER_USER\r\n" +
"FROM\r\n" +
" (\r\n" +
" SELECT\r\n" +
" COUNT(*) AS ANZAHL\r\n" +
" FROM\r\n" +
" sys.EXA_ROLE_SYS_PRIVS\r\n" +
" WHERE\r\n" +
" PRIVILEGE = 'ALTER USER'\r\n" +
" UNION ALL SELECT\r\n" +
" COUNT(*) AS ANZAHL\r\n" +
" FROM\r\n" +
" SYS.EXA_USER_SYS_PRIVS\r\n" +
" WHERE\r\n" +
" PRIVILEGE = 'ALTER USER'\r\n" +
" )";
private final Boolean userIsAuthorizedForConnections;
private final Boolean userIsAuthorizedForUsers;
private final Boolean userIsAuthorizedForRoles;
private final Boolean userIsAuthorizedForRolePrivs;
private final Boolean userIsAuthorizedForObjectPrivs;
private final Boolean userIsAuthorizedForConnectionPrivs;
private final Boolean userIsAuthorizedForSystemPrivs;
private final Boolean userIsAuthorizedForSessions;
private final Boolean userHasAlterUserPriv;
private int ExasolVersion;
public ExasolCurrentUserPrivileges(DBRProgressMonitor monitor,
JDBCSession session, ExasolDataSource exasolDataSource) {
userIsAuthorizedForConnections = ExasolCurrentUserPrivileges.verifyPriv(C_CONNECTIONS, session);
userIsAuthorizedForUsers = ExasolCurrentUserPrivileges.verifyPriv(C_USERS, session);
userIsAuthorizedForRolePrivs = ExasolCurrentUserPrivileges.verifyPriv(C_ROLE_PRIVS, session);
userIsAuthorizedForRoles = ExasolCurrentUserPrivileges.verifyPriv(C_ROLES, session);
userIsAuthorizedForObjectPrivs = ExasolCurrentUserPrivileges.verifyPriv(C_OBJECT_PRIV, session);
userIsAuthorizedForConnectionPrivs = ExasolCurrentUserPrivileges.verifyPriv(C_CONNECTION_PRIV, session);
userIsAuthorizedForSystemPrivs = ExasolCurrentUserPrivileges.verifyPriv("SELECT GRANTEE,PRIVILEGE,ADMIN_OPTION FROM SYS.EXA_DBA_SYS_PRIVS WHERE FALSE", session);
userIsAuthorizedForSessions = ExasolCurrentUserPrivileges.verifyPriv("SELECT * FROM SYS.EXA_DBA_SESSIONS", session);
userHasAlterUserPriv = ExasolCurrentUserPrivileges.verifyPriv(C_ALTER_USER, session);
try {
try (JDBCPreparedStatement dbStat = session.prepareStatement(C_VERSION)) {
try (ResultSet rs = dbStat.executeQuery()) {
rs.next();
ExasolVersion = JDBCUtils.safeGetInt(rs, "VERSION");
}
}
} catch (SQLException e) {
LOG.error("Error extracting Exasol version");
ExasolVersion = 5;
}
}
public int getExasolVersion() {
return ExasolVersion;
}
public Boolean getatLeastV5() {
return ExasolVersion >= 5;
}
public Boolean getatLeastV6() {
return ExasolVersion >= 6;
}
public Boolean getUserIsAuthorizedForRoles() {
return userIsAuthorizedForRoles;
}
public Boolean getUserIsAuthorizedForRolePrivs() {
return userIsAuthorizedForRolePrivs;
}
public Boolean getUserIsAuthorizedForSystemPrivs() {
return userIsAuthorizedForSystemPrivs;
}
private static Boolean verifyPriv(String sql, JDBCSession session) {
Boolean hasPriv;
try {
try (JDBCPreparedStatement dbStat = session.prepareStatement(sql)) {
try (ResultSet rs = dbStat.executeQuery()) {
}
}
hasPriv = true;
} catch (Exception e) {
hasPriv = false;
}
return hasPriv;
}
public Boolean getUserIsAuthorizedForConnections() {
return userIsAuthorizedForConnections;
}
public Boolean getUserIsAuthorizedForUsers() {
return userIsAuthorizedForUsers;
}
public Boolean getUserIsAuthorizedForObjectPrivs() {
return userIsAuthorizedForObjectPrivs;
}
public Boolean getUserIsAuthorizedForConnectionPrivs() {
return userIsAuthorizedForConnectionPrivs;
}
public Boolean isUserAuthorizedForSessions() {
return userIsAuthorizedForSessions;
}
public Boolean UserHasAlterUserPriv() {
return userHasAlterUserPriv;
}
}
......@@ -17,16 +17,6 @@
*/
package org.jkiss.dbeaver.ext.exasol.model;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.jkiss.code.NotNull;
......@@ -36,18 +26,7 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.exasol.ExasolConstants;
import org.jkiss.dbeaver.ext.exasol.ExasolDataSourceProvider;
import org.jkiss.dbeaver.ext.exasol.ExasolSQLDialect;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolBaseObjectGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolConnectionGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolGrantee;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolRole;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolRoleGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolSchemaGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolScriptGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolSystemGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolTableGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolTableObjectType;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolUser;
import org.jkiss.dbeaver.ext.exasol.manager.security.ExasolViewGrant;
import org.jkiss.dbeaver.ext.exasol.manager.security.*;
import org.jkiss.dbeaver.ext.exasol.model.plan.ExasolPlanAnalyser;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPDataSourceInfo;
......@@ -77,6 +56,11 @@ import org.jkiss.dbeaver.model.struct.DBSObjectSelector;
import org.jkiss.dbeaver.model.struct.DBSStructureAssistant;
import org.jkiss.utils.CommonUtils;
import java.sql.SQLException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExasolDataSource extends JDBCDataSource
implements DBSObjectSelector, DBCQueryPlanner, IAdaptable {
......@@ -177,8 +161,7 @@ public class ExasolDataSource extends JDBCDataSource
+ "order by b.object_name";
schemaCache = new JDBCObjectSimpleCache<>(
ExasolSchema.class, schemaSQL);
try {
this.dataTypeCache.getAllObjects(monitor, this);
} catch (DBException e) {
......@@ -437,8 +420,7 @@ public class ExasolDataSource extends JDBCDataSource
@Override
public ExasolSchema getDefaultObject()
{
return activeSchemaName == null ? null
: schemaCache.getCachedObject(activeSchemaName);
return activeSchemaName == null ? null : schemaCache.getCachedObject(activeSchemaName);
}
@Override
......@@ -483,7 +465,7 @@ public class ExasolDataSource extends JDBCDataSource
}
}
return false;
} catch (SQLException e) {
} catch (Exception e) {
throw new DBException(e, this);
}
}
......@@ -515,7 +497,6 @@ public class ExasolDataSource extends JDBCDataSource
{
return schemaCache.getAllObjects(monitor, this);
}
public ExasolSchema getSchema(DBRProgressMonitor monitor, String name)
throws DBException
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册