提交 b4d9dce8 编写于 作者: S serge-rider

#2102 PostgreSQL: lazy data type loading


Former-commit-id: aa43c9da
上级 1f82e3fa
......@@ -37,6 +37,7 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.impl.AbstractObjectCache;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistActionComment;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
......@@ -127,6 +128,10 @@ public class PostgreUtils {
return null;
}
public static boolean supportsTypeCategory(JDBCDataSource dataSource) {
return dataSource.isServerVersionAtLeast(8, 4);
}
@Nullable
public static <OWNER extends DBSObject, OBJECT extends PostgreObject> OBJECT getObjectById(
@NotNull DBRProgressMonitor monitor,
......@@ -575,4 +580,5 @@ public class PostgreUtils {
}
}
}
}
......@@ -31,6 +31,7 @@ import org.jkiss.dbeaver.model.impl.edit.DBECommandAbstract;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableColumnManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.TextUtils;
......@@ -66,7 +67,7 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
return;
}
}
final PostgreDataType rawType = dataType.getElementType();
final PostgreDataType rawType = dataType.getElementType(new VoidProgressMonitor());
if (rawType != null) {
sql.append(rawType.getTypeName());
} else {
......@@ -164,7 +165,7 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
protected PostgreTableColumn runTask() {
final PostgreTableColumn column = new PostgreTableColumn(parent);
column.setName(getNewColumnName(monitor, context, parent));
final PostgreDataType dataType = parent.getDatabase().getDataType(PostgreOid.VARCHAR);
final PostgreDataType dataType = parent.getDatabase().getDataType(monitor, PostgreOid.VARCHAR);
column.setDataType(dataType); //$NON-NLS-1$
column.setOrdinalPosition(-1);
......
......@@ -26,10 +26,13 @@ import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.impl.DBPositiveNumberTransformer;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCDataType;
import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTableColumn;
import org.jkiss.dbeaver.model.meta.IPropertyValueListProvider;
import org.jkiss.dbeaver.model.meta.IPropertyValueTransformer;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.model.struct.DBSTypedObjectEx;
import org.jkiss.utils.CommonUtils;
......@@ -66,12 +69,12 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
}
public PostgreAttribute(
OWNER table,
DBRProgressMonitor monitor, OWNER table,
JDBCResultSet dbResult)
throws DBException
{
super(table, true);
loadInfo(dbResult);
loadInfo(monitor, dbResult);
}
@Override
......@@ -85,7 +88,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
return objectId;
}
private void loadInfo(JDBCResultSet dbResult)
private void loadInfo(DBRProgressMonitor monitor, JDBCResultSet dbResult)
throws DBException
{
setName(JDBCUtils.safeGetString(dbResult, "attname"));
......@@ -93,16 +96,16 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
setRequired(JDBCUtils.safeGetBoolean(dbResult, "attnotnull"));
objectId = JDBCUtils.safeGetLong(dbResult, "attr_id");
final long typeId = JDBCUtils.safeGetLong(dbResult, "atttypid");
dataType = getTable().getDatabase().getDataType(typeId);
dataType = getTable().getDatabase().getDataType(monitor, typeId);
if (dataType == null) {
log.error("Attribute data type '" + typeId + "' not found. Use " + PostgreConstants.TYPE_VARCHAR);
dataType = getTable().getDatabase().getDataType(PostgreConstants.TYPE_VARCHAR);
dataType = getTable().getDatabase().getDataType(monitor, PostgreConstants.TYPE_VARCHAR);
} else {
// TODO: [#2824] Perhaps we should just use type names declared in pg_catalog
// Replacing them with "convenient" types names migh cause some issues
if (false && dataType.getCanonicalName() != null && getDataSource().isServerVersionAtLeast(9, 6)) {
// se canonical type names. But only for PG >= 9.6 (because I can't test with earlier versions)
PostgreDataType canonicalType = getTable().getDatabase().getDataType(dataType.getCanonicalName());
PostgreDataType canonicalType = getTable().getDatabase().getDataType(monitor, dataType.getCanonicalName());
if (canonicalType != null) {
this.dataType = canonicalType;
}
......@@ -204,7 +207,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
}
@Nullable
@Property(viewable = true, editable = true, updatable = false, order = 24)
@Property(viewable = true, editable = true, order = 24)
public PostgreAttributeIdentity getIdentity() {
return identity;
}
......@@ -213,7 +216,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
this.identity = identity;
}
@Property(viewable = false, order = 25)
@Property(order = 25)
public boolean isLocal() {
return isLocal;
}
......@@ -283,15 +286,8 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
@Override
public Object[] getPossibleValues(PostgreAttribute column)
{
Set<PostgreDataType> types = new TreeSet<>(new Comparator<PostgreDataType>() {
@Override
public int compare(PostgreDataType o1, PostgreDataType o2) {
return o1.getTypeName().compareTo(o2.getTypeName());
}
});
for (PostgreDataType type : column.getDataSource().getLocalDataTypes()) {
types.add(type);
}
Set<PostgreDataType> types = new TreeSet<>(Comparator.comparing(JDBCDataType::getTypeName));
types.addAll(column.getDataSource().getLocalDataTypes());
return types.toArray(new PostgreDataType[types.size()]);
}
}
......@@ -300,7 +296,7 @@ public abstract class PostgreAttribute<OWNER extends DBSEntity & PostgreObject>
@Override
public PostgreDataType transform(PostgreAttribute object, Object value) {
if (value instanceof String) {
PostgreDataType dataType = object.getDataSource().getDefaultInstance().getDataType((String) value);
PostgreDataType dataType = object.getDataSource().getDefaultInstance().getDataType(new VoidProgressMonitor(), (String)value);
if (dataType == null) {
throw new IllegalArgumentException("Bad data type name specified: " + value);
}
......
......@@ -42,6 +42,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectLookupCache;
import org.jkiss.dbeaver.model.impl.sql.QueryTransformerLimit;
import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.runtime.net.DefaultCallbackHandler;
import org.jkiss.dbeaver.tools.transfer.IDataTransferProducer;
......@@ -438,7 +439,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSObjectSelect
@Override
public PostgreDataType getLocalDataType(String typeName)
{
return getDefaultInstance().getDataType(typeName);
return getDefaultInstance().getDataType(new VoidProgressMonitor(), typeName);
}
@Override
......
......@@ -28,7 +28,6 @@ import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement;
import org.jkiss.dbeaver.model.impl.DBPositiveNumberTransformer;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSource;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectCache;
......@@ -277,7 +276,7 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
@Nullable
@Override
public DBSDataType getComponentType(@NotNull DBRProgressMonitor monitor) throws DBException {
return getElementType();
return getElementType(monitor);
}
@Nullable
......@@ -302,13 +301,13 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
}
@Property(category = CAT_MAIN, viewable = true, order = 12)
public PostgreDataType getBaseType() {
return resolveType(baseTypeId);
public PostgreDataType getBaseType(DBRProgressMonitor monitor) {
return getDatabase().getDataType(monitor, baseTypeId);
}
@Property(category = CAT_MAIN, viewable = true, order = 13)
public PostgreDataType getElementType() {
return elementTypeId == 0 ? null : resolveType(elementTypeId);
public PostgreDataType getElementType(DBRProgressMonitor monitor) {
return elementTypeId == 0 ? null : getDatabase().getDataType(monitor, elementTypeId);
}
@Property(category = CAT_MAIN, order = 15)
......@@ -397,8 +396,8 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
}
@Property(category = CAT_ARRAY)
public PostgreDataType getArrayItemType() {
return arrayItemTypeId == 0 ? null : resolveType(arrayItemTypeId);
public PostgreDataType getArrayItemType(DBRProgressMonitor monitor) {
return arrayItemTypeId == 0 ? null : getDatabase().getDataType(monitor, arrayItemTypeId);
}
// Plain type
......@@ -415,10 +414,6 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
return typeType == PostgreTypeType.c && classId >= 0;
}
private PostgreDataType resolveType(long typeId) {
return getDatabase().getDataType(typeId);
}
@NotNull
@Override
public DBSEntityType getEntityType() {
......@@ -531,7 +526,7 @@ public class PostgreDataType extends JDBCDataType<PostgreSchema> implements Post
@Override
protected PostgreDataTypeAttribute fetchObject(@NotNull JDBCSession session, @NotNull PostgreDataType postgreDataType, @NotNull JDBCResultSet resultSet) throws SQLException, DBException {
return new PostgreDataTypeAttribute(postgreDataType, resultSet);
return new PostgreDataTypeAttribute(session.getProgressMonitor(), postgreDataType, resultSet);
}
}
......
......@@ -18,14 +18,15 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
/**
* PostgreDataTypeAttribute
*/
public class PostgreDataTypeAttribute extends PostgreAttribute<PostgreDataType>
{
public PostgreDataTypeAttribute(PostgreDataType dataType, JDBCResultSet dbResult) throws DBException {
super(dataType, dbResult);
public PostgreDataTypeAttribute(DBRProgressMonitor monitor, PostgreDataType dataType, JDBCResultSet dbResult) throws DBException {
super(monitor, dataType, dbResult);
}
@Override
......
......@@ -19,11 +19,14 @@ package org.jkiss.dbeaver.ext.postgresql.model;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.postgresql.PostgreConstants;
import org.jkiss.dbeaver.ext.postgresql.PostgreUtils;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCObjectCache;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.utils.LongKeyMap;
......@@ -43,6 +46,11 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
setListOrderComparator(DBUtils.nameComparator());
}
@Override
protected String getCacheName() {
return "Data type cache";
}
@Override
protected synchronized void loadObjects(DBRProgressMonitor monitor, PostgreSchema postgreSchema) throws DBException {
super.loadObjects(monitor, postgreSchema);
......@@ -103,10 +111,16 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
@Override
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull PostgreSchema owner) throws SQLException
{
final JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT t.oid,t.* \n" +
"FROM pg_catalog.pg_type t WHERE typnamespace=?\n" +
"ORDER by t.oid");
// Initially cache only base types (everything but composite and arrays)
StringBuilder sql = new StringBuilder();
sql.append("SELECT t.oid,t.* \n").append("FROM pg_catalog.pg_type t WHERE typnamespace=? ");
if (PostgreUtils.supportsTypeCategory(session.getDataSource())) {
sql.append("AND typcategory not in ('A','C')");
} else {
sql.append("AND typtype <> 'c'");
}
sql.append("\nORDER by t.oid");
final JDBCPreparedStatement dbStat = session.prepareStatement(sql.toString());
dbStat.setLong(1, owner.getObjectId());
return dbStat;
}
......@@ -121,4 +135,50 @@ public class PostgreDataTypeCache extends JDBCObjectCache<PostgreSchema, Postgre
return dataTypeMap.get(oid);
}
@NotNull
static PostgreDataType resolveDataType(@NotNull DBRProgressMonitor monitor, @NotNull PostgreDatabase database, long oid) throws SQLException, DBException {
// Initially cache only base types (everything but composite and arrays)
try (JDBCSession session = database.getDefaultContext(true).openSession(monitor, DBCExecutionPurpose.META, "Resolve data type by OID")) {
try (final JDBCPreparedStatement dbStat = session.prepareStatement("SELECT t.oid,t.* FROM pg_catalog.pg_type t WHERE oid=? ")) {
dbStat.setLong(1, oid);
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
if (dbResult.next()) {
long schemaOid = JDBCUtils.safeGetLong(dbResult, "typnamespace");
PostgreSchema schema = database.getSchema(monitor, schemaOid);
if (schema == null) {
throw new DBException("Schema " + schemaOid + " not found for data type " + oid);
}
return PostgreDataType.readDataType(session, schema, dbResult);
} else {
throw new DBException("Data type " + oid + " not found in database " + database.getName());
}
}
}
//dbStat;
}
}
@NotNull
static PostgreDataType resolveDataType(@NotNull DBRProgressMonitor monitor, @NotNull PostgreDatabase database, String name) throws SQLException, DBException {
// Initially cache only base types (everything but composite and arrays)
try (JDBCSession session = database.getDefaultContext(true).openSession(monitor, DBCExecutionPurpose.META, "Resolve data type by name")) {
try (final JDBCPreparedStatement dbStat = session.prepareStatement("SELECT t.oid,t.* FROM pg_catalog.pg_type t WHERE typname=? ")) {
dbStat.setString(1, name);
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
if (dbResult.next()) {
long schemaOid = JDBCUtils.safeGetLong(dbResult, "typnamespace");
PostgreSchema schema = database.getSchema(monitor, schemaOid);
if (schema == null) {
throw new DBException("Schema " + schemaOid + " not found for data type " + name);
}
return PostgreDataType.readDataType(session, schema, dbResult);
} else {
throw new DBException("Data type " + name + " not found in database " + database.getName());
}
}
}
//dbStat;
}
}
}
......@@ -51,7 +51,6 @@ import java.sql.SQLException;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* PostgreDatabase
......@@ -173,37 +172,37 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return templateName;
}
@Property(viewable = false, order = 3)
@Property(order = 3)
public PostgreRole getDBA(DBRProgressMonitor monitor) throws DBException {
return PostgreUtils.getObjectById(monitor, roleCache, this, ownerId);
}
@Property(viewable = false, order = 5)
@Property(order = 5)
public PostgreCharset getDefaultEncoding(DBRProgressMonitor monitor) throws DBException {
return PostgreUtils.getObjectById(monitor, encodingCache, this, encodingId);
}
@Property(viewable = false, order = 10)
@Property(order = 10)
public String getCollate() {
return collate;
}
@Property(viewable = false, order = 11)
@Property(order = 11)
public String getCtype() {
return ctype;
}
@Property(viewable = false, order = 12)
@Property(order = 12)
public boolean isTemplate() {
return isTemplate;
}
@Property(viewable = false, order = 13)
@Property(order = 13)
public boolean isAllowConnect() {
return allowConnect;
}
@Property(viewable = false, order = 14)
@Property(order = 14)
public int getConnectionLimit() {
return connectionLimit;
}
......@@ -213,7 +212,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
@NotNull
@Override
public DBCExecutionContext getDefaultContext(boolean meta) {
public JDBCExecutionContext getDefaultContext(boolean meta) {
return dataSource.getDefaultContext(meta);
}
......@@ -287,7 +286,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return tablespaceCache.getAllObjects(monitor, this);
}
@Property(viewable = false, order = 4)
@Property(order = 4)
public PostgreTablespace getDefaultTablespace(DBRProgressMonitor monitor) throws DBException {
return PostgreUtils.getObjectById(monitor, tablespaceCache, this, tablespaceId);
}
......@@ -504,7 +503,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return null;
}
public PostgreDataType getDataType(long typeId) {
public PostgreDataType getDataType(DBRProgressMonitor monitor, long typeId) {
if (typeId <= 0) {
return null;
}
......@@ -519,11 +518,18 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return dataType;
}
}
log.debug("Data type '" + typeId + "' not found");
return null;
// Type not found. Let's resolve it
try {
dataType = PostgreDataTypeCache.resolveDataType(monitor, this, typeId);
dataType.getParentObject().dataTypeCache.cacheObject(dataType);
return dataType;
} catch (Exception e) {
log.debug("Can't resolve data type " + typeId, e);
return null;
}
}
public PostgreDataType getDataType(String typeName) {
public PostgreDataType getDataType(DBRProgressMonitor monitor, String typeName) {
if (typeName.endsWith("[]")) {
// In some cases ResultSetMetadata returns it as []
typeName = "_" + typeName.substring(0, typeName.length() - 2);
......@@ -560,8 +566,16 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
return dataType;
}
}
log.debug("Data type '" + typeName + "' not found in database '" + getName() + "'");
return null;
// Type not found. Let's resolve it
try {
PostgreDataType dataType = PostgreDataTypeCache.resolveDataType(monitor, this, typeName);
dataType.getParentObject().dataTypeCache.cacheObject(dataType);
return dataType;
} catch (Exception e) {
log.debug("Can't resolve data type " + typeName, e);
return null;
}
}
@Override
......@@ -597,7 +611,7 @@ public class PostgreDatabase implements DBSInstance, DBSCatalog, DBPRefreshableO
// FIXME: maybe some better workaround?
if (PostgreConstants.EC_PERMISSION_DENIED.equals(error.getDatabaseState())) {
log.warn(error);
setCache(Collections.<PostgreRole>emptyList());
setCache(Collections.emptyList());
return true;
}
return false;
......
......@@ -21,6 +21,7 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.generic.model.GenericStructContainer;
import org.jkiss.dbeaver.ext.postgresql.PostgreConstants;
import org.jkiss.dbeaver.ext.postgresql.PostgreUtils;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement;
......@@ -56,14 +57,10 @@ public class PostgreGenericTypeCache extends JDBCBasicDataTypeCache<GenericStruc
super(owner);
}
private boolean supportsTypeCategory() {
return owner.getDataSource().isServerVersionAtLeast(8, 4);
}
@Override
protected JDBCStatement prepareObjectsStatement(@NotNull JDBCSession session, @NotNull GenericStructContainer owner) throws SQLException
{
boolean supportsCategory = supportsTypeCategory();
boolean supportsCategory = PostgreUtils.supportsTypeCategory(session.getDataSource());
return session.prepareStatement(
"SELECT t.oid as typid,tn.nspname typnsname,t.* \n" +
"FROM pg_catalog.pg_type t , pg_catalog.pg_namespace tn\n" +
......@@ -75,7 +72,7 @@ public class PostgreGenericTypeCache extends JDBCBasicDataTypeCache<GenericStruc
@Override
protected JDBCDataType fetchObject(@NotNull JDBCSession session, @NotNull GenericStructContainer owner, @NotNull JDBCResultSet dbResult) throws SQLException, DBException
{
boolean supportsTypeCategory = supportsTypeCategory();
boolean supportsTypeCategory = PostgreUtils.supportsTypeCategory(session.getDataSource());
String name = JDBCUtils.safeGetString(dbResult, "typname");
if (CommonUtils.isEmpty(name)) {
return null;
......
......@@ -93,7 +93,7 @@ public class PostgreOperatorClass extends PostgreInformation {
@Property(viewable = true, order = 6)
public PostgreDataType getType(DBRProgressMonitor monitor) {
return accessMethod.getDatabase().getDataType(typeId);
return accessMethod.getDatabase().getDataType(monitor, typeId);
}
@Property(viewable = true, order = 7)
......@@ -106,7 +106,7 @@ public class PostgreOperatorClass extends PostgreInformation {
if (keyTypeId == 0) {
return getType(monitor);
}
return accessMethod.getDatabase().getDataType(keyTypeId);
return accessMethod.getDatabase().getDataType(monitor, keyTypeId);
}
}
......@@ -105,14 +105,15 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
}
public PostgreProcedure(
DBRProgressMonitor monitor,
PostgreSchema schema,
ResultSet dbResult)
{
super(schema, true);
loadInfo(dbResult);
loadInfo(monitor, dbResult);
}
private void loadInfo(ResultSet dbResult) {
private void loadInfo(DBRProgressMonitor monitor, ResultSet dbResult) {
this.oid = JDBCUtils.safeGetLong(dbResult, "oid");
setName(JDBCUtils.safeGetString(dbResult, "proname"));
this.ownerId = JDBCUtils.safeGetLong(dbResult, "proowner");
......@@ -127,7 +128,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
for (int i = 0; i < allArgTypes.length; i++) {
Long paramType = allArgTypes[i];
final PostgreDataType dataType = container.getDatabase().getDataType(paramType.intValue());
final PostgreDataType dataType = container.getDatabase().getDataType(monitor, paramType.intValue());
if (dataType == null) {
log.warn("Parameter data type [" + paramType + "] not found");
continue;
......@@ -156,7 +157,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
if (!ArrayUtils.isEmpty(inArgTypes)) {
for (int i = 0; i < inArgTypes.length; i++) {
Long paramType = inArgTypes[i];
final PostgreDataType dataType = container.getDatabase().getDataType(paramType.intValue());
final PostgreDataType dataType = container.getDatabase().getDataType(monitor, paramType.intValue());
if (dataType == null) {
log.warn("Parameter data type [" + paramType + "] not found");
continue;
......@@ -175,7 +176,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
{
final long varTypeId = JDBCUtils.safeGetLong(dbResult, "provariadic");
if (varTypeId != 0) {
varArrayType = container.getDatabase().getDataType(varTypeId);
varArrayType = container.getDatabase().getDataType(monitor, varTypeId);
}
}
this.procTransform = JDBCUtils.safeGetString(dbResult, "protransform");
......@@ -193,7 +194,7 @@ public class PostgreProcedure extends AbstractProcedure<PostgreDataSource, Postg
{
final long retTypeId = JDBCUtils.safeGetLong(dbResult, "prorettype");
if (retTypeId != 0) {
returnType = container.getDatabase().getDataType(retTypeId);
returnType = container.getDatabase().getDataType(monitor, retTypeId);
}
}
this.procSrc = JDBCUtils.safeGetString(dbResult, "prosrc");
......
......@@ -518,7 +518,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj
throws SQLException, DBException
{
try {
return new PostgreTableColumn(table, dbResult);
return new PostgreTableColumn(session.getProgressMonitor(), table, dbResult);
} catch (DBException e) {
log.warn("Error reading attribute info", e);
return null;
......@@ -804,7 +804,7 @@ public class PostgreSchema implements DBSSchema, DBPNamedObject2, DBPSaveableObj
protected PostgreProcedure fetchObject(@NotNull JDBCSession session, @NotNull PostgreSchema owner, @NotNull JDBCResultSet dbResult)
throws SQLException, DBException
{
return new PostgreProcedure(owner, dbResult);
return new PostgreProcedure(session.getProgressMonitor(), owner, dbResult);
}
}
......
......@@ -32,8 +32,8 @@ public class PostgreTableColumn extends PostgreAttribute<PostgreTableBase> imple
super(table);
}
public PostgreTableColumn(PostgreTableBase table, JDBCResultSet dbResult) throws DBException {
super(table, dbResult);
public PostgreTableColumn(DBRProgressMonitor monitor, PostgreTableBase table, JDBCResultSet dbResult) throws DBException {
super(monitor, table, dbResult);
}
@Override
......
......@@ -51,7 +51,7 @@ public class PostgreArrayValueHandler extends JDBCArrayValueHandler {
PostgreDataType itemType = null;
final PostgreDataType arrayType = PostgreUtils.findDataType((PostgreDataSource) session.getDataSource(), type);
if (arrayType != null) {
itemType = arrayType.getElementType();
itemType = arrayType.getElementType(session.getProgressMonitor());
}
if (itemType != null) {
if (className.equals(PostgreConstants.PG_OBJECT_CLASS)) {
......
......@@ -97,7 +97,7 @@ public abstract class JDBCObjectCache<OWNER extends DBSObject, OBJECT extends DB
try {
try (JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Load objects from " + owner.getName())) {
try (JDBCStatement dbStat = prepareObjectsStatement(session, owner)) {
monitor.subTask("Load " + getClass().getSimpleName());
monitor.subTask("Load " + getCacheName());
dbStat.setFetchSize(DBConstants.METADATA_FETCH_SIZE);
dbStat.executeStatement();
JDBCResultSet dbResult = dbStat.getResultSet();
......@@ -137,7 +137,7 @@ public abstract class JDBCObjectCache<OWNER extends DBSObject, OBJECT extends DB
Comparator<OBJECT> comparator = getListOrderComparator();
if (comparator != null) {
Collections.sort(tmpObjectList, comparator);
tmpObjectList.sort(comparator);
}
detectCaseSensitivity(owner);
......@@ -145,6 +145,10 @@ public abstract class JDBCObjectCache<OWNER extends DBSObject, OBJECT extends DB
this.invalidateObjects(monitor, owner, new CacheIterator());
}
protected String getCacheName() {
return getClass().getSimpleName();
}
// Can be implemented to provide custom cache error handler
protected boolean handleCacheReadError(DBException error) {
return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册