提交 bfaad6ed 编写于 作者: S Serge Rider

Merge remote-tracking branch 'origin/devel' into devel

......@@ -277,13 +277,13 @@ class ColumnsMappingDialog extends BaseDialog {
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
Set<String> types = new TreeSet<>();
DBPDataSource dataSource = settings.getTargetDataSource(attrMapping);
if (dataSource instanceof DBPDataTypeProvider) {
for (DBSDataType type : ((DBPDataTypeProvider) dataSource).getLocalDataTypes()) {
DBPDataTypeProvider dataTypeProvider = DBUtils.getParentOfType(DBPDataTypeProvider.class, settings.getContainer());
if (dataTypeProvider != null) {
for (DBSDataType type : dataTypeProvider.getLocalDataTypes()) {
types.add(type.getName());
}
}
types.add(attrMapping.getTargetType(dataSource, true));
types.add(attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true));
return new CustomComboBoxCellEditor(mappingViewer, mappingViewer.getTable(), types.toArray(new String[0]), SWT.BORDER);
}
......
......@@ -130,7 +130,7 @@ public class PostgreProcedureConfigurator implements DBEObjectConfigurator<Postg
languageCombo.setText("sql");
}
{
List<PostgreDataType> dataTypes = new ArrayList<>(parent.getDatabase().getDataSource().getLocalDataTypes());
List<PostgreDataType> dataTypes = new ArrayList<>(parent.getDatabase().getLocalDataTypes());
returnTypeCombo = UIUtils.createLabelCombo(group, "Return type", SWT.DROP_DOWN);
for (PostgreDataType dt : dataTypes) {
returnTypeCombo.add(dt.getName());
......@@ -139,7 +139,7 @@ public class PostgreProcedureConfigurator implements DBEObjectConfigurator<Postg
returnTypeCombo.addModifyListener(e -> {
String dtName = returnTypeCombo.getText();
if (!CommonUtils.isEmpty(dtName)) {
returnType = parent.getDatabase().getDataSource().getLocalDataType(dtName);
returnType = parent.getDatabase().getLocalDataType(dtName);
} else {
returnType = null;
}
......
......@@ -395,7 +395,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
public Object[] getPossibleValues(PostgreAttribute column)
{
Set<PostgreDataType> types = new TreeSet<>(Comparator.comparing(JDBCDataType::getTypeName));
types.addAll(column.getDataSource().getLocalDataTypes());
types.addAll(column.getDatabase().getLocalDataTypes());
return types.toArray(new PostgreDataType[0]);
}
}
......
......@@ -49,7 +49,7 @@ import java.util.*;
/**
* PostgreTypeType
*/
public class PostgreDataType extends JDBCDataType<PostgreSchema> implements PostgreClass, PostgreScriptObject, DBPQualifiedObject, DBPImageProvider
public class PostgreDataType extends JDBCDataType<PostgreDatabase> implements PostgreClass, PostgreScriptObject, DBPQualifiedObject, DBPImageProvider
{
private static final Log log = Log.getLog(PostgreDataType.class);
......@@ -75,6 +75,7 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
private final boolean alias;
private long typeId;
private PostgreSchema typeSchema;
private PostgreTypeType typeType;
private PostgreTypeCategory typeCategory;
private DBPDataKind dataKind;
......@@ -110,10 +111,11 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
private final AttributeCache attributeCache;
private Object[] enumValues;
public PostgreDataType(@NotNull JDBCSession session, @NotNull PostgreSchema owner, long typeId, int valueType, String name, int length, JDBCResultSet dbResult) throws DBException {
public PostgreDataType(@NotNull JDBCSession session, @NotNull PostgreDatabase owner, PostgreSchema schema, long typeId, int valueType, String name, int length, JDBCResultSet dbResult) throws DBException {
super(owner, valueType, name, null, false, true, length, -1, -1);
this.typeSchema = schema;
this.alias = false;
if (owner.isCatalogSchema()) {
if (schema.isCatalogSchema()) {
this.canonicalName = PostgreConstants.DATA_TYPE_CANONICAL_NAMES.get(name);
}
this.typeId = typeId;
......@@ -208,6 +210,8 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
setName(aliasName);
this.alias = true;
this.typeSchema = realType.getParentObject().getCatalogSchema();
this.typeId = realType.typeId;
this.typeType = realType.typeType;
this.typeCategory = realType.typeCategory;
......@@ -241,8 +245,9 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
}
@ForTest
PostgreDataType(PostgreSchema schema, int valueType, String name) {
super(schema, valueType, name, null, false, false, -1, -1, -1);
PostgreDataType(PostgreDatabase database, int valueType, String name) {
super(database, valueType, name, null, false, false, -1, -1, -1);
this.typeSchema = database.getCatalogSchema();
alias = false;
ownerId = 0;
attributeCache = null;
......@@ -325,7 +330,7 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
@NotNull
@Override
public PostgreDatabase getDatabase() {
return getParentObject().getDatabase();
return getParentObject();
}
@Override
......@@ -580,14 +585,17 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
return enumValues;
}
public PostgreSchema getTypeSchema() {
return typeSchema;
}
@NotNull
@Override
public String getFullyQualifiedName(DBPEvaluationContext context) {
final PostgreSchema owner = getParentObject();
if (owner == null || owner.getName().equals(PostgreConstants.PUBLIC_SCHEMA_NAME) || owner.getName().equals(PostgreConstants.CATALOG_SCHEMA_NAME)) {
if (typeSchema == null || typeSchema.getName().equals(PostgreConstants.PUBLIC_SCHEMA_NAME) || typeSchema.getName().equals(PostgreConstants.CATALOG_SCHEMA_NAME)) {
return getName();
} else {
return DBUtils.getQuotedIdentifier(owner) + "." + DBUtils.getQuotedIdentifier(this);
return DBUtils.getQuotedIdentifier(typeSchema) + "." + DBUtils.getQuotedIdentifier(this);
}
}
......@@ -650,15 +658,17 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
break;
}
case r: {
sql.append("CREATE TYPE ").append(getFullyQualifiedName(DBPEvaluationContext.DDL)).append(" AS RANGE (\n"); //$NON-NLS-1$ //$NON-NLS-2$
PostgreCollation collation = getCollationId(monitor);
appendCreateTypeParameter(sql, "COLLATION ", collation.getName());
appendCreateTypeParameter(sql, "CANONICAL", canonicalName);
// TODO: read data from pg_range
if (collation != null) {
sql.append("CREATE TYPE ").append(getFullyQualifiedName(DBPEvaluationContext.DDL)).append(" AS RANGE (\n"); //$NON-NLS-1$ //$NON-NLS-2$
appendCreateTypeParameter(sql, "COLLATION ", collation.getName());
appendCreateTypeParameter(sql, "CANONICAL", canonicalName);
// TODO: read data from pg_range
// if (!CommonUtils.isEmpty(su)) {
// sql.append("\n\tCOLLATION ").append(canonicalName);
// }
sql.append(");\n"); //$NON-NLS-1$
sql.append(");\n"); //$NON-NLS-1$
}
break;
}
case b: {
......@@ -784,7 +794,7 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
this.description = description;
}
public static PostgreDataType readDataType(@NotNull JDBCSession session, @NotNull PostgreSchema schema, @NotNull JDBCResultSet dbResult, boolean skipTables) throws SQLException, DBException
public static PostgreDataType readDataType(@NotNull JDBCSession session, @NotNull PostgreDatabase database, @NotNull JDBCResultSet dbResult, boolean skipTables) throws SQLException, DBException
{
//long schemaId = JDBCUtils.safeGetLong(dbResult, "typnamespace");
long typeId = JDBCUtils.safeGetLong(dbResult, "oid"); //$NON-NLS-1$
......@@ -994,9 +1004,13 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
return null;
}
int schemaId = JDBCUtils.safeGetInt(dbResult, "typnamespace");
PostgreSchema dataTypeSchema = database.getSchema(session.getProgressMonitor(), schemaId);
return new PostgreDataType(
session,
schema,
database,
dataTypeSchema,
typeId,
valueType,
name,
......
......@@ -40,7 +40,7 @@ import java.util.*;
/**
* PostgreDataTypeCache
*/
public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, PostgreDataType>
public class PostgreDataTypeCache extends JDBCObjectCache<PostgreDatabase, PostgreDataType>
{
private static final Log log = Log.getLog(PostgreDataTypeCache.class);
......@@ -56,13 +56,13 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
}
@Override
protected synchronized void loadObjects(DBRProgressMonitor monitor, PostgreSchema schema) throws DBException {
super.loadObjects(monitor, schema);
mapAliases(schema);
protected synchronized void loadObjects(DBRProgressMonitor monitor, PostgreDatabase database) throws DBException {
super.loadObjects(monitor, database);
mapAliases(database);
}
void loadDefaultTypes(PostgreSchema schema) {
void loadDefaultTypes(PostgreDatabase database) {
List<PostgreDataType> types = new ArrayList<>();
for (Field oidField : PostgreOid.class.getDeclaredFields()) {
......@@ -74,12 +74,12 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
String fieldName = oidField.getName().toLowerCase(Locale.ENGLISH);
if (fieldName.endsWith("_array")) {
fieldName = fieldName.substring(0, fieldName.length() - 6) + "_";
//PostgreDataType type = new PostgreDataType(schema, CommonUtils.toInt(typeId), fieldName);
//PostgreDataType type = new PostgreDataType(database, CommonUtils.toInt(typeId), fieldName);
//types.add(type);
// Ignore array types
continue;
} else {
PostgreDataType type = new PostgreDataType(schema, CommonUtils.toInt(typeId), fieldName);
PostgreDataType type = new PostgreDataType(database, CommonUtils.toInt(typeId), fieldName);
types.add(type);
}
} catch (Exception e) {
......@@ -88,17 +88,15 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
}
setCache(types);
// Cache aliases
mapAliases(schema);
mapAliases(database);
}
private void mapAliases(PostgreSchema schema) {
private void mapAliases(PostgreDatabase database) {
// Cache aliases
if (schema.isCatalogSchema()) {
PostgreServerExtension serverType = schema.getDataSource().getServerType();
mapDataTypeAliases(serverType.getDataTypeAliases(), false);
if (serverType.supportSerialTypes()) {
mapDataTypeAliases(PostgreConstants.SERIAL_TYPES, true);
}
PostgreServerExtension serverType = database.getDataSource().getServerType();
mapDataTypeAliases(serverType.getDataTypeAliases(), false);
if (serverType.supportSerialTypes()) {
mapDataTypeAliases(PostgreConstants.SERIAL_TYPES, true);
}
}
......@@ -175,28 +173,29 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
@NotNull
@Override
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull PostgreSchema owner) throws SQLException {
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull PostgreDatabase owner) throws SQLException {
// Initially cache only base types (everything but composite and arrays)
String sql =
"SELECT t.oid,t.*,c.relkind," + getBaseTypeNameClause(owner.getDataSource()) +", d.description" +
"\nFROM pg_catalog.pg_type t" +
"\nLEFT OUTER JOIN pg_catalog.pg_class c ON c.oid=t.typrelid" +
"\nLEFT OUTER JOIN pg_catalog.pg_description d ON t.oid=d.objoid" +
"\nWHERE typnamespace=? " +
"\nORDER by t.oid";
final JDBCPreparedStatement dbStat = session.prepareStatement(sql);
dbStat.setLong(1, owner.getObjectId());
return dbStat;
"\nWHERE t.typname IS NOT null" +
"\nAND t.typcategory <> 'A'" + // Do not read array types
"\nAND c.relkind is null or c.relkind = 'c'"; // 'c' == custom types
//"\nWHERE typnamespace=? " +
//"\nORDER by t.oid";
return session.prepareStatement(sql);
}
@Override
protected PostgreDataType fetchObject(@NotNull JDBCSession session, @NotNull PostgreSchema owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException
protected PostgreDataType fetchObject(@NotNull JDBCSession session, @NotNull PostgreDatabase owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException
{
return PostgreDataType.readDataType(session, owner, dbResult, true);
}
@Override
protected void invalidateObjects(DBRProgressMonitor monitor, PostgreSchema postgreSchema, Iterator<PostgreDataType> objectIter) {
protected void invalidateObjects(DBRProgressMonitor monitor, PostgreDatabase database, Iterator<PostgreDataType> objectIter) {
// Resolve value type IDs (#3731)
while (objectIter.hasNext()) {
PostgreDataType dt = objectIter.next();
......@@ -224,7 +223,7 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
if (schema == null) {
throw new DBException("Schema " + schemaOid + " not found for data type " + oid);
}
PostgreDataType dataType = PostgreDataType.readDataType(session, schema, dbResult, false);
PostgreDataType dataType = PostgreDataType.readDataType(session, database, dbResult, false);
if (dataType != null) {
return dataType;
}
......@@ -251,10 +250,12 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
if (schema == null) {
throw new DBException("Schema " + schemaOid + " not found for data type " + name);
}
return PostgreDataType.readDataType(session, schema, dbResult, false);
} else {
throw new DBException("Data type " + name + " not found in database " + database.getName());
PostgreDataType dataType = PostgreDataType.readDataType(session, database, dbResult, false);
if (dataType != null) {
return dataType;
}
}
throw new DBException("Data type " + name + " not found in database " + database.getName());
}
}
//dbStat;
......
......@@ -97,7 +97,7 @@ public class PostgreDatabase extends JDBCRemoteInstance
public final AvailableExtensionCache availableExtensionCache = new AvailableExtensionCache();
public final CollationCache collationCache = new CollationCache();
public final TablespaceCache tablespaceCache = new TablespaceCache();
public final LongKeyMap<PostgreDataType> dataTypeCache = new LongKeyMap<>();
public final PostgreDataTypeCache dataTypeCache = new PostgreDataTypeCache();
public JDBCObjectLookupCache<PostgreDatabase, PostgreSchema> schemaCache;
......@@ -159,7 +159,7 @@ public class PostgreDatabase extends JDBCRemoteInstance
this.name = databaseName;
this.initCaches();
PostgreSchema sysSchema = new PostgreSchema(this, PostgreConstants.CATALOG_SCHEMA_NAME);
sysSchema.getDataTypeCache().loadDefaultTypes(sysSchema);
dataTypeCache.loadDefaultTypes(this);
schemaCache.cacheObject(sysSchema);
}
......@@ -488,6 +488,8 @@ public class PostgreDatabase extends JDBCRemoteInstance
///////////////////////////////////////////////
// Data types
@NotNull
@Override
public DBPDataKind resolveDataKind(@NotNull String typeName, int typeID) {
......@@ -501,11 +503,7 @@ public class PostgreDatabase extends JDBCRemoteInstance
@Override
public Collection<PostgreDataType> getLocalDataTypes() {
final PostgreSchema schema = getCatalogSchema();
if (schema != null) {
return schema.getDataTypeCache().getCachedObjects();
}
return null;
return dataTypeCache.getCachedObjects();
}
@Override
......@@ -583,14 +581,10 @@ public class PostgreDatabase extends JDBCRemoteInstance
}
void cacheDataTypes(DBRProgressMonitor monitor, boolean forceRefresh) throws DBException {
if (dataTypeCache.isEmpty() || forceRefresh) {
dataTypeCache.clear();
if (!dataTypeCache.isFullyCached() || forceRefresh) {
dataTypeCache.clearCache();
// Cache data types
for (final PostgreSchema pgSchema : getSchemas(monitor)) {
if (PostgreConstants.CATALOG_SCHEMA_NAME.equals(pgSchema.getName())) {
pgSchema.getDataTypes(monitor);
}
}
dataTypeCache.loadObjects(monitor, this);
}
}
......@@ -718,21 +712,14 @@ public class PostgreDatabase extends JDBCRemoteInstance
if (typeId <= 0) {
return null;
}
PostgreDataType dataType = dataTypeCache.get(typeId);
PostgreDataType dataType = dataTypeCache.getDataType(typeId);
if (dataType != null) {
return dataType;
}
for (PostgreSchema schema : schemaCache.getCachedObjects()) {
dataType = schema.getDataTypeCache().getDataType(typeId);
if (dataType != null) {
dataTypeCache.put(typeId, dataType);
return dataType;
}
}
// Type not found. Let's resolve it
try {
dataType = PostgreDataTypeCache.resolveDataType(monitor, this, typeId);
dataType.getParentObject().getDataTypeCache().cacheObject(dataType);
dataTypeCache.cacheObject(dataType);
return dataType;
} catch (Exception e) {
log.debug("Can't resolve data type " + typeId, e);
......@@ -746,33 +733,7 @@ public class PostgreDatabase extends JDBCRemoteInstance
typeName = "_" + typeName.substring(0, typeName.length() - 2);
}
{
// First check system catalog
final PostgreSchema schema = getCatalogSchema();
if (schema != null) {
final PostgreDataType dataType = schema.getDataTypeCache().getCachedObject(typeName);
if (dataType != null) {
return dataType;
}
}
}
// Check schemas in search path
List<String> searchPath = getMetaContext().getSearchPath();
for (String schemaName : searchPath) {
final PostgreSchema schema = schemaCache.getCachedObject(schemaName);
if (schema != null) {
final PostgreDataType dataType = schema.getDataTypeCache().getCachedObject(typeName);
if (dataType != null) {
return dataType;
}
}
}
// Check the rest
for (PostgreSchema schema : schemaCache.getCachedObjects()) {
if (searchPath.contains(schema.getName())) {
continue;
}
final PostgreDataType dataType = schema.getDataTypeCache().getCachedObject(typeName);
PostgreDataType dataType = dataTypeCache.getCachedObject(typeName);
if (dataType != null) {
return dataType;
}
......@@ -785,7 +746,7 @@ public class PostgreDatabase extends JDBCRemoteInstance
// Type not found. Let's resolve it
try {
PostgreDataType dataType = PostgreDataTypeCache.resolveDataType(monitor, this, typeName);
dataType.getParentObject().getDataTypeCache().cacheObject(dataType);
dataTypeCache.cacheObject(dataType);
return dataType;
} catch (Exception e) {
log.debug("Can't resolve data type '" + typeName + "' in database '" + getName() + "'");
......
......@@ -611,7 +611,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
paramsSignature.append(param.getName()).append(' ');
}
final PostgreDataType dataType = param.getParameterType();
final PostgreSchema typeContainer = dataType.getParentObject();
final PostgreSchema typeContainer = dataType.getTypeSchema();
if (typeContainer == null ||
typeContainer.isPublicSchema() ||
typeContainer.isCatalogSchema())
......
......@@ -88,7 +88,7 @@ public class PostgreSchema implements
private final ConstraintCache constraintCache;
private final ProceduresCache proceduresCache;
private final IndexCache indexCache;
private final PostgreDataTypeCache dataTypeCache;
private List<PostgreDataType> dataTypeList;
protected volatile boolean hasStatistics;
PostgreSchema(PostgreDatabase database, String name) {
......@@ -101,7 +101,7 @@ public class PostgreSchema implements
constraintCache = createConstraintCache();
indexCache = new IndexCache();
proceduresCache = createProceduresCache();
dataTypeCache = new PostgreDataTypeCache();
dataTypeList = new ArrayList<>();
}
@NotNull
......@@ -276,8 +276,8 @@ public class PostgreSchema implements
return indexCache;
}
public PostgreDataTypeCache getDataTypeCache() {
return dataTypeCache;
public List<PostgreDataType> getDataTypeList() {
return dataTypeList;
}
@Association
......@@ -455,14 +455,16 @@ public class PostgreSchema implements
//@Property
@Association
public Collection<PostgreDataType> getDataTypes(DBRProgressMonitor monitor) throws DBException {
List<PostgreDataType> types = new ArrayList<>();
for (PostgreDataType dt : dataTypeCache.getAllObjects(monitor, this)) {
if (dt.getParentObject() == this) {
types.add(dt);
if (CommonUtils.isEmpty(dataTypeList)) {
Collection<PostgreDataType> allDatabaseTypes = getDatabase().getLocalDataTypes();
for (PostgreDataType dt : allDatabaseTypes) {
if (dt.getTypeSchema() == this) {
dataTypeList.add(dt);
}
}
DBUtils.orderObjects(dataTypeList);
}
DBUtils.orderObjects(types);
return types;
return dataTypeList;
}
@Override
......
......@@ -119,9 +119,9 @@ public abstract class JDBCTableColumn<TABLE_TYPE extends DBSEntity> extends JDBC
@Override
public void setTypeName(String typeName) {
super.setTypeName(typeName);
final DBPDataSource dataSource = getDataSource();
if (dataSource instanceof DBPDataTypeProvider) {
DBSDataType dataType = ((DBPDataTypeProvider) dataSource).getLocalDataType(typeName);
final DBPDataTypeProvider dataTypeProvider = DBUtils.getParentOfType(DBPDataTypeProvider.class, this);
if (dataTypeProvider != null) {
DBSDataType dataType = dataTypeProvider.getLocalDataType(typeName);
if (dataType != null) {
this.valueType = dataType.getTypeID();
if (this instanceof DBSTypedObjectExt4) {
......
......@@ -218,8 +218,8 @@ public final class DBStructUtils {
String typeName = typedObject.getTypeName();
String typeNameLower = typeName.toLowerCase(Locale.ENGLISH);
DBPDataKind dataKind = typedObject.getDataKind();
if (objectContainer instanceof DBPDataTypeProvider) {
DBPDataTypeProvider dataTypeProvider = (DBPDataTypeProvider) objectContainer;
DBPDataTypeProvider dataTypeProvider = DBUtils.getParentOfType(DBPDataTypeProvider.class, objectContainer);
if (dataTypeProvider != null) {
DBSDataType dataType = dataTypeProvider.getLocalDataType(typeName);
if (dataType == null && typeNameLower.equals("double")) {
dataType = dataTypeProvider.getLocalDataType("DOUBLE PRECISION");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册