Quintiq file version 2.0
|
#parent: #root
|
Method RollbackCurrentTransaction (
|
String message,
|
LibOpt_Error e,
|
Boolean logError
|
)
|
{
|
TextBody:
|
[*
|
rollback_storage := LibOpt_Utility::ConstructMathematicalProgramWithoutAnalysis();
|
|
rollback_storage.StoreString( LibOpt_Suboptimizer::RollbackStorage_HasRollback(), [String] true );
|
if( not isnull( this.SnapshotComponent() ) )
|
{
|
rollback_storage.StoreString( LibOpt_Suboptimizer::RollbackStorage_Snapshot(), this.SnapshotComponent().Serialize().AsString() );
|
}
|
|
if( not isnull( e ) )
|
{
|
rollback_storage.StoreString( LibOpt_Task::RollbackStorage_Error(), JSONIO::ExportToString( e, "iso8601", "iso8601", "iso8601", 0 ) );
|
}
|
|
current_transaction := LibOpt_CurrentTransaction::GetCurrentTransaction( this.Component() );
|
last_task := current_transaction.LastTask();
|
if( not isnull( last_task ) )
|
{
|
rollback_storage.StoreString( LibOpt_Task::RollbackStorage_Component(), [String] last_task.Component().Key() );
|
}
|
|
identifier := LibOpt_Task::AlgorithmStore_Identifier( this );
|
AlgorithmStore::TryRetrieve( identifier ); // Remove it from the AlgorithmStore if it is already stored.
|
AlgorithmStore::Store( identifier, & rollback_storage );
|
|
if( logError )
|
{
|
//if we have indicated we want to log this error it will be thrown below in the try block
|
//and then immediately consumed by the onfailure block
|
try
|
{
|
//create a separate program to undo and throw the error
|
progam := LibOpt_Utility::ConstructMathematicalProgramWithoutAnalysis();
|
progam.UndoStep( message );
|
}
|
onfailure
|
{
|
}
|
}
|
LibOpt_Utility::ThrowCleanError( message );
|
*]
|
}
|