File Coverage

blib/lib/Apache/DBILogger.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             package Apache::DBILogger;
2              
3             require 5.004;
4 1     1   918 use strict;
  1         2  
  1         44  
5 1     1   1755 use Apache::Constants qw( :common );
  0            
  0            
6             use DBI;
7             use Date::Format;
8              
9             $Apache::DBILogger::revision = sprintf("%d.%02d", q$Revision: 1.20 $ =~ /(\d+)\.(\d+)/o);
10             $Apache::DBILogger::VERSION = "0.93";
11              
12             sub reconnect($$) {
13             my ($dbhref, $r) = @_;
14              
15             $$dbhref->disconnect;
16              
17             $r->log_error("Reconnecting to DBI server");
18              
19             $$dbhref = DBI->connect($r->dir_config("DBILogger_data_source"), $r->dir_config("DBILogger_username"), $r->dir_config("DBILogger_password"));
20            
21             unless ($$dbhref) {
22             $r->log_error("Apache::DBILogger could not connect to ".$r->dir_config("DBILogger_data_source")." - ".$DBI::errstr);
23             return DECLINED;
24             }
25             }
26              
27             sub logger {
28             my $r = shift->last;
29              
30             my $s = $r->server;
31             my $c = $r->connection;
32              
33             my %data = (
34             'server' => $s->server_hostname,
35             'bytes' => $r->bytes_sent,
36             'filename' => $r->filename || '',
37             'remotehost'=> $c->remote_host || '',
38             'remoteip' => $c->remote_ip || '',
39             'status' => $r->status || '',
40             'urlpath' => $r->uri || '',
41             'referer' => $r->header_in("Referer") || '',
42             'useragent' => $r->header_in('User-Agent') || '',
43             'timeserved'=> time2str("%Y-%m-%d %X", time),
44             'contenttype' => $r->content_type || ''
45             );
46              
47             if (my $user = $c->user) {
48             $data{user} = $user;
49             }
50              
51             $data{usertrack} = $r->notes('cookie') || '';
52              
53             my $dbh = DBI->connect($r->dir_config("DBILogger_data_source"), $r->dir_config("DBILogger_username"), $r->dir_config("DBILogger_password"));
54            
55             unless ($dbh) {
56             $r->log_error("Apache::DBILogger could not connect to ".$r->dir_config("DBILogger_data_source")." - ".$DBI::errstr);
57             return DECLINED;
58             }
59            
60             my @valueslist;
61            
62             foreach (keys %data) {
63             $data{$_} = $dbh->quote($data{$_});
64             push @valueslist, $data{$_};
65             }
66              
67             my $table = $r->dir_config("DBILogger_table") || 'requests';
68              
69             my $statement = "insert into $table (". join(',', keys %data) .") VALUES (". join(',', @valueslist) .")";
70              
71             my $tries = 0;
72            
73             TRYAGAIN: my $sth = $dbh->prepare($statement);
74            
75             unless ($sth) {
76             $r->log_error("Apache::DBILogger could not prepare sql query ($statement): $DBI::errstr");
77             return DECLINED;
78             }
79              
80             my $rv = $sth->execute;
81              
82             unless ($rv) {
83             $r->log_error("Apache::DBILogger had problems executing query ($statement): $DBI::errstr");
84             # unless ($tries++ > 1) {
85             # &reconnect(\$dbh, $r);
86             # goto TRYAGAIN;
87             # }
88             }
89            
90             $sth->finish;
91              
92              
93             $dbh->disconnect;
94              
95             OK;
96             }
97              
98             # #perl pun: windows is for users who can't handle the power of the mac.
99              
100             sub handler {
101             shift->post_connection(\&logger);
102             return OK;
103             }
104              
105             1;
106             __END__