summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/tpl/defs.pl3
-rw-r--r--data/tpl/vnbrowse4
-rw-r--r--data/tpl/vnedit6
-rw-r--r--data/tpl/vnpage6
-rw-r--r--lib/ChangeLog20
-rw-r--r--lib/Multi/Core.pm29
-rw-r--r--lib/Multi/IRC.pm16
-rw-r--r--lib/Multi/Image.pm119
-rw-r--r--lib/Multi/Maintenance.pm84
-rw-r--r--lib/Multi/RG.pm3
-rw-r--r--lib/Multi/Sitemap.pm4
-rw-r--r--lib/VNDB/Releases.pm27
-rw-r--r--lib/VNDB/Util/DB.pm31
-rw-r--r--lib/VNDB/VN.pm73
-rw-r--r--util/OLD/cleanimg.pl (renamed from util/cleanimg.pl)0
-rwxr-xr-xutil/OLD/cron_daily.sh (renamed from util/cron_daily.sh)0
-rw-r--r--util/OLD/cron_daily.sql (renamed from util/cron_daily.sql)0
-rw-r--r--util/OLD/relgraph.pl (renamed from util/relgraph.pl)0
-rw-r--r--util/OLD/sitemap.pl (renamed from util/sitemap.pl)0
-rw-r--r--[-rwxr-xr-x]util/multi.pl7
-rw-r--r--util/updates/update_1.14.pl2
-rw-r--r--util/updates/update_1.14.sql8
22 files changed, 324 insertions, 118 deletions
diff --git a/data/tpl/defs.pl b/data/tpl/defs.pl
index b68faab0..44ce3121 100644
--- a/data/tpl/defs.pl
+++ b/data/tpl/defs.pl
@@ -300,9 +300,8 @@ my %formerr_exeptions = (
usrexists => 'Username already exists, please choose an other one',
mailexists => 'There already is a user with that email address, please request a new password if you forgot it',
nomail => 'No user found with that email address',
- nojpeg => 'Image is not in JPEG format!',
+ nojpeg => 'Image is not in JPEG or PNG format!',
toolarge => 'Image is too large (in filesize), try to compress it a little',
- imgsize => 'Image is too large (in height/width), try to resize it a little',
);
sub formerr {
my @err = ref $_[0] eq 'ARRAY' ? @{$_[0]} : ();
diff --git a/data/tpl/vnbrowse b/data/tpl/vnbrowse
index 79dd122e..27aa78b7 100644
--- a/data/tpl/vnbrowse
+++ b/data/tpl/vnbrowse
@@ -15,7 +15,7 @@
<div id="lfilter">
<b>Languages</b> (none selected means all)<br />
[[ for (sort keys %{$d{lang}}) { next if !$d{lang}{$_}; ]]-
- <input type="checkbox" name="lang_[[= $_ ]]" id="lang_[[= $_ ]]" value="1" -[[= $d{slang}=~/$_/?'checked="checked"':'' ]]>
+ <input type="checkbox" name="lang_[[= $_ ]]" id="lang_[[= $_ ]]" value="1" -[[= $d{slang}=~/$_/?'checked="checked"':'' ]] />
<label for="lang_[[= $_ ]]">[[: $VNDB::LANG->{$_} ]]- ([[= $d{lang}{$_} ]])</label>
[[ } ]]-
</div>
@@ -70,7 +70,7 @@
<td class="tc2">Released [[= sortbut($url, 'released') ]]</td>
<td class="tc3">Languages</td>
<td class="tc4">Rating [[= sortbut($url, 'votes') ]]</td>
- </thead></tr>
+ </tr></thead>
[[ for (@{$d{vn}}) {
$_->{c_votes} =~ s#^([0-9]{2}.[0-9]{2})\|([0-9]{4})$#$1 == 0 ? sprintf '- (%d)', $2 : sprintf '%.2f (%d)', $1, $2#e;
$_->{c_released} =~ s#^([0-9]{4})([0-9]{2}).+#$1==0?'N/A':$1==9999?'TBA':(($2&&$2>0?($Time::CTime::MoY[$2-1].' '):'').$1)#e;
diff --git a/data/tpl/vnedit b/data/tpl/vnedit
index f3ae245c..3f5c6700 100644
--- a/data/tpl/vnedit
+++ b/data/tpl/vnedit
@@ -64,13 +64,13 @@
{ type => 'sub', title => 'Image', short => 'img' },
$d{id} ? (
- { type => 'static', text => $d{vn}{image} ?
+ { type => 'static', text => $d{vn}{image} > 0 ?
sprintf '<img src="%s/cv/%02d/%d.jpg" style="float: right" />', $p{st}, $d{vn}{image}%50, $d{vn}{image} :
- 'No image uploaded yet...' },
+ $d{vn}{image} < 0 ? '[processing]' : 'No image uploaded yet...' },
) : (),
{ type => 'upload', name => $d{vn}{image} ? 'Change' : 'Upload', short => 'img' },
{ type => 'static', text => q|
- Preferably the cover of the CD/DVD/package. Image must be in JPEG format and at most 256x400px and 50KB.<br /><br />| },
+ Preferably the cover of the CD/DVD/package. Image must be in JPEG or PNG format and at most 500kB. Images larger than 256x400 will automatically be resized.<br /><br />| },
{ type => 'check', short => 'img_nsfw', name => '<b>NSFW.</b> Please check this option if the image contains nudity, gore, or is otherwise not safe in a work-friendly environment.' },
{ type => 'sub', title => 'Visual novel relations', short => 'rel' },
diff --git a/data/tpl/vnpage b/data/tpl/vnpage
index 15cb3235..1cfdd89a 100644
--- a/data/tpl/vnpage
+++ b/data/tpl/vnpage
@@ -22,7 +22,7 @@
[ l_cisv => 'CISVisual link', sub { $_[0] ? '<a href="http://cisvisual.net/title/'.$_[0].'">'.$_[0].'</a>' : 'No link' } ],
[ categories => 'Categories', sub { join(' ', map { $VNDB::CAT->{substr($_->[0],0,1)}[1]{substr($_->[0],1,2)}.'('.$_->[1].')' } sort { $a->[0] cmp $b->[0] } @{$_[0]}) || 'No categories selected' }, 1 ],
[ relations => 'Relations', sub { join("<br />\n", map { $VNDB::VREL->[$_->{relation}].': '._hchar($_->{title}) } sort { $a->{id} <=> $b->{id} } @{$_[0]}) } ],
- [ image => 'Image', sub { $_[0] ? sprintf '<img src="%s/cv/%02d/%d.jpg" />', $p{st}, $_[0]%50, $_[0] : 'No image'; } ],
+ [ image => 'Image', sub { $_[0] > 0 ? sprintf '<img src="%s/cv/%02d/%d.jpg" />', $p{st}, $_[0]%50, $_[0] : $_[0] < 0 ? '[processing]' : 'No image'; } ],
[ img_nsfw => 'NSFW', sub { $_[0] ? 'Not safe' : 'Safe' } ]
) ]]
[[ } ]]-
@@ -40,12 +40,14 @@
<div id="vnheader">
<div>
-[[ if($d{vn}{image}) { ]]
+[[ if($d{vn}{image} > 0) { ]]
[[ if($d{vn}{img_nsfw} && !$p{AuthNsfw}) { ]]
<img src="[[: $p{st} ]]/cv/nsfw.png" id="nsfw" class="[[: $p{st} ]]/cv/[[= sprintf '%02d/%d', $d{vn}{image}%50, $d{vn}{image} ]].jpg" />
[[ } else { ]]
<img src="[[: $p{st} ]]/cv/[[= sprintf '%02d/%d', $d{vn}{image}%50, $d{vn}{image} ]].jpg" alt="[[: $p{PageTitle} ]]" />
[[ } ]]
+[[ } elsif($d{vn}{image} < 0) { ]]-
+ [processing image, please return in a few minutes]
[[ } else { ]]-
No image uploaded yet...
[[ } ]]-
diff --git a/lib/ChangeLog b/lib/ChangeLog
index c161ab9c..37c1eb3b 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,6 +1,9 @@
TODO:
- + Add a 'change' when hiding/unhiding an item
- + Remove all references to an item when it's hidden
+ + The current implementation of the hidden flag *SUCKS*, seriously needs
+ some revising:
+ + Add a 'change' when hiding/unhiding an item
+ + Remove all references to an item when it's hidden
+ (preferably with the option to re-add them when unhiding)
1.14 - ?
- Removed the ID gap prevention method
@@ -12,10 +15,15 @@ TODO:
- Fixed the ordering of nodes in the relation graphs
- Used global.pl as the central location of the PgSQL login info
- Wrote a daemon which handles several tasks:
- - Generation of relation graphs
- - Generation of the sitemap.xml.gz
- - The IRC bot
- + TODO: scaling/compressing of cover images
+ - Generation of relation graphs
+ - Generation of the sitemap.xml.gz
+ - The IRC bot
+ - scaling/compressing of cover images
+ - General maintenance
+ - Fixed bug with categories not being re-selected after an error submitting
+ a new VN
+ - Relation graphs are now automatically updated when a change in a related
+ release causes information in the graph to be outdated
1.13 - 2008-04-04
- Fixed update_prev
diff --git a/lib/Multi/Core.pm b/lib/Multi/Core.pm
index 1eea66ca..6f3b452c 100644
--- a/lib/Multi/Core.pm
+++ b/lib/Multi/Core.pm
@@ -7,19 +7,20 @@ package Multi::Core;
use strict;
use warnings;
-use POE;
+use POE 'Component::Cron';
use Storable 'freeze', 'thaw';
use IPC::ShareLite ':lock';
use Time::HiRes 'time', 'gettimeofday', 'tv_interval'; # overload time()
+use DateTime::Event::Cron; # bug in PoCo::Cron
sub spawn {
my $p = shift;
POE::Session->create(
package_states => [
- $p => [qw| _start register fetch queue execute finish log cmd_exit |],
+ $p => [qw| _start register addcron fetch queue execute finish log cmd_exit |],
],
- heap => { queue => [], cmds => [], running => 0, starttime => 0 },
+ heap => { cron => [], queue => [], cmds => [], running => 0, starttime => 0 },
);
}
@@ -39,6 +40,13 @@ sub register { # regex, state
}
+sub addcron { # cronline, cmd
+ return if $Multi::DAEMONIZE; # no cronjobs when we aren't a daemon!
+ push @{$_[HEAP]{cron}}, POE::Component::Cron->from_cron($_[ARG0], $_[SESSION], queue => $_[ARG1]);
+ $_[KERNEL]->call(core => log => 3, "Added cron: %s %s", $_[ARG0], $_[ARG1]);
+}
+
+
sub fetch { # lastfetch
my $s = IPC::ShareLite->new(-key => $VNDB::SHMKEY,-create => 1, -destroy => 0);
$s->lock(LOCK_SH);
@@ -97,12 +105,18 @@ sub finish { # cmd [, stop ]
sub log { # level, msg
return if $_[ARG0] > $Multi::LOGLVL;
- #open(my $F, \&STDOUT); #'>>', $Multi::LOGDIR.'/multi.log');
+
(my $p = $_[SENDER][2]{$_[CALLER_STATE]}[0]) =~ s/^Multi:://; # NOT PORTABLE
- printf "[%s] (%s) %s::%s: %s\n", scalar localtime,
+ my $msg = sprintf '(%s) %s::%s: %s',
(qw|WRN ACT DBG|)[$_[ARG0]-1], $p, $_[CALLER_STATE],
$_[ARG2] ? sprintf($_[ARG1], @_[ARG2..$#_]) : $_[ARG1];
- #close $F;
+
+ open(my $F, '>>', $Multi::LOGDIR.'/multi.log');
+ printf $F "[%s] %s\n", scalar localtime, $msg;
+ close $F;
+
+ # (debug) log to stdout as well...
+ #printf "[%s] %s\n", scalar localtime, $msg;
}
@@ -118,7 +132,8 @@ sub cmd_exit {
$s->unlock();
undef $s;
- $_[KERNEL]->delay('fetch'); # This'll make the current session stop
+ $_[KERNEL]->delay('fetch'); # stop fetching
+ $_->delete() for (@{$_[HEAP]{cron}}); # stop scheduling cron jobs
$_[KERNEL]->signal($_[KERNEL], 'shutdown'); # Broadcast to other sessions
}
diff --git a/lib/Multi/IRC.pm b/lib/Multi/IRC.pm
index 3ab4790a..75300419 100644
--- a/lib/Multi/IRC.pm
+++ b/lib/Multi/IRC.pm
@@ -109,15 +109,15 @@ sub irc_msg {
my $m = $_[ARG2];
if($m =~ /^say (.+)$/) {
- $_[KERNEL]->post(circ => privmsg => $_[HEAP]{o}{channel}, $1); }
- elsif($m =~ /^me (.+)$/) {
- $_[KERNEL]->post(circ => ctcp => $_[HEAP]{o}{channel}, "ACTION $1"); }
- elsif($m =~ /^cmd (.+)$/) {
- $_[KERNEL]->post(core => queue => $1); }
- elsif($m =~ /^eval (.+)$/) {
+ $_[KERNEL]->post(circ => privmsg => $_[HEAP]{o}{channel}, $1);
+ } elsif($m =~ /^me (.+)$/) {
+ $_[KERNEL]->post(circ => ctcp => $_[HEAP]{o}{channel}, "ACTION $1");
+ } elsif($m =~ /^cmd (.+)$/) {
+ $_[KERNEL]->post(core => queue => $1);
+ } elsif($m =~ /^eval (.+)$/) {
$_[KERNEL]->post(circ => privmsg => $nick, 'eval: '.$_)
- for (split /\r?\n/, eval($1)||$@); }
- else {
+ for (split /\r?\n/, eval($1)||$@);
+ } else {
$_[KERNEL]->post(circ => privmsg => $nick, 'Unkown command'); }
# TODO: add command to view the current queue, and a method to send log messages
diff --git a/lib/Multi/Image.pm b/lib/Multi/Image.pm
new file mode 100644
index 00000000..f9ccd83e
--- /dev/null
+++ b/lib/Multi/Image.pm
@@ -0,0 +1,119 @@
+
+#
+# Multi::Image - Image compressing and resizing
+#
+
+package Multi::Image;
+
+use strict;
+use warnings;
+use POE;
+use Image::Magick;
+use Image::MetaData::JPEG;
+
+
+sub spawn {
+ my $p = shift;
+ POE::Session->create(
+ package_states => [
+ $p => [qw| _start cmd_coverimage format compress update finish |],
+ ],
+ heap => {
+ imgpath => '/www/vndb/static/cv'
+ },
+ );
+}
+
+
+sub _start {
+ $_[KERNEL]->alias_set('image');
+ $_[KERNEL]->sig(shutdown => 'shutdown');
+ $_[KERNEL]->call(core => register => qr/^coverimage(?: ([0-9]+)|)$/, 'cmd_coverimage');
+
+ # check for unprocessed cover images every day on 0:00 and 12:00 local time
+ $_[KERNEL]->post(core => addcron => '0 0,12 * * *', 'coverimage');
+}
+
+
+sub cmd_coverimage {
+ $_[HEAP]{curcmd} = $_[ARG0];
+
+ if($_[ARG1]) {
+ $_[HEAP]{todo} = [ $_[ARG1] ];
+ } else {
+ my $q = $Multi::SQL->prepare('SELECT image FROM vn_rev WHERE image < 0');
+ $q->execute();
+ $_[HEAP]{todo} = [ map { -1*$_->[0]} @{$q->fetchall_arrayref([])} ];
+ if(!@{$_[HEAP]{todo}}) {
+ $_[KERNEL]->call(core => log => 2, 'No images to process');
+ $_[KERNEL]->yield('finish');
+ return;
+ }
+ }
+ $_[KERNEL]->yield(format => $_[HEAP]{todo}[0]);
+}
+
+
+sub format { # imgid
+ $_[HEAP]{imgid} = $_[ARG0];
+ $_[HEAP]{img} = sprintf '%s/%02d/%d.jpg', $_[HEAP]{imgpath}, $_[ARG0]%50, $_[ARG0];
+ $_[KERNEL]->call(core => log => 3, 'Processing image %d', $_[HEAP]{imgid});
+
+ $_[HEAP]{im} = Image::Magick->new;
+ $_[HEAP]{im}->Read($_[HEAP]{img});
+ $_[HEAP]{im}->Set(magick => 'JPEG');
+ my($w, $h) = ($_[HEAP]{im}->Get('width'), $_[HEAP]{im}->Get('height'));
+ if($w > 256 || $h > 400) {
+ $_[KERNEL]->call(core => log => 3, 'Image too large (%dx%d), resizing', $w, $h);
+ if($w/$h > 256/400) { # width is the limiting factor
+ $h *= 256/$w;
+ $w = 256;
+ } else {
+ $w *= 400/$h;
+ $h = 400;
+ }
+ $_[HEAP]{im}->Thumbnail(width => $w, height => $h);
+ }
+
+ $_[KERNEL]->yield('compress');
+}
+
+
+sub compress {
+ $_[HEAP]{im}->Set(quality => 80);
+ $_[HEAP]{im}->Write($_[HEAP]{img});
+ undef $_[HEAP]{im};
+
+ $_[HEAP]{md} = Image::MetaData::JPEG->new($_[HEAP]{img});
+ $_[HEAP]{md}->drop_segments('METADATA');
+ $_[HEAP]{md}->save($_[HEAP]{img});
+ undef $_[HEAP]{md};
+
+ $_[KERNEL]->call(core => log => 3, 'Compressed image %d to %.2fkB', $_[HEAP]{imgid}, (-s $_[HEAP]{img})/1024);
+ $_[KERNEL]->yield('update');
+}
+
+
+sub update {
+ $Multi::SQL->do('UPDATE vn_rev SET image = ? WHERE image = ?', undef, $_[HEAP]{imgid}, -1*$_[HEAP]{imgid});
+
+ $_[KERNEL]->yield('finish');
+}
+
+
+sub finish {
+ if($_[HEAP]{imgid}) {
+ $_[HEAP]{todo} = [ grep { $_[HEAP]{imgid} != $_ } @{$_[HEAP]{todo}} ];
+ if(@{$_[HEAP]{todo}}) {
+ $_[KERNEL]->yield(format => $_[HEAP]{todo}[0]);
+ return;
+ }
+ }
+
+ $_[KERNEL]->post(core => finish => $_[HEAP]{curcmd});
+ delete @{$_[HEAP]}{qw| curcmd imgid img im md todo |};
+}
+
+
+1;
+
diff --git a/lib/Multi/Maintenance.pm b/lib/Multi/Maintenance.pm
new file mode 100644
index 00000000..fb74e192
--- /dev/null
+++ b/lib/Multi/Maintenance.pm
@@ -0,0 +1,84 @@
+
+#
+# Multi::Maintenance - General maintenance functions
+#
+
+package Multi::Maintenance;
+
+use strict;
+use warnings;
+use POE;
+
+
+sub spawn {
+ my $p = shift;
+ POE::Session->create(
+ package_states => [
+ $p => [qw| _start cmd_maintenance vncache ratings prevcache integrity |],
+ ],
+ );
+}
+
+
+sub _start {
+ $_[KERNEL]->alias_set('maintenance');
+ $_[KERNEL]->call(core => register => qr/^maintenance((?: (?:all|vncache|ratings|prevcache|integrity))+)$/, 'cmd_maintenance');
+
+ # Perform all maintenance functions every day on 0:00
+ $_[KERNEL]->post(core => addcron => '0 0 * * *', 'maintenance all');
+}
+
+
+sub cmd_maintenance {
+ local $_ = $_[ARG1];
+
+ $_[KERNEL]->yield('vncache') if /(vncache|all)/;
+ $_[KERNEL]->yield('ratings') if /(ratings|all)/;
+ $_[KERNEL]->yield('prevcache') if /(prevcache|all)/;
+ $_[KERNEL]->yield('integrity') if /(integrity|all)/;
+
+ $_[KERNEL]->post(core => finish => $_[ARG0]);
+}
+
+
+sub vncache {
+ $_[KERNEL]->call(core => log => 3 => 'Updating c_* columns in the vn table...');
+ $Multi::SQL->do('SELECT update_vncache(0)');
+}
+
+
+sub ratings {
+ $_[KERNEL]->call(core => log => 3 => 'Recalculating VN ratings...');
+ $Multi::SQL->do('SELECT calculate_rating()');
+}
+
+
+sub prevcache {
+ $_[KERNEL]->call(core => log => 3 => 'Updating prev column in the changes table...');
+ $Multi::SQL->do(q|SELECT update_prev('vn', ''), update_prev('releases', ''), update_prev('producers', '')|);
+}
+
+
+sub integrity {
+ my $q = $Multi::SQL->prepare(q|
+ SELECT 'r', id FROM releases_rev rr
+ WHERE NOT EXISTS(SELECT 1 FROM releases_vn rv WHERE rr.id = rv.rid)
+ UNION
+ SELECT c.type::varchar, id FROM changes c
+ WHERE (c.type = 0 AND NOT EXISTS(SELECT 1 FROM vn_rev vr WHERE vr.id = c.id))
+ OR (c.type = 1 AND NOT EXISTS(SELECT 1 FROM releases_rev rr WHERE rr.id = c.id))
+ OR (c.type = 2 AND NOT EXISTS(SELECT 1 FROM producers_rev pr WHERE pr.id = c.id))|);
+ $q->execute();
+ my $r = $q->fetchall_arrayref([]);
+ if(@$r) {
+ $_[KERNEL]->call(core => log => 1, '!DATABASE INCONSISTENCIES FOUND!: %s',
+ join(', ', map { $_->[0].':'.$_->[1] } @$r));
+ } else {
+ $_[KERNEL]->call(core => log => 3, 'No database inconsistencies found');
+ }
+}
+
+
+1;
+
+
diff --git a/lib/Multi/RG.pm b/lib/Multi/RG.pm
index 9133a7a6..bf0ad9f6 100644
--- a/lib/Multi/RG.pm
+++ b/lib/Multi/RG.pm
@@ -33,6 +33,9 @@ sub spawn {
sub _start {
$_[KERNEL]->alias_set('rg');
$_[KERNEL]->call(core => register => qr/^relgraph ((?:[0-9]+)(?:\s+[0-9]+)*|all)$/, 'cmd_relgraph');
+
+ # regenerate all relation graphs twice a month (every 1st and 15nd day at 03:00)
+ $_[KERNEL]->post(core => addcron => '0 3 1,15 * *', 'relgraph all');
}
diff --git a/lib/Multi/Sitemap.pm b/lib/Multi/Sitemap.pm
index 836fce5b..24981910 100644
--- a/lib/Multi/Sitemap.pm
+++ b/lib/Multi/Sitemap.pm
@@ -31,7 +31,9 @@ sub spawn {
sub _start {
$_[KERNEL]->alias_set('sitemap');
$_[KERNEL]->call(core => register => qr/^sitemap$/, 'cmd_sitemap');
- # TODO: add an event to run cmd_sitemap on a daily basis
+
+ # Regenerate the sitemap every day on 0:00
+ $_[KERNEL]->post(core => addcron => '0 0 * * *', 'sitemap');
}
diff --git a/lib/VNDB/Releases.pm b/lib/VNDB/Releases.pm
index 0012d324..6f642cba 100644
--- a/lib/VNDB/Releases.pm
+++ b/lib/VNDB/Releases.pm
@@ -8,7 +8,7 @@ use Digest::MD5;
use vars ('$VERSION', '@EXPORT');
$VERSION = $VNDB::VERSION;
-@EXPORT = qw| RPage REdit RLock RDel RHide |;
+@EXPORT = qw| RPage REdit RLock RDel RHide RVNCache |;
sub RPage {
@@ -111,9 +111,12 @@ sub REdit {
media => $media,
producers => $producers,
);
- my $cid;
+ my $cid;
$cid = $self->DBEditRelease($rid, %opts) if $rid; # edit
($rid, $cid) = $self->DBAddRelease(%opts) if !$rid; # add
+
+ $self->RVNCache(@$new_vn, (map { $_->{vid} } @$vn));
+
return $self->ResRedirect('/r'.$rid.'?rev='.$cid, 'post');
}
}
@@ -157,7 +160,8 @@ sub RDel {
return $self->ResDenied if !$self->AuthCan('del');
my $r = $self->DBGetRelease(id => $id, what => 'vn')->[0];
return $self->ResNotFound if !$r;
- $self->DBDelRelease([ map { $_->{vid} } @{$r->{vn}} ], $id);
+ $self->DBDelRelease($id);
+ $self->RVNCache(map { $_->{vid} } @{$r->{vn}});
return $self->ResRedirect('/v'.$r->{vn}[0]{id}, 'perm');
}
@@ -169,10 +173,25 @@ sub RHide {
return $self->ResDenied if !$self->AuthCan('del');
my $r = $self->DBGetRelease(id => $id, what => 'vn')->[0];
return $self->ResNotFound if !$r;
- $self->DBHideRelease($id, $r->{hidden}?0:1, [ map { $_->{vid} } @{$r->{vn}} ]);
+ $self->DBHideRelease($id, $r->{hidden}?0:1);
+ $self->RVNCache(map { $_->{vid} } @{$r->{vn}});
return $self->ResRedirect('/r'.$id, 'perm');
}
+sub RVNCache { # @vids - calls update_vncache and regenerates relation graphs if needed
+ my($self, @vns) = @_;
+ my $before = $self->DBGetVN(id => \@vns, order => 'v.id');
+ $self->DBVNCache(@vns);
+ my $after = $self->DBGetVN(id => \@vns, order => 'v.id');
+ my @upd = map {
+ $before->[$_]{rgraph} && (
+ $before->[$_]{c_released} != $after->[$_]{c_released}
+ || $before->[$_]{c_languages} ne $after->[$_]{c_languages}
+ ) ? $before->[$_]{id} : ();
+ } 0..$#$before;
+ $self->RunCmd('relgraph '.join(' ', @upd)) if @upd;
+}
+
1;
diff --git a/lib/VNDB/Util/DB.pm b/lib/VNDB/Util/DB.pm
index c93e0997..408a1b86 100644
--- a/lib/VNDB/Util/DB.pm
+++ b/lib/VNDB/Util/DB.pm
@@ -16,7 +16,7 @@ $VERSION = $VNDB::VERSION;
DBGetUser DBAddUser DBUpdateUser
DBGetVotes DBVoteStats DBAddVote DBDelVote
DBGetVNList DBVNListStats DBAddVNList DBEditVNList DBDelVNList
- DBGetVN DBAddVN DBEditVN DBDelVN DBHideVN DBUndefRG
+ DBGetVN DBAddVN DBEditVN DBDelVN DBHideVN DBUndefRG DBVNCache
DBGetRelease DBAddRelease DBEditRelease DBDelRelease DBHideRelease
DBGetProducer DBGetProducerVN DBAddProducer DBEditProducer DBDelProducer DBHideProducer
DBExec DBRow DBAll DBLastId
@@ -560,8 +560,10 @@ sub DBGetVN { # %options->{ id rev char search order results page what cati cate
my %where = (
!$o{id} && !$o{rev} ? ( # don't fetch hidden items unless we ask for an ID
'v.hidden = 0' => 1 ) : (),
- $o{id} ? (
+ $o{id} && !ref($o{id}) ? (
'v.id = %d' => $o{id} ) : (),
+ $o{id} && ref($o{id}) ? (
+ 'v.id IN(!l)' => $o{id} ) : (),
$o{rev} ? (
'vr.id = %d' => $o{rev} ) : (),
$o{char} ? (
@@ -796,6 +798,12 @@ sub DBHideVN { # id, hidden
}
+sub DBVNCache { # @vids
+ my($s,@vn) = @_;
+ $s->DBExec('SELECT update_vncache(%d)', $_) for (@vn);
+}
+
+
sub DBUndefRG { # ids
my($s, @id) = @_;
$s->DBExec(q|
@@ -920,8 +928,6 @@ sub DBAddRelease { # options -> { columns in releases_rev table + comm + vn + pr
my $rid = $s->DBLastId('releases');
_insert_release_rev($s, $id, $rid, \%o);
-
- $s->DBExec('SELECT update_vncache(%d)', $_) for (@{$o{vn}});
return ($rid, $id);
}
@@ -946,8 +952,6 @@ sub DBEditRelease { # id, %opts->{ columns in releases_rev table + comm + vn + p
_insert_release_rev($s, $id, $rid, \%o);
$s->DBExec(q|UPDATE releases SET latest = %d WHERE id = %d|, $id, $rid);
-
- $s->DBExec('SELECT update_vncache(%d)', $_) for (@{$o{vn}});
return $id;
}
@@ -986,8 +990,8 @@ sub _insert_release_rev {
}
-sub DBDelRelease { # $vns, @ids
- my($s, $vn, @rid) = @_;
+sub DBDelRelease { # $vns
+ my($s, @rid) = @_;
return if !@rid;
$s->DBExec($_, \@rid) for(
q|DELETE FROM changes WHERE id IN(SELECT rr.id FROM releases_rev rr WHERE rr.rid IN(!l))|,
@@ -998,23 +1002,16 @@ sub DBDelRelease { # $vns, @ids
q|DELETE FROM releases_vn WHERE rid IN(!l)|,
q|DELETE FROM releases WHERE id IN(!l)|,
);
-
- if($vn) {
- $s->DBExec('SELECT update_vncache(%d)', $_) for (@$vn);
- }
}
-sub DBHideRelease { # id, hidden, vns
- my($s, $id, $h, $vn) = @_;
+sub DBHideRelease { # id, hidden
+ my($s, $id, $h) = @_;
$s->DBExec(q|
UPDATE releases
SET hidden = %d
WHERE id = %d|,
$h, $id);
- if(@$vn) {
- $s->DBExec('SELECT update_vncache(%d)', $_) for (@$vn);
- }
}
diff --git a/lib/VNDB/VN.pm b/lib/VNDB/VN.pm
index ec1de95d..69d4e490 100644
--- a/lib/VNDB/VN.pm
+++ b/lib/VNDB/VN.pm
@@ -9,7 +9,7 @@ require bytes;
use vars ('$VERSION', '@EXPORT');
$VERSION = $VNDB::VERSION;
-@EXPORT = qw| VNPage VNEdit VNLock VNDel VNHide VNBrowse VNXML VNUpdReverse VNRecreateRel |;
+@EXPORT = qw| VNPage VNEdit VNLock VNDel VNHide VNBrowse VNXML VNUpdReverse |;
sub VNPage {
@@ -110,18 +110,12 @@ sub VNEdit {
my $l;
open(my $T, '<:raw:bytes', $tmp) || die $1;
read $T, $l, 2;
- seek $T, 0, 0;
- my($x, $y) = jpegsize($T);
close($T);
$frm->{_err} = $frm->{_err} ? [ @{$frm->{_err}}, 'nojpeg' ] : [ 'nojpeg' ]
- if $l ne pack('H*', 'ffd8');
- if(!$frm->{_err}) {
- $frm->{_err} = $frm->{_err} ? [ @{$frm->{_err}}, 'toolarge' ] : [ 'toolarge' ]
- if -s $tmp > 51200; # 50 KB max.
- $frm->{_err} = $frm->{_err} ? [ @{$frm->{_err}}, 'imgsize' ] : [ 'imgsize' ]
- if $x > 256 || $y > 400; # 256x400 max
- }
+ if $l ne pack('H*', 'ffd8') && $l ne pack('H*', '8950');
+ $frm->{_err} = $frm->{_err} ? [ @{$frm->{_err}}, 'toolarge' ] : [ 'toolarge' ]
+ if !$frm->{_err} && -s $tmp > 512*1024; # 500 KB max.
if($frm->{_err}) {
unlink $tmp;
@@ -130,6 +124,8 @@ sub VNEdit {
my $new = sprintf '%s/%02d/%d.jpg', $self->{imgpath}, $imgid%50, $imgid;
rename $tmp, $new or die $!;
chmod 0666, $new;
+ $self->RunCmd(sprintf 'coverimage %d', $imgid);
+ $imgid = -1*$imgid;
}
} elsif($id) {
$imgid = $v->{image};
@@ -151,7 +147,7 @@ sub VNEdit {
if((!$oid && $#$relations >= 0) || ($oid && $frm->{relations} ne $b4{relations})) {
my %old = $oid ? (map { $_->{id} => $_->{relation} } @{$v->{relations}}) : ();
my %new = map { $_->[1] => $_->[0] } @$relations;
- $self->VNRecreateRel($id, $self->VNUpdReverse(\%old, \%new, $id, $cid));
+ $self->VNUpdReverse(\%old, \%new, $id, $cid);
}
return $self->ResRedirect('/v'.$id.'?rev='.$cid, 'post');
@@ -161,9 +157,7 @@ sub VNEdit {
if($id) {
$frm->{$_} ||= $b4{$_} for (keys %b4);
$frm->{comm} = sprintf 'Reverted to revision %d by %s.', $v->{cid}, $v->{username} if $v->{cid} != $v->{latest};
- } else {
- $frm->{categories} = 0;
- }
+ }
$self->AddHid($frm);
$frm->{_hid} = {map{$_=>1} qw| info cat img |}
@@ -210,8 +204,8 @@ sub VNHide {
return $self->ResNotFound() if !$v;
return $self->ResDenied if !$self->AuthCan('del');
$self->DBHideVN($id, $v->{hidden}?0:1);
- $self->VNRecreateRel($id, $self->VNUpdReverse({ map { $_->{id} => $_->{relation} } @{$v->{relations}} }, {}, $id, 0))
- if @{$v->{relations}};
+ #$self->VNUpdReverse({ map { $_->{id} => $_->{relation} } @{$v->{relations}} }, {}, $id, 0)
+ # if @{$v->{relations}};
return $self->ResRedirect('/v'.$id, 'perm');
}
@@ -293,44 +287,6 @@ sub VNXML {
}
-
-sub jpegsize {
- my $stream = shift;
-
- my $MARKER = "\xFF"; # Section marker.
-
- my $SIZE_FIRST = 0xC0; # Range of segment identifier codes
- my $SIZE_LAST = 0xC3; # that hold size info.
-
- my ($x, $y, $id) = (undef, undef, "could not determine JPEG size");
-
- my ($marker, $code, $length, $data);
- my $segheader;
-
- seek $stream, 2, 0;
- while (1) {
- $length = 4;
- read $stream, $segheader, $length;
-
- ($marker, $code, $length) = unpack("a a n", $segheader);
-
- if ($marker ne $MARKER) {
- $id = "JPEG marker not found";
- last;
- } elsif((ord($code) >= $SIZE_FIRST) && (ord($code) <= $SIZE_LAST)) {
- $length = 5;
- read $stream, $data, $length;
- ($y, $x) = unpack("xnn", $data);
- $id = 'JPG';
- last;
- } else {
- seek $stream, ($length - 2), 1;
- }
- }
- return ($x, $y, $id);
-}
-
-
# Update reverse relations
sub VNUpdReverse { # old, new, id, cid
my($self, $old, $new, $id, $cid) = @_;
@@ -360,14 +316,7 @@ sub VNUpdReverse { # old, new, id, cid
);
}
- return keys %upd;
-}
-
-
-sub VNRecreateRel { # @ids
- my($s, @id) = @_;
- $s->DBUndefRG(@id);
- $s->RunCmd('relgraph '.join(' ',@id));
+ $self->RunCmd('relgraph '.join(' ', $id, keys %upd));
}
diff --git a/util/cleanimg.pl b/util/OLD/cleanimg.pl
index 45032106..45032106 100644
--- a/util/cleanimg.pl
+++ b/util/OLD/cleanimg.pl
diff --git a/util/cron_daily.sh b/util/OLD/cron_daily.sh
index 743a9839..743a9839 100755
--- a/util/cron_daily.sh
+++ b/util/OLD/cron_daily.sh
diff --git a/util/cron_daily.sql b/util/OLD/cron_daily.sql
index c30f30f1..c30f30f1 100644
--- a/util/cron_daily.sql
+++ b/util/OLD/cron_daily.sql
diff --git a/util/relgraph.pl b/util/OLD/relgraph.pl
index a4ae486d..a4ae486d 100644
--- a/util/relgraph.pl
+++ b/util/OLD/relgraph.pl
diff --git a/util/sitemap.pl b/util/OLD/sitemap.pl
index 6fde2f80..6fde2f80 100644
--- a/util/sitemap.pl
+++ b/util/OLD/sitemap.pl
diff --git a/util/multi.pl b/util/multi.pl
index b4b4cad2..4c22bced 100755..100644
--- a/util/multi.pl
+++ b/util/multi.pl
@@ -26,9 +26,6 @@
# -a Don't do anything, just add the commands specified on
# the command line to the shared memory processing queue.
-
-# TODO: error handling
-
#
# Multi - core namespace for initialisation and global variables
#
@@ -46,7 +43,9 @@ use DBI;
use lib '/www/vndb/lib';
use Multi::Core;
use Multi::RG;
+use Multi::Image;
use Multi::Sitemap;
+use Multi::Maintenance;
use Multi::IRC;
BEGIN { require 'global.pl' }
@@ -79,7 +78,9 @@ our $SQL = DBI->connect(@VNDB::DBLOGIN,
Multi::Core->spawn();
Multi::RG->spawn();
+Multi::Image->spawn();
Multi::Sitemap->spawn();
+Multi::Maintenance->spawn();
Multi::IRC->spawn(
server => 'irc.synirc.net',
user => 'Multi_'.$$,
diff --git a/util/updates/update_1.14.pl b/util/updates/update_1.14.pl
index 9c4e787d..af9840c5 100644
--- a/util/updates/update_1.14.pl
+++ b/util/updates/update_1.14.pl
@@ -34,7 +34,7 @@ for (0..49) {
# rename relation graphs
-system('util/relgraph.pl');
+system('util/multi.pl -c "relgraph all"');
# rename cover images
diff --git a/util/updates/update_1.14.sql b/util/updates/update_1.14.sql
index 70ae8ef0..77f9ee71 100644
--- a/util/updates/update_1.14.sql
+++ b/util/updates/update_1.14.sql
@@ -17,6 +17,14 @@ DROP FUNCTION get_new_id(text);
+-- remove users.p* columns (Why haven't I done so earlier?)
+ALTER TABLE users DROP COLUMN pvotes;
+ALTER TABLE users DROP COLUMN pfind;
+ALTER TABLE users DROP COLUMN plist;
+ALTER TABLE users DROP COLUMN pign_nsfw;
+
+
+
-- relation graphs get ID numbers
CREATE SEQUENCE relgraph_seq;
ALTER TABLE vn ALTER COLUMN rgraph DROP NOT NULL;