ee5cfcb3c1e7f7c9c8c8a61fdafa4e317f652581
[freeside.git] / htetc / global.asa
1 BEGIN { eval "use Devel::AutoProfiler;"; } #only if installed...
2 #BEGIN { package Devel::AutoProfiler; use vars qw(%caller_info); }
3 #use Devel::AutoProfiler;
4
5 use strict;
6 use vars qw( $cgi $p );
7 use CGI 2.47;
8 #use CGI::Carp qw(fatalsToBrowser);
9 use Date::Format;
10 use Date::Parse;
11 use Time::Local;
12 use File::Basename;
13 use Tie::IxHash;
14 use HTML::Entities;
15 use IO::Handle;
16 use IO::File;
17 use String::Approx qw(amatch);
18 use Chart::LinesPoints;
19 use HTML::Widgets::SelectLayers 0.02;
20 use FS::UID qw(cgisuidsetup dbh getotaker datasrc driver_name);
21 use FS::Record qw(qsearch qsearchs fields dbdef);
22 use FS::Conf;
23 use FS::CGI qw(header menubar popurl table itable ntable idiot eidiot
24                small_custview myexit http_header);
25 use FS::Msgcat qw(gettext geterror);
26
27 use FS::agent;
28 use FS::agent_type;
29 use FS::domain_record;
30 use FS::cust_bill;
31 use FS::cust_bill_pay;
32 use FS::cust_credit;
33 use FS::cust_credit_bill;
34 use FS::cust_main;
35 use FS::cust_main_county;
36 use FS::cust_pay;
37 use FS::cust_pkg;
38 use FS::cust_refund;
39 use FS::cust_svc;
40 use FS::nas;
41 use FS::part_bill_event;
42 use FS::part_pkg;
43 use FS::part_referral;
44 use FS::part_svc;
45 use FS::part_svc_router;
46 use FS::part_virtual_field;
47 use FS::pkg_svc;
48 use FS::port;
49 use FS::queue qw(joblisting);
50 use FS::raddb;
51 use FS::session;
52 use FS::svc_acct;
53 use FS::svc_acct_pop qw(popselector);
54 use FS::svc_domain;
55 use FS::svc_forward;
56 use FS::svc_www;
57 use FS::router;
58 use FS::addr_block;
59 use FS::svc_broadband;
60 use FS::type_pkgs;
61 use FS::part_export;
62 use FS::part_export_option;
63 use FS::export_svc;
64 use FS::msgcat;
65
66 sub Script_OnStart {
67   $Response->AddHeader('Pragma' => 'no-cache');
68   $Response->AddHeader('Cache-control' => 'no-cache');
69 #  $Response->AddHeader('Expires' => 0);
70   $Response->{Expires} = -36288000;
71
72   $cgi = new CGI;
73   &cgisuidsetup($cgi);
74   $p = popurl(2);
75   #print $cgi->header( '-expires' => 'now' );
76   #dbh->{'private_profile'} = {} if dbh->can('sprintProfile');
77   dbh->{'private_profile'} = {} if UNIVERSAL::can(dbh, 'sprintProfile');
78
79   #really should check for FS::Profiler or something
80     # Devel::AutoProfiler _our_ VERSION?  thanks a fucking lot
81   if ( Devel::AutoProfiler->can('__recursively_fetch_subs_in_package') ) {
82     #should check to see it's my special version.  well, switch to FS::Profiler
83
84     #nicked from Devel::AutoProfiler::INIT
85     my %subs = Devel::AutoProfiler::__recursively_fetch_subs_in_package('main');
86
87
88     SUB : while( my ($name, $ref) = each(%subs) )
89       {
90         #next if $name =~ /^(main::)?Apache::/;
91         next unless $name =~ /FS/;
92         foreach my $sub (@Devel::AutoProfiler::do_not_instrument_this_sub)
93           {
94             if ($name =~ /$sub/)
95               {
96                 next SUB;
97               }
98           }
99         next if ($Devel::AutoProfiler::do_not_instrument_this_sub{$name});
100         #warn "INIT name is $name \n";
101         Devel::AutoProfiler::__instrument_sub($name, $ref);
102       }
103
104   }
105
106 }
107
108 sub Script_OnFlush {
109   my $ref = $Response->{BinaryRef};
110   #$$ref = $cgi->header( @FS::CGI::header ) . $$ref;
111   #$$ref = $cgi->header() . $$ref;
112   #warn "Script_OnFlush called with dbh ". dbh. "\n";
113   #if ( dbh->can('sprintProfile') ) {
114   if ( UNIVERSAL::can(dbh, 'sprintProfile') ) {
115     #warn "dbh can sprintProfile\n";
116     if ( lc($Response->{ContentType}) eq 'text/html' ) { #con
117       #warn "contenttype is sprintProfile\n";
118       $$ref =~ s/<\/BODY>[\s\n]*<\/HTML>[\s\n]*$//i
119         or warn "can't remove";
120   
121       #$$ref .= '<PRE>'. ("\n"x96). encode_entities(dbh->sprintProfile()). '</PRE>';
122       #  wtf?  konqueror...
123       $$ref .= '<PRE>'. ("\n"x4096). encode_entities(dbh->sprintProfile()).
124                "\n\n". &sprintAutoProfile(). '</PRE>';
125
126       $$ref .= '</BODY></HTML>';
127     }
128     dbh->{'private_profile'} = {};
129   }
130 }
131
132 #if ( defined(@DBIx::Profile::ISA) && DBIx::Profile::db->can('sprintProfile') ) {
133 #if ( defined(@DBIx::Profile::ISA) && UNIVERSAL::can('DBIx::Profile::db', 'sprintProfile') ) {
134 if ( defined(@DBIx::Profile::ISA) ) {
135
136   #warn "enabling profiling redirects";
137   *CGI::redirect = sub {
138     my( $self, $location) = @_;
139     my $page =
140       $cgi->header.
141       qq!<HTML><BODY>Redirect to <A HREF="$location">$location</A>!.
142       '<BR><BR><PRE>'.
143         ( UNIVERSAL::can(dbh, 'sprintProfile')
144             ? encode_entities(dbh->sprintProfile())
145             : 'DBIx::Profile missing sprintProfile method;'.
146               'unpatched or too old?'                        ).
147       "\n\n". &sprintAutoProfile().  '</PRE>'.
148       '</BODY></HTML>';
149     dbh->{'private_profile'} = {};
150     return $page;
151   };
152
153 }
154
155 sub by_total_time 
156
157   return $a->{total_time_in_sub} <=> $b->{total_time_in_sub}; 
158 }
159
160 sub sprintAutoProfile {
161   my %caller_info = %Devel::AutoProfiler::caller_info;
162   return unless keys %caller_info;
163
164   %Devel::AutoProfiler::caller_info = ();
165
166   my @keys = keys(%caller_info);
167
168   foreach my $key (@keys)
169     {
170       my $href = $caller_info{$key};
171
172       $href->{who_am_i} = $key;
173     }
174
175   my @subs = values(%caller_info);
176
177   #my @sorted = sort by_total_time ( @subs );
178   my @sorted = reverse sort by_total_time ( @subs );
179
180   # print Dumper \@sorted;
181
182   my @readable_info;
183
184   foreach my $sort (@sorted)
185     {
186       push(@readable_info, delete($sort->{who_am_i}));
187       push(@readable_info, $sort);
188     }
189
190   use Data::Dumper;
191   return encode_entities(Dumper(\@readable_info));
192
193 }
194
195 sub include {
196   $Response->Include(@_);
197 }
198
199 if ( defined(@DBIx::Profile::ISA) ) {
200
201   #false laziness w/above
202   *redirect = sub {
203     my($location) = @_;
204
205     ${$Response->{BinaryRef}} = 
206       $cgi->header.
207       qq!<HTML><BODY>Redirect to <A HREF="$location">$location</A>!.
208       '<BR><BR><PRE>'.
209         ( UNIVERSAL::can(dbh, 'sprintProfile')
210             ? encode_entities(dbh->sprintProfile())
211             : 'DBIx::Profile missing sprintProfile method;'.
212               'unpatched or too old?'                        ).
213       "\n\n". &sprintAutoProfile().  '</PRE>'.
214       '</BODY></HTML>';
215
216     dbh->{'private_profile'} = {};
217
218     $Response->End;
219
220   };
221
222 } else {
223
224   *redirect = sub {
225     $Response->Redirect(@_);
226   }
227
228 }
229
230 1;
231