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

Merge pull request #10182 from dbeaver/derbyduplicate#10181

#10181 derby constraint model reordering
......@@ -22,6 +22,7 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.generic.model.*;
import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaModel;
import org.jkiss.dbeaver.ext.generic.model.meta.GenericMetaObject;
import org.jkiss.dbeaver.model.DBPErrorAssistant;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
......@@ -31,6 +32,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSEntityConstraintType;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.BeanUtils;
import org.jkiss.utils.CommonUtils;
......@@ -151,38 +153,9 @@ public class DerbyMetaModel extends GenericMetaModel
} else {
dbStat.setString(1, owner.getName());
}
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
while (dbResult.next()) {
String name = JDBCUtils.safeGetString(dbResult, "PK_NAME");
if (name == null) {
continue;
}
try {
GenericUniqueKey gConstraint = new GenericUniqueKey(forParent, name, null, getUniqueConstraintType(dbResult), true);
Object descriptor = JDBCUtils.safeGetObject(dbResult, "DESCRIPTOR");
if (descriptor != null) {
Object baseColumnPositions = BeanUtils.invokeObjectMethod(descriptor, "baseColumnPositions");
int[] columnPositions = (int []) baseColumnPositions;
for (int pos : columnPositions) {
List<? extends GenericTableColumn> attributes = forParent.getAttributes(session.getProgressMonitor());
if (!CommonUtils.isEmpty(attributes)) {
for (GenericTableColumn genericTableColumn : attributes) {
if (genericTableColumn.getOrdinalPosition() == pos) {
GenericTableConstraintColumn constraintColumn = new GenericTableConstraintColumn(gConstraint, genericTableColumn, pos);
gConstraint.addColumn(constraintColumn);
forParent.addUniqueKey(gConstraint);
}
}
}
}
}
} catch (Throwable e) {
throw new DBException("Can't get Derby constraint", e);
}
}
}
return dbStat;
}
@Override
public DBSEntityConstraintType getUniqueConstraintType(JDBCResultSet dbResult) throws DBException, SQLException {
String type = JDBCUtils.safeGetString(dbResult, "TYPE");
......@@ -195,4 +168,35 @@ public class DerbyMetaModel extends GenericMetaModel
return super.getUniqueConstraintType(dbResult);
}
@Override
public GenericUniqueKey createConstraintImpl(GenericTableBase table, String constraintName, DBSEntityConstraintType constraintType, JDBCResultSet dbResult, boolean persisted) {
return new GenericUniqueKey(table, constraintName, null, constraintType, persisted);
}
@Override
public GenericTableConstraintColumn[] createConstraintColumnsImpl(JDBCSession session, GenericTableBase parent, GenericUniqueKey object, GenericMetaObject pkObject, JDBCResultSet dbResult) throws DBException {
try {
List<GenericTableConstraintColumn> derbyConstraintColumns = new ArrayList<>();
Object descriptor = JDBCUtils.safeGetObject(dbResult, "DESCRIPTOR");
if (descriptor != null) {
Object baseColumnPositions = BeanUtils.invokeObjectMethod(descriptor, "baseColumnPositions");
int[] columnPositions = (int []) baseColumnPositions;
for (int pos : columnPositions) {
List<? extends GenericTableColumn> attributes = parent.getAttributes(dbResult.getSession().getProgressMonitor());
if (!CommonUtils.isEmpty(attributes)) {
for (GenericTableColumn genericTableColumn : attributes) {
if (genericTableColumn.getOrdinalPosition() == pos) {
GenericTableConstraintColumn constraintColumn = new GenericTableConstraintColumn(object, genericTableColumn, pos);
derbyConstraintColumns.add(constraintColumn);
}
}
}
}
return ArrayUtils.toArray(GenericTableConstraintColumn.class, derbyConstraintColumns);
}
} catch (Throwable e) {
log.debug("Can't get Derby constraint", e);
}
return super.createConstraintColumnsImpl(session, parent, object, pkObject, dbResult);
}
}
......@@ -95,10 +95,10 @@ tree.triggers.node.tip = Table triggers
tree.tview.node.name = View
tree.tviews.node.name = Views
tree.tviews.node.tip = Views
tree.uni_key.columns.node.name = Unique key columns
tree.uni_key.node.name = Unique Key
tree.uni_keys.node.name = Unique Keys
tree.uni_keys.node.tip = Table unique keys
tree.uni_key.columns.node.name = Key columns
tree.uni_key.node.name = Key
tree.uni_keys.node.name = Keys
tree.uni_keys.node.tip = Table keys
driver.apache.ignite.description = Apache Ignite JDBC driver
driver.redshift.description = AWS Redshift JDBC driver
......@@ -85,6 +85,6 @@ tree.trigger.node.name = Ausl\u00F6ser
tree.triggers.node.name = Ausl\u00F6ser
tree.tview.node.name = Ansicht
tree.tviews.node.name = Ansichten
tree.uni_key.columns.node.name = Eindeutige Schl\u00FCsselspalten
tree.uni_key.node.name = Eindeutiger Schl\u00FCssel
tree.uni_keys.node.name = Eindeutige Schl\u00FCssel
tree.uni_key.columns.node.name = Schl\u00FCsselspalten
tree.uni_key.node.name = Schl\u00FCssel
tree.uni_keys.node.name = Schl\u00FCssel
......@@ -4,9 +4,9 @@ tree.tables.node.name = Tablas
tree.table.node.name = Tabla
tree.columns.node.name = Columnas
tree.column.node.name = Columna
tree.uni_keys.node.name = Claves \u00FAnicas
tree.uni_key.node.name = Clave \u00FAnica
tree.uni_key.columns.node.name = Columnas de clave \u00FAnica
tree.uni_keys.node.name = Claves
tree.uni_key.node.name = Clave
tree.uni_key.columns.node.name = Columnas de clave
tree.foreign_keys.node.name = Columnas de clave externa
tree.foreign_key.node.name = Clave externa
tree.foreign_key_columns.node.name = Columnas de clave externa
......
......@@ -2,9 +2,9 @@ tree.tables.node.name = Tables
tree.table.node.name = Table
tree.columns.node.name = Colonnes
tree.column.node.name = Colonne
tree.uni_keys.node.name = Clefs uniques
tree.uni_key.node.name = Clef unique
tree.uni_key.columns.node.name = Colonnes de clefs uniques
tree.uni_keys.node.name = Clefs
tree.uni_key.node.name = Clef
tree.uni_key.columns.node.name = Colonnes de clefs
tree.foreign_keys.node.name = Clefs \u00E9trang\u00E8res
tree.foreign_key.node.name = Clef \u00E9trang\u00E8re
tree.foreign_key_columns.node.name = Colonnes de clefs \u00E9trang\u00E8res
......
......@@ -18,10 +18,10 @@ tree.procedures.node.name=\u041F\u0440\u043E\u0446\u0435\u0434\u0443\u0440\u044B
tree.procedure.node.name=\u041F\u0440\u043E\u0446\u0435\u0434\u0443\u0440\u0430
tree.packages.node.name=\u041F\u0430\u043A\u0435\u0442\u044B
tree.package.node.name=\u041F\u0430\u043A\u0435\u0442
tree.uni_keys.node.name=\u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043B\u044E\u0447\u0438
tree.uni_keys.node.tip=\u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043B\u044E\u0447\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B
tree.uni_key.node.name=\u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u043A\u043B\u044E\u0447
tree.uni_key.columns.node.name=\u041A\u043E\u043B\u043E\u043D\u043A\u0438 \u0443\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043A\u043B\u044E\u0447\u0430
tree.uni_keys.node.name=\u041A\u043B\u044E\u0447\u0438
tree.uni_keys.node.tip=\u041A\u043B\u044E\u0447\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B
tree.uni_key.node.name=\u041A\u043B\u044E\u0447
tree.uni_key.columns.node.name=\u041A\u043E\u043B\u043E\u043D\u043A\u0438 \u043A\u043B\u044E\u0447\u0430
tree.references.node.name=\u0421\u0441\u044B\u043B\u043A\u0438
tree.references.node.tip=\u0421\u0441\u044B\u043B\u043A\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B
tree.reference.node.name=\u0421\u0441\u044B\u043B\u043A\u0430
......
......@@ -91,4 +91,6 @@ public class GenericConstants {
public static final String TABLE_TYPE_VIEW = "VIEW";
public static final String TABLE_TYPE_TABLE = "TABLE";
public static final String BASE_CONSTRAINT_NAME = "new_key";
}
......@@ -17,6 +17,7 @@
package org.jkiss.dbeaver.ext.generic.edit;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.ext.generic.GenericConstants;
import org.jkiss.dbeaver.ext.generic.model.GenericTable;
import org.jkiss.dbeaver.ext.generic.model.GenericTableBase;
import org.jkiss.dbeaver.ext.generic.model.GenericUniqueKey;
......@@ -62,7 +63,7 @@ public class GenericPrimaryKeyManager extends SQLConstraintManager<GenericUnique
GenericTableBase tableBase = (GenericTableBase)container;
return tableBase.getDataSource().getMetaModel().createConstraintImpl(
tableBase,
null,
GenericConstants.BASE_CONSTRAINT_NAME,
DBSEntityConstraintType.PRIMARY_KEY,
null,
false);
......
......@@ -98,26 +98,7 @@ class ConstraintKeysCache extends JDBCCompositeCache<GenericStructContainer, Gen
GenericTableBase parent, GenericUniqueKey object, JDBCResultSet dbResult)
throws SQLException, DBException
{
String columnName = GenericUtils.safeGetStringTrimmed(pkObject, dbResult, JDBCConstants.COLUMN_NAME);
if (CommonUtils.isEmpty(columnName)) {
log.debug("Null primary key column for '" + object.getName() + "'");
return null;
}
if ((columnName.startsWith("[") && columnName.endsWith("]")) ||
(columnName.startsWith(SQLConstants.DEFAULT_IDENTIFIER_QUOTE) && columnName.endsWith(SQLConstants.DEFAULT_IDENTIFIER_QUOTE))) {
// [JDBC: SQLite] Escaped column name. Let's un-escape it
columnName = columnName.substring(1, columnName.length() - 1);
}
int keySeq = GenericUtils.safeGetInt(pkObject, dbResult, JDBCConstants.KEY_SEQ);
GenericTableColumn tableColumn = parent.getAttribute(session.getProgressMonitor(), columnName);
if (tableColumn == null) {
log.warn("Column '" + columnName + "' not found in table '" + parent.getFullyQualifiedName(DBPEvaluationContext.DDL) + "' for PK '" + object.getFullyQualifiedName(DBPEvaluationContext.DDL) + "'");
return null;
}
return new GenericTableConstraintColumn[] {
new GenericTableConstraintColumn(object, tableColumn, keySeq) };
return parent.getDataSource().getMetaModel().createConstraintColumnsImpl(session, parent, object, pkObject, dbResult);
}
@Override
......
......@@ -24,6 +24,7 @@ import org.jkiss.dbeaver.ext.generic.GenericConstants;
import org.jkiss.dbeaver.ext.generic.model.*;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPErrorAssistant;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
......@@ -34,6 +35,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCBasicDataTypeCache;
import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCDataType;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLConstants;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSEntityConstraintType;
import org.jkiss.dbeaver.model.struct.DBSObjectFilter;
......@@ -660,6 +662,30 @@ public class GenericMetaModel {
return new GenericUniqueKey(table, constraintName, null, constraintType, persisted);
}
public GenericTableConstraintColumn[] createConstraintColumnsImpl(JDBCSession session,
GenericTableBase parent, GenericUniqueKey object, GenericMetaObject pkObject, JDBCResultSet dbResult) throws DBException {
String columnName = GenericUtils.safeGetStringTrimmed(pkObject, dbResult, JDBCConstants.COLUMN_NAME);
if (CommonUtils.isEmpty(columnName)) {
log.debug("Null primary key column for '" + object.getName() + "'");
return null;
}
if ((columnName.startsWith("[") && columnName.endsWith("]")) ||
(columnName.startsWith(SQLConstants.DEFAULT_IDENTIFIER_QUOTE) && columnName.endsWith(SQLConstants.DEFAULT_IDENTIFIER_QUOTE))) {
// [JDBC: SQLite] Escaped column name. Let's un-escape it
columnName = columnName.substring(1, columnName.length() - 1);
}
int keySeq = GenericUtils.safeGetInt(pkObject, dbResult, JDBCConstants.KEY_SEQ);
GenericTableColumn tableColumn = parent.getAttribute(session.getProgressMonitor(), columnName);
if (tableColumn == null) {
log.warn("Column '" + columnName + "' not found in table '" + parent.getFullyQualifiedName(DBPEvaluationContext.DDL) + "' for PK '" + object.getFullyQualifiedName(DBPEvaluationContext.DDL) + "'");
return null;
}
return new GenericTableConstraintColumn[] {
new GenericTableConstraintColumn(object, tableColumn, keySeq) };
}
//////////////////////////////////////////////////////
// Sequences
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册