[dw-free] better organization of LJ functions
[commit: http://hg.dwscoalition.org/dw-free/rev/904af5fb25f0]
http://bugs.dwscoalition.org/show_bug.cgi?id=3965
New module LJ::Procnotify (in a new file cgi-bin/LJ/Procnotify.pm, moved out
of ljlib.pl)
Patch by
kareila.
Files modified:
http://bugs.dwscoalition.org/show_bug.cgi?id=3965
New module LJ::Procnotify (in a new file cgi-bin/LJ/Procnotify.pm, moved out
of ljlib.pl)
Patch by
Files modified:
- bin/renameuser.pl
- cgi-bin/Apache/LiveJournal.pm
- cgi-bin/DW/User/Rename.pm
- cgi-bin/LJ/Procnotify.pm
- cgi-bin/LJ/Sysban.pm
- cgi-bin/ljlib.pl
--------------------------------------------------------------------------------
diff -r 78a3513a71b5 -r 904af5fb25f0 bin/renameuser.pl
--- a/bin/renameuser.pl Wed Dec 07 20:39:21 2011 +0800
+++ b/bin/renameuser.pl Wed Dec 07 21:50:46 2011 +0800
@@ -156,8 +156,8 @@
LJ::MemCache::delete("uidof:$from");
LJ::MemCache::delete("uidof:$to");
- LJ::procnotify_add("rename_user", { 'user' => $u->{'user'},
- 'userid' => $u->{'userid'} });
+ LJ::Procnotify::add( "rename_user", { user => $u->user,
+ userid => $u->userid } );
$dbh->do( "INSERT INTO renames (renid, auth, cartid, renuserid, fromuser, touser, rendate) ".
"VALUES ( NULL, '[manual]', 0, ?, $qfrom, $qto, ? )",
diff -r 78a3513a71b5 -r 904af5fb25f0 cgi-bin/Apache/LiveJournal.pm
--- a/cgi-bin/Apache/LiveJournal.pm Wed Dec 07 20:39:21 2011 +0800
+++ b/cgi-bin/Apache/LiveJournal.pm Wed Dec 07 21:50:46 2011 +0800
@@ -305,7 +305,7 @@
}
LJ::start_request();
- LJ::procnotify_check();
+ LJ::Procnotify::check();
S2::set_domain('LJ');
my $lang = $LJ::DEFAULT_LANG || $LJ::LANGS[0];
diff -r 78a3513a71b5 -r 904af5fb25f0 cgi-bin/DW/User/Rename.pm
--- a/cgi-bin/DW/User/Rename.pm Wed Dec 07 20:39:21 2011 +0800
+++ b/cgi-bin/DW/User/Rename.pm Wed Dec 07 21:50:46 2011 +0800
@@ -355,8 +355,8 @@
DW::User::Rename::_clear_from_cache( $self, $fromusername, $tousername );
# tell everything else that we renamed
- LJ::procnotify_add( "rename_user", { user => $fromusername,
- userid => $self->userid });
+ LJ::Procnotify::add( "rename_user", { user => $fromusername,
+ userid => $self->userid } );
$token->apply( userid => $self->userid, from => $fromusername, to => $tousername );
diff -r 78a3513a71b5 -r 904af5fb25f0 cgi-bin/LJ/Procnotify.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cgi-bin/LJ/Procnotify.pm Wed Dec 07 21:50:46 2011 +0800
@@ -0,0 +1,118 @@
+# This code was forked from the LiveJournal project owned and operated
+# by Live Journal, Inc. The code has been modified and expanded by
+# Dreamwidth Studios, LLC. These files were originally licensed under
+# the terms of the license supplied by Live Journal, Inc, which can
+# currently be found at:
+#
+# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
+#
+# In accordance with the original license, this code and all its
+# modifications are provided under the GNU General Public License.
+# A copy of that license can be found in the LICENSE file included as
+# part of this distribution.
+
+package LJ::Procnotify;
+
+use strict;
+use lib "$ENV{LJHOME}/cgi-bin";
+require 'ljlib.pl';
+
+
+# <LJFUNC>
+# name: LJ::Procnotify::add
+# des: Sends a message to all other processes on all clusters.
+# info: You'll probably never use this yourself.
+# args: cmd, args?
+# des-cmd: Command name. Currently recognized: "DBI::Role::reload" and "rename_user"
+# des-args: Hashref with key/value arguments for the given command.
+# See relevant parts of [func[LJ::Procnotify::callback]], for
+# required args for different commands.
+# returns: new serial number on success; 0 on fail.
+# </LJFUNC>
+sub add {
+ my ($cmd, $argref) = @_;
+ my $dbh = LJ::get_db_writer();
+ return 0 unless $dbh;
+
+ my $args = join('&', map { LJ::eurl($_) . "=" . LJ::eurl($argref->{$_}) }
+ sort keys %$argref);
+ $dbh->do("INSERT INTO procnotify (cmd, args) VALUES (?,?)",
+ undef, $cmd, $args);
+
+ return 0 if $dbh->err;
+ return $dbh->{'mysql_insertid'};
+}
+
+# <LJFUNC>
+# name: LJ::Procnotify::callback
+# des: Call back function process notifications.
+# info: You'll probably never use this yourself.
+# args: cmd, argstring
+# des-cmd: Command name.
+# des-argstring: String of arguments.
+# returns: new serial number on success; 0 on fail.
+# </LJFUNC>
+sub callback {
+ my ($cmd, $argstring) = @_;
+ my $arg = {};
+ LJ::decode_url_string($argstring, $arg);
+
+ if ($cmd eq "rename_user") {
+ # this looks backwards, but the cache hash names are just odd:
+ delete $LJ::CACHE_USERNAME{$arg->{'userid'}};
+ delete $LJ::CACHE_USERID{$arg->{'user'}};
+ return;
+ }
+
+ # ip/uniq/spamreport bans
+ my %ban_types = (
+ ip => \%LJ::IP_BANNED,
+ uniq => \%LJ::UNIQ_BANNED,
+ spamreport => \%LJ::SPAMREPORT_BANNED,
+ );
+
+ if ( $cmd =~ /^ban_(\w+)$/ && exists $ban_types{$1} ) {
+ my $banarg = $arg->{$1};
+ $ban_types{$1}->{$banarg} = $arg->{exptime};
+ return;
+ }
+
+ if ( $cmd =~ /^unban_(\w+)$/ && exists $ban_types{$1} ) {
+ my $banarg = $arg->{$1};
+ delete $ban_types{$1}->{$banarg};
+ return;
+ }
+
+ # cluster switchovers
+ if ($cmd eq 'cluster_switch') {
+ $LJ::CLUSTER_PAIR_ACTIVE{ $arg->{'cluster'} } = $arg->{ 'role' };
+ return;
+ }
+}
+
+
+# each server process runs this to periodically check for new actions
+
+sub check {
+ my $now = time;
+ return if $LJ::CACHE_PROCNOTIFY_CHECK &&
+ $LJ::CACHE_PROCNOTIFY_CHECK + 30 > $now;
+ $LJ::CACHE_PROCNOTIFY_CHECK = $now;
+
+ my $dbr = LJ::get_db_reader();
+ my $max = $dbr->selectrow_array("SELECT MAX(nid) FROM procnotify");
+ return unless defined $max;
+ my $old = $LJ::CACHE_PROCNOTIFY_MAX;
+ if (defined $old && $max > $old) {
+ my $sth = $dbr->prepare("SELECT cmd, args FROM procnotify ".
+ "WHERE nid > ? AND nid <= $max ORDER BY nid");
+ $sth->execute($old);
+ while (my ($cmd, $args) = $sth->fetchrow_array) {
+ LJ::Procnotify::callback( $cmd, $args );
+ }
+ }
+ $LJ::CACHE_PROCNOTIFY_MAX = $max;
+}
+
+
+1;
diff -r 78a3513a71b5 -r 904af5fb25f0 cgi-bin/LJ/Sysban.pm
--- a/cgi-bin/LJ/Sysban.pm Wed Dec 07 20:39:21 2011 +0800
+++ b/cgi-bin/LJ/Sysban.pm Wed Dec 07 21:50:46 2011 +0800
@@ -630,7 +630,7 @@
my $procopts = { $what => $value, exptime => $until };
- LJ::procnotify_add( "ban_$what", $procopts );
+ LJ::Procnotify::add( "ban_$what", $procopts );
LJ::MemCache::delete( "sysban:$what" );
return 1;
@@ -643,7 +643,7 @@
my $procopts = { $what => $value };
- LJ::procnotify_add( "unban_$what", $procopts );
+ LJ::Procnotify::add( "unban_$what", $procopts );
LJ::MemCache::delete( "sysban:$what" );
return 1;
diff -r 78a3513a71b5 -r 904af5fb25f0 cgi-bin/ljlib.pl
--- a/cgi-bin/ljlib.pl Wed Dec 07 20:39:21 2011 +0800
+++ b/cgi-bin/ljlib.pl Wed Dec 07 21:50:46 2011 +0800
@@ -89,6 +89,7 @@
use DW::LatestFeed;
use LJ::Support;
use LJ::Keywords;
+use LJ::Procnotify;
# make Unicode::MapUTF8 autoload:
sub Unicode::MapUTF8::AUTOLOAD {
@@ -1413,100 +1414,6 @@
return hex(substr($c, 1, 6));
}
-# <LJFUNC>
-# name: LJ::procnotify_add
-# des: Sends a message to all other processes on all clusters.
-# info: You'll probably never use this yourself.
-# args: cmd, args?
-# des-cmd: Command name. Currently recognized: "DBI::Role::reload" and "rename_user"
-# des-args: Hashref with key/value arguments for the given command.
-# See relevant parts of [func[LJ::procnotify_callback]], for
-# required args for different commands.
-# returns: new serial number on success; 0 on fail.
-# </LJFUNC>
-sub procnotify_add {
- my ($cmd, $argref) = @_;
- my $dbh = LJ::get_db_writer();
- return 0 unless $dbh;
-
- my $args = join('&', map { LJ::eurl($_) . "=" . LJ::eurl($argref->{$_}) }
- sort keys %$argref);
- $dbh->do("INSERT INTO procnotify (cmd, args) VALUES (?,?)",
- undef, $cmd, $args);
-
- return 0 if $dbh->err;
- return $dbh->{'mysql_insertid'};
-}
-
-# <LJFUNC>
-# name: LJ::procnotify_callback
-# des: Call back function process notifications.
-# info: You'll probably never use this yourself.
-# args: cmd, argstring
-# des-cmd: Command name.
-# des-argstring: String of arguments.
-# returns: new serial number on success; 0 on fail.
-# </LJFUNC>
-sub procnotify_callback
-{
- my ($cmd, $argstring) = @_;
- my $arg = {};
- LJ::decode_url_string($argstring, $arg);
-
- if ($cmd eq "rename_user") {
- # this looks backwards, but the cache hash names are just odd:
- delete $LJ::CACHE_USERNAME{$arg->{'userid'}};
- delete $LJ::CACHE_USERID{$arg->{'user'}};
- return;
- }
-
- # ip/uniq/spamreport bans
- my %ban_types = (
- ip => \%LJ::IP_BANNED,
- uniq => \%LJ::UNIQ_BANNED,
- spamreport => \%LJ::SPAMREPORT_BANNED,
- );
-
- if ( $cmd =~ /^ban_(\w+)$/ && exists $ban_types{$1} ) {
- my $banarg = $arg->{$1};
- $ban_types{$1}->{$banarg} = $arg->{exptime};
- return;
- }
-
- if ( $cmd =~ /^unban_(\w+)$/ && exists $ban_types{$1} ) {
- my $banarg = $arg->{$1};
- delete $ban_types{$1}->{$banarg};
- return;
- }
-
- # cluster switchovers
- if ($cmd eq 'cluster_switch') {
- $LJ::CLUSTER_PAIR_ACTIVE{ $arg->{'cluster'} } = $arg->{ 'role' };
- return;
- }
-}
-
-sub procnotify_check
-{
- my $now = time;
- return if $LJ::CACHE_PROCNOTIFY_CHECK + 30 > $now;
- $LJ::CACHE_PROCNOTIFY_CHECK = $now;
-
- my $dbr = LJ::get_db_reader();
- my $max = $dbr->selectrow_array("SELECT MAX(nid) FROM procnotify");
- return unless defined $max;
- my $old = $LJ::CACHE_PROCNOTIFY_MAX;
- if (defined $old && $max > $old) {
- my $sth = $dbr->prepare("SELECT cmd, args FROM procnotify ".
- "WHERE nid > ? AND nid <= $max ORDER BY nid");
- $sth->execute($old);
- while (my ($cmd, $args) = $sth->fetchrow_array) {
- LJ::procnotify_callback($cmd, $args);
- }
- }
- $LJ::CACHE_PROCNOTIFY_MAX = $max;
-}
-
# We're not always running under mod_perl... sometimes scripts (syndication sucker)
# call paths which end up thinking they need the remote IP, but don't.
sub get_remote_ip
--------------------------------------------------------------------------------
