示例#1
0
 private void RunTest(string query)
 {
     outputEditor.Text = ArasXsltExtensions.Transform(query, _xmlWriter.ToString(), _wizard.Connection);
 }
示例#2
0
        public void ProcessImport(IDataExtractor extractor, string xslt, int batchSize)
        {
            _extractor = extractor;
            Exception error = null;

            _completeDate      = DateTime.MinValue;
            _globallyProcessed = 0;

            try
            {
                extractor.Reset();
                using (_cts = new CancellationTokenSource())
                {
                    var opts = new ParallelOptions();
                    opts.CancellationToken = _cts.Token;

                    Parallel.ForEach(GetXml(extractor, batchSize), opts, xml =>
                    {
                        int locallyProcessed = 0;
                        var doc = new XmlDocument();
                        doc.LoadXml(ArasXsltExtensions.Transform(xslt, xml, _conn.ExternalConnection));
                        IList <XmlElement> levelElements = new XmlElement[] { doc.DocumentElement };

                        while (!levelElements.Any(e => e.LocalName == "AML" || e.LocalName == "SQL" ||
                                                  e.LocalName == "sql" || e.LocalName == "Item"))
                        {
                            levelElements = levelElements.Elements(e => true).ToList();
                        }

                        var isError = false;
                        for (var i = 0; i < levelElements.Count; i++)
                        {
                            Action <int, int> progressReporter = (curr, count) =>
                            {
                                var progress = (int)(((double)(count * i + curr) / (count * levelElements.Count)) * batchSize);
                                if (progress > locallyProcessed)
                                {
                                    Interlocked.Add(ref _globallyProcessed, progress - locallyProcessed);
                                }
                                locallyProcessed = progress;
                                SignalProgress(batchSize);
                            };

                            XmlNode result;
                            switch (levelElements[i].LocalName)
                            {
                            case "AML":
                                result = _conn.CallAction("ApplyAML", levelElements[i], progressReporter);
                                break;

                            case "SQL":
                            case "sql":
                                result = _conn.CallAction("ApplySQL", levelElements[i], progressReporter);
                                break;

                            case "Item":
                                result = _conn.CallAction("ApplyItem", levelElements[i], progressReporter);
                                break;

                            default:
                                result = null;
                                break;
                            }

                            if (_conn.GetError(result) != null)
                            {
                                _errors.Add(new ErrorEntry()
                                {
                                    Error = result.OuterXml, Query = xml
                                });
                                isError = true;
                                break;
                            }
                        }

                        if (isError)
                        {
                            Interlocked.Increment(ref _errorBlocks);
                        }
                        Interlocked.Add(ref _globallyProcessed, batchSize - locallyProcessed);

                        SignalProgress(batchSize);
                        opts.CancellationToken.ThrowIfCancellationRequested();
                    });
                }
            }
            catch (OperationCanceledException) { }
            catch (Exception ex)
            {
                error = ex;
            }
            finally
            {
                _cts = null;
            }

            _completeDate = DateTime.Now;
            OnActionComplete(new ActionCompleteEventArgs()
            {
                Exception = error
            });
        }