From 9bbc3df682eb3b628ad941457ee609aebb4caf8d Mon Sep 17 00:00:00 2001 From: serge-rider Date: Thu, 14 Jun 2018 01:41:02 +0300 Subject: [PATCH] #3621 HSQL synonyms support Former-commit-id: 54ec79eb193e772626c4ba3addce921adc663f74 --- .../OSGI-INF/l10n/bundle.properties | 2 + .../ext/generic/model/GenericDataSource.java | 7 +- .../generic/model/GenericObjectContainer.java | 27 +++++++- .../ext/generic/model/GenericSequence.java | 2 +- .../generic/model/GenericStructContainer.java | 2 + .../ext/generic/model/GenericSynonym.java | 2 +- .../OSGI-INF/l10n/bundle.properties | 2 + .../ext/hsqldb/model/HSQLMetaModel.java | 31 +++++++++ .../dbeaver/ext/hsqldb/model/HSQLSynonym.java | 65 +++++++++++++++++++ 9 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 plugins/org.jkiss.dbeaver.ext.hsqldb/src/org/jkiss/dbeaver/ext/hsqldb/model/HSQLSynonym.java 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 8fb4302978..f6db29eeaa 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 2a5351131a..0a60e02b8d 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 01829e63ac..1871999734 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 46c448b078..5155b07d72 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 aabcf62a5e..eb354d9340 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 450c1cef40..3a307388e5 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 fed6eb677a..dfa9b5e37e 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 81383d7edb..389830e901 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 0000000000..a8c5054239 --- /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; + } +} -- GitLab