← Index
NYTProf Performance Profile   « line view »
For starman worker -M FindBin --max-requests 50 --workers 2 --user=kohadev-koha --group kohadev-koha --pid /var/run/koha/kohadev/plack.pid --daemonize --access-log /var/log/koha/kohadev/plack.log --error-log /var/log/koha/kohadev/plack-error.log -E deployment --socket /var/run/koha/kohadev/plack.sock /etc/koha/sites/kohadev/plack.psgi
  Run on Fri Jan 8 14:31:06 2016
Reported on Fri Jan 8 14:31:36 2016

Filename/home/vagrant/kohaclone/C4/Search/History.pm
StatementsExecuted 21 statements in 1.61ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
11140µs4.01msC4::Search::History::::get_from_sessionC4::Search::History::get_from_session
11128µs114µsC4::Search::History::::BEGIN@3C4::Search::History::BEGIN@3
11116µs55µsC4::Search::History::::BEGIN@7C4::Search::History::BEGIN@7
11116µs67µsC4::Search::History::::BEGIN@11C4::Search::History::BEGIN@11
11113µs13µsC4::Search::History::::BEGIN@5C4::Search::History::BEGIN@5
11110µs93µsC4::Search::History::::BEGIN@9C4::Search::History::BEGIN@9
1119µs34µsC4::Search::History::::BEGIN@10C4::Search::History::BEGIN@10
1118µs10µsC4::Search::History::::BEGIN@6C4::Search::History::BEGIN@6
0000s0sC4::Search::History::::addC4::Search::History::add
0000s0sC4::Search::History::::add_to_sessionC4::Search::History::add_to_session
0000s0sC4::Search::History::::deleteC4::Search::History::delete
0000s0sC4::Search::History::::delete_from_cookieC4::Search::History::delete_from_cookie
0000s0sC4::Search::History::::getC4::Search::History::get
0000s0sC4::Search::History::::set_to_sessionC4::Search::History::set_to_session
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package C4::Search::History;
2
32137µs2199µs
# spent 114µs (28+85) within C4::Search::History::BEGIN@3 which was called: # once (28µs+85µs) by C4::Auth::BEGIN@32 at line 3
use Modern::Perl;
# spent 114µs making 1 call to C4::Search::History::BEGIN@3 # spent 85µs making 1 call to Modern::Perl::import
4
5233µs113µs
# spent 13µs within C4::Search::History::BEGIN@5 which was called: # once (13µs+0s) by C4::Auth::BEGIN@32 at line 5
use C4::Auth qw( get_session );
# spent 13µs making 1 call to C4::Search::History::BEGIN@5
6226µs211µs
# spent 10µs (8+1) within C4::Search::History::BEGIN@6 which was called: # once (8µs+1µs) by C4::Auth::BEGIN@32 at line 6
use C4::Context;
# spent 10µs making 1 call to C4::Search::History::BEGIN@6 # spent 1µs making 1 call to C4::Context::import
7279µs294µs
# spent 55µs (16+39) within C4::Search::History::BEGIN@7 which was called: # once (16µs+39µs) by C4::Auth::BEGIN@32 at line 7
use Koha::DateUtils;
# spent 55µs making 1 call to C4::Search::History::BEGIN@7 # spent 39µs making 1 call to Exporter::import
8
9227µs2175µs
# spent 93µs (10+83) within C4::Search::History::BEGIN@9 which was called: # once (10µs+83µs) by C4::Auth::BEGIN@32 at line 9
use JSON qw( encode_json decode_json );
# spent 93µs making 1 call to C4::Search::History::BEGIN@9 # spent 83µs making 1 call to JSON::import
10255µs258µs
# spent 34µs (9+24) within C4::Search::History::BEGIN@10 which was called: # once (9µs+24µs) by C4::Auth::BEGIN@32 at line 10
use URI::Escape;
# spent 34µs making 1 call to C4::Search::History::BEGIN@10 # spent 24µs making 1 call to Exporter::import
1121.24ms2118µs
# spent 67µs (16+51) within C4::Search::History::BEGIN@11 which was called: # once (16µs+51µs) by C4::Auth::BEGIN@32 at line 11
use Encode;
# spent 67µs making 1 call to C4::Search::History::BEGIN@11 # spent 51µs making 1 call to Exporter::import
12
13sub add {
14 my ($params) = @_;
15 my $userid = $params->{userid};
16 my $sessionid = $params->{sessionid};
17 my $query_desc = $params->{query_desc};
18 my $query_cgi = $params->{query_cgi};
19 my $total = $params->{total} // 0;
20 my $type = $params->{type} || 'biblio';
21 my $time = $params->{time};
22
23 my $dbh = C4::Context->dbh;
24
25 # Add the request the user just made
26 my $query = q{
27 INSERT INTO search_history(
28 userid, sessionid, query_desc, query_cgi, type, total, time
29 ) VALUES(
30 ?, ?, ?, ?, ?, ?, ?
31 )
32 };
33 my $sth = $dbh->prepare($query);
34 $sth->execute( $userid, $sessionid, $query_desc, $query_cgi, $type,
35 $total, $time );
36}
37
38sub add_to_session {
39 my ($params) = @_;
40 my $cgi = $params->{cgi};
41 my $query_desc = $params->{query_desc} || "unknown";
42 my $query_cgi = $params->{query_cgi} || "unknown";
43 my $total = $params->{total};
44 my $type = $params->{type} || 'biblio';
45
46 # To a cookie (the user is not logged in)
47 my $now = dt_from_string;
48 my $id = $now->year . $now->month . $now->day . $now->hour . $now->minute . $now->second . int(rand(100));
49 my @recent_searches = get_from_session( { cgi => $cgi } );
50 push @recent_searches, {
51 query_desc => $query_desc,
52 query_cgi => $query_cgi,
53 total => "$total",
54 type => $type,
55 time => output_pref( { dt => $now, dateformat => 'iso', timeformat => '24hr' } ),
56 id => $id,
57 };
58
59 shift @recent_searches if ( @recent_searches > 15 );
60 set_to_session( { cgi => $cgi, search_history => \@recent_searches } );
61}
62
63sub delete {
64 my ($params) = @_;
65 my $id = $params->{id};
66 my $userid = $params->{userid};
67 my $sessionid = $params->{sessionid};
68 my $type = $params->{type} || q{};
69 my $previous = $params->{previous} || 0;
70 my $interval = $params->{interval} || 0;
71
72 unless ( ref( $id ) ) {
73 $id = $id ? [ $id ] : [];
74 }
75
76 unless ( $userid or @$id or $interval ) {
77 warn "ERROR: userid, id or interval is required for history deletion";
78 return;
79 }
80
81 my $dbh = C4::Context->dbh;
82 my $query = q{
83 DELETE FROM search_history
84 WHERE 1
85 };
86
87 $query .= q{ AND id IN ( } . join( q{,}, (q{?}) x @$id ) . q{ )}
88 if @$id;
89
90 $query .= q{
91 AND userid = ?
92 } if $userid;
93
94 if ($sessionid) {
95 $query .=
96 $previous
97 ? q{ AND sessionid != ?}
98 : q{ AND sessionid = ?};
99 }
100
101 $query .= q{ AND type = ?}
102 if $type;
103
104 # FIXME DATE_SUB is a Mysql-ism. Postgres uses: datefield - INTERVAL '6 months'
105 $query .= q{ AND time < DATE_SUB( NOW(), INTERVAL ? DAY )}
106 if $interval;
107
108 $dbh->do(
109 $query, {},
110 ( @$id ? ( @$id ) : () ),
111 ( $userid ? $userid : () ),
112 ( $sessionid ? $sessionid : () ),
113 ( $type ? $type : () ),
114 ( $interval ? $interval : () ),
115 );
116}
117
118sub delete_from_cookie {
119 my ($params) = @_;
120 my $cookie = $params->{cookie};
121 my $id = $params->{id};
122
123 return unless $cookie;
124
125 unless ( ref( $id ) ) {
126 $id = $id ? [ $id ] : [];
127 }
128 return unless @$id;
129
130 my @searches;
131 if ( $cookie ){
132 $cookie = uri_unescape( $cookie );
133 if (decode_json( $cookie )) {
134 @searches = @{decode_json( $cookie )}
135 }
136 }
137
138 @searches = map {
139 my $search = $_;
140 ( grep { $_ != $search->{id} } @$id ) ? $search : ()
141 } @searches;
142
143 return uri_escape( encode_json( \@searches ) );
144
145}
146
147sub get {
148 my ($params) = @_;
149 my $id = $params->{id};
150 my $userid = $params->{userid};
151 my $sessionid = $params->{sessionid};
152 my $type = $params->{type};
153 my $previous = $params->{previous};
154
155 unless ( ref( $id ) ) {
156 $id = $id ? [ $id ] : [];
157 }
158
159 unless ( $userid or @$id ) {
160 warn "ERROR: userid is required for history search";
161 return;
162 }
163
164 my $query = q{
165 SELECT *
166 FROM search_history
167 WHERE 1
168 };
169
170 $query .= q{ AND id IN ( } . join( q{,}, (q{?}) x @$id ) . q{ )}
171 if @$id;
172
173 $query .= q{
174 AND userid = ?
175 } if $userid;
176
177 if ($sessionid) {
178 $query .=
179 $previous
180 ? q{ AND sessionid != ?}
181 : q{ AND sessionid = ?};
182 }
183
184 $query .= q{ AND type = ?}
185 if $type;
186
187 my $dbh = C4::Context->dbh;
188 my $sth = $dbh->prepare($query);
189 $sth->execute(
190 ( @$id ? ( @$id ) : () ),
191 ( $userid ? $userid : () ),
192 ( $sessionid ? $sessionid : () ),
193 ( $type ? $type : () )
194 );
195 return $sth->fetchall_arrayref( {} );
196}
197
198
# spent 4.01ms (40µs+3.97) within C4::Search::History::get_from_session which was called: # once (40µs+3.97ms) by C4::Auth::get_template_and_user at line 390 of C4/Auth.pm
sub get_from_session {
1991400ns my ($params) = @_;
2001800ns my $cgi = $params->{cgi};
20115µs1413µs my $sessionID = $cgi->cookie('CGISESSID');
# spent 413µs making 1 call to CGI::cookie
2021200ns return () unless $sessionID;
20313µs13.21ms my $session = C4::Auth::get_session($sessionID);
# spent 3.21ms making 1 call to C4::Auth::get_session
20417µs110µs return () unless $session and $session->param('search_history');
# spent 10µs making 1 call to CGI::Session::param
205 my $obj =
206 eval { decode_json( uri_unescape( $session->param('search_history') ) ) };
207 return () unless defined $obj;
208 return () unless ref $obj eq 'ARRAY';
209 return @{$obj};
210}
211
212sub set_to_session {
213 my ($params) = @_;
214 my $cgi = $params->{cgi};
215 my $search_history = $params->{search_history};
216 my $sessionID = $cgi->cookie('CGISESSID');
217 return () unless $sessionID;
218 my $session = C4::Auth::get_session($sessionID);
219 return () unless $session;
220 $session->param( 'search_history',
221 uri_escape( encode_json($search_history) ) );
222}
223
22413µs1;
225
226__END__