source: trunk/npemap.org.uk/cgi/get-reports.fcgi @ 323

Last change on this file since 323 was 323, checked in by Nick Burch, 15 years ago

Escape properly

  • Property svn:executable set to *
File size: 3.6 KB
Line 
1#!/usr/bin/perl
2#
3# Copyright (c) 2006 Dominic Hargreaves
4# See accompanying file "LICENCE" for licence details
5
6use strict;
7use warnings;
8
9use CGI::Fast qw/:standard -debug/;
10
11# Find our private perl libraries
12use FindBin;
13use lib "$FindBin::Bin/../perllib";
14use NPEMap;
15
16sub print_err;
17
18# Set up database handler to try and make sure it's ready for the first
19# request
20# No point in handling errors here since they'll get handled by the request
21# handler
22my $dbh = setup_dbh();
23
24
25my @fields = qw(sort);
26my @sorts = qw(postcode date number);
27
28my $cgi;
29# Process incoming requests
30REQUEST: while ($cgi = new CGI::Fast) {
31
32    # In case the database went away, make sure we have a connection
33    unless ($dbh = setup_dbh()) {
34        print_internal_err('Error setting up database connection');
35        next REQUEST;
36    }
37
38    # Input validation
39        my $sort = "postcode";
40        if(defined $cgi->param("sort")) {
41                $sort = $cgi->param("sort");
42        }
43        my $valid_sort = 0;
44    foreach my $tsort (@sorts) {
45                if($tsort eq $sort) { $valid_sort = 1; }
46        }
47    unless($valid_sort) {
48        print_err ("Invalid sort '$sort' supplied");
49        next REQUEST;
50    }
51
52        # How to order the reports
53        my $order = " ORDER BY ";
54        if($sort eq "postcode") {
55                $order .= "outward, inward, bad_postcodes.created_at ";
56        } elsif($sort eq "date") {
57                $order .= "bad_postcodes.created_at, outward, inward ";
58        } elsif($sort eq "number") {
59                # More to do later on
60                $order .= "outward, inward ";
61        } else {
62                $order .= "id ";
63        }
64
65    my $sql =
66                "SELECT ".
67                "       outward || ' ' || inward AS postcode,     ".
68                "   outward, inward,                          ".
69                "       easting, northing,                        ".
70                "       id, source,                               ".
71                "   reason, reporter_email,                   ".
72                "       bad_postcodes.created_at AS reported_time ".
73                "FROM postcodes                               ".
74                "INNER JOIN bad_postcodes ON                  ".
75                "       (id = postcode                            ".
76                "       AND NOT actioned )                        ".
77                "WHERE NOT deleted                            ".
78                $order;
79    my $sth = $dbh->prepare($sql);
80   
81    if ($sth->execute()) {
82        print "Content-type: text/javascript\n\n";
83
84                my @rows;
85        while(my @row = $sth->fetchrow_array) {
86                        push @rows, \@row;
87                }
88
89                # Do any more sorting that's needed
90                if($sort eq "number") {
91                        my %counts;
92                        foreach my $row (@rows) {
93                                my ($postcode) = @$row;
94                                $counts{$postcode}++;
95                        }
96                        # Re-sort based on counts
97                        my @srows = sort {
98                                my ($ra,$rb) = ($a,$b);
99                                my $pca = $ra->[0];
100                                my $pcb = $rb->[0];
101                                if($counts{$pca} == $counts{$pcb}) {
102                                        my ($oa,$ia) = ($ra->[1],$ra->[2]);
103                                        my ($ob,$ib) = ($rb->[1],$rb->[2]);
104                                        if($oa eq $ob) {
105                                                return $ia cmp $ib;
106                                        } else {
107                                                return $oa cmp $ob;
108                                        }
109                                } else {
110                                        return $counts{$pca} <=> $counts{$pcb};
111                                }
112                        } @rows;
113                        @rows = reverse @srows;
114                }
115
116                # Display
117                foreach my $row (@rows) {
118                        my ($postcode,$outward,$inward,$easting,$northing,$id,$source,$reason,$reporter,$reported_time) = @$row;
119                        # Escape the reason and email
120                        $reason =~ s/'/&quot;/;
121                        $reporter =~ s/'/&quot;/;
122
123            print "addReport($id, '$postcode', $easting, $northing, [$source], ['$reason','$reporter','$reported_time']);\n";
124        }
125    } else {
126        print_internal_err("Database error retrieving data");
127    }
128
129}
130
131# No more requests to serve, so tidy up
132$dbh->disconnect;
133
134# Helper routines
135sub print_err {
136    my $err = shift;
137    print header("text/plain", "400 $err");
138    print "Error: $err\n";
139}
140
141sub print_internal_err {
142    my $err = shift;
143    print header("text/plain", "500 $err");
144    print "Error: $err\n";
145}
Note: See TracBrowser for help on using the repository browser.