# HG changeset patch # User matthias42@netbeans.org # Date 1327702638 -3600 # Node ID 687fe440c34c9543c822f23f3c91dea86ef1bb33 # Parent dee0b5da88055fb3420e2dd182d87ad81319aa36 Some DBMS return database meta data with whitespace padding (in this case informix), but don't tollerate untrimmed queries for the elements => Trim results from getString Additionally don't guard multi-catalog support by dmd.supportsCatalogsInTableDefinitions informix does not support cross catalog creates, but cross catalog queries. diff --git a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/MetadataUtilities.java b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/MetadataUtilities.java --- a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/MetadataUtilities.java +++ b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/MetadataUtilities.java @@ -77,4 +77,12 @@ return ignoreCase ? str1.equalsIgnoreCase(str2) : str1.equals(str2); } } + + public static String trimmed(String input) { + if(input == null) { + return input; + } else { + return input.trim(); + } + } } diff --git a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCCatalog.java b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCCatalog.java --- a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCCatalog.java +++ b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCCatalog.java @@ -141,10 +141,10 @@ boolean supportsCatalog = jdbcMetadata.getDmd().supportsCatalogsInTableDefinitions(); try { while (rs.next()) { - String schemaName = rs.getString("TABLE_SCHEM"); // NOI18N + String schemaName = MetadataUtilities.trimmed(rs.getString("TABLE_SCHEM")); // NOI18N // Workaround for pre-JDBC 3.0 drivers, where DatabaseMetaData.getSchemas() // only returns a TABLE_SCHEM column. - String catalogName = columnCount > 1 && supportsCatalog ? rs.getString("TABLE_CATALOG") : name; // NOI18N + String catalogName = columnCount > 1 && supportsCatalog ? MetadataUtilities.trimmed(rs.getString("TABLE_CATALOG")) : name; // NOI18N LOGGER.log(Level.FINE, "Read schema ''{0}'' in catalog ''{1}''", new Object[] { schemaName, catalogName }); LOGGER.log(Level.FINEST, "MetadataUtilities.equals(catalogName=''{0}'', name=''{1}'') returns {2}", new Object[] {catalogName, name, MetadataUtilities.equals(catalogName, name)}); diff --git a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCMetadata.java b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCMetadata.java --- a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCMetadata.java +++ b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCMetadata.java @@ -39,7 +39,6 @@ * * Portions Copyrighted 2010 Sun Microsystems, Inc. */ - package org.netbeans.modules.db.metadata.model.jdbc; import java.sql.Connection; @@ -66,11 +65,9 @@ public class JDBCMetadata extends MetadataImplementation { private static final Logger LOGGER = Logger.getLogger(JDBCMetadata.class.getName()); - private final Connection conn; private final String defaultSchemaName; private final DatabaseMetaData dmd; - protected Catalog defaultCatalog; protected Map catalogs; @@ -85,12 +82,12 @@ } if (LOGGER.isLoggable(Level.FINE)) { try { - LOGGER.log(Level.FINE, "Retrieved DMD for product ''{0}'' version ''{1}'', driver ''{2}'' version ''{3}''", new Object[] { - dmd.getDatabaseProductName(), - dmd.getDatabaseProductVersion(), - dmd.getDriverName(), - dmd.getDriverVersion() - }); + LOGGER.log(Level.FINE, "Retrieved DMD for product ''{0}'' version ''{1}'', driver ''{2}'' version ''{3}''", new Object[]{ + dmd.getDatabaseProductName(), + dmd.getDatabaseProductVersion(), + dmd.getDriverName(), + dmd.getDriverVersion() + }); } catch (SQLException e) { LOGGER.log(Level.FINE, "Exception while logging metadata information", e); } @@ -147,41 +144,38 @@ Map newCatalogs = new LinkedHashMap(); try { String defaultCatalogName = conn.getCatalog(); - LOGGER.log(Level.FINE, "Default catalog is ''{0}'', supportsCatalogsInTableDefinitions()? {1}", new Object[] { defaultCatalogName, dmd.supportsCatalogsInTableDefinitions()}); - if (dmd.supportsCatalogsInTableDefinitions()) { - ResultSet rs = dmd.getCatalogs(); - try { - while (rs.next()) { - String catalogName = rs.getString("TABLE_CAT"); // NOI18N - LOGGER.log(Level.FINE, "Read catalog ''{0}''", catalogName); - if (MetadataUtilities.equals(catalogName, defaultCatalogName)) { - defaultCatalog = createJDBCCatalog(catalogName, true, defaultSchemaName).getCatalog(); - newCatalogs.put(defaultCatalog.getName(), defaultCatalog); - LOGGER.log(Level.FINE, "Created default catalog {0}", defaultCatalog); - } else { - Catalog catalog = createJDBCCatalog(catalogName, false, null).getCatalog(); - newCatalogs.put(catalogName, catalog); - LOGGER.log(Level.FINE, "Created catalog {0}", catalog); - } + ResultSet rs = dmd.getCatalogs(); + try { + while (rs.next()) { + String catalogName = MetadataUtilities.trimmed(rs.getString("TABLE_CAT")); // NOI18N + LOGGER.log(Level.FINE, "Read catalog ''{0}''", catalogName); + if (MetadataUtilities.equals(catalogName, defaultCatalogName)) { + defaultCatalog = createJDBCCatalog(catalogName, true, defaultSchemaName).getCatalog(); + newCatalogs.put(defaultCatalog.getName(), defaultCatalog); + LOGGER.log(Level.FINE, "Created default catalog {0}", defaultCatalog); + } else { + Catalog catalog = createJDBCCatalog(catalogName, false, null).getCatalog(); + newCatalogs.put(catalogName, catalog); + LOGGER.log(Level.FINE, "Created catalog {0}", catalog); } - } finally { - if (rs != null) { - rs.close(); - } + } + } finally { + if (rs != null) { + rs.close(); } } } catch (SQLException e) { - throw new MetadataException(e); + LOGGER.log(Level.INFO, "Could not load catalogs list from database (getCatalogs failed)."); } if (defaultCatalog == null) { defaultCatalog = createJDBCCatalog(null, true, defaultSchemaName).getCatalog(); - + // Issue 154407 - Don't put the default catalog in the list of catalogs if its name is null, // unless it's the *only* catalog (e.g. with Derby, where it doesn't have a concept of catalogs) if (newCatalogs.isEmpty()) { newCatalogs.put(null, defaultCatalog); } - + LOGGER.log(Level.FINE, "Created fallback default catalog {0}", defaultCatalog); } catalogs = Collections.unmodifiableMap(newCatalogs); diff --git a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCSchema.java b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCSchema.java --- a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCSchema.java +++ b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCSchema.java @@ -163,7 +163,7 @@ ResultSet rs = jdbcCatalog.getJDBCMetadata().getDmd().getTables(jdbcCatalog.getName(), name, "%", new String[] { "TABLE", "SYSTEM TABLE" }); // NOI18N try { while (rs.next()) { - String tableName = rs.getString("TABLE_NAME"); // NOI18N + String tableName = MetadataUtilities.trimmed(rs.getString("TABLE_NAME")); // NOI18N Table table = createJDBCTable(tableName).getTable(); newTables.put(tableName, table); LOGGER.log(Level.FINE, "Created table {0}", table); @@ -186,7 +186,7 @@ ResultSet rs = jdbcCatalog.getJDBCMetadata().getDmd().getTables(jdbcCatalog.getName(), name, "%", new String[] { "VIEW" }); // NOI18N try { while (rs.next()) { - String viewName = rs.getString("TABLE_NAME"); // NOI18N + String viewName = MetadataUtilities.trimmed(rs.getString("TABLE_NAME")); // NOI18N View view = createJDBCView(viewName).getView(); newViews.put(viewName, view); LOGGER.log(Level.FINE, "Created view {0}", view); @@ -209,7 +209,7 @@ ResultSet rs = jdbcCatalog.getJDBCMetadata().getDmd().getProcedures(jdbcCatalog.getName(), name, "%"); // NOI18N try { while (rs.next()) { - String procedureName = rs.getString("PROCEDURE_NAME"); // NOI18N + String procedureName = MetadataUtilities.trimmed(rs.getString("PROCEDURE_NAME")); // NOI18N Procedure procedure = createJDBCProcedure(procedureName).getProcedure(); newProcedures.put(procedureName, procedure); LOGGER.log(Level.FINE, "Created procedure {0}", procedure); diff --git a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCTable.java b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCTable.java --- a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCTable.java +++ b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCTable.java @@ -212,7 +212,7 @@ continue; } - String indexName = rs.getString("INDEX_NAME"); + String indexName = MetadataUtilities.trimmed(rs.getString("INDEX_NAME")); if (index == null || !(currentIndexName.equals(indexName))) { index = createJDBCIndex(indexName, rs); LOGGER.log(Level.FINE, "Created index " + index); @@ -262,7 +262,7 @@ column = getColumn(rs.getString("COLUMN_NAME")); if (!isOdbc(rs)) { position = rs.getInt("ORDINAL_POSITION"); - ordering = JDBCUtils.getOrdering(rs.getString("ASC_OR_DESC")); + ordering = JDBCUtils.getOrdering(MetadataUtilities.trimmed(rs.getString("ASC_OR_DESC"))); } } catch (SQLException e) { filterSQLException(e); @@ -282,7 +282,7 @@ JDBCForeignKey fkey = null; String currentKeyName = null; while (rs.next()) { - String keyName = rs.getString("FK_NAME"); + String keyName = MetadataUtilities.trimmed(rs.getString("FK_NAME")); // We have to assume that if the foreign key name is null, then this is a *new* // foreign key, even if the last foreign key name was also null. if (fkey == null || keyName == null || !(currentKeyName.equals(keyName))) { @@ -323,13 +323,13 @@ try { table = findReferredTable(rs); - colname = rs.getString("PKCOLUMN_NAME"); // NOI18N + colname = MetadataUtilities.trimmed(rs.getString("PKCOLUMN_NAME")); // NOI18N referredColumn = table.getColumn(colname); if (referredColumn == null) { throw new MetadataException(getMessage("ERR_COL_NOT_FOUND", table.getParent().getParent().getName(), table.getParent().getName(), table.getName(), colname)); // NOI18N } - colname = rs.getString("FKCOLUMN_NAME"); + colname = MetadataUtilities.trimmed(rs.getString("FKCOLUMN_NAME")); referringColumn = getColumn(colname); position = rs.getInt("KEY_SEQ"); @@ -350,7 +350,7 @@ Table table = null; try { - String catalogName = rs.getString("PKTABLE_CAT"); // NOI18N + String catalogName = MetadataUtilities.trimmed(rs.getString("PKTABLE_CAT")); // NOI18N if (catalogName == null || catalogName.length() == 0) { catalog = jdbcSchema.getParent(); } else { @@ -360,7 +360,7 @@ } } - String schemaName = rs.getString("PKTABLE_SCHEM"); // NOI18N + String schemaName = MetadataUtilities.trimmed(rs.getString("PKTABLE_SCHEM")); // NOI18N if (schemaName == null || schemaName.length() == 0) { schema = catalog.getSyntheticSchema(); @@ -371,7 +371,7 @@ } } - String tableName = rs.getString("PKTABLE_NAME"); + String tableName = MetadataUtilities.trimmed(rs.getString("PKTABLE_NAME")); table = schema.getTable(tableName); if (table == null) { @@ -394,9 +394,9 @@ try { while (rs.next()) { if (pkname == null) { - pkname = rs.getString("PK_NAME"); + pkname = MetadataUtilities.trimmed(rs.getString("PK_NAME")); } - String colName = rs.getString("COLUMN_NAME"); + String colName = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME")); pkcols.add(getColumn(colName)); } } finally { diff --git a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCValue.java b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCValue.java --- a/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCValue.java +++ b/db.metadata.model/src/org/netbeans/modules/db/metadata/model/jdbc/JDBCValue.java @@ -46,6 +46,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Logger; +import org.netbeans.modules.db.metadata.model.MetadataUtilities; import org.netbeans.modules.db.metadata.model.api.MetadataElement; import org.netbeans.modules.db.metadata.model.api.Nullable; import org.netbeans.modules.db.metadata.model.api.SQLType; @@ -76,7 +77,7 @@ * @throws java.sql.SQLException */ public static JDBCValue createProcedureValue(ResultSet rs) throws SQLException { - String name = rs.getString("COLUMN_NAME"); + String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME")); SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE")); int length = rs.getInt("LENGTH"); int precision = rs.getInt("PRECISION"); @@ -95,7 +96,7 @@ * @throws java.sql.SQLException */ public static JDBCValue createTableColumnValue(ResultSet rs) throws SQLException { - String name = rs.getString("COLUMN_NAME"); + String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME")); SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE")); int length = 0; @@ -124,7 +125,7 @@ * @throws java.sql.SQLException */ public static JDBCValue createTableColumnValueODBC(ResultSet rs) throws SQLException { - String name = rs.getString("COLUMN_NAME"); + String name = MetadataUtilities.trimmed(rs.getString("COLUMN_NAME")); SQLType type = JDBCUtils.getSQLType(rs.getInt("DATA_TYPE")); int length = 0; int precision = 0;