9 # typical url for this script:
10 # http://www.chiark.greenend.org.uk/ucgi/~clareb/mason/pirates/routetextstring?format=json&ocean=Midnight&string=d
21 my $sth= $dbh->prepare("SELECT archipelago,islandid,islandname
22 FROM islands WHERE islandname LIKE ?
23 UNION ALL SELECT DISTINCT archipelago,NULL,archipelago
24 FROM islands WHERE archipelago LIKE ?");
26 my (@results, $canontext);
27 my ($output, $output_wrong);
29 if ($format =~ /json/) {
30 $r->content_type($ctype or $format);
31 $output= sub { print to_json({
33 show => length $canontext ? encode_entities($canontext)
36 $output_wrong= sub { print to_json({
41 if ($format =~ /return/) {
42 $output= sub { return { Error => '', Results => \@results }; };
43 $output_wrong= sub { return { Error => $_[0] }; };
45 if ($format =~ /dump/) {
46 $r->content_type('text/plain');
47 $output_wrong= sub { print Dumper(\@_); };
48 $output= sub { print Dumper(\@results, $canontext); };
51 foreach my $each (split m#[/|,]#, $string) {
52 $each =~ s/^\s*//; $each =~ s/\s*$//; $each =~ s/\s+/ /g;
53 next if !length $each;
55 my $msg= sprintf $_[0], encode_entities($each);
56 $output_wrong->($msg);
60 foreach my $pat ("$each\%", "\%$each\%") {
61 $sth->execute($pat,$pat);
62 $results= $sth->fetchall_arrayref();
64 map { $m{ $_->[2] }=1 } @$results;
69 return $err->('no island or arch matches "%s"');
71 return $err->(' ');
73 return $err->('ambiguous island or arch "%s",'.
74 ' could be '.join(', ', sort keys %m));
77 push @results, $results->[0];
80 $canontext= join ' | ', map { $_->[2] } @results;