From 963eae5494e22eba82f726210eb573303bd343dd Mon Sep 17 00:00:00 2001 From: serge-rider Date: Fri, 10 Aug 2018 23:45:19 +0300 Subject: [PATCH] #3950 SQL Server: synonyms meta info support --- .../ext/generic/model/GenericSynonym.java | 2 +- .../OSGI-INF/l10n/bundle.properties | 2 + .../ext/mssql/model/SQLServerMetaModel.java | 36 ++++++++++ .../ext/mssql/model/SQLServerSynonym.java | 72 +++++++++++++++++++ 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerSynonym.java diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSynonym.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSynonym.java index bfce919138..ef87ae6a71 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSynonym.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSynonym.java @@ -63,7 +63,7 @@ public abstract class GenericSynonym implements DBSAlias, DBSObject, DBPQualifie @Nullable @Override - public DBSObject getParentObject() { + public GenericStructContainer getParentObject() { return container; } diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.mssql/OSGI-INF/l10n/bundle.properties index 4ec6ab6e6b..a204719935 100644 --- a/plugins/org.jkiss.dbeaver.ext.mssql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.mssql/OSGI-INF/l10n/bundle.properties @@ -10,3 +10,5 @@ datasource.sybase.description=Sybase/SAP ASE datasource meta.org.jkiss.dbeaver.ext.mssql.model.SQLServerTable.description.name=Description meta.org.jkiss.dbeaver.ext.mssql.model.SQLServerTable.description.description=Table description +meta.org.jkiss.dbeaver.ext.mssql.model.SQLServerSynonym.targetObject.name=Base object +meta.org.jkiss.dbeaver.ext.mssql.model.SQLServerSynonym.targetObject.description=Object to which the user of this synonym is redirected diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java index 1ab1fad683..6909a45856 100644 --- a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java @@ -345,6 +345,42 @@ public class SQLServerMetaModel extends GenericMetaModel implements DBCQueryTran } } + @Override + public boolean supportsSynonyms(GenericDataSource dataSource) { + return true; + } + + @Override + public List loadSynonyms(DBRProgressMonitor monitor, GenericStructContainer container) throws DBException { + try (JDBCSession session = DBUtils.openMetaSession(monitor, container, "Read system synonyms")) { + try (JDBCPreparedStatement dbStat = session.prepareStatement( + "SELECT * FROM " + getSystemSchemaFQN(container.getDataSource(), container.getCatalog()) + ".synonyms WHERE schema_name(schema_id)=?")) { + dbStat.setString(1, container.getSchema().getName()); + List result = new ArrayList<>(); + + try (JDBCResultSet dbResult = dbStat.executeQuery()) { + while (dbResult.next()) { + String name = JDBCUtils.safeGetString(dbResult, "name"); + if (name == null) { + continue; + } + name = name.trim(); + SQLServerSynonym synonym = new SQLServerSynonym( + container, + name, + null, + JDBCUtils.safeGetString(dbResult, "base_object_name")); + result.add(synonym); + } + } + return result; + + } + } catch (SQLException e) { + throw new DBException(e, container.getDataSource()); + } + } + @Override public SQLServerTable createTableImpl(GenericStructContainer container, String tableName, String tableType, JDBCResultSet dbResult) { return new SQLServerTable(container, tableName, tableType, dbResult); diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerSynonym.java b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerSynonym.java new file mode 100644 index 0000000000..29f94fc47b --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerSynonym.java @@ -0,0 +1,72 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2018 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.mssql.model; + +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.ext.generic.model.GenericCatalog; +import org.jkiss.dbeaver.ext.generic.model.GenericSchema; +import org.jkiss.dbeaver.ext.generic.model.GenericStructContainer; +import org.jkiss.dbeaver.ext.generic.model.GenericSynonym; +import org.jkiss.dbeaver.model.DBPEvaluationContext; +import org.jkiss.dbeaver.model.DBPQualifiedObject; +import org.jkiss.dbeaver.model.DBUtils; +import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSObject; + +/** +* SQL server synonym +*/ +public class SQLServerSynonym extends GenericSynonym implements DBPQualifiedObject { + + private static final Log log = Log.getLog(SQLServerSynonym.class); + + private String targetObjectName; + + public SQLServerSynonym(GenericStructContainer container, String name, String description, String targetObjectName) { + super(container, name, description); + this.targetObjectName = targetObjectName; + } + + @Override + public String getFullyQualifiedName(DBPEvaluationContext context) { + return DBUtils.getFullQualifiedName( + getDataSource(), + getParentObject(), + this); + } + + @Property(viewable = true, order = 20) + @Override + public DBSObject getTargetObject(DBRProgressMonitor monitor) throws DBException { + int divPos = targetObjectName.indexOf("].["); + if (divPos == -1) { + log.debug("Bad target object name '" + targetObjectName + "' for synonym '" + getName() + "'"); + return null; + } + String schemaName = DBUtils.getUnQuotedIdentifier(getDataSource(), targetObjectName.substring(0, divPos + 1)); + String objectName = DBUtils.getUnQuotedIdentifier(getDataSource(), targetObjectName.substring(divPos + 2)); + GenericCatalog database = getParentObject().getCatalog(); + GenericSchema schema = database.getSchema(monitor, schemaName); + if (schema == null) { + log.debug("Schema '" + schemaName + "' not found for synonym '" + getName() + "'"); + return null; + } + return schema.getChild(monitor, objectName); + } +} -- GitLab