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);
}
}
);