@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) { String name = index.getName(); return name != null && name.startsWith("PRIMARY_KEY_"); }
@Override protected boolean isInternalForeignKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk, IIndex index) { String name = index.getName(); return (name != null) && name.startsWith("SYS_IDX_"); }
@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) { // MySql defines a unique index "PRIMARY" for primary keys return "PRIMARY".equals(index.getName()); }
@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) throws SQLException { return index.getName().startsWith(" "); }
@Override protected boolean isInternalForeignKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk, IIndex index) { String name = index.getName(); return (name != null) && name.startsWith("SYS_IDX_"); }
@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) { String name = index.getName(); return (name != null) && (name.startsWith("SYS_PK_") || name.startsWith("SYS_IDX_")); }
@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) { String name = index.getName(); return (name != null) && (name.startsWith("SYS_PK_") || name.startsWith("SYS_IDX_")); }
private boolean isInternalIndex(IIndex index) { String name = index.getName(); // Internal names normally have the form "SQL051228005030780" if ((name != null) && name.startsWith("SQL")) { try { Long.parseLong(name.substring(3)); return true; } catch (NumberFormatException ex) { // we ignore it } } return false; } }
@Override protected boolean isInternalForeignKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk, IIndex index) { String name = index.getName(); return name != null && (name.startsWith(fk.getName()) || name.startsWith("CONSTRAINT_INDEX_")); }
@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) { // Sql Server generates an index "PK__[table name]__[hex number]" StringBuffer pkIndexName = new StringBuffer(); pkIndexName.append("PK__"); pkIndexName.append(table.getName()); pkIndexName.append("__"); return index.getName().toUpperCase().startsWith(pkIndexName.toString().toUpperCase()); }
@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) throws SQLException { // We can simply check the sysindexes table where a specific flag is set // for pk indexes StringBuffer query = new StringBuffer(); query.append("SELECT name = si.name FROM dbo.sysindexes si, dbo.sysobjects so WHERE so.name = '"); query.append(table.getName()); query.append("' AND si.name = '"); query.append(index.getName()); query.append("' AND so.id = si.id AND (si.status & 2048) > 0"); Statement stmt = connection.createStatement(); try { ResultSet rs = stmt.executeQuery(query.toString()); boolean result = rs.next(); rs.close(); return result; } finally { stmt.close(); } } }
@Override protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) throws SQLException { // We can simply check the sysindexes table where a specific flag is set // for pk indexes StringBuffer query = new StringBuffer(); query.append("SELECT name = si.name FROM dbo.sysindexes si, dbo.sysobjects so WHERE so.name = '"); query.append(table.getName()); query.append("' AND si.name = '"); query.append(index.getName()); query.append("' AND so.id = si.id AND (si.status & 2048) > 0"); Statement stmt = connection.createStatement(); try { ResultSet rs = stmt.executeQuery(query.toString()); boolean result = rs.next(); rs.close(); return result; } finally { stmt.close(); } } }
@Override protected boolean isInternalForeignKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk, IIndex index) { // MySql defines a non-unique index of the same name as the fk return getPlatform().getDdlBuilder().getForeignKeyName(table, fk).equals(index.getName()); }
@Override protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaData, Map<String, Object> values) throws SQLException { Table table = super.readTable(connection, metaData, values); if (table != null) { // PostgreSQL also returns unique indices for non-pk auto-increment // columns which are of the form "[table]_[column]_key" HashMap<String,IIndex> uniquesByName = new HashMap<String,IIndex>(); for (int indexIdx = 0; indexIdx < table.getIndexCount(); indexIdx++) { IIndex index = table.getIndex(indexIdx); if (index.isUnique() && (index.getName() != null)) { uniquesByName.put(index.getName(), index); } } for (int columnIdx = 0; columnIdx < table.getColumnCount(); columnIdx++) { Column column = table.getColumn(columnIdx); if (column.isAutoIncrement() && !column.isPrimaryKey()) { String indexName = table.getName() + "_" + column.getName() + "_key"; if (uniquesByName.containsKey(indexName)) { table.removeIndex((IIndex) uniquesByName.get(indexName)); uniquesByName.remove(indexName); } } } } setPrimaryKeyConstraintName(connection, table); return table; }
@Override protected Table readTable(Connection connection, DatabaseMetaDataWrapper metaData, Map<String, Object> values) throws SQLException { String tableName = (String) values.get("TABLE_NAME"); for (int idx = 0; idx < KNOWN_SYSTEM_TABLES.length; idx++) { if (KNOWN_SYSTEM_TABLES[idx].equals(tableName)) { return null; } } Table table = super.readTable(connection, metaData, values); if (table != null) { // Sql Server does not return the auto-increment status via the // database metadata determineAutoIncrementFromResultSetMetaData(connection, table, table.getColumns()); // TODO: Replace this manual filtering using named pks once they are // available // This is then probably of interest to every platform for (int idx = 0; idx < table.getIndexCount();) { IIndex index = table.getIndex(idx); if (index.isUnique() && existsPKWithName(metaData, table, index.getName())) { table.removeIndex(idx); } else { idx++; } } } return table; }