summaryrefslogtreecommitdiff
path: root/lib/Multi/Maintenance.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Multi/Maintenance.pm')
-rw-r--r--lib/Multi/Maintenance.pm64
1 files changed, 62 insertions, 2 deletions
diff --git a/lib/Multi/Maintenance.pm b/lib/Multi/Maintenance.pm
index be267aba..5b092d0a 100644
--- a/lib/Multi/Maintenance.pm
+++ b/lib/Multi/Maintenance.pm
@@ -9,6 +9,7 @@ use strict;
use warnings;
use POE;
use PerlIO::gzip;
+use VNDBUtil 'normalize_titles';
sub spawn {
@@ -17,13 +18,15 @@ sub spawn {
package_states => [
$p => [qw|
_start shutdown set_daily daily set_monthly monthly log_stats
- vncache_inc tagcache vnpopularity vnrating cleangraphs cleansessions
+ vncache_inc tagcache vnpopularity vnrating cleangraphs cleansessions cleannotifications
vncache_full usercache statscache logrotate
+ vnsearch_check vnsearch_gettitles vnsearch_update
|],
],
heap => {
- daily => [qw|vncache_inc tagcache vnpopularity vnrating cleangraphs cleansessions|],
+ daily => [qw|vncache_inc tagcache vnpopularity vnrating cleangraphs cleansessions cleannotifications|],
monthly => [qw|vncache_full usercache statscache logrotate|],
+ vnsearch_checkdelay => 3600,
@_,
},
);
@@ -35,6 +38,8 @@ sub _start {
$_[KERNEL]->sig(shutdown => 'shutdown');
$_[KERNEL]->yield('set_daily');
$_[KERNEL]->yield('set_monthly');
+ $_[KERNEL]->yield('vnsearch_check');
+ $_[KERNEL]->post(pg => listen => vnsearch => 'vnsearch_check');
}
@@ -158,6 +163,13 @@ sub cleansessions {
}
+sub cleannotifications {
+ $_[KERNEL]->post(pg => do =>
+ q|DELETE FROM notifications WHERE read < NOW()-'1 month'::interval|,
+ undef, 'log_stats', 'cleannotifications');
+}
+
+
#
# M O N T H L Y J O B S
#
@@ -235,5 +247,53 @@ sub logrotate {
}
+#
+# V N S E A R C H C A C H E
+#
+
+
+sub vnsearch_check {
+ $_[KERNEL]->call(pg => query =>
+ 'SELECT id FROM vn WHERE NOT hidden AND c_search IS NULL LIMIT 1',
+ undef, 'vnsearch_gettitles');
+}
+
+
+sub vnsearch_gettitles { # num, res
+ return $_[KERNEL]->delay('vnsearch_check', $_[HEAP]{vnsearch_checkdelay}) if $_[ARG0] == 0;
+ my $id = $_[ARG1][0]{id};
+
+ # fetch the titles
+ $_[KERNEL]->call(pg => query => q{
+ SELECT vr.title, vr.original, vr.alias
+ FROM vn v
+ JOIN vn_rev vr ON vr.id = v.latest
+ WHERE v.id = ?
+ UNION
+ SELECT rr.title, rr.original, NULL
+ FROM releases r
+ JOIN releases_rev rr ON rr.id = r.latest
+ JOIN releases_vn rv ON rv.rid = r.latest
+ WHERE rv.vid = ?
+ AND NOT r.hidden
+ }, [ $id, $id ], 'vnsearch_update', $id);
+}
+
+
+sub vnsearch_update { # num, res, vid, time
+ my($res, $id, $time) = @_[ARG1..ARG3];
+ my @t = map +($_->{title}, $_->{original}), @$res;
+ # alias fields are a bit special
+ for (@$res) {
+ push @t, split /,/, $_->{alias} if $_->{alias};
+ }
+ my $t = normalize_titles(@t);
+ $_[KERNEL]->call(core => log => 'Updated search cache for v%d', $id);
+ $_[KERNEL]->call(pg => do =>
+ q|UPDATE vn SET c_search = ? WHERE id = ?|,
+ [ $t, $id ], 'vnsearch_check');
+}
+
+
1;