private Database identifyNewTables() { Database _database = new Database(); _database.setName(database.getName()); Collection<String> tableNames = tblNameMap.values(); LOG.info("Initializing database and creating tables"); for (String tableName : tableNames) { if (database.findTable(tableName) == null) { Table table = createTable(tableName); LOG.info("Creating {}", table.toVerboseString()); _database.addTable(table); database.addTable(table); } else { LOG.debug("Table {} already exists", tableName); } } return _database; }
/** * Returns a deep clone of the given model object, including all tables, foreign keys, indexes etc. * * @param source The source model * @return The clone */ public Database clone(Database source) { Database result = new Database(); result.setName(source.getName()); result.setIdMethod(source.getIdMethod()); result.setVersion(source.getVersion()); for (int tableIdx = 0; tableIdx < source.getTableCount(); tableIdx++) { Table sourceTable = source.getTable(tableIdx); result.addTable(clone(sourceTable, true, false, result, true)); } for (int tableIdx = 0; tableIdx < source.getTableCount(); tableIdx++) { Table sourceTable = source.getTable(tableIdx); Table clonedTable = result.getTable(tableIdx); for (int fkIdx = 0; fkIdx < sourceTable.getForeignKeyCount(); fkIdx++) { ForeignKey sourceFk = sourceTable.getForeignKey(fkIdx); clonedTable.addForeignKey(clone(sourceFk, clonedTable, result, true)); } } return result; }
@Override public void init() { Connection connection = null; try { Database _database = identifyNewTables(); if(_database.getTableCount() >0 ) { LOG.info("Creating {} new tables (totally {} tables)", _database.getTableCount(),database.getTableCount()); connection = ConnectionManagerFactory.getInstance().getConnection(); this.platform.createTables(connection,_database, false, true); LOG.info("Created {} new tables: ",_database.getTableCount(),_database.getTables()); } else { LOG.debug("All the {} tables have already been created, no new tables", database.getTableCount()); } } catch (Exception e) { LOG.error(e.getMessage(),e); throw new IllegalStateException(e); } finally { if(connection != null){ try { connection.close(); } catch (SQLException e) { LOG.warn(e.getMessage(),e); } } } }
/** * Creates the external foreignkey creation statements for all tables in the database. * * @param database The database */ public void createForeignKeys(Database database) throws IOException { for (int idx = 0; idx < database.getTableCount(); idx++) { createForeignKeys(database, database.getTable(idx)); } }
/** * Returns the {@link org.apache.ddlutils.dynabean.SqlDynaClass} for the given table name. If the it does not * exist yet, a new one will be created based on the Table definition. * * @param tableName The name of the table to create the bean for * @return The <code>SqlDynaClass</code> for the indicated table or <code>null</code> * if the model contains no such table */ public SqlDynaClass getDynaClassFor(String tableName) { Table table = findTable(tableName); return table != null ? getDynaClassCache().getDynaClass(table) : null; }
/** * {@inheritDoc} */ public String toString() { StringBuilder result = new StringBuilder(); result.append("Database [name="); result.append(getName()); result.append("; "); result.append(getTableCount()); result.append(" tables]"); return result.toString(); }
changes.addAll(checkForRemovedTables(sourceModel, intermediateModel, targetModel)); for (int tableIdx = 0; tableIdx < intermediateModel.getTableCount(); tableIdx++) Table intermediateTable = intermediateModel.getTable(tableIdx); Table sourceTable = sourceModel.findTable(intermediateTable.getQualifiedName(), _caseSensitive); Table targetTable = targetModel.findTable(intermediateTable.getQualifiedName(), _caseSensitive); List tableChanges = compareTables(sourceModel, sourceTable, intermediateModel, intermediateTable,
/** * Finds the table with the specified name, using case insensitive matching. * Note that this method is not called getTable to avoid introspection * problems. * * @param name The name of the table to find * @return The table or <code>null</code> if there is no such table */ public Table findTable(String name) { return findTable(name, false); }
for (int tableIdx = 0; tableIdx < otherDb.getTableCount(); tableIdx++) Table table = otherDb.getTable(tableIdx); if (findTable(table.getQualifiedName()) != null) addTable(cloneHelper.clone(table, true, false, this, true)); for (int tableIdx = 0; tableIdx < otherDb.getTableCount(); tableIdx++) Table otherTable = otherDb.getTable(tableIdx); Table localTable = findTable(otherTable.getQualifiedName());
/** * {@inheritDoc} */ public void alterTables(Connection connection, Database desiredModel, boolean continueOnError) throws DatabaseOperationException { Database currentModel = readModelFromDatabase(connection, desiredModel.getName()); alterModel(currentModel, desiredModel, continueOnError); }
/** * Writes the database model to the given XML writer. * * @param model The database model * @param xmlWriter The XML writer */ private void writeDatabaseElement(Database model, PrettyPrintingXmlWriter xmlWriter) throws DdlUtilsXMLException { writeElementStart(xmlWriter, QNAME_ELEMENT_DATABASE); xmlWriter.writeNamespace(null, DDLUTILS_NAMESPACE); writeAttribute(xmlWriter, QNAME_ATTRIBUTE_NAME, model.getName()); writeAttribute(xmlWriter, QNAME_ATTRIBUTE_DEFAULT_ID_METHOD, model.getIdMethod()); writeAttribute(xmlWriter, QNAME_ATTRIBUTE_VERSION, model.getVersion()); if (model.getTableCount() > 0) { xmlWriter.printlnIfPrettyPrinting(); for (int idx = 0; idx < model.getTableCount(); idx++) { writeTableElement(model.getTable(idx), xmlWriter); } } writeElementEnd(xmlWriter); }
/** * {@inheritDoc} */ public void apply(Database database, boolean caseSensitive) { // we only need to replace the table in the model, as there can't be a // foreign key from or to it when these kind of changes are created for (int tableIdx = 0; tableIdx < database.getTableCount(); tableIdx++) { Table curTable = database.getTable(tableIdx); if ((caseSensitive && curTable.getQualifiedName().equals(getChangedTable())) || (!caseSensitive && curTable.getQualifiedName().equalsIgnoreCase(getChangedTable()))) { database.removeTable(tableIdx); database.addTable(tableIdx, new CloneHelper().clone(_targetTable, true, false, database, caseSensitive)); break; } } } }
/** * Returns a verbose string representation of this database. * * @return The string representation */ public String toVerboseString() { StringBuilder result = new StringBuilder(); result.append("Database ["); result.append(getName()); result.append("] tables:"); for (int idx = 0; idx < getTableCount(); idx++) { result.append(" "); result.append(getTable(idx).toVerboseString()); } return result.toString(); } }
/** * Reads a database element from the XML stream reader. * * @param xmlReader The reader * @return The database object */ private Database readDatabaseElement(XMLStreamReader xmlReader) throws XMLStreamException, IOException { Database model = new Database(); for (int idx = 0; idx < xmlReader.getAttributeCount(); idx++) { QName attrQName = xmlReader.getAttributeName(idx); if (isSameAs(attrQName, QNAME_ATTRIBUTE_NAME)) { model.setName(xmlReader.getAttributeValue(idx)); } else if (isSameAs(attrQName, QNAME_ATTRIBUTE_DEFAULT_ID_METHOD)) { model.setIdMethod(xmlReader.getAttributeValue(idx)); } else if (isSameAs(attrQName, QNAME_ATTRIBUTE_VERSION)) { model.setVersion(xmlReader.getAttributeValue(idx)); } } readTableElements(xmlReader, model); consumeRestOfElement(xmlReader); return model; }
/** * {@inheritDoc} */ public Database readModelFromDatabase(Connection connection, String name, String catalog, String schema, String[] tableTypes) throws DatabaseOperationException { try { JdbcModelReader reader = getModelReader(); Database model = reader.getDatabase(connection, name, catalog, schema, tableTypes); postprocessModelFromDatabase(model); if ((model.getName() == null) || (model.getName().length() == 0)) { model.setName(MODEL_DEFAULT_NAME); } return model; } catch (SQLException ex) { throw new DatabaseOperationException(ex); } }
Database targetModel = new Database(); targetModel.initialize(); Table[] tables = _tableNames != null ? targetModel.findTables(_tableNames, task.isUseDelimitedSqlIdentifiers()) : targetModel.findTables(_tableNameRegExp, task.isUseDelimitedSqlIdentifiers()); targetModel.removeTables(tables);
Table table = _model.findTable(tableName, isCaseSensitive()); DynaBean bean = _model.createDynaBeanFor(table);