Apricot.Fetcher.Collect C# (CSharp) Method

Collect() public method

public Collect ( ) : int
return int
        public int Collect()
        {
            Queue<Uri> uriQueue = new Queue<Uri>(this.subscriptionList);
            Queue<Task<IEnumerable<Entry>>> taskQueue = new Queue<Task<IEnumerable<Entry>>>();
            List<Entry> entryList = new List<Entry>();
            int successfulRow = 0;

            this.entryList.Clear();

            while (uriQueue.Count > 0 || taskQueue.Count > 0)
            {
                while (uriQueue.Count > 0 && taskQueue.Count < 2 * Environment.ProcessorCount)
                {
                    WebRequest webRequest = WebRequest.Create(uriQueue.Dequeue());
                    Task<IEnumerable<Entry>> task = new Task<IEnumerable<Entry>>(delegate (object state)
                    {
                        WebRequest request = (WebRequest)state;
                        WebResponse response = null;
                        Stream s = null;
                        BufferedStream bs = null;

                        try
                        {
                            response = request.GetResponse();
                            s = response.GetResponseStream();
                            bs = new BufferedStream(s);
                            s = null;

                            XmlDocument xmlDocument = new XmlDocument();

                            xmlDocument.Load(bs);
                            xmlDocument.Normalize();

                            if (xmlDocument.DocumentElement.NamespaceURI.Equals("http://www.w3.org/1999/02/22-rdf-syntax-ns#") && xmlDocument.DocumentElement.LocalName.Equals("RDF"))
                            {
                                return ParseRss10(xmlDocument.DocumentElement);
                            }
                            else if (xmlDocument.DocumentElement.Name.Equals("rss"))
                            {
                                foreach (XmlAttribute xmlAttribute in xmlDocument.DocumentElement.Attributes)
                                {
                                    if (xmlAttribute.Name.Equals("version"))
                                    {
                                        if (xmlAttribute.Value.Equals("2.0"))
                                        {
                                            return ParseRss20(xmlDocument.DocumentElement);
                                        }

                                        break;
                                    }
                                }
                            }
                            else if (xmlDocument.DocumentElement.NamespaceURI.Equals("http://www.w3.org/2005/Atom") && xmlDocument.DocumentElement.LocalName.Equals("feed"))
                            {
                                return ParseAtom10(xmlDocument.DocumentElement);
                            }
                        }
                        finally
                        {
                            if (bs != null)
                            {
                                bs.Close();
                            }

                            if (s != null)
                            {
                                s.Close();
                            }

                            if (response != null)
                            {
                                response.Close();
                            }
                        }

                        return Enumerable.Empty<Entry>();
                    }, webRequest, TaskCreationOptions.LongRunning);

                    if (this.timeout.HasValue)
                    {
                        webRequest.Timeout = this.timeout.Value;
                    }

                    if (this.userAgent != null)
                    {
                        HttpWebRequest httpWebRequest = webRequest as HttpWebRequest;

                        if (httpWebRequest != null)
                        {
                            httpWebRequest.UserAgent = this.userAgent;
                        }
                    }

                    taskQueue.Enqueue(task);
                    task.Start();
                }

                Task<IEnumerable<Entry>>[] tasks = taskQueue.ToArray();
                int index = Task<IEnumerable<Entry>>.WaitAny(tasks);

                taskQueue.Clear();

                for (int i = 0; i < tasks.Length; i++)
                {
                    if (index == i)
                    {
                        if (tasks[i].Exception == null)
                        {
                            this.entryList.AddRange(tasks[i].Result);
                        }
                    }
                    else
                    {
                        taskQueue.Enqueue(tasks[i]);
                    }
                }
            }

            foreach (System.Configuration.ConnectionStringSettings settings in System.Configuration.ConfigurationManager.ConnectionStrings)
            {
                DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName);

                using (IDbConnection connection = factory.CreateConnection())
                {
                    connection.ConnectionString = settings.ConnectionString;
                    connection.Open();

                    this.entryList.ForEach(delegate (Entry entry)
                    {
                        if (entry.Resource != null)
                        {
                            string sql = null;

                            using (IDbCommand command = factory.CreateCommand())
                            {
                                command.Connection = connection;
                                command.CommandText = BuildSelectStatement(entry.Resource);

                                if ((int)command.ExecuteScalar() == 0)
                                {
                                    sql = BuildInsertStatement(entry);
                                }
                                else if (entry.Created < entry.Modified)
                                {
                                    sql = BuildUpdateStatement(entry);
                                }
                            }

                            if (sql != null)
                            {
                                using (IDbCommand c = factory.CreateCommand())
                                {
                                    c.Connection = connection;
                                    c.CommandText = sql;

                                    IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);

                                    c.Transaction = transaction;

                                    try
                                    {
                                        successfulRow += c.ExecuteNonQuery();

                                        transaction.Commit();
                                    }
                                    catch
                                    {
                                        transaction.Rollback();
                                    }
                                }
                            }
                        }
                    });
                }
            }

            return successfulRow;
        }