From 88853c1168a333c7c7b7951b2931852e6df7da55 Mon Sep 17 00:00:00 2001 From: yorhel Date: Sat, 26 Apr 2008 09:25:45 +0000 Subject: Stupid comments - like I can keep track of everything I change... git-svn-id: svn://vndb.org/vndb@5 1fe2e327-d9db-4752-bcf7-ef0cb4a1748b --- lib/ChangeLog | 20 +++++--- lib/Multi/Core.pm | 29 +++++++++--- lib/Multi/IRC.pm | 16 +++---- lib/Multi/Image.pm | 119 +++++++++++++++++++++++++++++++++++++++++++++++ lib/Multi/Maintenance.pm | 84 +++++++++++++++++++++++++++++++++ lib/Multi/RG.pm | 3 ++ lib/Multi/Sitemap.pm | 4 +- lib/VNDB/Releases.pm | 27 +++++++++-- lib/VNDB/Util/DB.pm | 31 ++++++------ lib/VNDB/VN.pm | 73 +++++------------------------ 10 files changed, 301 insertions(+), 105 deletions(-) create mode 100644 lib/Multi/Image.pm create mode 100644 lib/Multi/Maintenance.pm (limited to 'lib') 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)); } -- cgit v1.2.3