示例#1
0
 protected override void Prepare(JoobContext ctx, Root root)
 {
     _layer = new SpatialLayer {
         Name = _layerName
     };
     root.OtherSpatialLayers.Add(_layer);
 }
 protected virtual void Prepare(JoobContext ctx, Root root)
 {
 }
        protected override bool Import(WorkerParameter workParam)
        {
            var totalLines = workParam.TotalLines;
            var enumerator = workParam.Enumerator;
            var workBlock  = totalLines < 500 ? 5 : totalLines / 100;

            try
            {
                using (var ctx = new JoobContext())
                {
                    using (var tx = ctx.BeginTransaction())
                    {
                        ReportProgress(0, "Opening database...");

                        var root = ctx.FirstInstance <Root>() ?? new Root();
                        if (!ContinueWork(tx, workParam))
                        {
                            return(false);
                        }

                        Prepare(ctx, root);

                        var counter = 0;
                        ReportProgress(0, "Importing data...");

                        while (enumerator.MoveNext())
                        {
                            if (!ContinueWork(tx, workParam))
                            {
                                return(false);
                            }

                            var line = enumerator.Current;

                            if (line.StartsWith("--"))
                            {
                                continue;
                            }

                            T result;
                            if (ParseLine(line, root, out result))
                            {
                                workParam.ImportedObjects.Add(result);

                                counter++;
                                if (counter % workBlock == 0)
                                {
                                    ReportProgress(counter);
                                }
                            }
                            else
                            {
                                workParam.NumIgnored++;
                            }
                        }

                        //Debug.Assert(workParam.ImportedObjects.Count + workParam.NumIgnored == totalLines);

                        ReportProgress(counter, "Committing changes...");
                        tx.Commit();
                    }
                }

                return(true);
            }
            catch
            {
                workParam.ImportedObjects.Clear();
                workParam.NumIgnored = totalLines;
                return(false);
            }
        }