//--------------------------------------------------------------------------------------------------- public void Save(Course obj) { using (var transaction = SessionProvider.Instance.GetSession().BeginTransaction()) { SessionProvider.Instance.GetSession().SaveOrUpdate(obj); transaction.Commit(); } }
//--------------------------------------------------------------------------------------------------- public override Event Import(Repository.IImportRepository repository) { var index_page = LoadUrl(InternalEvent.Url); Event ev = GetEventSection(index_page); repository.Event(ref ev); var courses_node = index_page.DocumentNode.SelectSingleNode("//frame[@name=\"main\"]"); if (courses_node == null) { throw new ImportFormatNotSupportedException("Could not find the event main frame"); } var courses_address = courses_node.GetAttributeValue("src", String.Empty); if (string.IsNullOrWhiteSpace(courses_address)) { throw new ImportFormatNotSupportedException("Could not find the event classes address"); } var top_page = LoadUrl(InternalEvent.Url, courses_address); // Loop over classes var courses_nodes = top_page.DocumentNode.SelectNodes("//a[starts-with(@href, \"default.asp?page=table\")]"); foreach (var course_node in courses_nodes) { var course = new Course { Event = ev, Name = course_node.InnerText }; repository.Course(ref course); // The course page address needs massaging var course_url = course_node.Attributes["href"].Value.Replace("default.asp?page=table&", "table.asp?"); var course_page = LoadUrl(InternalEvent.Url, course_url); var result_nodes = course_page.DocumentNode.SelectNodes("//tr[starts-with(@onmouseover, \"highlight\")]"); // Two rows per result for (int i = 0; i < result_nodes.Count; i += 2) { var result = new Result { Course = course }; // Position can be a number or null, if null then use the string as a code var position_node = result_nodes[i].SelectSingleNode("td[1]"); try { result.Position = Convert.ToInt32(position_node.ChildNodes[0].InnerText); } catch (FormatException) { result.Position = null; } // Name var results_name_node = result_nodes[i].SelectSingleNode("td[2]"); result.Name = results_name_node.ChildNodes[0].InnerText; // Time var time_node = result_nodes[i].SelectSingleNode("td[3]/a"); try { result.Time = new TimeSpan( 0, Convert.ToInt32(time_node.ChildNodes[0].InnerText.Split(new char[] { '.' })[0]), Convert.ToInt32(time_node.ChildNodes[0].InnerText.Split(new char[] { '.' })[1]) ); } catch (FormatException) { result.Time = null; } // Club var club_name_node = result_nodes[i + 1].SelectSingleNode("td[1]"); result.ClubName = club_name_node.ChildNodes[0].InnerText; repository.Result(ref result); } } return ev; }
//--------------------------------------------------------------------------------------------------- private void ParseSinglePage( IImportRepository repository, HtmlDocument document, Event ev, string course_selector, string course_name_selector, string course_details_selector, string results_selector, string results_position_selector, string results_name_selector, string results_club_selector, string results_age_selector, string results_time_selector ) { // Courses var course_nodes = document.DocumentNode.SelectNodes(course_selector); foreach (var course_node in course_nodes) { Course course = new Course(); course.Event = ev; // Course name var name_node = course_node.SelectSingleNode(course_name_selector); course.Name = name_node.InnerText; // Course details var details_node = course_node.SelectSingleNode(course_details_selector); if (details_node != null) { course.Length = Convert.ToDecimal(details_node.InnerText.Split(new char[] { ' ' })[0].TrimEnd(new char[] { 'k', 'm' })); course.Climb = Convert.ToDecimal(details_node.InnerText.Split(new char[] { ' ' })[1].TrimEnd(new char[] { 'm' })); } // Commit the course repository.Course(ref course); // Results var results_nodes = course_node.SelectNodes(results_selector); foreach (var results_node in results_nodes) { Result result = new Result(); result.Course = course; // Position can be a number or null, if null then use the string as a code var position_node = results_node.SelectSingleNode(results_position_selector); try { result.Position = Convert.ToInt32(position_node.ChildNodes[0].InnerText.TrimEnd(new char[] { 'r', 's', 't', 'n', 'd', 'h' })); } catch (FormatException) { result.Position = null; result.Code = position_node.ChildNodes[0].InnerText; } // Name var results_name_node = results_node.SelectSingleNode(results_name_selector); result.Name = results_name_node.ChildNodes[0].InnerText; // Club var club_name_node = results_node.SelectSingleNode(results_club_selector); result.ClubName = club_name_node.ChildNodes[0].InnerText; // Age class var age_class_node = results_node.SelectSingleNode(results_age_selector); result.Age = age_class_node.ChildNodes[0].InnerText; // Time var time_node = results_node.SelectSingleNode(results_time_selector); try { result.Time = new TimeSpan( 0, Convert.ToInt32(time_node.ChildNodes[0].InnerText.Split(new char[] { ':' })[0]), Convert.ToInt32(time_node.ChildNodes[0].InnerText.Split(new char[] { ':' })[1]) ); } catch (FormatException) { result.Time = null; } // Commit the result repository.Result(ref result); } } }
//--------------------------------------------------------------------------------------------------- public IList<Result> Results(Course c) { return SessionProvider.Instance.GetSession().CreateQuery("FROM Result r WHERE r.Course = :course ORDER BY r.Code ASC, r.Position ASC") .SetEntity("course", c) .List<Result>(); }
public void Course(ref Course c) { c.Id = m_course_id++; m_courses.Add(c); }