Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import org.datanucleus.store.rdbms.table.Table;
import org.datanucleus.store.schema.AbstractStoreSchemaHandler;
import org.datanucleus.store.schema.StoreSchemaData;
import org.datanucleus.store.schema.naming.NamingCase;
import org.datanucleus.transaction.TransactionIsolation;
import org.datanucleus.util.Localiser;
import org.datanucleus.util.NucleusLogger;
Expand Down Expand Up @@ -418,9 +419,9 @@ public String getTableType(Connection conn, Table table)
}
String tableName = (c[2] != null) ? c[2] : table.getIdentifier().getName();

catalogName = getIdentifierForUseWithDatabaseMetaData(catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(tableName);
catalogName = getIdentifierForUseWithDatabaseMetaData(conn, catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(conn, schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(conn, tableName);

try
{
Expand Down Expand Up @@ -651,9 +652,9 @@ protected RDBMSTableFKInfo getRDBMSTableFKInfoForTable(Connection conn, Table ta
}
String tableName = (c[2] != null) ? c[2] : table.getIdentifier().getName();

catalogName = getIdentifierForUseWithDatabaseMetaData(catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(tableName);
catalogName = getIdentifierForUseWithDatabaseMetaData(conn, catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(conn, schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(conn, tableName);

return getRDBMSTableFKInfoForTable(conn, catalogName, schemaName, tableName);
}
Expand Down Expand Up @@ -722,9 +723,9 @@ protected RDBMSTablePKInfo getRDBMSTablePKInfoForTable(Connection conn, Table ta
}
String tableName = (c[2] != null) ? c[2] : table.getIdentifier().getName();

catalogName = getIdentifierForUseWithDatabaseMetaData(catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(tableName);
catalogName = getIdentifierForUseWithDatabaseMetaData(conn, catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(conn, schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(conn, tableName);

return getRDBMSTablePKInfoForTable(conn, catalogName, schemaName, tableName);
}
Expand Down Expand Up @@ -793,9 +794,9 @@ protected RDBMSTableIndexInfo getRDBMSTableIndexInfoForTable(Connection conn, Ta
}
String tableName = (c[2] != null) ? c[2] : table.getIdentifier().getName();

catalogName = getIdentifierForUseWithDatabaseMetaData(catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(tableName);
catalogName = getIdentifierForUseWithDatabaseMetaData(conn, catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(conn, schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(conn, tableName);

return getRDBMSTableIndexInfoForTable(conn, catalogName, schemaName, tableName);
}
Expand All @@ -822,7 +823,7 @@ protected RDBMSTableIndexInfo getRDBMSTableIndexInfoForTable(Connection conn, St
{
// This is a hack for the DatabaseAdapter method that requires a schema for Oracle
schemaNameTmp = rdbmsStoreMgr.getDefaultSchemaName();
schemaNameTmp = getIdentifierForUseWithDatabaseMetaData(schemaNameTmp);
schemaNameTmp = getIdentifierForUseWithDatabaseMetaData(conn, schemaNameTmp);
}
ResultSet rs = dba.getExistingIndexes(conn, catalogName, schemaNameTmp, tableName);
if (rs == null)
Expand Down Expand Up @@ -882,8 +883,8 @@ protected RDBMSSchemaInfo getRDBMSSchemaInfoForCatalogSchema(Connection conn, St
ResultSet rs = null;
try
{
String catalogName = getIdentifierForUseWithDatabaseMetaData(catalog);
String schemaName = getIdentifierForUseWithDatabaseMetaData(schema);
String catalogName = getIdentifierForUseWithDatabaseMetaData(conn, catalog);
String schemaName = getIdentifierForUseWithDatabaseMetaData(conn, schema);
rs = getDatastoreAdapter().getColumns(conn, catalogName, schemaName, null, null);
while (rs.next())
{
Expand Down Expand Up @@ -972,9 +973,9 @@ protected RDBMSTableInfo getRDBMSTableInfoForTable(Connection conn, Table table)
}
String tableName = (c[2] != null) ? c[2] : table.getIdentifier().getName();

catalogName = getIdentifierForUseWithDatabaseMetaData(catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(tableName);
catalogName = getIdentifierForUseWithDatabaseMetaData(conn, catalogName);
schemaName = getIdentifierForUseWithDatabaseMetaData(conn, schemaName);
tableName = getIdentifierForUseWithDatabaseMetaData(conn, tableName);

return getRDBMSTableInfoForTable(conn, catalogName, schemaName, tableName);
}
Expand Down Expand Up @@ -1109,12 +1110,12 @@ private void refreshTableData(Object connection, String catalog, String schema,
try
{
Connection conn = (Connection)connection;
String catalogName = getIdentifierForUseWithDatabaseMetaData(catalog);
String schemaName = getIdentifierForUseWithDatabaseMetaData(schema);
String catalogName = getIdentifierForUseWithDatabaseMetaData(conn, catalog);
String schemaName = getIdentifierForUseWithDatabaseMetaData(conn, schema);
if (tableNames.size() == 1)
{
// Single table to retrieve so restrict the query
String tableName = getIdentifierForUseWithDatabaseMetaData((String)tableNames.iterator().next());
String tableName = getIdentifierForUseWithDatabaseMetaData(conn, (String)tableNames.iterator().next());
if (NucleusLogger.DATASTORE_SCHEMA.isDebugEnabled())
{
NucleusLogger.DATASTORE_SCHEMA.debug(Localiser.msg("050028", tableName, catalogName, schemaName));
Expand Down Expand Up @@ -1299,23 +1300,44 @@ private static String[] splitTableIdentifierName(String separator, String name)
/**
* Convenience method to convert the passed identifier into the correct case for use with this
* datastore adapter, and removing any quote characters.
* @param conn database connection
* @param identifier The raw identifier
* @return The identifier for use
*/
private String getIdentifierForUseWithDatabaseMetaData(String identifier)
public String getIdentifierForUseWithDatabaseMetaData(Connection conn, String identifier)
{
if (identifier == null)
{
return null;
}
return identifier.replace(getDatastoreAdapter().getIdentifierQuoteString(), "");
// TODO Really ought to do the case conversion so that we check in the case of the adapter
// This is needed where the user has provided an identifier but in the wrong case
// When you enable this the JDO2 TCK will likely go incredibly slow since Derby use of
// DatabaseMetaData.getColumns() see "http://issues.apache.org/jira/browse/DERBY-1996"
/* return JDBCUtils.getIdentifierNameStripped(
storeMgr.getIdentifierFactory().getIdentifierInAdapterCase(identifier),
storeMgr.getDatastoreAdapter());*/

identifier = rdbmsStoreMgr.getIdentifierFactory().getIdentifierInAdapterCase(identifier);

if (identifier.startsWith(getDatastoreAdapter().getIdentifierQuoteString()))
{

return identifier.replace(getDatastoreAdapter().getIdentifierQuoteString(), "");
}
try
{
DatabaseMetaData dmd = conn.getMetaData();
if (dmd.storesLowerCaseIdentifiers())
{
return identifier.toLowerCase();
}
else if (dmd.storesUpperCaseIdentifiers())
{
return identifier.toUpperCase();
}
else
{
return identifier;
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}

/**
Expand Down
15 changes: 3 additions & 12 deletions src/main/java/org/datanucleus/store/rdbms/table/ProbeTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.datanucleus.metadata.AbstractMemberMetaData;
import org.datanucleus.store.rdbms.adapter.DatastoreAdapter;
import org.datanucleus.store.rdbms.mapping.java.JavaTypeMapping;
import org.datanucleus.store.rdbms.schema.RDBMSSchemaHandler;
import org.datanucleus.store.rdbms.RDBMSStoreManager;
import org.datanucleus.store.schema.naming.NamingCase;
import org.datanucleus.util.Localiser;
Expand Down Expand Up @@ -93,17 +94,7 @@ public String[] findSchemaDetails(Connection conn)

// Make sure the table name is in the correct case.
// This is required by RDBMS such as PostgreSQL which allow creation in one format yet actually store it in another.
String table_name = identifier.getName();
if (storeMgr.getIdentifierFactory().getNamingCase() == NamingCase.LOWER_CASE ||
storeMgr.getIdentifierFactory().getNamingCase() == NamingCase.LOWER_CASE_QUOTED)
{
table_name = table_name.toLowerCase();
}
else if (storeMgr.getIdentifierFactory().getNamingCase() == NamingCase.UPPER_CASE ||
storeMgr.getIdentifierFactory().getNamingCase() == NamingCase.UPPER_CASE_QUOTED)
{
table_name = table_name.toUpperCase();
}
String table_name = ((RDBMSSchemaHandler) storeMgr.getSchemaHandler()).getIdentifierForUseWithDatabaseMetaData(conn, identifier.getName());

// Utilise default catalog/schema if available and applicable
String catalog_name = storeMgr.getStringProperty(PropertyNames.PROPERTY_MAPPING_CATALOG);
Expand All @@ -123,7 +114,7 @@ else if (storeMgr.getIdentifierFactory().getNamingCase() == NamingCase.UPPER_CAS
{
if (!rs.next())
{
throw new NucleusDataStoreException(Localiser.msg("057027",identifier));
throw new NucleusDataStoreException(Localiser.msg("057027", table_name));
}

schemaDetails[0] = rs.getString(1);
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/org/datanucleus/store/rdbms/table/TableImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,13 @@ public boolean validateColumns(Connection conn, boolean validateColumnStructure,
throws SQLException
{
Map<DatastoreIdentifier, Column> unvalidated = new HashMap<>(columnsByIdentifier);
Map<String, DatastoreIdentifier> schemaToLogical = new HashMap<>();
unvalidated.keySet().forEach(key->{
RDBMSSchemaHandler schemaHandler = (RDBMSSchemaHandler) storeMgr.getSchemaHandler();
String schemaIdentifierName = schemaHandler.getIdentifierForUseWithDatabaseMetaData(conn, key.getName());
schemaToLogical.put(schemaIdentifierName, key);
});

List<StoreSchemaData> tableColInfo = storeMgr.getColumnInfoForTable(this, conn);
Iterator i = tableColInfo.iterator();
while (i.hasNext())
Expand All @@ -202,18 +209,18 @@ public boolean validateColumns(Connection conn, boolean validateColumnStructure,
// Create an identifier to use for the real column - use "CUSTOM" because we don't want truncation
DatastoreIdentifier colIdentifier = storeMgr.getIdentifierFactory().newColumnIdentifier(ci.getColumnName(),
this.storeMgr.getNucleusContext().getTypeManager().isDefaultEmbeddedType(String.class), null, true);
Column col = unvalidated.get(colIdentifier);
Column col = unvalidated.get(schemaToLogical.get(ci.getColumnName()));
if (col != null)
{
if (validateColumnStructure)
{
col.initializeColumnInfoFromDatastore(ci);
col.validate(ci);
unvalidated.remove(colIdentifier);
unvalidated.remove(schemaToLogical.get(ci.getColumnName()));
}
else
{
unvalidated.remove(colIdentifier);
unvalidated.remove(schemaToLogical.get(ci.getColumnName()));
}
}
}
Expand Down