예제 #1
0
        /// <summary>
        /// Loads pending packages.
        /// </summary>
        /// <param name="worker">The worker.</param>
        public bool Load(ActionWorker worker)
        {
            if (IsLoading)
            {
                return(false);
            }

            bool loadResult;

            Owner.DoBeforeLoad(new LoadEventArgs(worker));
            worker.ReportProgress(Localizer.LoadingStarted);
            Interlocked.Increment(ref loadNesting);
            try
            {
                using (var applicationObjectSpace = XafDeltaModule.XafApp.CreateObjectSpace())
                {
                    var currentNodeId = ReplicationNode.GetCurrentNodeId(applicationObjectSpace);

                    // select pending input packages
                    var inputPackages =
                        applicationObjectSpace.GetObjects <Package>(CriteriaOperator.Parse(
                                                                        "ApplicationName = ? And (RecipientNodeId = ? Or RecipientNodeId = ?) " +
                                                                        "And (SenderNodeId <> ?)",
                                                                        Owner.ApplicationName, currentNodeId, ReplicationNode.AllNodes,
                                                                        Owner.CurrentNodeId)).
                        Where(x => x.LoadedDateTime == DateTime.MinValue).ToList();

                    worker.ReportProgress(string.Format(Localizer.PackagesSelectedForLoading, inputPackages.Count));

                    // load each package until cancellation or error occured
                    loadResult = true;
                    foreach (var inputPackage in inputPackages.OrderBy(x => x.PackageDateTime).TakeWhile(z => !worker.CancellationPending))
                    {
                        // loadResult &= LoadPackage(new LoadPackageContext(inputReplica,worker, applicationObjectSpace, currentNodeId));
                        loadResult &= LoadPackage(worker, inputPackage);
                        if (!loadResult)
                        {
                            break;
                        }
                    }

                    applicationObjectSpace.CommitChanges();
                }
            }
            finally
            {
                Interlocked.Decrement(ref loadNesting);
                worker.ReportProgress(Color.Blue, Localizer.LoadingIsFinished);
            }
            Owner.DoAfterLoad(new LoadEventArgs(worker));
            return(loadResult);
        }
예제 #2
0
        /// <summary>
        /// Loads the package.
        /// </summary>
        /// <param name="worker">The worker.</param>
        /// <param name="package">The package.</param>
        public bool LoadPackage(ActionWorker worker, Package package)
        {
            bool result;

            Interlocked.Increment(ref loadNesting);
            try
            {
                using (var applicationObjectSpace = XafDeltaModule.XafApp.CreateObjectSpace())
                {
                    var currentNodeId = ReplicationNode.GetCurrentNodeId(applicationObjectSpace);
                    result = LoadPackage(new LoadPackageContext(package, worker,
                                                                applicationObjectSpace, currentNodeId));
                    applicationObjectSpace.CommitChanges();
                }
                var packageObjectSpace = ObjectSpace.FindObjectSpaceByObject(package);
                packageObjectSpace.CommitChanges();
            }
            finally
            {
                Interlocked.Decrement(ref loadNesting);
            }
            return(result);
        }