From a50d63df2a6b7f41726a55a48283dc03bc3ce514 Mon Sep 17 00:00:00 2001 From: Andrej Smigala Date: Thu, 15 Oct 2015 14:38:44 +0200 Subject: [PATCH] TEIIDDES-2458 Fix name in source for Sybase Attempt to set the correct name in source for tables imported from Sybase. Sybase does not return a list of schemas, but still requires the fully qualified name to include the owner. We workaround this by obtaining the metadata for each imported table and getting the "schema" from there. In case of any problem, we fall back on the original behaviour. --- .../designer/jdbc/relational/i18n.properties | 1 + .../impl/custom/SybaseModelProcessor.java | 95 +++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/i18n.properties b/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/i18n.properties index 223cd7b380..9f78f3b909 100644 --- a/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/i18n.properties +++ b/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/i18n.properties @@ -33,6 +33,7 @@ RelationalModelProcessorImpl.Error_while_computing_datatype = Error while comput RelationalModelProcessorImpl.ResultSetName=ResultSet RelationalModelProcessorImpl.Error_while_obtaining_quote_string = Error while obtaining quote string for {0} RelationalModelProcessorImpl.Error_while_obtaining_catalogs = Error while obtaining catalogs string for {0} +RelationalModelProcessorImpl.Error_while_obtaining_name_in_source = Unable to obtain correct name in source for {0} RelationalModelProcessorImpl.importDescription = JDBC Import diff --git a/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/impl/custom/SybaseModelProcessor.java b/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/impl/custom/SybaseModelProcessor.java index 17dc4960d4..18e5c6a20e 100644 --- a/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/impl/custom/SybaseModelProcessor.java +++ b/plugins/org.teiid.designer.jdbc.relational/src/org/teiid/designer/jdbc/relational/impl/custom/SybaseModelProcessor.java @@ -7,11 +7,19 @@ */ package org.teiid.designer.jdbc.relational.impl.custom; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Iterator; import java.util.List; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.teiid.designer.core.types.DatatypeConstants; +import org.teiid.designer.jdbc.JdbcException; +import org.teiid.designer.jdbc.JdbcImportSettings; +import org.teiid.designer.jdbc.metadata.JdbcNode; import org.teiid.designer.jdbc.metadata.JdbcTable; import org.teiid.designer.jdbc.relational.impl.Context; import org.teiid.designer.jdbc.relational.impl.RelationalModelProcessorImpl; @@ -20,6 +28,7 @@ import org.teiid.designer.metamodels.relational.Column; import org.teiid.designer.metamodels.relational.Index; import org.teiid.designer.metamodels.relational.PrimaryKey; +import org.teiid.designer.metamodels.relational.RelationalEntity; import org.teiid.designer.metamodels.relational.RelationalFactory; import org.teiid.designer.metamodels.relational.Table; import org.teiid.designer.metamodels.relational.util.RelationalTypeMapping; @@ -224,4 +233,90 @@ protected void setColumnInfo( final Column column, column.setNativeType("double precision"); //$NON-NLS-1$ } } + + /* (non-Javadoc) + * @see org.teiid.designer.jdbc.relational.impl.RelationalModelProcessorImpl#computeNameInSource(org.teiid.designer.metamodels.relational.RelationalEntity, java.lang.String, org.teiid.designer.jdbc.metadata.JdbcNode, org.teiid.designer.jdbc.relational.impl.Context, boolean, java.util.List) + */ + @Override + protected String computeNameInSource(RelationalEntity object, String name, + JdbcNode node, Context context, boolean forced, List problems) { + + /* + * sybase with the jconn driver does not return schemas from + * DatabaseMetaData.getSchemas, but it requires the fqn to be in the + * form .. and it does return the part as + * the SCHEMA value in DatabaseMetaData.getTables + * + * In case we are unable to obtain the correct name in source, we do not fail, + * but let the super implementation handle it and just show a warning. + * + */ + + final JdbcImportSettings settings = context.getJdbcImportSettings(); + boolean includeCatalogs = settings.isCreateCatalogsInModel(); + + if (node instanceof JdbcTable && includeCatalogs) { + JdbcTable tableEntity = (JdbcTable) node; + try { + DatabaseMetaData databaseMetaData = context.getJdbcDatabase() + .getDatabaseMetaData(); + JdbcNode parentDatabase = tableEntity.getParentDatabaseObject( + true, false); + ResultSet tables = databaseMetaData.getTables( + parentDatabase.getName(), null, name, null); + + final StringBuffer sb = new StringBuffer(); + String quoteString = databaseMetaData + .getIdentifierQuoteString(); + + if (tables.next()) { + sb.append(quoteString); + sb.append(tables.getString("TABLE_CAT")); //$NON-NLS-1$ + sb.append(quoteString); + sb.append(databaseMetaData.getCatalogSeparator()); + sb.append(quoteString); + sb.append(tables.getString("TABLE_SCHEM")); //$NON-NLS-1$ + sb.append(quoteString); + sb.append(databaseMetaData.getCatalogSeparator()); + sb.append(quoteString); + sb.append(tables.getString("TABLE_NAME")); //$NON-NLS-1$ + sb.append(quoteString); + } + + if (tables.next()) { + // multiple tables with same name but different owners + addNameInSourceWarning(name, context, problems, null); + } + + return sb.toString(); + + } catch (JdbcException ex) { + addNameInSourceWarning(name, context, problems, ex); + } catch (SQLException ex) { + addNameInSourceWarning(name, context, problems, ex); + } + } + return super.computeNameInSource(object, name, node, context, forced, + problems); + } + + /** + * @param context + * @param problems + * @param ex + */ + private void addNameInSourceWarning(String name, Context context, + List problems, Exception ex) { + final String msg = org.teiid.designer.jdbc.relational.ModelerJdbcRelationalConstants.Util + .getString( + "RelationalModelProcessorImpl.Error_while_obtaining_name_in_source", //$NON-NLS-1$ + context.getJdbcDatabase().getName()) + + (ex == null ? "" : ex.getLocalizedMessage()); //$NON-NLS-1$ + final IStatus status = new Status( + IStatus.WARNING, + org.teiid.designer.jdbc.relational.ModelerJdbcRelationalConstants.PLUGIN_ID, + 0, msg, ex); + problems.add(status); + } + }