commit b0743ff93b8074647e69329f87f65dccfedbf062
parent 9c1e0ab57af908c4b9890bd37d421b7404d3e8ca
Author: Kyle Milz <kyle@getaddrinfo.net>
Date: Mon, 20 Oct 2014 02:58:47 -0600
add new tools for fcgi searching and www generation
Diffstat:
A | html/index.tt2 | | | 74 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | html/pricechart.css | | | 39 | +++++++++++++++++++++++++++++++++++++++ |
A | search.pl | | | 50 | ++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | site_gen.pl | | | 71 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
4 files changed, 234 insertions(+), 0 deletions(-)
diff --git a/html/index.tt2 b/html/index.tt2
@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>PriceCharts</title>
+ <link rel="stylesheet" type="text/css" href="/pricechart.css" />
+</head>
+<body>
+ <div class="float_left title">
+ <a href='/'><em>Price</em><b>Charts</b></a>
+ </div>
+ <div class="float_right">
+ <form method="post" action="/search.html">
+ <fieldset>
+ <input type="text" name="q" />
+ <input type="submit" value="Search">
+ </fieldset>
+ </form>
+ </div>
+
+ <hr class="clear_both">
+ <div class="float_left column">
+ <h1>What</h1>
+
+ <p> Welcome to <b>PriceCharts</b>, a place to do inter-retailer
+ price comparisons to ensure that products are bought at their
+ lowest possible price. </p>
+
+ <p> <b>PriceCharts</b> periodically looks up and saves product
+ price information and then displays it as a chart. From the
+ chart it is easily determined which retailer has the current
+ lowest price and also how the price trends over time. Currently
+ <b>[% num_products %]</b> products from <b>[% manufacturers %]
+ </b> manufacturers are being tracked. </p>
+
+ <p> The following retailers are included:
+ <ul>
+ [% FOREACH variable IN vendors %]
+ <li>[% variable %]
+ [% END %]
+
+ </ul>
+ </p>
+ </div>
+
+ <div class="float_left column">
+ <h1>Why</h1>
+
+ <p> <b>PriceCharts</b> is meant to be a consumers purchasing
+ tool. It is intended to give the consumer insight into retail
+ pricing of products which they would not normally have. </p>
+
+ <p> A well known practice when looking to purchase something new
+ is <em>price comparison</em>. A purchaser decides on a certain
+ make and model that they want and then look at the different
+ retailers in their area to find the one with the lowest price.
+ That is what this website does. It automates <em>price
+ comparisons</em>. </p>
+
+ <p> This is important because the price difference between
+ different retailers for the same product is often hundreds of
+ dollars if not more. One glance at the price chart for the
+ product will tell you not only the current best retailer to buy
+ the product from but also historically who has had the best
+ price. </p>
+
+ </div>
+ <hr class="clear_both">
+
+ <div class="footer">
+ <a href="mailto:kyle@getaddrinfo.net">Feedback/Donate</a>
+ </div>
+</body>
+</html>
diff --git a/html/pricechart.css b/html/pricechart.css
@@ -0,0 +1,39 @@
+.clear_both {
+ clear: both;
+}
+
+.column {
+ width: 47%;
+ padding-left: 1.5%;
+ padding-right 1.5%;
+}
+
+fieldset {
+ border: 0px;
+}
+
+input {
+ font-size: 1em;
+}
+
+.float_left {
+ float: left;
+}
+
+.float_right {
+ float: right;
+}
+
+.footer {
+ text-align: center;
+}
+
+.logo {
+ padding-right: 10px;
+}
+
+.title a {
+ font-size: 2em;
+ color: black;
+ text-decoration: none;
+}
diff --git a/search.pl b/search.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FCGI;
+
+use shared;
+
+my $cfg = get_config();
+my $dbh = get_dbh($cfg);
+
+mkdir "$cfg->{general}{var}/www/run";
+my $socket_path = "$cfg->{general}{var}/www/run/search.sock";
+
+my $socket = FCGI::OpenSocket($socket_path, 1024);
+my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV,
+ $socket, FCGI::FAIL_ACCEPT_ON_INTR);
+
+chmod 0777, $socket_path;
+sub sigint
+{
+ $request->LastCall();
+}
+$SIG{INT} = \&sigint;
+
+while ($request->Accept() >= 0) {
+ print "Content-Type: text/html\r\n\r\n";
+ print "Hello, World!<br>\n";
+
+ for (sort keys %ENV) {
+ print "$_: $ENV{$_} <br>\n";
+ }
+
+ read(STDIN, my $input, $ENV{CONTENT_LENGTH});
+ (undef, $input) = split("=", $input);
+ print "querying for: $input <br>\n";
+
+ my $query = "select * from products where title like ?";
+ my $products = $dbh->selectall_arrayref($query, undef, "%$input%");
+
+ print "found " . scalar @$products . " products <br>\n";
+
+ for (@$products) {
+ print "$_->[2] <br>\n";
+ }
+}
+
+FCGI::CloseSocket($socket);
+$dbh->disconnect();
diff --git a/site_gen.pl b/site_gen.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use GD::SVG;
+use GD::Polyline;
+use Template;
+use POSIX;
+
+use shared;
+
+my $cfg = get_config();
+my $dbh = get_dbh($cfg);
+my $log = get_log($cfg, "pricecharts_webgen");
+
+my $config = {
+ INTERPOLATE => 1,
+ POST_CHOMP => 1,
+ EVAL_PERL => 1
+};
+
+my $template = Template->new($config);
+
+my $query = "select distinct brand from products";
+my $manuf = $dbh->selectcol_arrayref($query);
+
+$query = "select part_num from products";
+my $products = $dbh->selectcol_arrayref($query);
+
+my @vendors = sort keys $cfg->{vendors};
+
+my $vars = {
+ vendors => \@vendors,
+ manufacturers => scalar @$manuf,
+ num_products => scalar @$products
+};
+
+my $input = "html/index.tt2";
+$template->process($input, $vars, "www/htdocs/index.html") || die $template->error();
+
+# $query = "select part_num from products";
+# my $products = $dbh->selectcol_arrayref($query);
+
+print $log strftime "%b %e %Y %H:%M ", localtime;
+
+if ($args{p}) {
+ gen_chart($args{p});
+ print $log "$args{p} generated\n";
+}
+else {
+ gen_chart($_) for (@$products);
+ print $log scalar(@$products) . " products generated\n";
+}
+
+sub gen_chart
+{
+ my $part_num = shift;
+ vprint("$part_num:\n");
+
+ my $image = new GD::SVG::Image(800, 200);
+ my $polyline = new GD::Polyline;
+
+ $query = "select * from prices where part_num = ?";
+ my $prices = $dbh->selectall_arrayref($query, undef, $part_num);
+
+ vprintf("\t# prices = %i\n", scalar @$prices);
+}
+
+close $log;
+$dbh->disconnect();