private void createTables(boolean dropTables) { for (Enumeration e = EOModelGroup.defaultGroup().models().objectEnumerator(); e.hasMoreElements(); ) { final EOModel eomodel = (EOModel) e.nextElement(); EODatabaseContext dbc = EOUtilities.databaseContextForModelNamed(ec, eomodel.name()); dbc.lock(); try { EOAdaptorChannel channel = dbc.availableChannel().adaptorChannel(); if (eomodel.adaptorName().contains("JDBC")) { EOSynchronizationFactory syncFactory = (EOSynchronizationFactory) channel.adaptorContext().adaptor().synchronizationFactory(); ERXSQLHelper helper = ERXSQLHelper.newSQLHelper(channel); NSDictionary options = helper.defaultOptionDictionary(true, dropTables); // Primary key support creation throws an unwanted exception // if // EO_PK_TABLE already // exists (e.g. in case of MySQL), so we add pk support in a // stand-alone step options = optionsWithPrimaryKeySupportDisabled(options); createPrimaryKeySupportForModel(eomodel, channel, syncFactory); String sqlScript = syncFactory.schemaCreationScriptForEntities(eomodel.entities(), options); log.info("Creating tables: {}", eomodel.name()); ERXJDBCUtilities.executeUpdateScript(channel, sqlScript, true); } } catch (SQLException ex) { log.error("Can't update", ex); } finally { dbc.unlock(); } } }
/** * Returns an EOAttribute with all of its fields filled in based on the properties of this * ERXMigrationColumn. The attribute is attached to the given entity. * * @param entity the entity to add the attribute to * @return an EOAttribute with all of its fields filled in */ @SuppressWarnings("unchecked") public EOAttribute _newAttribute(EOEntity entity) { EOAdaptor eoAdaptor = _table.database().adaptor(); // MS: Hack to make Memory adaptor migrations "work" if (!(eoAdaptor instanceof JDBCAdaptor)) { EOAttribute nonJdbcAttribute = new EOAttribute(); nonJdbcAttribute.setName(_name); nonJdbcAttribute.setColumnName(_name); nonJdbcAttribute.setExternalType("nonJdbcAttribute"); entity.addAttribute(nonJdbcAttribute); return nonJdbcAttribute; } JDBCAdaptor adaptor = (JDBCAdaptor) _table.database().adaptor(); ERXSQLHelper sqlHelper = ERXSQLHelper.newSQLHelper(adaptor); String externalType = sqlHelper.externalTypeForJDBCType(adaptor, _jdbcType); if (externalType == null) { externalType = "IF_YOU_ARE_SEEING_THIS_SOMETHING_WENT_WRONG_WITH_EXTERNAL_TYPES"; } EOAttribute attribute = adaptor.createAttribute( _name, _name, _jdbcType, externalType, _precision, _scale, _allowsNull ? 1 : 0); if (_width > 0) { attribute.setWidth(_width); } if (_defaultValue != null) { NSDictionary userInfo = attribute.userInfo(); NSMutableDictionary mutableUserInfo; if (userInfo == null) { mutableUserInfo = new NSMutableDictionary(); } else { mutableUserInfo = userInfo.mutableClone(); } mutableUserInfo.setObjectForKey(_defaultValue, "default"); attribute.setUserInfo(mutableUserInfo); } if (_overrideValueType != null) { if (ERXMigrationColumn.NULL_VALUE_TYPE.equals(_overrideValueType)) { attribute.setValueType(null); } else { attribute.setValueType(_overrideValueType); } if (sqlHelper.reassignExternalTypeForValueTypeOverride(attribute)) { adaptor.assignExternalTypeForAttribute(attribute); } } if (_overrideExternalType != null) { attribute.setExternalType(_overrideExternalType); } entity.addAttribute(attribute); return attribute; }
/** * Changes the data type of this column. * * @param jdbcType the new JDBC type of the column (see java.sql.Types) * @param scale the new scale * @param precision the new precision * @param width the new width * @param options the options to use for conversion (or null) * @throws SQLException if the change fails */ @SuppressWarnings("unchecked") public void setDataType(int jdbcType, int scale, int precision, int width, NSDictionary options) throws SQLException { JDBCAdaptor adaptor = (JDBCAdaptor) _table.database().adaptor(); String externalType = ERXSQLHelper.newSQLHelper(adaptor).externalTypeForJDBCType(adaptor, jdbcType); EOSchemaSynchronization schemaSynchronization = _table.database().synchronizationFactory(); NSArray<EOSQLExpression> expressions = schemaSynchronization.statementsToConvertColumnType( _name, _table.name(), null, new _ColumnType(externalType, scale, precision, width), options); ERXMigrationDatabase._ensureNotEmpty(expressions, "convert column type", true); ERXJDBCUtilities.executeUpdateScript( _table.database().adaptorChannel(), ERXMigrationDatabase._stringsForExpressions(expressions)); _jdbcType = jdbcType; _scale = scale; _precision = precision; _width = width; }