@Override public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { return metaData.getPrimaryKeys(catalog, schema, table); }
private Collection<String> getPrimaryKeys(final Connection connection, final String catalog, final String actualTableName) throws SQLException { Collection<String> result = new HashSet<>(); try (ResultSet resultSet = connection.getMetaData().getPrimaryKeys(catalog, null, actualTableName)) { while (resultSet.next()) { result.add(resultSet.getString("COLUMN_NAME")); } } return result; }
protected void buildPrimaryKey(TableMeta tableMeta) throws SQLException { ResultSet rs = dbMeta.getPrimaryKeys(conn.getCatalog(), null, tableMeta.name); String primaryKey = ""; int index = 0; while (rs.next()) { if (index++ > 0) { primaryKey += ","; } primaryKey += rs.getString("COLUMN_NAME"); } // 无主键的 table 将在后续的 removeNoPrimaryKeyTable() 中被移除,不再抛出异常 // if (StrKit.isBlank(primaryKey)) { // throw new RuntimeException("primaryKey of table \"" + tableMeta.name + "\" required by active record pattern"); // } tableMeta.primaryKey = primaryKey; rs.close(); }
protected List<String> readPrimaryKeyNames(DatabaseMetaData metadata, TableId id) throws SQLException { final List<String> pkColumnNames = new ArrayList<>(); try (ResultSet rs = metadata.getPrimaryKeys(id.catalog(), id.schema(), id.table())) { while (rs.next()) { String columnName = rs.getString(4); int columnIndex = rs.getInt(5); Collect.set(pkColumnNames, columnIndex - 1, columnName, null); } } return pkColumnNames; }
public static TableSchema from(final Connection conn, final String catalog, final String schema, final String tableName, final boolean translateColumnNames, final boolean includePrimaryKeys) throws SQLException { final DatabaseMetaData dmd = conn.getMetaData(); try (final ResultSet colrs = dmd.getColumns(catalog, schema, tableName, "%")) { final List<ColumnDescription> cols = new ArrayList<>(); while (colrs.next()) { final ColumnDescription col = ColumnDescription.from(colrs); cols.add(col); } final Set<String> primaryKeyColumns = new HashSet<>(); if (includePrimaryKeys) { try (final ResultSet pkrs = conn.getMetaData().getPrimaryKeys(catalog, null, tableName)) { while (pkrs.next()) { final String colName = pkrs.getString("COLUMN_NAME"); primaryKeyColumns.add(normalizeColumnName(colName, translateColumnNames)); } } } return new TableSchema(cols, translateColumnNames, primaryKeyColumns, dmd.getIdentifierQuoteString()); } } }
public static TableSchema from(final Connection conn, final String catalog, final String schema, final String tableName, final boolean translateColumnNames, final boolean includePrimaryKeys) throws SQLException { final DatabaseMetaData dmd = conn.getMetaData(); try (final ResultSet colrs = dmd.getColumns(catalog, schema, tableName, "%")) { final List<ColumnDescription> cols = new ArrayList<>(); while (colrs.next()) { final ColumnDescription col = ColumnDescription.from(colrs); cols.add(col); } final Set<String> primaryKeyColumns = new HashSet<>(); if (includePrimaryKeys) { try (final ResultSet pkrs = dmd.getPrimaryKeys(catalog, null, tableName)) { while (pkrs.next()) { final String colName = pkrs.getString("COLUMN_NAME"); primaryKeyColumns.add(normalizeColumnName(colName, translateColumnNames)); } } } return new TableSchema(cols, translateColumnNames, primaryKeyColumns, dmd.getIdentifierQuoteString()); } } }
public TableStruct analyse(Connection connection, String table) throws SQLException { ResultSet structRs = null; ResultSet columnSet = null; TableStruct tableStruct = new TableStruct(table); try { structRs = connection.getMetaData().getPrimaryKeys(connection.getCatalog(), null, table); columnSet = connection.getMetaData().getColumns(null, "%", table, "%"); while (structRs.next()) { tableStruct.getPrimaryKeys().add(structRs.getString("COLUMN_NAME")); } while (columnSet.next()) { tableStruct.getColumns().put(columnSet.getString("COLUMN_NAME"), columnSet.getString("TYPE_NAME")); } } catch (SQLException e) { try { DbUtils.close(structRs); DbUtils.close(columnSet); } catch (SQLException ignored) { } throw e; } return tableStruct; }
@Override public Void call() throws Exception { Connection conn = getConnection(); DatabaseMetaData meta = conn.getMetaData(); conn.close(); meta.getPrimaryKeys(null, null, null); return null; } }, "08003", "Connection is closed.");
private ResultSet getPrimaryKeysMetaData() throws SQLException { DatabaseMetaData metadata = mock(DatabaseMetaData.class); ResultSet resultSet = mock(ResultSet.class); ResultSet primaryKeys = mock(ResultSet.class); when(connection.getMetaData()).thenReturn(metadata); when(metadata.getTables(any(), any(), any(), any())).thenReturn(resultSet); when(metadata.getPrimaryKeys(any(), any(), anyString())).thenReturn(primaryKeys); when(primaryKeys.getString("COLUMN_NAME")).thenReturn(KEY_COLUMN); when(resultSet.next()).thenReturn(true).thenReturn(false); when(resultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME); return primaryKeys; }
/** * @throws Exception If failed. */ @Test public void testPrimaryKeyMetadata() throws Exception { try (Connection conn = DriverManager.getConnection(URL); ResultSet rs = conn.getMetaData().getPrimaryKeys(null, "pers", "PERSON")) { int cnt = 0; while (rs.next()) { assert "_KEY".equals(rs.getString("COLUMN_NAME")); cnt++; } assert cnt == 1; } }
/** * Checks that field names in the metadata matches specified expected fields. * * @param tabName part of the sql query after CREATE TABLE TESTER. * @param expPKFields Expected primary key fields. */ private void checkPKFields(String tabName, String... expPKFields) throws Exception { try (Connection conn = DriverManager.getConnection(URL)) { DatabaseMetaData md = conn.getMetaData(); ResultSet rs = md.getPrimaryKeys(conn.getCatalog(), null, tabName); List<String> colNames = new ArrayList<>(); while (rs.next()) colNames.add(rs.getString(COL_NAME_IDX)); assertEquals("Field names in the primary key are not correct", Arrays.asList(expPKFields), colNames); } }
/** * @throws Exception If failed. */ @Test public void testInvalidCatalog() throws Exception { try (Connection conn = DriverManager.getConnection(URL)) { DatabaseMetaData meta = conn.getMetaData(); ResultSet rs = meta.getSchemas("q", null); assert !rs.next() : "Results must be empty"; rs = meta.getTables("q", null, null, null); assert !rs.next() : "Results must be empty"; rs = meta.getColumns("q", null, null, null); assert !rs.next() : "Results must be empty"; rs = meta.getIndexInfo("q", null, null, false, false); assert !rs.next() : "Results must be empty"; rs = meta.getPrimaryKeys("q", null, null); assert !rs.next() : "Results must be empty"; } }
@Before public void setup() throws Exception { tableMetaDataManager = new TableMetaDataManager(); connection = mock(Connection.class); databaseMetaData = mock(DatabaseMetaData.class); when(connection.getMetaData()).thenReturn(databaseMetaData); tablesResultSet = mock(ResultSet.class); when(databaseMetaData.getTables(any(), any(), any(), any())).thenReturn(tablesResultSet); primaryKeysResultSet = mock(ResultSet.class); when(databaseMetaData.getPrimaryKeys(any(), any(), anyString())) .thenReturn(primaryKeysResultSet); columnResultSet = mock(ResultSet.class); when(databaseMetaData.getColumns(any(), any(), eq(TABLE_NAME), any())) .thenReturn(columnResultSet); regionMapping = mock(RegionMapping.class); when(regionMapping.getTableName()).thenReturn(TABLE_NAME); }
@Test public void testGetPrimaryKeysReturnsNonNull() throws SQLException { assertThat( dbmd.getPrimaryKeys( null, null, "%" ), notNullValue() ); } // TODO: Later, test more (e.g., right columns (even if/though zero rows)).
/** * @throws Exception If failed. */ @Test public void testPrimaryKeyMetadata() throws Exception { try (Connection conn = DriverManager.getConnection(BASE_URL); ResultSet rs = conn.getMetaData().getPrimaryKeys(null, "pers", "PERSON")) { int cnt = 0; while (rs.next()) { assertEquals("_KEY", rs.getString("COLUMN_NAME")); cnt++; } assertEquals(1, cnt); } }
@CheckForNull private PK pkOf(Connection connection, String tableName) throws SQLException { try (ResultSet resultSet = connection.getMetaData().getPrimaryKeys(null, null, tableName)) { String pkName = null; List<PkColumn> columnNames = null; while (resultSet.next()) { if (columnNames == null) { pkName = resultSet.getString("PK_NAME"); columnNames = new ArrayList<>(1); } else { assertThat(pkName).as("Multiple primary keys found").isEqualTo(resultSet.getString("PK_NAME")); } columnNames.add(new PkColumn(resultSet.getInt("KEY_SEQ") - 1, resultSet.getString("COLUMN_NAME"))); } if (columnNames == null) { return null; } return new PK( pkName, columnNames.stream() .sorted(PkColumn.ORDERING_BY_INDEX) .map(PkColumn::getName) .collect(MoreCollectors.toList())); } }
private void primaryKeyColumns(Connection conn, Table table, ProgressMeasure progress) { requireNonNulls(conn, table, progress); final SqlSupplier<ResultSet> supplier = () -> conn.getMetaData().getPrimaryKeys(null, null, table.getId()); final TableChildMutator<PrimaryKeyColumn> mutator = (pkc, rs) -> { final String columnName = rs.getString("COLUMN_NAME"); pkc.mutator().setId(columnName); pkc.mutator().setName(columnName); pkc.mutator().setOrdinalPosition(rs.getInt("KEY_SEQ")); }; tableChilds( table, PrimaryKeyColumn.class, table.mutator()::addNewPrimaryKeyColumn, supplier, rsChild -> rsChild.getString("COLUMN_NAME"), mutator ); if (!table.isView() && table.primaryKeyColumns().noneMatch(pk -> true)) { LOGGER.warn(format("Table '%s' does not have any primary key.", table.getId())); } }
protected void primaryKeyColumns(Connection connection, Table table, ProgressMeasure progressListener) { requireNonNulls(connection, table); final Schema schema = table.getParentOrThrow(); final SqlSupplier<ResultSet> supplier = () -> connection.getMetaData().getPrimaryKeys(jdbcCatalogLookupName(schema), jdbcSchemaLookupName(schema), metaDataTableNameForPrimaryKeys(table) ); final AbstractDbmsOperationHandler.TableChildMutator<PrimaryKeyColumn, ResultSet> mutator = (primaryKeyColumn, rs) -> { final String columnName = rs.getString("COLUMN_NAME"); primaryKeyColumn.mutator().setId(columnName); primaryKeyColumn.mutator().setName(columnName); primaryKeyColumn.mutator().setOrdinalPosition(rs.getInt("KEY_SEQ")); }; tableChilds(PrimaryKeyColumn.class, table.mutator()::addNewPrimaryKeyColumn, supplier, mutator, progressListener); if (!table.isView() && table.primaryKeyColumns().noneMatch(pk -> true)) { LOGGER.warn("Table '" + table.getId() + "' does not have any primary key."); } }
/** * Check that lookup in the metadata have been performed using specified catalog name (that is neither {@code null} * nor correct catalog name), empty result set is returned. * * @param invalidCat catalog name that is not either */ private void checkNoEntitiesFoundForCatalog(String invalidCat) throws SQLException { try (Connection conn = DriverManager.getConnection(URL)) { DatabaseMetaData meta = conn.getMetaData(); // Intention: we set the other arguments that way, the values to have as many results as possible. assertIsEmpty(meta.getTables(invalidCat, null, "%", new String[] {"TABLE"})); assertIsEmpty(meta.getColumns(invalidCat, null, "%", "%")); assertIsEmpty(meta.getColumnPrivileges(invalidCat, "pers", "PERSON", "%")); assertIsEmpty(meta.getTablePrivileges(invalidCat, null, "%")); assertIsEmpty(meta.getPrimaryKeys(invalidCat, "pers", "PERSON")); assertIsEmpty(meta.getImportedKeys(invalidCat, "pers", "PERSON")); assertIsEmpty(meta.getExportedKeys(invalidCat, "pers", "PERSON")); // meta.getCrossReference(...) doesn't make sense because we don't have FK constraint. assertIsEmpty(meta.getIndexInfo(invalidCat, null, "%", false, true)); assertIsEmpty(meta.getSuperTables(invalidCat, "%", "%")); assertIsEmpty(meta.getSchemas(invalidCat, null)); assertIsEmpty(meta.getPseudoColumns(invalidCat, null, "%", "")); } }
/** * Check that lookup in the metadata have been performed using specified catalog name (that is neither {@code null} * nor correct catalog name), empty result set is returned. * * @param invalidCat catalog name that is not either */ private void checkNoEntitiesFoundForCatalog(String invalidCat) throws SQLException { try (Connection conn = DriverManager.getConnection(BASE_URL)) { DatabaseMetaData meta = conn.getMetaData(); // Intention: we set the other arguments that way, the values to have as many results as possible. assertIsEmpty(meta.getTables(invalidCat, null, "%", new String[] {"TABLE"})); assertIsEmpty(meta.getColumns(invalidCat, null, "%", "%")); assertIsEmpty(meta.getColumnPrivileges(invalidCat, "pers", "PERSON", "%")); assertIsEmpty(meta.getTablePrivileges(invalidCat, null, "%")); assertIsEmpty(meta.getPrimaryKeys(invalidCat, "pers", "PERSON")); assertIsEmpty(meta.getImportedKeys(invalidCat, "pers", "PERSON")); assertIsEmpty(meta.getExportedKeys(invalidCat, "pers", "PERSON")); // meta.getCrossReference(...) doesn't make sense because we don't have FK constraint. assertIsEmpty(meta.getIndexInfo(invalidCat, null, "%", false, true)); assertIsEmpty(meta.getSuperTables(invalidCat, "%", "%")); assertIsEmpty(meta.getSchemas(invalidCat, null)); assertIsEmpty(meta.getPseudoColumns(invalidCat, null, "%", "")); } }