1 BEGIN { eval "use Devel::AutoProfiler;"; } #only if installed...
2 #BEGIN { package Devel::AutoProfiler; use vars qw(%caller_info); }
3 #use Devel::AutoProfiler;
6 use vars qw( $cgi $p );
8 #use CGI::Carp qw(fatalsToBrowser);
16 use String::Approx qw(amatch);
17 use Chart::LinesPoints;
18 use HTML::Widgets::SelectLayers 0.02;
19 use FS::UID qw(cgisuidsetup dbh getotaker datasrc driver_name);
20 use FS::Record qw(qsearch qsearchs fields dbdef);
22 use FS::CGI qw(header menubar popurl table itable ntable idiot eidiot
23 small_custview myexit http_header);
24 use FS::Msgcat qw(gettext geterror);
28 use FS::domain_record;
30 use FS::cust_bill_pay;
32 use FS::cust_credit_bill;
34 use FS::cust_main_county;
40 use FS::part_bill_event;
42 use FS::part_referral;
46 use FS::queue qw(joblisting);
50 use FS::svc_acct_pop qw(popselector);
57 use FS::part_ac_field;
60 use FS::svc_broadband;
63 use FS::part_export_option;
68 $Response->AddHeader('Pragma' => 'no-cache');
69 $Response->AddHeader('Cache-control' => 'no-cache');
70 # $Response->AddHeader('Expires' => 0);
71 $Response->{Expires} = -36288000;
76 #print $cgi->header( '-expires' => 'now' );
77 dbh->{'private_profile'} = {} if dbh->can('sprintProfile');
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
84 #nicked from Devel::AutoProfiler::INIT
85 my %subs = Devel::AutoProfiler::__recursively_fetch_subs_in_package('main');
88 SUB : while( my ($name, $ref) = each(%subs) )
90 #next if $name =~ /^(main::)?Apache::/;
91 next unless $name =~ /FS/;
92 foreach my $sub (@Devel::AutoProfiler::do_not_instrument_this_sub)
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);
109 my $ref = $Response->{BinaryRef};
110 #$$ref = $cgi->header( @FS::CGI::header ) . $$ref;
111 #$$ref = $cgi->header() . $$ref;
112 if ( dbh->can('sprintProfile') ) {
113 if ( lc($Response->{ContentType}) eq 'text/html' ) {
114 $$ref =~ s/<\/BODY>[\s\n]*<\/HTML>[\s\n]*$//i
115 or warn "can't remove";
117 #$$ref .= '<PRE>'. ("\n"x96). encode_entities(dbh->sprintProfile()). '</PRE>';
119 $$ref .= '<PRE>'. ("\n"x4096). encode_entities(dbh->sprintProfile()).
120 "\n\n". &sprintAutoProfile(). '</PRE>';
122 $$ref .= '</BODY></HTML>';
124 dbh->{'private_profile'} = {};
128 if ( defined(@DBIx::Profile::ISA) && DBIx::Profile::db->can('sprintProfile') ) {
130 #warn "enabling profiling redirects";
131 *CGI::redirect = sub {
132 my( $self, $location) = @_;
135 qq!<HTML><BODY>Redirect to <A HREF="$location">$location</A><BR><BR>!.
136 '<PRE>'. encode_entities(dbh->sprintProfile()).
137 "\n\n". &sprintAutoProfile(). '</PRE>'.
139 dbh->{'private_profile'} = {};
147 return $a->{total_time_in_sub} <=> $b->{total_time_in_sub};
150 sub sprintAutoProfile {
151 my %caller_info = %Devel::AutoProfiler::caller_info;
152 return unless keys %caller_info;
154 %Devel::AutoProfiler::caller_info = ();
156 my @keys = keys(%caller_info);
158 foreach my $key (@keys)
160 my $href = $caller_info{$key};
162 $href->{who_am_i} = $key;
165 my @subs = values(%caller_info);
167 #my @sorted = sort by_total_time ( @subs );
168 my @sorted = reverse sort by_total_time ( @subs );
170 # print Dumper \@sorted;
174 foreach my $sort (@sorted)
176 push(@readable_info, delete($sort->{who_am_i}));
177 push(@readable_info, $sort);
181 return encode_entities(Dumper(\@readable_info));