提交 44769aae 编写于 作者: K Kai Morich

enhanced HANA navigation tree

- show schema folder (to allow schema filtering)
- show sequences
- show data types only once
上级 85e26bbb
......@@ -642,9 +642,9 @@
<driver
id="sap_hana"
category="SAP"
label="HANA"
icon="icons/sap_hana_icon.png"
iconBig="icons/sap_hana_icon_big.png"
label="HANA (Old)"
icon="platform:/plugin/org.jkiss.dbeaver.ext.hana/icons/sap_hana_icon.png"
iconBig="platform:/plugin/org.jkiss.dbeaver.ext.hana/icons/sap_hana_icon_big.png"
class="com.sap.db.jdbc.Driver"
sampleURL="jdbc:sap://{host}[:{port}]"
defaultPort="30015"
......
#Properties file for org.jkiss.dbeaver.ext.hana
Bundle-Vendor = JKISS
Bundle-Name = DBeaver SAP HANA Support
tree.column.node.name = Column
tree.columns.node.name = Columns
tree.dataType.node.name = Data Type
tree.dataTypes.node.name = Data Types
tree.foreign_key.node.name = Foreign Key
tree.foreign_key_columns.node.name = Foreign key columns
tree.foreign_keys.node.name = Foreign Keys
tree.function.node.name = Function
tree.function_columns.node.name = Function parameters
tree.functions.node.name = Functions
tree.index.node.name = Index
tree.index_columns.node.name = Index columns
tree.indexes.node.name = Indexes
tree.procedure.node.name = Procedure
tree.procedure_columns.node.name = Procedure parameters
tree.procedures.node.name = Procedures
tree.reference.node.name = Reference
tree.reference_columns.node.name = Reference columns
tree.references.node.name = References
tree.sequence.node.name = Sequence
tree.sequences.node.name = Sequences
tree.schema.node.name = Schema
tree.schemas.node.name = Schemas
tree.synonym.node.name = Synonym
tree.synonyms.node.name = Synonyms
tree.table.node.name = Table
tree.tables.node.name = Tables
tree.tableTriggers.node.name = Table Triggers
tree.trigger.node.name = Trigger
tree.triggers.node.name = Triggers
tree.tview.node.name = View
tree.tviews.node.name = Views
tree.uni_key.columns.node.name = Unique key columns
tree.uni_key.node.name = Unique Key
tree.uni_keys.node.name = Unique Keys
meta.org.jkiss.dbeaver.ext.hana.model.HANASysViewColumn.unit.name=Unit
meta.org.jkiss.dbeaver.ext.hana.model.plan.HANAPlanNode.operatorName.name=Operator Name
meta.org.jkiss.dbeaver.ext.hana.model.plan.HANAPlanNode.operatorDetails.name=Operator Details
......
......@@ -3,4 +3,5 @@ output.. = target/classes/
bin.includes = .,\
META-INF/,\
OSGI-INF/,\
plugin.xml
plugin.xml,\
icons/
......@@ -7,4 +7,111 @@
<meta id="hana" class="org.jkiss.dbeaver.ext.hana.model.HANAMetaModel" driverClass="com.sap.db.jdbc.Driver"/>
</extension>
<extension point="org.jkiss.dbeaver.dataSourceProvider">
<datasource
class="org.jkiss.dbeaver.ext.hana.HANADataSourceProvider"
description="%datasource.hana.description"
id="hana"
parent="generic"
label="HANA">
<tree path="hana" label="HANA data source">
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericSchema" label="%tree.schemas.node.name" icon="#folder_schema">
<items label="#schema" path="schema" property="schemas" icon="#schema" optional="true">
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTable" label="%tree.tables.node.name" icon="#folder_table">
<items label="%tree.table.node.name" path="table" property="physicalTables" icon="#table">
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTableColumn" label="%tree.columns.node.name" icon="#columns">
<items label="%tree.column.node.name" path="attribute" property="attributes" icon="#column"/>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericPrimaryKey" label="%tree.uni_keys.node.name" icon="#constraints">
<items label="%tree.uni_key.node.name" path="uniqueKey" property="constraints" icon="#unique-key">
<items label="%tree.uni_key.columns.node.name" itemLabel="%tree.column.node.name" path="column" property="attributeReferences" navigable="false" inline="true"/>
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTableForeignKey" label="%tree.foreign_keys.node.name" icon="#foreign-keys">
<items label="%tree.foreign_key.node.name" path="association" property="associations" icon="#foreign-key">
<items label="%tree.foreign_key_columns.node.name" itemLabel="%tree.column.node.name" path="column" property="attributeReferences" navigable="false" inline="true"/>
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTableIndex" label="%tree.indexes.node.name" icon="#indexes">
<items label="%tree.index.node.name" path="index" property="indexes" icon="#index">
<items label="%tree.index_columns.node.name" path="column" property="attributeReferences" icon="#column" navigable="false" inline="true"/>
</items>
</folder>
<folder label="%tree.references.node.name" icon="#references" virtual="true">
<items label="%tree.reference.node.name" path="reference" property="references" icon="#reference" virtual="true">
<items label="%tree.reference_columns.node.name" itemLabel="%tree.column.node.name" path="column" property="attributeReferences" navigable="false" inline="true" virtual="true"/>
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTrigger" label="%tree.triggers.node.name" icon="#triggers">
<items label="%tree.trigger.node.name" path="trigger" property="triggers" icon="#trigger"/>
</folder>
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericView" label="%tree.tviews.node.name" icon="#folder_view">
<items label="%tree.tview.node.name" path="view" property="views" icon="#view">
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTableColumn" label="%tree.columns.node.name" icon="#columns">
<items label="%tree.column.node.name" path="attribute" property="attributes" icon="#column"/>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTrigger" label="%tree.triggers.node.name" icon="#triggers">
<items label="%tree.trigger.node.name" path="trigger" property="triggers" icon="#trigger"/>
</folder>
</items>
</folder>
<folder type="org.jkiss.dbeaver.model.struct.rdb.DBSTableIndex" label="%tree.indexes.node.name" icon="#indexes">
<items icon="#index" label="%tree.index.node.name" path="index" property="indexes" virtual="true">
<items icon="#column" label="%tree.index_columns.node.name" itemLabel="%tree.column.node.name" path="column" property="attributeReferences" inline="true" navigable="false" virtual="true"/>
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericProcedure" label="%tree.procedures.node.name" icon="#procedures">
<items label="%tree.procedures.node.name" itemLabel="%tree.procedure.node.name" path="procedure" property="proceduresOnly" icon="#procedure">
<items label="%tree.procedure_columns.node.name" itemLabel="%tree.column.node.name" path="column" property="parameters" navigable="false"/>
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericProcedure" label="%tree.functions.node.name" icon="#functions">
<items label="%tree.functions.node.name" itemLabel="%tree.function.node.name" path="function" property="functionsOnly" icon="#function">
<items label="%tree.function_columns.node.name" itemLabel="%tree.column.node.name" path="column" property="parameters" navigable="false"/>
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericSequence" label="%tree.sequences.node.name" icon="#sequences">
<items label="%tree.sequence.node.name" path="sequence" property="sequences" icon="#sequence"/>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericSynonym" label="%tree.synonyms.node.name" icon="#synonyms">
<items label="%tree.synonym.node.name" path="synonym" property="synonyms" icon="#synonym"/>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTrigger" label="%tree.triggers.node.name" icon="#triggers">
<items label="%tree.trigger.node.name" path="trigger" property="tableTriggers" icon="#trigger"/>
</folder>
</items>
</folder>
<folder type="org.jkiss.dbeaver.model.struct.DBSDataType" label="%tree.dataTypes.node.name" icon="#data_types" description="Global data types">
<items label="%tree.dataType.node.name" path="dataType" property="dataTypes" icon="#data_type"/>
</folder>
</tree>
<drivers managable="true">
<driver
id="sap_hana"
category="SAP"
label="HANA"
icon="icons/sap_hana_icon.png"
iconBig="icons/sap_hana_icon_big.png"
class="com.sap.db.jdbc.Driver"
sampleURL="jdbc:sap://{host}[:{port}]"
defaultPort="30015"
description=""
webURL="http://scn.sap.com/community/developer-center/hana"
categories="sql">
<file type="jar" path="maven:/com.sap.cloud.db.jdbc:ngdbc:RELEASE"/>
<replace provider="generic" driver="sap_hana"/>
<parameter name="split-procedures-and-functions" value="true"/>
<parameter name="query-get-active-db" value="SELECT CURRENT_SCHEMA FROM DUMMY"/>
<parameter name="query-set-active-db" value="SET SCHEMA &quot;?&quot;"/>
</driver>
</drivers>
</datasource>
</extension>
</plugin>
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 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.hana;
import org.jkiss.dbeaver.ext.generic.GenericDataSourceProvider;
public class HANADataSourceProvider extends GenericDataSourceProvider {
}
......@@ -187,6 +187,38 @@ public class HANAMetaModel extends GenericMetaModel
}
}
@Override
public boolean supportsSequences(GenericDataSource dataSource) {
return true;
}
@Override
public List<GenericSequence> loadSequences(DBRProgressMonitor monitor, GenericStructContainer container) throws DBException {
try (JDBCSession session = DBUtils.openMetaSession(monitor, container, "Read synonyms")) {
try (JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY FROM SYS.SEQUENCES WHERE SCHEMA_NAME = ? ORDER BY SEQUENCE_NAME")) {
dbStat.setString(1, container.getName());
List<GenericSequence> result = new ArrayList<>();
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
while (dbResult.next()) {
String name = dbResult.getString(1);
Number minValue = dbResult.getBigDecimal(2);
Number maxValue = dbResult.getBigDecimal(3);
Number incrementBy = dbResult.getBigDecimal(4);
Number lastValue = null;
GenericSequence sequence = new GenericSequence(container, name, "", lastValue, minValue, maxValue, incrementBy);
result.add(sequence);
}
}
return result;
}
} catch (SQLException e) {
throw new DBException(e, container.getDataSource());
}
}
@Override
public boolean supportsSynonyms(GenericDataSource dataSource) {
return true;
......
......@@ -101,6 +101,8 @@ public class HANAStructureAssistant extends JDBCStructureAssistant {
String objectName = dbResult.getString(2);
String description = dbResult.getString(3);
GenericSchema schema = parentSchema != null ? parentSchema : dataSource.getSchema(schemaName);
if (schema == null)
continue; // filtered
result.add(new AbstractObjectReference(objectName, schema, description, GenericTable.class,
RelationalObjectType.TYPE_TABLE) {
......@@ -142,6 +144,8 @@ public class HANAStructureAssistant extends JDBCStructureAssistant {
String objectName = dbResult.getString(2);
String description = dbResult.getString(3);
GenericSchema schema = parentSchema != null ? parentSchema : dataSource.getSchema(schemaName);
if (schema == null)
continue; // filtered
result.add(new AbstractObjectReference(objectName, schema, description, GenericTable.class,
RelationalObjectType.TYPE_VIEW) {
......@@ -183,6 +187,8 @@ public class HANAStructureAssistant extends JDBCStructureAssistant {
String objectName = dbResult.getString(2);
String description = null;
GenericSchema schema = parentSchema != null ? parentSchema : dataSource.getSchema(schemaName);
if (schema == null)
continue; // filtered
result.add(new AbstractObjectReference(objectName, schema, description, GenericProcedure.class,
RelationalObjectType.TYPE_PROCEDURE) {
......@@ -225,6 +231,8 @@ public class HANAStructureAssistant extends JDBCStructureAssistant {
String columnName = dbResult.getString(3);
String description = dbResult.getString(4);
GenericSchema schema = parentSchema != null ? parentSchema : dataSource.getSchema(schemaName);
if (schema == null)
continue; // filtered
result.add(new AbstractObjectReference(objectName, schema, description, GenericTableColumn.class,
RelationalObjectType.TYPE_TABLE_COLUMN) {
......@@ -272,6 +280,8 @@ public class HANAStructureAssistant extends JDBCStructureAssistant {
String columnName = dbResult.getString(3);
String description = dbResult.getString(4);
GenericSchema schema = parentSchema != null ? parentSchema : dataSource.getSchema(schemaName);
if (schema == null)
continue; // filtered
result.add(new AbstractObjectReference(objectName, schema, description, GenericTableColumn.class,
RelationalObjectType.TYPE_TABLE_COLUMN) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册