Ejemplo n.º 1
0
        private void GetResultPage(ImportResponse response, int pageSize)
        {
            CachedImportRequest cachedRequest = this.GetFromCache(response.Context);

            int itemCount = 0;

            response.Objects    = new List <CSEntryChange>();
            response.TotalItems = cachedRequest.Count;

            if (pageSize > 0)
            {
                CSEntryChange csentry;

                while (cachedRequest.Queue.TryDequeue(out csentry))
                {
                    itemCount++;

                    response.Objects.Add(csentry);

                    if (itemCount >= pageSize)
                    {
                        break;
                    }
                }
            }

            if (cachedRequest.Queue.IsEmpty && cachedRequest.ProducerComplete)
            {
                response.HasMoreItems = false;
            }
            else
            {
                response.HasMoreItems = true;
            }
        }
Ejemplo n.º 2
0
 private void AddToCache(string context, CachedImportRequest request)
 {
     AcmaSyncService.cache.Add(context, request, new CacheItemPolicy()
     {
         SlidingExpiration = new TimeSpan(0, 10, 0)
     });
 }
Ejemplo n.º 3
0
        private void ProduceCSEntryChanges(ResultEnumerator results, Schema schema, CachedImportRequest request)
        {
            ParallelOptions op = new ParallelOptions();

            op.CancellationToken      = new CancellationToken();
            request.CancellationToken = op.CancellationToken;
            op.MaxDegreeOfParallelism = 1;

            Parallel.ForEach(results, op, item =>
            {
                if (op.CancellationToken.IsCancellationRequested)
                {
                    return;
                }

                string objectClassName = item.ObjectClass == null ? item.DeltaObjectClassName : item.ObjectClass.Name;
                SchemaType type        = schema.Types.FirstOrDefault(t => t.Name == objectClassName);

                if (type == null)
                {
                    return;
                }

                CSEntryChange csentry = null;

                try
                {
                    csentry = item.ToCSEntryChange(type);
                    MAStatistics.AddImportOperation();
                }
                catch (Exception ex)
                {
                    MAStatistics.AddImportError();

                    if (csentry == null)
                    {
                        csentry = CSEntryChange.Create();
                    }

                    if (string.IsNullOrWhiteSpace(csentry.DN))
                    {
                        csentry.ErrorCodeImport = MAImportError.ImportErrorCustomStopRun;
                    }
                    else
                    {
                        csentry.ErrorCodeImport = MAImportError.ImportErrorCustomContinueRun;
                    }

                    csentry.ErrorName   = ex.Message;
                    csentry.ErrorDetail = ex.StackTrace;
                }

                request.Queue.Enqueue(csentry);
            });

            request.ProducerComplete = true;
        }
Ejemplo n.º 4
0
        private void StartProducerThread(ResultEnumerator results, Schema schema, CachedImportRequest request)
        {
            Task t = new Task(() =>
            {
                this.ProduceCSEntryChanges(results, schema, request);
            });

            t.Start();
        }
Ejemplo n.º 5
0
        public ImportResponse ImportStart(ImportStartRequest request)
        {
            Logger.WriteLine("Import request received");
            MAStatistics.StartOperation(MAOperationType.Import);

            ImportResponse      response      = new ImportResponse();
            CachedImportRequest cachedRequest = new CachedImportRequest();

            cachedRequest.Request = request;

            if (cachedRequest.Request.ImportType == OperationType.Delta)
            {
                this.ProcessOperationEvents(AcmaEventOperationType.DeltaImport);
            }
            else
            {
                this.ProcessOperationEvents(AcmaEventOperationType.FullImport);
            }

            byte[] watermark = ActiveConfig.DB.GetHighWatermarkMAObjectsDelta();
            response.Watermark          = watermark == null ? null : Convert.ToBase64String(watermark);
            cachedRequest.HighWatermark = watermark;
            Logger.WriteLine("Got delta watermark: {0}", response.Watermark);

            ResultEnumerator enumerator;

            if (cachedRequest.Request.ImportType == OperationType.Delta)
            {
                enumerator = ActiveConfig.DB.EnumerateMAObjectsDelta(watermark);
            }
            else
            {
                enumerator = ActiveConfig.DB.EnumerateMAObjects(cachedRequest.Request.Schema.Types.Select(t => t.Name).ToList(), null, null);
            }

            cachedRequest.Queue = new ConcurrentQueue <CSEntryChange>();
            cachedRequest.Count = enumerator.TotalCount;
            this.StartProducerThread(enumerator, request.Schema, cachedRequest);

            response.Context = Guid.NewGuid().ToString();

            this.AddToCache(response.Context, cachedRequest);
            this.GetResultPage(response, request.PageSize);

            return(response);
        }