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 bfce9191381f32c4c9dc683aa324831d96aba37f..ef87ae6a719dd85b6d7b3119aab4d6dc38612b44 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 4ec6ab6e6bcb65674f2793e679c5b94cf164b06b..a20471993591657799b6ce9ee65081083d0ab0f2 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 1ab1fad68399b505d6fef0929c6f132020bb2fa6..6909a45856794f23178d26f856fff0747e44a545 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 0000000000000000000000000000000000000000..29f94fc47b7ebeebab0ee44efec0ffdbcbc1117c --- /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); + } +}