diff options
author | yorhel <yorhel@1fe2e327-d9db-4752-bcf7-ef0cb4a1748b> | 2008-04-26 09:25:45 +0000 |
---|---|---|
committer | yorhel <yorhel@1fe2e327-d9db-4752-bcf7-ef0cb4a1748b> | 2008-04-26 09:25:45 +0000 |
commit | 88853c1168a333c7c7b7951b2931852e6df7da55 (patch) | |
tree | fbad6f17f0820c89ce5dd8da748cf37b56549d14 | |
parent | d2efb163c11a11e02abd7251fdfde3cb54c710ef (diff) |
Stupid comments - like I can keep track of everything I change...
git-svn-id: svn://vndb.org/vndb@5 1fe2e327-d9db-4752-bcf7-ef0cb4a1748b
-rw-r--r-- | data/tpl/defs.pl | 3 | ||||
-rw-r--r-- | data/tpl/vnbrowse | 4 | ||||
-rw-r--r-- | data/tpl/vnedit | 6 | ||||
-rw-r--r-- | data/tpl/vnpage | 6 | ||||
-rw-r--r-- | lib/ChangeLog | 20 | ||||
-rw-r--r-- | lib/Multi/Core.pm | 29 | ||||
-rw-r--r-- | lib/Multi/IRC.pm | 16 | ||||
-rw-r--r-- | lib/Multi/Image.pm | 119 | ||||
-rw-r--r-- | lib/Multi/Maintenance.pm | 84 | ||||
-rw-r--r-- | lib/Multi/RG.pm | 3 | ||||
-rw-r--r-- | lib/Multi/Sitemap.pm | 4 | ||||
-rw-r--r-- | lib/VNDB/Releases.pm | 27 | ||||
-rw-r--r-- | lib/VNDB/Util/DB.pm | 31 | ||||
-rw-r--r-- | lib/VNDB/VN.pm | 73 | ||||
-rw-r--r-- | util/OLD/cleanimg.pl (renamed from util/cleanimg.pl) | 0 | ||||
-rwxr-xr-x | util/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.pl | 7 | ||||
-rw-r--r-- | util/updates/update_1.14.pl | 2 | ||||
-rw-r--r-- | util/updates/update_1.14.sql | 8 |
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; |