I _think_ that requests will be accepted before that point, but not dispatched.
I am not sure why finishInitialization() is called before migrating: public final void finishInitialization(NSNotification n) { finishInitialization(); if (ERXMigrator.shouldMigrateAtStartup()) { ERXMigrator migrator = migrator(); migrationsWillRun(migrator); migrator.migrateToLatest(); migrationsDidRun(migrator); } NSNotificationCenter.defaultCenter().postNotification(new NSNotification(ERXApplication.ApplicationDidFinishInitializationNotification, this)); }
It would be a good place to to do post-migration work if it was called after. Mike, why is this before? Or, one could implement didFinishInitialization in Wonder, triggered by that notification.
Chuck
On Apr 6, 2011, at 12:10 PM, John Huss wrote: But when didFinishLaunching happens the app is already accepting requests (if concurrent handling is turned on), isn't it? I thought so; if so, that's not a good place to do something that your app requires to run correctly.
John On Wed, Apr 6, 2011 at 2:02 PM, Miguel Angel Torres Avila <email@hidden> wrote:
Thanks Chuck, I implemented the third option and worked like a charm!
On Apr 6, 2011, at 1:46 PM, Chuck Hill wrote:
I will suggest not doing that in a Wonder app. :-) I think you should move the code. There are a few choices:
1. Use this notification: /**
* Notification to post when all application initialization processes are complete (including migrations)
*/
public static final String ApplicationDidFinishInitializationNotification = "NSApplicationDidFinishInitializationNotification";
2. Use this method:
/** * Called after migrations finish running.
* @param migrator the migrator that was used
*/
protected void migrationsDidRun(ERXMigrator migrator) {
// DO NOTHING }
3. Use this method:
/** * Called when the application posts
* {@link WOApplication#ApplicationDidFinishLaunchingNotification}.
* Override this to perform application specific tasks after the application
* has been initialized. THis is a good spot to perform batch application
* tasks.
*/
public void didFinishLaunching() {
}
Chuck
On Apr 6, 2011, at 11:07 AM, Miguel Angel Torres Avila wrote:
Thanks Chuck, Paul and Mike for your help
The principal problem was that Migrations functionality is called automatically after my own code that loads some info from de data base, so if the migration has changes in a table that is considered in my code the app crashes before the migration occurs.
The solution is to add the Chuck's code before everything else in the constructor of my Application class.
if (ERXMigrator.shouldMigrateAtStartup()) {
try {
migrator().migrateToLatest(); }
catch (ERXMigrationFailedException e) {
// It might be a missing plugin problem
new ERXJDBCConnectionAnalyzer(databaseConnectionDictionary()); throw e;
} }
On Apr 6, 2011, at 12:51 PM, Paul D Yu wrote:
Look at the _dbupdater table in your database.
It should have a row in there with your EOModel name in it; set the version back to null.
Paul
On Apr 6, 2011, at 1:43 PM, Mike Schrag wrote: More than likely you've already run once, and the migration did nothing, so it succeeded, and it's not going to run it again unless you modify the data in the migration version table to reset it back.
On Apr 6, 2011, at 1:24 PM, Miguel Angel Torres Avila wrote:
Thanks Paul
For some reason the code inside the upgrade class is never called.
I think I should mistyped something. I am checking now.
On Apr 6, 2011, at 12:16 PM, Paul D Yu wrote: Miguel
You will need to call the external sql script from inside of your Migration.java file.
@Override public void upgrade(EOEditingContext editingContext, ERXMigrationDatabase database) throws Throwable {
ERXJDBCUtilities.executeUpdateScriptFromResourceNamed(database.adaptorChannel(), "DInAdminEOModel1_Postgresql_Upgrade.migration", "DIModelFramework");
}
Something like that?
Paul On Apr 6, 2011, at 1:07 PM, Chuck Hill wrote:
Is this a "full" Wonder app, extending ERXApplication? If not, you need to initiate the migration:
if (ERXMigrator.shouldMigrateAtStartup()) {
try {
migrator().migrateToLatest(); }
catch (ERXMigrationFailedException e) {
// It might be a missing plugin problem
new ERXJDBCConnectionAnalyzer(databaseConnectionDictionary()); throw e;
} }
Chuck
On Apr 6, 2011, at 9:47 AM, Miguel Angel Torres Avila wrote:
Hi all,
I am trying to implement Migrations in an existing Application.
I followed the instructions in this page:
and this one
I think the steps are:
1. Modify properties file:
# Migrations
er.migration.migrateAtStartup=true er.migration.createTablesIfNecessary=true
er.migration.modelNames=DInAdminEOModel er.extensions.migration.ERXMigration.useDatabaseSpecificMigrations=true
DInAdminEOModel.InitialMigrationVersion=1
DInAdminEOModel.MigrationClassPrefix=com.toracom.app.migration.DInAdminEOModel
2. Create class com.toracom.app.migration.DInAdminEOModel1.java
/////// BEGIN CLASS
package com.toracom.app.migration;
import com.webobjects.eoaccess.EOAdaptorChannel; import com.webobjects.eoaccess.EOModel;
import com.webobjects.eocontrol.EOEditingContext;
import com.webobjects.foundation.NSArray;
import er.extensions.migration.ERXMigration; import er.extensions.migration.ERXModelVersion;
public class DInAdminEOModel1 extends ERXMigration {
public NSArray<ERXModelVersion> modelDependencies() {
return null;
}
@Override
public void upgrade(EOEditingContext editingContext, EOAdaptorChannel channel, EOModel model) throws Throwable {
}
@Override public void downgrade(EOEditingContext editingContext, EOAdaptorChannel channel, EOModel model) throws Throwable {
// TODO Auto-generated method stub
} }
////// END CLASS
3. Create DInAdminEOModel1_Postgresql_Upgrade.migration file
ALTER TABLE parametros ADD COLUMN modulo_cfdivault_habilitado varchar(5);
UDPATE parametros SET modulo_cfdivault_habilitado = 'false';
ALTER TABLE parametros ALTER COLUMN modulo_cfdivault_habilitado SET NOT NULL;
When I run my application never get the SQL code executed. In the Application class I load a Parametros entity but I get the following error
Apr 06 11:38:11 dinadmin[55559] DEBUG NSLog - evaluateExpression: <com.webobjects.jdbcadaptor.PostgresqlExpression: "SELECT DISTINCT t0.directorio_raiz_procesamiento_cfd, t0.email_formato, t0.encoding_archivo_fuente, t0.encoding_escritura_cfd, t0.encoding_escritura_div_sol, t0.encoding_escritura_xml_co, t0.encoding_escritura_xml_impresion, t0.encoding_lectura_jaxb, t0.encoding_obtencion_co, t0.encoding_trans_co, t0.fh, t0.fhc, t0.formato_fecha_dhtmlxgrid, t0.formato_numero_registro_bd, t0.formato_numero_registro_bd_corto, t0.fsh, t0.fshnm, t0.iva, t0.logs_debug, t0.logs_path, t0.logs_stdout, t0.metodo_impresion, t0.modulo_cfdivault_habilitado, t0.moneda_id, t0.nd, t0.ne, t0.nm, t0.nombre_aplicacion, t0.np, t0.ntc, t0.parametros_id, t0.retraso_daemon, t0.rfc_fisica, t0.rfc_moral, t0.sistema_inicializado, t0.url_birt_viewer, t0.version_comprobante FROM parametros t0" withBindings: >
Apr 06 11:38:11 dinadmin[55559] DEBUG NSLog - === Rollback Internal Transaction
ERROR: column t0.modulo_cfdivault_habilitado does not existat org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1608)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1343)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:194)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:336)
Because the modulo_cfdivault_habilitado column does not exist, so the migration's file is never executed.
Am I missing something, maybe a missing Framework?
Thanks in advance.
_______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list ( email@hidden)
This email sent to email@hidden
-- Chuck Hill Senior Consultant / VP Development
Practical WebObjects - for developers who want to increase their overall knowledge of WebObjects or who are trying to solve specific problems.
_______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list ( email@hidden)
_______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list ( email@hidden)
This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list ( email@hidden) Help/Unsubscribe/Update your Subscription:
_______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list ( email@hidden)
This email sent to email@hidden
_______________________________________________ Do not post admin requests to the list. They will be ignored.
This email sent to email@hidden
-- Chuck Hill Senior Consultant / VP Development
Practical WebObjects - for developers who want to increase their overall knowledge of WebObjects or who are trying to solve specific problems.
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ( email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden
-- Chuck Hill Senior Consultant / VP Development
Practical WebObjects - for developers who want to increase their overall knowledge of WebObjects or who are trying to solve specific problems.
|