# # SIMPLE mod_perl DBI example... # # OpenBSD 7.7 # # $ su # $ pkg_add apache-httpd ap2-mod_perl mariadb-server # $ mysql_install_db # $ mysql -u root # mysql> CREATE DATABASE count; # mysql> USE count; # mysql> CREATE TABLE count (name VARCHAR(255) PRIMARY KEY NOT NULL, value INT NOT NULL); # mysql> INSERT INTO count VALUES ('matt',0); # mysql> CREATE USER 'matt'@'localhost' IDENTIFIED BY 'abc123'; # mysql> GRANT ALL PRIVILEGES ON *.* TO 'matt'@'localhost'; # mysql> FLUSH PRIVILEGES; # mysql> exit # # vi /etc/apache2/httpd2.conf # LoadModule perl_module /usr/local/lib/apache2/mod_perl.so # PerlModule hello # # SetHandler modperl # PerlResponseHandler hello # # # $ cp hello.pm /usr/local/libdata/perl5/site_perl/amd64-openbsd/ # $ rcctl enable mysqld # $ rcctl start mysqld # $ rcctl enable apache2 # $ rcctl start apache2 # $ apachectl restart # $ curl http://localhost/hello # # PROGRAMMER: Matthew W. Coan # E-MAIL: matthewcoan1976@hotmail.com # WWW: http://slack.net/~mcoan/ # package hello; use strict; use warnings; use DBI; use Apache2::RequestRec(); use Apache2::RequestIO(); use Apache2::Const -compile => qw(OK); my $username = "matt"; my $password = "abc123"; my $dbh = 0; sub x2c { my $string = shift; $string =~ s/\+/ /g; $string =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg; return $string; } sub parse { my $request = shift; my %params; my $content; if($request->method eq "GET") { $content = $request->args; } else { $request->read($content, $request->header_in("Content-length")); } my @pairs = split(/[&;]/, $content); foreach my $pair (@pairs) { my ($key,$value) = split('=',$pair,2); $params{&x2c($key)} = &x2c($value); } return \%params; } sub display_count { my $request = shift; my $count = shift; $request->content_type('text/html'); $request->print(< Counter V1.0

count=$count

EOT } sub process_request0 { my $name = shift; my $request = shift; my $ret = 1; my $count = 0; if($dbh) { my $sth = $dbh->prepare("UPDATE count SET value = value + 1 WHERE name = ?"); if($sth->execute($name)) { $sth->finish(); $sth = $dbh->prepare("SELECT value FROM count WHERE name = ?"); if($sth->execute($name)) { while(my @row = $sth->fetchrow_array()) { $count = $row[0]; } $sth->finish(); &display_count($request,$count); } else { &service_unavailable($request); } } else { $ret = 0; } } else { $ret = 0; } return $ret; } sub open_connection() { return DBI->connect('DBI:MariaDB:database=count;host=localhost', $username, $password); } sub process_request { my $params = shift; my $request = shift; my $name = "matt"; if($params->{"name"}) { $name = $params->{"name"}; } if(!&process_request0($name,$request)) { $dbh = &open_connection(); if(!&process_request0($name,$request)) { &service_unavailable($request); } } } sub service_unavailable { my $request = shift; $request->content_type('text/html'); $request->print(< Sorry, service unavailable

Sorry, service unavailable

EOT } sub handler { my $request = shift; my $params = &parse($request); if(!$dbh) { $dbh = &open_connection(); } if($dbh) { &process_request($params,$request); } else { &service_unavailable($request) } return Apache2::Const::OK; } 1;