From 0e533f62bb4e630a405ab50e3e74cd1980cf5d14 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Tue, 13 Aug 2019 20:54:24 +0200 Subject: [PATCH] #6286 Generic driver: procedure type detect fix --- .../generic/model/meta/GenericMetaModel.java | 137 ++++++++++-------- 1 file changed, 74 insertions(+), 63 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/meta/GenericMetaModel.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/meta/GenericMetaModel.java index f526518f8a..97ab084cbd 100644 --- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/meta/GenericMetaModel.java +++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/meta/GenericMetaModel.java @@ -226,76 +226,16 @@ public class GenericMetaModel { GenericDataSource dataSource = container.getDataSource(); GenericMetaObject procObject = dataSource.getMetaObject(GenericConstants.OBJECT_PROCEDURE); try (JDBCSession session = DBUtils.openMetaSession(monitor, container, "Load procedures")) { - // Read procedures - JDBCResultSet dbResult = session.getMetaData().getProcedures( - container.getCatalog() == null ? null : container.getCatalog().getName(), - container.getSchema() == null ? null : JDBCUtils.escapeWildCards(session, container.getSchema().getName()), - dataSource.getAllObjectsPattern()); - try { - while (dbResult.next()) { - if (monitor.isCanceled()) { - break; - } - String procedureCatalog = GenericUtils.safeGetStringTrimmed(procObject, dbResult, JDBCConstants.PROCEDURE_CAT); - String procedureName = GenericUtils.safeGetStringTrimmed(procObject, dbResult, JDBCConstants.PROCEDURE_NAME); - String specificName = GenericUtils.safeGetStringTrimmed(procObject, dbResult, JDBCConstants.SPECIFIC_NAME); - int procTypeNum = GenericUtils.safeGetInt(procObject, dbResult, JDBCConstants.PROCEDURE_TYPE); - String remarks = GenericUtils.safeGetString(procObject, dbResult, JDBCConstants.REMARKS); - DBSProcedureType procedureType; - switch (procTypeNum) { - case DatabaseMetaData.procedureNoResult: procedureType = DBSProcedureType.PROCEDURE; break; - case DatabaseMetaData.procedureReturnsResult: procedureType = DBSProcedureType.FUNCTION; break; - case DatabaseMetaData.procedureResultUnknown: procedureType = DBSProcedureType.PROCEDURE; break; - default: procedureType = DBSProcedureType.UNKNOWN; break; - } - if (CommonUtils.isEmpty(specificName)) { - specificName = procedureName; - } - procedureName = GenericUtils.normalizeProcedureName(procedureName); - - GenericPackage procedurePackage = null; - // FIXME: remove as a silly workaround - String packageName = getPackageName(dataSource, procedureCatalog, procedureName, specificName); - if (packageName != null) { - if (!CommonUtils.isEmpty(packageName)) { - if (packageMap == null) { - packageMap = new TreeMap<>(); - } - procedurePackage = packageMap.get(packageName); - if (procedurePackage == null) { - procedurePackage = new GenericPackage(container, packageName, true); - packageMap.put(packageName, procedurePackage); - container.addPackage(procedurePackage); - } - } - } - - final GenericProcedure procedure = createProcedureImpl( - procedurePackage != null ? procedurePackage : container, - procedureName, - specificName, - remarks, - procedureType, - null); - if (procedurePackage != null) { - procedurePackage.addProcedure(procedure); - } else { - container.addProcedure(procedure); - } - } - } - finally { - dbResult.close(); - } - + boolean supportsFunctions = false; try { // Try to read functions (note: this function appeared only in Java 1.6 so it maybe not implemented by many drivers) // Read procedures - dbResult = session.getMetaData().getFunctions( + JDBCResultSet dbResult = session.getMetaData().getFunctions( container.getCatalog() == null ? null : container.getCatalog().getName(), container.getSchema() == null ? null : JDBCUtils.escapeWildCards(session, container.getSchema().getName()), dataSource.getAllObjectsPattern()); try { + supportsFunctions = true; while (dbResult.next()) { if (monitor.isCanceled()) { break; @@ -344,6 +284,77 @@ public class GenericMetaModel { log.debug("Can't read generic functions", e); } + { + // Read procedures + JDBCResultSet dbResult = session.getMetaData().getProcedures( + container.getCatalog() == null ? null : container.getCatalog().getName(), + container.getSchema() == null ? null : JDBCUtils.escapeWildCards(session, container.getSchema().getName()), + dataSource.getAllObjectsPattern()); + try { + while (dbResult.next()) { + if (monitor.isCanceled()) { + break; + } + String procedureCatalog = GenericUtils.safeGetStringTrimmed(procObject, dbResult, JDBCConstants.PROCEDURE_CAT); + String procedureName = GenericUtils.safeGetStringTrimmed(procObject, dbResult, JDBCConstants.PROCEDURE_NAME); + String specificName = GenericUtils.safeGetStringTrimmed(procObject, dbResult, JDBCConstants.SPECIFIC_NAME); + int procTypeNum = GenericUtils.safeGetInt(procObject, dbResult, JDBCConstants.PROCEDURE_TYPE); + String remarks = GenericUtils.safeGetString(procObject, dbResult, JDBCConstants.REMARKS); + DBSProcedureType procedureType; + switch (procTypeNum) { + case DatabaseMetaData.procedureNoResult: + procedureType = DBSProcedureType.PROCEDURE; + break; + case DatabaseMetaData.procedureReturnsResult: + procedureType = supportsFunctions ? DBSProcedureType.PROCEDURE : DBSProcedureType.FUNCTION; + break; + case DatabaseMetaData.procedureResultUnknown: + procedureType = DBSProcedureType.PROCEDURE; + break; + default: + procedureType = DBSProcedureType.UNKNOWN; + break; + } + if (CommonUtils.isEmpty(specificName)) { + specificName = procedureName; + } + procedureName = GenericUtils.normalizeProcedureName(procedureName); + + GenericPackage procedurePackage = null; + // FIXME: remove as a silly workaround + String packageName = getPackageName(dataSource, procedureCatalog, procedureName, specificName); + if (packageName != null) { + if (!CommonUtils.isEmpty(packageName)) { + if (packageMap == null) { + packageMap = new TreeMap<>(); + } + procedurePackage = packageMap.get(packageName); + if (procedurePackage == null) { + procedurePackage = new GenericPackage(container, packageName, true); + packageMap.put(packageName, procedurePackage); + container.addPackage(procedurePackage); + } + } + } + + final GenericProcedure procedure = createProcedureImpl( + procedurePackage != null ? procedurePackage : container, + procedureName, + specificName, + remarks, + procedureType, + null); + if (procedurePackage != null) { + procedurePackage.addProcedure(procedure); + } else { + container.addProcedure(procedure); + } + } + } finally { + dbResult.close(); + } + } + } catch (SQLException e) { throw new DBException(e, dataSource); } -- GitLab