diff --git a/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties index 8fb4302978327e228d0735968c6816e236a79754..f6db29eeaa38e1c12cdb913292ba5c915fb78870 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties @@ -79,6 +79,8 @@ meta.org.jkiss.dbeaver.ext.generic.model.GenericSequence.lastValue.name=Value meta.org.jkiss.dbeaver.ext.generic.model.GenericSequence.minValue.name=Min Value meta.org.jkiss.dbeaver.ext.generic.model.GenericSequence.maxValue.name=Max Value meta.org.jkiss.dbeaver.ext.generic.model.GenericSequence.incrementBy.name=Increment +meta.org.jkiss.dbeaver.ext.generic.model.GenericSynonym.name.name=Name +meta.org.jkiss.dbeaver.ext.generic.model.GenericSynonym.description.name=Description meta.org.jkiss.dbeaver.ext.generic.model.GenericTrigger.name.name=Name meta.org.jkiss.dbeaver.ext.generic.model.GenericTrigger.description.name=Description meta.org.jkiss.dbeaver.ext.generic.model.GenericTrigger.table.name=Table diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java index 2a5351131a491eb0351eaa98f4128948c410c25e..0a60e02b8d7fb82e561b1486733e2c550110150a 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java @@ -356,10 +356,15 @@ public class GenericDataSource extends JDBCDataSource } @Override - public Collection getSequences(DBRProgressMonitor monitor) throws DBException { + public Collection getSequences(DBRProgressMonitor monitor) throws DBException { return structureContainer == null ? null : structureContainer.getSequences(monitor); } + @Override + public Collection getSynonyms(DBRProgressMonitor monitor) throws DBException { + return structureContainer == null ? null : structureContainer.getSynonyms(monitor); + } + @Override public Collection getTriggers(DBRProgressMonitor monitor) throws DBException { return structureContainer == null ? null : structureContainer.getTriggers(monitor); diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java index 01829e63ac30d5c3cf5d3b05e303b65a158b8540..18719997341cf7047706d980f2629cf264edc38e 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java @@ -47,7 +47,8 @@ public abstract class GenericObjectContainer implements GenericStructContainer,D private final PrimaryKeysCache primaryKeysCache; private List packages; protected List procedures; - protected List sequences; + protected List sequences; + protected List synonyms; private List triggers; protected GenericObjectContainer(@NotNull GenericDataSource dataSource) @@ -306,13 +307,21 @@ public abstract class GenericObjectContainer implements GenericStructContainer,D } @Override - public Collection getSequences(DBRProgressMonitor monitor) throws DBException { + public Collection getSequences(DBRProgressMonitor monitor) throws DBException { if (sequences == null) { loadSequences(monitor); } return sequences; } + @Override + public Collection getSynonyms(DBRProgressMonitor monitor) throws DBException { + if (synonyms == null) { + loadSynonyms(monitor); + } + return synonyms; + } + @Override public Collection getTriggers(DBRProgressMonitor monitor) throws DBException { if (triggers == null) { @@ -363,6 +372,7 @@ public abstract class GenericObjectContainer implements GenericStructContainer,D this.packages = null; this.procedures = null; this.sequences = null; + this.synonyms = null; return this; } @@ -425,6 +435,19 @@ public abstract class GenericObjectContainer implements GenericStructContainer,D } } + private synchronized void loadSynonyms(DBRProgressMonitor monitor) + throws DBException + { + synonyms = dataSource.getMetaModel().loadSynonyms(monitor, this); + + // Order procedures + if (synonyms == null) { + synonyms = new ArrayList<>(); + } else { + DBUtils.orderObjects(synonyms); + } + } + private synchronized List loadTriggers(DBRProgressMonitor monitor) throws DBException { diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSequence.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSequence.java index 46c448b078bb10ba40e478c06e30882283558501..5155b07d72875895306e9b18ccb9507dbc829a1d 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSequence.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericSequence.java @@ -76,7 +76,7 @@ public class GenericSequence implements DBSSequence, DBPQualifiedObject @NotNull @Override - public DBPDataSource getDataSource() { + public GenericDataSource getDataSource() { return container.getDataSource(); } diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java index aabcf62a5e73ad9e70c1c8f2f4f1c453be533592..eb354d9340e0732ba89bffe6ae24ffb8abc9e410 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java @@ -70,6 +70,8 @@ public interface GenericStructContainer extends DBSObjectContainer, DBSProcedure Collection getSequences(DBRProgressMonitor monitor) throws DBException; + Collection getSynonyms(DBRProgressMonitor monitor) throws DBException; + Collection getTriggers(DBRProgressMonitor monitor) throws DBException; Collection getTableTriggers(DBRProgressMonitor monitor) throws DBException; 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 450c1cef40aaebd5e362d7102511d5adcec47230..3a307388e545c4438820e87d0c0192bc8439f3b3 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 @@ -69,7 +69,7 @@ public abstract class GenericSynonym implements DBSAlias, DBSObject, DBPQualifie @NotNull @Override - public DBPDataSource getDataSource() { + public GenericDataSource getDataSource() { return container.getDataSource(); } diff --git a/plugins/org.jkiss.dbeaver.ext.hsqldb/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.hsqldb/OSGI-INF/l10n/bundle.properties index fed6eb677aa1d70a1636d2e7840464785f668e1f..dfa9b5e37ec158af38ca1dbd6b884f79c7ace0b4 100644 --- a/plugins/org.jkiss.dbeaver.ext.hsqldb/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ext.hsqldb/OSGI-INF/l10n/bundle.properties @@ -1,6 +1,8 @@ Bundle-Vendor = JKISS Bundle-Name = DBeaver HSQLDB Support +meta.org.jkiss.dbeaver.ext.hsqldb.model.HSQLSynonym.targetObject.name=Object +meta.org.jkiss.dbeaver.ext.hsqldb.model.HSQLSynonym.targetObjectType.name=Object Type meta.org.jkiss.dbeaver.ext.hsqldb.model.HSQLTrigger.orientation.name=Orientation meta.org.jkiss.dbeaver.ext.hsqldb.model.HSQLTrigger.timing.name=Timing meta.org.jkiss.dbeaver.ext.hsqldb.model.HSQLTrigger.manipulation.name=Manipulation diff --git a/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java index 81383d7edb33f5c93508a37bed5a1ce453d738e5..389830e901f705cc4bc67a3a4a782e95b92da9e2 100644 --- a/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLMetaModel.java @@ -216,4 +216,35 @@ public class HSQLMetaModel extends GenericMetaModel return ((HSQLTrigger)trigger).getStatement(); } + @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.getDataSource(), "Read triggers")) { + try (JDBCPreparedStatement dbStat = session.prepareStatement( + "SELECT * FROM INFORMATION_SCHEMA.SYSTEM_SYNONYMS\n" + + "WHERE SYNONYM_SCHEMA=?\n" + + "ORDER BY SYNONYM_NAME")) { + dbStat.setString(1, container.getName()); + + List result = new ArrayList<>(); + + try (JDBCResultSet dbResult = dbStat.executeQuery()) { + while (dbResult.next()) { + HSQLSynonym trigger = new HSQLSynonym( + container, + dbResult); + result.add(trigger); + } + } + return result; + + } + } catch (SQLException e) { + throw new DBException(e, container.getDataSource()); + } + } } diff --git a/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLSynonym.java b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLSynonym.java new file mode 100644 index 0000000000000000000000000000000000000000..a8c5054239a4ccfc789882ed22c8615597dd2d45 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLSynonym.java @@ -0,0 +1,65 @@ +/* + * 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.hsqldb.model; + +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; +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.ext.generic.model.GenericTable; +import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; +import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils; +import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSObject; + +/** + * HSQLSynonym + */ +public class HSQLSynonym extends GenericSynonym { + + private static final Log log = Log.getLog(HSQLSynonym.class); + + private String targetSchemaName; + private String targetObjectName; + private String targetObjectType; + + protected HSQLSynonym(GenericStructContainer container, JDBCResultSet dbResult) { + super(container, JDBCUtils.safeGetString(dbResult, "SYNONYM_NAME"), null); + targetSchemaName = JDBCUtils.safeGetString(dbResult, "OBJECT_SCHEMA"); + targetObjectName = JDBCUtils.safeGetString(dbResult, "OBJECT_NAME"); + targetObjectType = JDBCUtils.safeGetString(dbResult, "OBJECT_TYPE"); + } + + @Property(viewable = true, order = 3) + public String getTargetObjectType() { + return targetObjectType; + } + + @Property(viewable = true, order = 4) + @Override + public DBSObject getTargetObject(DBRProgressMonitor monitor) throws DBException { + GenericSchema schema = getDataSource().getSchema(targetSchemaName); + if (schema == null) { + log.error("Schema '" + targetSchemaName + "' not found"); + } else { + return schema.getTable(monitor, targetObjectName); + } + return null; + } +}