my $query_cgi = $params->{query_cgi};
my $total = $params->{total} // 0;
my $type = $params->{type} || 'biblio';
+ my $time = $params->{time};
my $dbh = C4::Context->dbh;
# Add the request the user just made
my $query = q{
INSERT INTO search_history(
- userid, sessionid, query_desc, query_cgi, type, total, time
+ userid, sessionid, query_desc, query_cgi, type, total} . ( $time ? ', time' : '' ) . q{
) VALUES(
- ?, ?, ?, ?, ?, ?, NOW()
+ ?, ?, ?, ?, ?, ?} . ( $time ? ', ?' : '' ) . q{
)
};
my $sth = $dbh->prepare($query);
$sth->execute( $userid, $sessionid, $query_desc, $query_cgi, $type,
- $total );
+ $total, ( $time ? $time : () ) );
}
sub add_to_session {
my ($params) = @_;
my $cgi = $params->{cgi};
- my $query_desc = Encode::decode_utf8( $params->{query_desc} ) || "unknown";
- my $query_cgi = Encode::decode_utf8( $params->{query_cgi} ) || "unknown";
+ my $query_desc = $params->{query_desc} || "unknown";
+ my $query_cgi = $params->{query_cgi} || "unknown";
my $total = $params->{total};
my $type = $params->{type} || 'biblio';
+ # To a cookie (the user is not logged in)
+ my $now = dt_from_string;
+ my $id = $now->year . $now->month . $now->day . $now->hour . $now->minute . $now->second . int(rand(100));
my @recent_searches = get_from_session( { cgi => $cgi } );
- push @recent_searches,
- {
+ push @recent_searches, {
query_desc => $query_desc,
query_cgi => $query_cgi,
total => "$total",
type => $type,
- time => output_pref( { dt => dt_from_string(), dateformat => 'iso', timeformat => '24hr' } ),
- };
+ time => output_pref( { dt => $now, dateformat => 'iso', timeformat => '24hr' } ),
+ id => $id,
+ };
shift @recent_searches if ( @recent_searches > 15 );
set_to_session( { cgi => $cgi, search_history => \@recent_searches } );
sub delete {
my ($params) = @_;
+ my $id = $params->{id};
my $userid = $params->{userid};
my $sessionid = $params->{sessionid};
my $type = $params->{type} || q{};
my $previous = $params->{previous} || 0;
+ my $interval = $params->{interval} || 0;
- unless ($userid) {
- warn "ERROR: userid is required for history search";
+ unless ( ref( $id ) ) {
+ $id = $id ? [ $id ] : [];
+ }
+
+ unless ( $userid or @$id or $interval ) {
+ warn "ERROR: userid, id or interval is required for history deletion";
return;
}
my $dbh = C4::Context->dbh;
my $query = q{
DELETE FROM search_history
- WHERE userid = ?
+ WHERE 1
};
+ $query .= q{ AND id IN ( } . join( q{,}, (q{?}) x @$id ) . q{ )}
+ if @$id;
+
+ $query .= q{
+ AND userid = ?
+ } if $userid;
+
if ($sessionid) {
$query .=
$previous
$query .= q{ AND type = ?}
if $type;
+ # FIXME DATE_SUB is a Mysql-ism. Postgres uses: datefield - INTERVAL '6 months'
+ $query .= q{ AND time < DATE_SUB( NOW(), INTERVAL ? DAY )}
+ if $interval;
+
$dbh->do(
- $query, {}, $userid,
+ $query, {},
+ ( @$id ? ( @$id ) : () ),
+ ( $userid ? $userid : () ),
( $sessionid ? $sessionid : () ),
- ( $type ? $type : () )
+ ( $type ? $type : () ),
+ ( $interval ? $interval : () ),
);
}
+sub delete_from_cookie {
+ my ($params) = @_;
+ my $cookie = $params->{cookie};
+ my $id = $params->{id};
+
+ return unless $cookie;
+
+ unless ( ref( $id ) ) {
+ $id = $id ? [ $id ] : [];
+ }
+ return unless @$id;
+
+ my @searches;
+ if ( $cookie ){
+ $cookie = uri_unescape( $cookie );
+ if (decode_json( $cookie )) {
+ @searches = @{decode_json( $cookie )}
+ }
+ }
+
+ @searches = map {
+ my $search = $_;
+ ( grep { $_ != $search->{id} } @$id ) ? $search : ()
+ } @searches;
+
+ return uri_escape( encode_json( \@searches ) );
+
+}
+
sub get {
my ($params) = @_;
+ my $id = $params->{id};
my $userid = $params->{userid};
my $sessionid = $params->{sessionid};
my $type = $params->{type};
my $previous = $params->{previous};
- unless ($userid) {
+ unless ( ref( $id ) ) {
+ $id = $id ? [ $id ] : [];
+ }
+
+ unless ( $userid or @$id ) {
warn "ERROR: userid is required for history search";
return;
}
my $query = q{
SELECT *
FROM search_history
- WHERE userid = ?
+ WHERE 1
};
+ $query .= q{ AND id IN ( } . join( q{,}, (q{?}) x @$id ) . q{ )}
+ if @$id;
+
+ $query .= q{
+ AND userid = ?
+ } if $userid;
+
if ($sessionid) {
$query .=
$previous
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare($query);
$sth->execute(
- $userid,
+ ( @$id ? ( @$id ) : () ),
+ ( $userid ? $userid : () ),
( $sessionid ? $sessionid : () ),
( $type ? $type : () )
);
my $session = C4::Auth::get_session($sessionID);
return () unless $session;
$session->param( 'search_history',
- uri_escape_utf8( encode_json($search_history) ) );
+ uri_escape( encode_json($search_history) ) );
}
1;