package er.extensions.migration;
import com.webobjects.eoaccess.EOAdaptorChannel;
import com.webobjects.eoaccess.EOModel;
import com.webobjects.eocontrol.EOEditingContext;
import com.webobjects.foundation.NSArray;
/**
* IERXMigration is the interface that you must implement to provide a migration from one version to another.
* <p>
* You should not saveChanges() on the editing context passed into the methods of this interface (unless it cannot be
* avoided), because there is a transaction above you.
* <p>
* You also must be very careful of the EO operations you perform with this editing context. You may be in the process
* of upgrading across multiple model versions, so it is possible that you model you are using may be out of sync with
* the underlying database at the time this particular migration is being performed in the sequence. For instance, you
* would always be running with the latest version model, but this might be migration 3 of 5 required to get your
* database in sync with this latest model version, so the transitional model that existed when version 3 was valid may
* no longer exist. In general, you should only do low level channel operations during migration. Though, the editing
* context is provided here as a convenience for use under controlled circumstances if you know it will not be a
* problem. You can use the IERXPostMigration interface if you need to execute (in a restricted way) EO operations.
*
* @author mschrag
*/
public interface IERXMigration {
/**
* Returns an array of ModelVersion objects that this migration depends on.
*
* @return an array of model versions that this migration depends on
*/
public NSArray<ERXModelVersion> modelDependencies();
/**
* Called when migrating the database from the last version to this version. For instance if this is AuthModel1, it
* will be called to migrate from version 0 to version 1.
*
* @param editingContext
* the editing context you can perform EO operations with.
* @param channel
* the channel to perform low level operations with
* @param model
* the model being upgraded
* @throws Throwable
* if something fails
*/
public void upgrade(EOEditingContext editingContext, EOAdaptorChannel channel, EOModel model) throws Throwable;
/**
* Called when migrating the database from the next version to this version. For instance if this is AuthModel1, it
* will be called to migrate from version 1 back to version 0.
*
* If this is the lowest migration you support, downgrade should throw an ERXMigrationFailedException.
*
* @param editingContext
* the editing context you can perform EO operations with.
* @param channel
* the channel to perform low level operations with
* @param model
* the model being downgraded
* @throws Throwable
* if something fails
*/
public void downgrade(EOEditingContext editingContext, EOAdaptorChannel channel, EOModel model) throws Throwable;
}