#!/usr/bin/env perl use strict; use warnings; use TFLMonitor::Schema; use XML::LibXML; use XML::LibXML::XPathContext; use Path::Class; my $libdir=file(__FILE__)->parent; my $dbfile=$libdir->parent->file('monitor.db'); my $doc=XML::LibXML->load_xml(location=> 'http://cloud.tfl.gov.uk/TrackerNet/LineStatus'); die "Couldn't fetch status\n" unless $doc; my $schema=TFLMonitor::Schema->connect( "dbi:SQLite:dbname=$dbfile", '','', { AutoCommit => 1, }); my $xpath=XML::LibXML::XPathContext->new($doc); $xpath->registerNs('ws','http://webservices.lul.co.uk/'); my (%lines,%status,@ls); for my $ls ($xpath->findnodes(q{/ws:ArrayOfLineStatus/ws:LineStatus},$doc)) { my ($line)=$xpath->findnodes(q{ws:Line},$ls); my $line_id=$line->findvalue(q{@ID}); $lines{$line_id} ||= { id => $line_id, name => $line->findvalue(q{@Name}), }; my ($status)=$xpath->findnodes(q{ws:Status},$ls); my $status_code=$status->findvalue(q{@ID}); my $is_active=$status->findvalue(q{@IsActive}); $status{$status_code} ||= { code => $status_code, class => $status->findvalue(q{@CssClass}), description => $status->findvalue(q{@Description}), is_active => $is_active, }; push @ls,{ 'time' => time(), line_id => $line_id, status_code => $status_code, is_active => $is_active, details => $ls->findvalue(q{@StatusDetails}), }; } $schema->txn_do( sub{ for my $l (values %lines) { $schema->resultset('TFLMonitor::Schema::Line') ->find_or_create( $l, { key => 'primary' }, ); } for my $s (values %status) { $schema->resultset('TFLMonitor::Schema::Status') ->find_or_create( $s, { key => 'primary' }, ); } for my $ls (@ls) { $schema->resultset('TFLMonitor::Schema::LineStatus')->create($ls); } } );