未验证 提交 0419d44a 编写于 作者: S Serge Rider 提交者: GitHub

Merge pull request #11033 from dbeaver/fkReferenceNetizza-ee#753

dbeaver/dbeaver-ee#753 load references method changed for outside cha…
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2020 DBeaver Corp and others
*
* 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.generic.model;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaObject;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCConstants;
/**
* Helper class for reading foreign key fields
*/
public class ForeignKeyInfo {
String pkColumnName;
String fkTableCatalog;
String fkTableSchema;
String fkTableName;
String fkColumnName;
int keySeq;
int updateRuleNum;
int deleteRuleNum;
String fkName;
String pkName;
int deferabilityNum;
public void fetchColumnsInfo (GenericMetaObject fkObject, @NotNull JDBCResultSet dbResult) {
pkColumnName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.PKCOLUMN_NAME);
fkTableCatalog = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKTABLE_CAT);
fkTableSchema = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKTABLE_SCHEM);
fkTableName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKTABLE_NAME);
fkColumnName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKCOLUMN_NAME);
keySeq = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.KEY_SEQ);
updateRuleNum = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.UPDATE_RULE);
deleteRuleNum = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.DELETE_RULE);
fkName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FK_NAME);
pkName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.PK_NAME);
deferabilityNum = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.DEFERRABILITY);
}
}
......@@ -310,20 +310,6 @@ public abstract class GenericTableBase extends JDBCTable<GenericDataSource, Gene
public abstract String getDDL();
private static class ForeignKeyInfo {
String pkColumnName;
String fkTableCatalog;
String fkTableSchema;
String fkTableName;
String fkColumnName;
int keySeq;
int updateRuleNum;
int deleteRuleNum;
String fkName;
String pkName;
int deferabilityNum;
}
private List<GenericTableForeignKey> loadReferences(DBRProgressMonitor monitor)
throws DBException
{
......@@ -335,30 +321,7 @@ public abstract class GenericTableBase extends JDBCTable<GenericDataSource, Gene
// First read entire resultset to prevent recursive metadata requests
// some drivers don't like it
final GenericMetaObject fkObject = getDataSource().getMetaObject(GenericConstants.OBJECT_FOREIGN_KEY);
final List<ForeignKeyInfo> fkInfos = new ArrayList<>();
JDBCDatabaseMetaData metaData = session.getMetaData();
// Load indexes
try (JDBCResultSet dbResult = metaData.getExportedKeys(
getCatalog() == null ? null : getCatalog().getName(),
getSchema() == null ? null : getSchema().getName(),
getName()))
{
while (dbResult.next()) {
ForeignKeyInfo fkInfo = new ForeignKeyInfo();
fkInfo.pkColumnName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.PKCOLUMN_NAME);
fkInfo.fkTableCatalog = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKTABLE_CAT);
fkInfo.fkTableSchema = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKTABLE_SCHEM);
fkInfo.fkTableName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKTABLE_NAME);
fkInfo.fkColumnName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FKCOLUMN_NAME);
fkInfo.keySeq = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.KEY_SEQ);
fkInfo.updateRuleNum = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.UPDATE_RULE);
fkInfo.deleteRuleNum = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.DELETE_RULE);
fkInfo.fkName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.FK_NAME);
fkInfo.pkName = GenericUtils.safeGetStringTrimmed(fkObject, dbResult, JDBCConstants.PK_NAME);
fkInfo.deferabilityNum = GenericUtils.safeGetInt(fkObject, dbResult, JDBCConstants.DEFERRABILITY);
fkInfos.add(fkInfo);
}
}
final List<ForeignKeyInfo> fkInfos = loadReferenceInfoList(session, fkObject);
List<GenericTableForeignKey> fkList = new ArrayList<>();
Map<String, GenericTableForeignKey> fkMap = new HashMap<>();
......@@ -463,6 +426,24 @@ public abstract class GenericTableBase extends JDBCTable<GenericDataSource, Gene
}
}
public List<ForeignKeyInfo> loadReferenceInfoList(@NotNull JDBCSession session, GenericMetaObject fkObject) throws SQLException {
final List<ForeignKeyInfo> fkInfos = new ArrayList<>();
JDBCDatabaseMetaData metaData = session.getMetaData();
// Load indexes
try (JDBCResultSet dbResult = metaData.getExportedKeys(
getCatalog() == null ? null : getCatalog().getName(),
getSchema() == null ? null : getSchema().getName(),
getName()))
{
while (dbResult.next()) {
ForeignKeyInfo fkInfo = new ForeignKeyInfo();
fkInfo.fetchColumnsInfo(fkObject, dbResult);
fkInfos.add(fkInfo);
}
}
return fkInfos;
}
@Nullable
@Association
public List<? extends GenericTrigger> getTriggers(@NotNull DBRProgressMonitor monitor) throws DBException {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册