private static void crawlTables( final MutableCatalog catalog, final RetrieverConnection retrieverConnection, final SchemaCrawlerOptions options) throws SchemaCrawlerException { final SchemaInfoLevel infoLevel = options.getSchemaInfoLevel(); final boolean retrieveTables = infoLevel.isRetrieveTables(); if (!retrieveTables) { LOGGER.log(Level.INFO, "Not retrieving tables, since this was not requested"); return; } final StopWatch stopWatch = new StopWatch("crawlTables"); LOGGER.log(Level.INFO, "Crawling tables"); final TableRetriever retriever; final TableColumnRetriever columnRetriever; final ForeignKeyRetriever fkRetriever; final TableExtRetriever retrieverExtra; try { retriever = new TableRetriever(retrieverConnection, catalog); columnRetriever = new TableColumnRetriever(retrieverConnection, catalog); fkRetriever = new ForeignKeyRetriever(retrieverConnection, catalog); retrieverExtra = new TableExtRetriever(retrieverConnection, catalog); stopWatch.time( "retrieveTables", () -> { for (final Schema schema : retriever.getSchemas()) { retriever.retrieveTables( schema.getCatalogName(), schema.getName(), options.getTableNamePattern(), options.getTableTypes(), options.getTableInclusionRule()); } return null; }); final NamedObjectList<MutableTable> allTables = catalog.getAllTables(); stopWatch.time( "retrieveColumns", () -> { if (infoLevel.isRetrieveTableColumns()) { columnRetriever.retrieveColumns(allTables, options.getColumnInclusionRule()); } return null; }); stopWatch.time( "retrieveForeignKeys", () -> { if (infoLevel.isRetrieveForeignKeys()) { if (infoLevel.isRetrieveTableColumns()) { fkRetriever.retrieveForeignKeys(allTables); } } else { LOGGER.log( Level.WARNING, "Foreign-keys are not being retrieved, so tables cannot be sorted using the natural sort order"); } return null; }); stopWatch.time( "filterAndSortTables", () -> { // Filter the list of tables based on grep criteria, and // parent-child relationships final Predicate<Table> tableFilter = tableFilter(options); ((Reducible) catalog).reduce(Table.class, new TablesReducer(options, tableFilter)); // Sort the remaining tables final TablesGraph tablesGraph = new TablesGraph(allTables); tablesGraph.setTablesSortIndexes(); return null; }); stopWatch.time( "retrieveIndexes", () -> { LOGGER.log(Level.INFO, "Retrieving primary keys and indexes"); for (final MutableTable table : allTables) { final boolean isView = table instanceof MutableView; if (!isView && infoLevel.isRetrieveTableColumns()) { retriever.retrievePrimaryKey(table); if (infoLevel.isRetrieveIndexes()) { retriever.retrieveIndexes(table, true); retriever.retrieveIndexes(table, false); // table.replacePrimaryKey(); } } } return null; }); stopWatch.time( "retrieveTableConstraintInformation", () -> { if (infoLevel.isRetrieveTableConstraintInformation()) { retrieverExtra.retrieveTableConstraintInformation(); } return null; }); stopWatch.time( "retrieveTriggerInformation", () -> { if (infoLevel.isRetrieveTriggerInformation()) { retrieverExtra.retrieveTriggerInformation(); } return null; }); stopWatch.time( "retrieveViewInformation", () -> { if (infoLevel.isRetrieveViewInformation()) { retrieverExtra.retrieveViewInformation(); } return null; }); stopWatch.time( "retrieveTableDefinitions", () -> { if (infoLevel.isRetrieveTableDefinitionsInformation()) { retrieverExtra.retrieveTableDefinitions(); } return null; }); stopWatch.time( "retrieveIndexInformation", () -> { if (infoLevel.isRetrieveIndexInformation()) { retrieverExtra.retrieveIndexInformation(); } return null; }); stopWatch.time( "retrieveAdditionalTableAttributes", () -> { if (infoLevel.isRetrieveAdditionalTableAttributes()) { retrieverExtra.retrieveAdditionalTableAttributes(); } return null; }); stopWatch.time( "retrieveTablePrivileges", () -> { if (infoLevel.isRetrieveTablePrivileges()) { retrieverExtra.retrieveTablePrivileges(); } return null; }); stopWatch.time( "retrieveAdditionalColumnAttributes", () -> { if (infoLevel.isRetrieveAdditionalColumnAttributes()) { retrieverExtra.retrieveAdditionalColumnAttributes(); } return null; }); stopWatch.time( "retrieveTableColumnPrivileges", () -> { if (infoLevel.isRetrieveTableColumnPrivileges()) { retrieverExtra.retrieveTableColumnPrivileges(); } return null; }); LOGGER.log(Level.INFO, stopWatch.toString()); } catch (final Exception e) { if (e instanceof SchemaCrawlerSQLException) { throw new SchemaCrawlerException(e.getMessage(), e.getCause()); } else if (e instanceof SchemaCrawlerException) { throw (SchemaCrawlerException) e; } else { throw new SchemaCrawlerException("Exception retrieving table information", e); } } }