discourse-legacysite-perl/site/slowtwitch.com/cgi-bin/articles/admin/Links/Table/CatLinks.pm
2024-06-17 21:49:12 +10:00

96 lines
3.1 KiB
Perl

# ==================================================================
# Gossamer Links - enhanced directory management system
#
# Website : http://gossamer-threads.com/
# Support : http://gossamer-threads.com/scripts/support/
# CVS Info : 087,071,086,086,085
# Revision : $Id: CatLinks.pm,v 1.4 2006/03/25 01:13:35 brewt Exp $
#
# Copyright (c) 2004 Gossamer Threads Inc. All Rights Reserved.
# Redistribution in part or in whole strictly prohibited. Please
# see LICENSE file for full details.
# ==================================================================
package Links::Table::CatLinks;
# ==================================================================
use strict;
use Links qw/:payment :objects/;
use GT::SQL;
use GT::SQL::Table;
use vars qw /@ISA $ERROR_MESSAGE @DELETING/;
@ISA = qw/GT::SQL::Table/;
$ERROR_MESSAGE = 'GT::SQL';
@DELETING = (); # Used by Links::Table::Links
sub delete {
# -----------------------------------------------------------------------------
# We override the default CatLinks delete to delete any links that will no
# longer be referenced as a result of the deletion.
#
my ($self, $cond) = @_;
ref $cond or return $self->fatal(BADARGS => '$catlinks->delete(condition)');
# Get the CatLinks rows that are about to be deleted
my (%delete, %links);
my $sth = $self->select($cond);
while (my $row = $sth->fetchrow_hashref) {
$delete{$row->{LinkID}}++;
if (exists $links{$row->{LinkID}}) {
push @{$links{$row->{LinkID}}}, $row->{CategoryID};
}
else {
$links{$row->{LinkID}} = [$row->{CategoryID}];
}
}
# Delete the CatLinks rows
my $ret = $self->SUPER::delete($cond) or return;
# Get the links that still exist in the CatLinks table after the delete (ie.
# links that were in multiple categories). These are the links that shouldn't
# be deleted from the Links table.
my @remaining = keys %delete ? $self->select('LinkID', { LinkID => [keys %delete] })->fetchall_list : ();
for (@remaining, @DELETING) {
delete $delete{$_};
}
# Non-validated links don't increment Category counts.
my @notval = keys %links ? $DB->table('Links')->select('ID', { ID => [keys %links], isValidated => 'No' })->fetchall_list : ();
for (@notval, @DELETING) {
delete $links{$_};
}
# Any links in %delete have no references to it from CatLinks
if (keys %delete) {
$DB->table('Links')->delete({ ID => [keys %delete] });
}
# Build a list of categories that need their counts updated
my %cats;
for (keys %links) {
for (@{$links{$_}}) {
$cats{$_}++;
}
}
# Update the Category link counts
if (keys %cats) {
my $category = $DB->table('Category');
my %change;
while (my ($catid, $count) = each %cats) {
push @{$change{-$count}}, $catid;
}
$category->link_count(\%change);
while (my ($change, $ids) = each %change) {
$category->update({ Direct_Links => \("Direct_Links - " . abs $change) }, { ID => $ids });
}
}
$ret;
}
1;