Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FIX: Data insert/update/deletes are now better handled to calculate r… #2213

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
117 changes: 52 additions & 65 deletions backend/Origam.Server/Common/ServerEntityUIActionRunnerClient.cs
Expand Up @@ -159,31 +159,21 @@ public void SetModalDialogSize(ArrayList resultList,ExecuteActionProcessData pro
new Dictionary<string, IList<KeyValuePair<object, DataMergeChange>>>();
Dictionary<DataRow, List<DataRow>> deletedRowsParents = null;

try
if (entityWorkflowAction.CleanDataBeforeMerge)
{
sessionStore.UnregisterEvents();

if (entityWorkflowAction.CleanDataBeforeMerge)
{
targetData.AcceptChanges();

DatasetTools.Clear(targetData);
changes.Add(ChangeInfo.CleanDataChangeInfo());
}

deletedRowsParents = DatasetTools.GetDeletedRows(
sourceData, targetData);
MergeParams mergeParams = new MergeParams(profile.Id);
mergeParams.TrueDelete
= entityWorkflowAction.MergeType == ServiceOutputMethod.FullMerge;
DatasetTools.MergeDataSet(
targetData, sourceData, changeList, mergeParams);
targetData.AcceptChanges();

DatasetTools.Clear(targetData);
changes.Add(ChangeInfo.CleanDataChangeInfo());
}
finally
{
sessionStore.RegisterEvents();
}

deletedRowsParents = DatasetTools.GetDeletedRows(
sourceData, targetData);
MergeParams mergeParams = new MergeParams(profile.Id);
mergeParams.TrueDelete
= entityWorkflowAction.MergeType == ServiceOutputMethod.FullMerge;
DatasetTools.MergeDataSet(
targetData, sourceData, changeList, mergeParams);
// process rules (but not after clean merge, there we expect processed data
// we process the rules after merge so all data were merged before we start firing any
// events... If we would process rules WHILE merging, there would be a race condition - e.g.
Expand All @@ -192,57 +182,56 @@ public void SetModalDialogSize(ArrayList resultList,ExecuteActionProcessData pro
// value when being merged, thus, resulting in a not-rule-processed data.
if (!entityWorkflowAction.CleanDataBeforeMerge && sessionStore.HasRules)
{
foreach (var entry in changeList)
try
{
string tableName = entry.Key;

foreach (var rowEntry in entry.Value)
sessionStore.RegisterEvents();
foreach (var entry in changeList)
{
DataRow row = targetData.Tables[tableName].Rows.Find(rowEntry.Key);

DataRowState changeType = rowEntry.Value.State;

if (changeType == DataRowState.Added)
string tableName = entry.Key;
foreach (var rowEntry in entry.Value)
{
sessionStore.RuleHandler.OnRowChanged(new DataRowChangeEventArgs(row, DataRowAction.Add), sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
}

switch (changeType)
{
case DataRowState.Added:
sessionStore.RuleHandler.OnRowCopied(row, sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
break;

case DataRowState.Modified:
row.BeginEdit();
Hashtable changedColumns = rowEntry.Value.Columns;
if (changedColumns != null)
{
foreach (DictionaryEntry changedColumnEntry in changedColumns)
DataRow row = targetData.Tables[tableName].Rows.Find(rowEntry.Key);
DataRowState changeType = rowEntry.Value.State;
if (changeType == DataRowState.Added)
{
sessionStore.RuleHandler.OnRowChanged(new DataRowChangeEventArgs(row, DataRowAction.Add), sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
}
switch (changeType)
{
case DataRowState.Added:
sessionStore.RuleHandler.OnRowCopied(row, sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
break;
case DataRowState.Modified:
row.BeginEdit();
Hashtable changedColumns = rowEntry.Value.Columns;
if (changedColumns != null)
{
DataColumn changedColumn = (DataColumn)changedColumnEntry.Value;
object newValue = row[changedColumn];
sessionStore.RuleHandler.OnColumnChanged(new DataColumnChangeEventArgs(row, changedColumn, newValue), sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
foreach (DictionaryEntry changedColumnEntry in changedColumns)
{
DataColumn changedColumn = (DataColumn)changedColumnEntry.Value;
object newValue = row[changedColumn];
sessionStore.RuleHandler.OnColumnChanged(new DataColumnChangeEventArgs(row, changedColumn, newValue), sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
}
}
}
row.EndEdit();
break;

case DataRowState.Deleted:
// deletions later
break;

default:
throw new Exception(Resources.ErrorUnknownRowChangeState);
row.EndEdit();
break;
case DataRowState.Deleted:
// deletions later
break;
default:
throw new Exception(Resources.ErrorUnknownRowChangeState);
}
}
}
foreach (var deletedItem in deletedRowsParents)
{
sessionStore.RuleHandler.OnRowDeleted(deletedItem.Value.ToArray(), deletedItem.Key, sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
}
}

foreach (var deletedItem in deletedRowsParents)
finally
{
sessionStore.RuleHandler.OnRowDeleted(deletedItem.Value.ToArray(), deletedItem.Key, sessionStore.XmlData, sessionStore.RuleSet, sessionStore.RuleEngine);
sessionStore.UnregisterEvents();
}

}

// in any case update the list row - we do not know if it was changed directly (will be in changelist)
Expand Down Expand Up @@ -345,9 +334,7 @@ private static void AddSavedInfo(ArrayList changes)
}
if (entityWorkflowAction.CommitChangesAfterMerge)
{
sessionStore.UnregisterEvents();
data.AcceptChanges();
sessionStore.RegisterEvents();
AddSavedInfo(changes);
}
switch (entityWorkflowAction.RefreshAfterWorkflow)
Expand Down
10 changes: 1 addition & 9 deletions backend/Origam.Server/Session Stores/FormSessionStore.cs
Expand Up @@ -394,15 +394,7 @@ public override void RevertChanges()
{
lock (_getRowDataLock)
{
try
{
UnregisterEvents();
Data.RejectChanges();
}
finally
{
RegisterEvents();
}
Data.RejectChanges();
}
}

Expand Down
Expand Up @@ -147,7 +147,6 @@ internal virtual object Save()
}
}
// store the data
this.UnregisterEvents();
try
{
core.DataService.Instance.StoreData(
Expand All @@ -160,10 +159,6 @@ internal virtual object Save()
{
throw new RuleException(ex.Message);
}
finally
{
RegisterEvents();
}
if (RefreshAfterSaveType == SaveRefreshType.RefreshChangedRecords)
{
foreach (DataRow r in changedRows)
Expand Down