Skip to content

Commit 5dfb1cd

Browse files
authored
Merge pull request #2159 from BEXIS2/rc
Rc
2 parents c61dbc8 + 5b10576 commit 5dfb1cd

File tree

22 files changed

+561
-170
lines changed

22 files changed

+561
-170
lines changed

Components/AAA/BExIS.Security.Services/Utilities/MessageHelper.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,22 @@ public static string GetDeleteDatasetMessage(long datasetid, string userName, st
3838
return message + ".";
3939
}
4040

41+
public static string GetUndoDeleteDatasetHeader(long datasetid, string entityname)
42+
{
43+
return $"{entityname}: Restore (ID {datasetid})";
44+
}
45+
46+
public static string GetUndoDeleteDatasetMessage(long datasetid, string userName, string entityname)
47+
{
48+
string message = $"{entityname} with ID <b>{datasetid}</b> was restored";
49+
50+
if (!string.IsNullOrEmpty(userName))
51+
52+
return message += $" by <b>{userName}</b>";
53+
54+
return message + ".";
55+
}
56+
4157
public static string GetTryToDeleteDatasetHeader(long datasetid, string entityname)
4258
{
4359
return $"{entityname}: Try to delete ID {datasetid}";

Components/DLM/BExIS.Dlm.Services/Data/DatasetManager.cs

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,164 @@ public bool UndoDeleteDataset(Int64 datasetId, string username, bool rollbackChe
592592
}
593593
}
594594

595+
/// <summary>
596+
/// Reset data of a dataset
597+
/// If the dataset is checked out and the <paramref name="rollbackCheckout"/> is
598+
/// True, the dataset's changes will be roll-backed and then the delete operation takes place, but if the <paramref name="rollbackCheckout"/> is false,
599+
/// The changes will be checked in as a new version and then the deletion operation is executed.
600+
/// </summary>
601+
/// <param name="datasetId">The identifier of the dataset to be checked-in.</param>
602+
/// <param name="username">The username that performs the check-in, which should be the same as the check-out username.</param>
603+
/// <param name="rollbackCheckout">Determines whether latest uncommitted changes should be rolled back or checked in before marking the dataset as deleted.</param>
604+
/// <returns>True if the dataset is deleted, False otherwise.</returns>
605+
public bool RevertLastVersionOfDataset(Int64 datasetId, string username, bool rollbackCheckout)
606+
{
607+
string deleteReason = "Revert of entity " + datasetId; // @ToDO replace by variable from UI
608+
Contract.Requires(datasetId >= 0);
609+
610+
using (IUnitOfWork uow = this.GetUnitOfWork())
611+
{
612+
IRepository<Dataset> datasetRepo = uow.GetRepository<Dataset>();
613+
IRepository<DatasetVersion> datasetVersionRepo = uow.GetRepository<DatasetVersion>();
614+
IRepository<DataTuple> tupleRepo = uow.GetRepository<DataTuple>();
615+
IRepository<DataTupleVersion> tupleVersionRepo = uow.GetRepository<DataTupleVersion>();
616+
IRepository<ContentDescriptor> contentDescriptorRepo = uow.GetRepository<ContentDescriptor>();
617+
618+
//this.DatasetRepo.Evict();
619+
//this.DatasetVersionRepo.Evict();
620+
//this.DataTupleRepo.Evict();
621+
//this.DataTupleVerionRepo.Evict();
622+
623+
Dataset entity = datasetRepo.Get(datasetId);
624+
if (entity.Status == DatasetStatus.Deleted)
625+
return false;
626+
/// the dataset must be in CheckedIn state to be deleted
627+
/// so if it is checked out, the checkout version (working copy) is removed first
628+
if (entity.Status == DatasetStatus.CheckedOut)
629+
{
630+
if (rollbackCheckout == true)
631+
{
632+
this.undoCheckout(entity.Id, username, false); // commit and behavior: create|refresh
633+
}
634+
else
635+
{
636+
throw new Exception(string.Format("Dataset {0} is in check out state, which prevents it from being deleted. Rollback the changes or check them in and try again", entity.Id));
637+
}
638+
}
639+
640+
try
641+
{
642+
643+
// get the latest dataset with data (a)
644+
entity = datasetRepo.Get(entity.Id);
645+
var versions = entity.Versions.OrderBy(v => v.Id);
646+
647+
if (versions.Count() <= 1) return false; // can not revert if one
648+
649+
var toDeletedDatasetVersion = versions.ElementAt(entity.Versions.Count - 1); // select the last version to be deleted
650+
var lastDatasetVersion = versions.ElementAt(entity.Versions.Count - 2); // select the second last version to be the new last version
651+
652+
// get all old tuples version that go to the datatuples table
653+
var oldTupleVersions = tupleVersionRepo.Query().Where(t =>
654+
t.DatasetVersion.Id.Equals(lastDatasetVersion.Id) &&
655+
t.ActingDatasetVersion.Id.Equals(toDeletedDatasetVersion.Id)
656+
).ToList();
657+
658+
// copy datatuplversions -> datatuples table
659+
List<DataTuple> datatuples = new List<DataTuple>();
660+
foreach (var oldTupleVersion in oldTupleVersions)
661+
{
662+
DataTuple tuple = new DataTuple()
663+
{
664+
TupleAction = TupleAction.Edited,
665+
Extra = oldTupleVersion.Extra,
666+
//Id = orginalTuple.Id,
667+
OrderNo = oldTupleVersion.OrderNo,
668+
Timestamp = oldTupleVersion.Timestamp,
669+
XmlAmendments = oldTupleVersion.XmlAmendments,
670+
JsonVariableValues = oldTupleVersion.JsonVariableValues,
671+
DatasetVersion = oldTupleVersion.DatasetVersion, //latestCheckedInVersion,
672+
Values = oldTupleVersion.Values
673+
};
674+
675+
datatuples.Add(tuple);
676+
}
677+
678+
if (datatuples != null && datatuples.Count > 0)
679+
{
680+
int batchSize = uow.PersistenceManager.PreferredPushSize;
681+
List<DataTuple> processedTuples = null;
682+
long iterations = datatuples.Count / batchSize;
683+
if (iterations * batchSize < datatuples.Count)
684+
iterations++;
685+
for (int round = 0; round < iterations; round++)
686+
{
687+
processedTuples = datatuples.Skip(round * batchSize).Take(batchSize).ToList();
688+
tupleRepo.Put(processedTuples);
689+
uow.ClearCache(true); //flushes one batch of tuples
690+
processedTuples.Clear();
691+
GC.Collect();
692+
}
693+
}
694+
695+
// // delete the old tuple versions
696+
tupleVersionRepo.Delete(oldTupleVersions.Select(v => v.Id).ToList());
697+
698+
699+
// all new tuples need to be deleted
700+
var newTuples = tupleRepo.Query().Where(t =>
701+
t.DatasetVersion.Id.Equals(toDeletedDatasetVersion.Id)
702+
).ToList();
703+
704+
tupleRepo.Delete(newTuples.Select(v => v.Id).ToList());
705+
706+
//uow.Commit(); // commit datatuple changes
707+
708+
lastDatasetVersion = datasetVersionRepo.Get(lastDatasetVersion.Id);
709+
lastDatasetVersion.Status = DatasetVersionStatus.CheckedIn;
710+
datasetVersionRepo.Put(lastDatasetVersion);
711+
712+
entity.Status = DatasetStatus.CheckedIn;
713+
714+
// check content descriptors
715+
if (toDeletedDatasetVersion.ContentDescriptors.Any())
716+
{
717+
foreach (var contentDescriptor in toDeletedDatasetVersion.ContentDescriptors)
718+
{
719+
// remove the content descriptor from the dataset version
720+
contentDescriptorRepo.Delete(contentDescriptor.Id);
721+
}
722+
}
723+
724+
datasetVersionRepo.Delete(toDeletedDatasetVersion.Id);
725+
//entity.Versions.Remove(deletedDatasetVersion);
726+
727+
entity = datasetRepo.Get(datasetId); // maybe not needed!
728+
entity.Status = DatasetStatus.CheckedIn;
729+
datasetRepo.Put(entity);
730+
uow.Commit();
731+
732+
// if any problem was detected during the commit, an exception will be thrown!
733+
if (entity.DataStructure != null)
734+
{
735+
SyncView(entity.Id, ViewCreationBehavior.Create | ViewCreationBehavior.Refresh);
736+
}
737+
738+
LoggerFactory.LogCustom("entity " + datasetId + " returns from last version status");
739+
740+
return (true);
741+
}
742+
catch (Exception ex)
743+
{
744+
if (!IsDatasetCheckedIn(datasetId))
745+
{
746+
checkInDataset(entity.Id, "Checked-in after failed revert try!", username, false, ViewCreationBehavior.Create | ViewCreationBehavior.Refresh, "", TagType.None);
747+
}
748+
return false;
749+
}
750+
}
751+
}
752+
595753
/// <summary>
596754
/// Physically deletes the whole dataset, including its versions and data tuples, from the database.
597755
/// </summary>

Components/DLM/BExIS.Dlm.Tests/Helpers/DatasetHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,14 +302,14 @@ public Dataset GenerateTuplesWithRandomValuesForDataset(Dataset dataset, Structu
302302
}
303303
}
304304

305-
public Dataset UpdateOneTupleForDataset(Dataset dataset, StructuredDataStructure dataStructure, long id, int value, DatasetManager datasetManager)
305+
public Dataset UpdateOneTupleForDataset(Dataset dataset, StructuredDataStructure dataStructure, long id, int value,string username, DatasetManager datasetManager)
306306
{
307307
dataset.Status.Should().Be(DatasetStatus.CheckedIn);
308308
dataset.Should().NotBeNull();
309309

310310
try
311311
{
312-
if (datasetManager.IsDatasetCheckedOutFor(dataset.Id, "David") || datasetManager.CheckOutDataset(dataset.Id, "David"))
312+
if (datasetManager.IsDatasetCheckedOutFor(dataset.Id, username) || datasetManager.CheckOutDataset(dataset.Id, username))
313313
{
314314
dataset.Status.Should().Be(DatasetStatus.CheckedOut, "Dataset must be in Checkedout status.");
315315

0 commit comments

Comments
 (0)