File: apache2.patch

package info (click to toggle)
libapache-dbilogger-perl 0.93-13
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 140 kB
  • sloc: perl: 342; makefile: 2
file content (198 lines) | stat: -rw-r--r-- 6,276 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
Description: Ported the module to correctly work under Apache 2.x / mod_perl
 2.x, as it is API-incompatible
Author: Gunnar Wolf <gwolf@debian.org>
Bug-Debian: https://bugs.debian.org/397491
Last-Update: 2007-05-01
Forwarded: unknown

--- a/DBILogger.pm
+++ b/DBILogger.pm
@@ -2,7 +2,25 @@ package Apache::DBILogger;
 
 require 5.004;
 use strict;
-use Apache::Constants qw( :common );
+# use Apache::Constants qw( :common );
+# In order to make this module compatible with either Apache 1.3.x or 2.2.x,
+# for which mod_perl has slightly different APIs, this BEGIN block serves the
+# same purpose as the previous 'use Apache::Constants qw(:common)' statement.
+my $modperl2;
+BEGIN {
+    eval "use Apache::Constants qw(:common);";
+    if ($@) {
+        eval "use Apache2::Const qw(:common);
+              use APR::Pool;
+              use APR::Table;
+              use Apache2::Connection;
+              use APR::SockAddr;";
+	$modperl2 = 1;
+	if ($@) {
+            die "Not under Apache, not under Apache2?\n$@";
+        }
+    }
+}
 use DBI;
 use Date::Format;
 
@@ -25,30 +43,12 @@ sub reconnect($$) {
 }
 
 sub logger {
-	my $r = shift->last;
+        my $r = _get_req(shift);
 
 	my $s = $r->server;
 	my $c = $r->connection;
 
-	my %data = (
-		    'server'	=> $s->server_hostname,
-		    'bytes'     => $r->bytes_sent,
-		    'filename'	=> $r->filename || '',
-		    'remotehost'=> $c->remote_host || '',
-		    'remoteip'  => $c->remote_ip || '',
-		    'status'    => $r->status || '',
-		    'urlpath'	=> $r->uri || '',
-		    'referer'	=> $r->header_in("Referer") || '',	
-		    'useragent'	=> $r->header_in('User-Agent') || '',
-		    'timeserved'=> time2str("%Y-%m-%d %X", time),
-		    'contenttype' => $r->content_type || ''
-	);
-
-	if (my $user = $c->user) {
-		$data{user} = $user;
-	}
-
-	$data{usertrack} = $r->notes('cookie') || '';
+	my %data = _get_data($r);
 
 	my $dbh = DBI->connect($r->dir_config("DBILogger_data_source"), $r->dir_config("DBILogger_username"), $r->dir_config("DBILogger_password"));
   
@@ -57,16 +57,12 @@ sub logger {
   		return DECLINED;
   	}
   	
-  	my @valueslist;
-  	
-  	foreach (keys %data) {
-		$data{$_} = $dbh->quote($data{$_});
-		push @valueslist, $data{$_};
-	}
-
 	my $table = $r->dir_config("DBILogger_table") || 'requests';
 
-	my $statement = "insert into $table (". join(',', keys %data) .") VALUES (". join(',', @valueslist) .")";
+        my @columns = map($dbh->quote_identifier($_), keys   %data);
+        my @values  = map($dbh->quote($_),            values %data);
+
+	my $statement = "INSERT INTO $table (" . join(', ', @columns) . ") VALUES (" . join(', ', @values ) . ")";
 
 	my $tries = 0;
 	
@@ -98,10 +94,75 @@ sub logger {
 # #perl pun: <q[merlyn]> windows is for users who can't handle the power of the mac.
 
 sub handler { 
-	shift->post_connection(\&logger);
+        _register_logger(shift);
+}
+
+############################################################
+# Multi-API compatibility functions follow
+#
+# _register_logger, _get_req and _get_data should take care of handling the
+# incompatibility between the mod_perl 1.x and 2.x APIs. They should do exactly
+# the same, although in a different way; they are based on
+# http://perl.apache.org/docs/2.0/user/porting/compat.html
+#
+# For any bugs regarding this code, please contact Gunnar Wolf
+# <gwolf@debian.org>.
+sub _register_logger {
+        my $r = shift;
+	if ($modperl2) {
+	        $r->pool->cleanup_register(\&logger, $r);
+	} else {
+		$r->post_connection(\&logger);
+	}
 	return OK;
 }
 
+sub _get_req {
+        return $modperl2 ? shift : shift->last;
+}
+
+sub _get_data {
+        my ($r, $s, $c, %data);
+	$r = shift;
+	$s = $r->server;
+	$c = $r->connection;
+
+	if ($modperl2) {
+	        %data = (
+			 'server'	=> $s->server_hostname,
+			 'bytes'        => $r->bytes_sent,
+			 'filename'	=> $r->filename || '',
+			 'remotehost'   => $c->get_remote_host || '',
+			 'remoteip'     => $c->remote_addr->ip_get || '',
+			 'status'       => $r->status || '',
+			 'urlpath'	=> $r->uri || '',
+			 'referer'	=> $r->headers_in->{'Referer'} || '',
+			 'useragent'	=> $r->headers_in->{'User-Agent'} || '',
+			 'timeserved'   => time2str("%Y-%m-%d %X", time),
+			 'contenttype'  => $r->content_type || '',
+			 'user'         => $r->user() || '',
+			 'usertrack'    => $r->notes->get('cookie') || ''
+			 );
+	} else {
+	        %data = (
+			 'server'	=> $s->server_hostname,
+			 'bytes'        => $r->bytes_sent,
+			 'filename'	=> $r->filename || '',
+			 'remotehost'   => $c->remote_host || '',
+			 'remoteip'     => $c->remote_ip || '',
+			 'status'       => $r->status || '',
+			 'urlpath'	=> $r->uri || '',
+			 'referer'	=> $r->header_in("Referer") || '',
+			 'useragent'	=> $r->header_in('User-Agent') || '',
+			 'timeserved'   => time2str("%Y-%m-%d %X", time),
+			 'contenttype'  => $r->content_type || '',
+			 'user'         => $c->user || '',
+			 'usertrack'    => $r->notes('cookie') || ''
+			 );
+	}
+	return %data;
+}
+
 1;
 __END__
 
@@ -139,6 +200,10 @@ CREATE TABLE requests (
   KEY timeserved_idx (timeserved)
 );
 
+Please note that for some databases (notably, PostgreSQL) you will need to
+double-quote the user column name (that is, to specify it as C<"user"
+varchar(15)>) in order for the database not to mistake it with a keyword.
+
 Its recommended that you include
 
 use Apache::DBI;
@@ -267,6 +332,19 @@ work fine with Apache::DBI.
 You might get problems with Apache 1.2.x. (Not supporting
 post_connection?)
 
+=head1 MOD_PERL 2 SUPPORT
+
+The official version of this module, as Ask Bjoern Hansen last modified
+it, lacks support for the API changes introduced with Apache 2.x and
+the corresponding mod_perl 2.x - Of course, this is quite understandable
+as this module was last updated in 1998 ;-) But anyway, the module does its
+job still quite fine, and users still require its functionality.
+
+For any help requests regarding this module on Apache 2 systems, contact
+Gunnar Wolf <gwolf@debian.org> directly. If your system is based on Debian
+GNU/Linux, you can use the regular Debian bugtracking facilities, as the
+multi-API patch was introduced specifically for Debian.
+
 =head1 SUPPORT
 
 This module is supported via the mod_perl mailinglist