http://bugs.dwscoalition.org/show_bug.cgi?id=1710

        This has syntax errors, wtf. 
X-Hg-Repo: dw-free
  Subject: dw-free: http://bugs.dwscoalition.org/show_bug.cgi?id=1710
  From: mark
  
  changeset e592e3f488fb in /home/hg/repos/dw-free
  details: http://hg.dwscoalition.org/dw-free?cmd=changeset;node=e592e3f488fb
  description:
    http://bugs.dwscoalition.org/show_bug.cgi?id=1710

        Revert changeset 4d8bd333d94e for gratuitous syntax errors, it won't 
even compile.

        Patch by mark. 

diffs (807 lines):

diff -r 4d8bd333d94e -r e592e3f488fb bin/upgrading/s2style-wizard-update.pl
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/upgrading/s2style-wizard-update.pl    Sun Sep 20 18:51:52 2009 +0000
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+
+use strict;
+$| = 1;
+
+require "$ENV{'LJHOME'}/cgi-bin/ljlib.pl";
+
+my $sysid = LJ::get_userid("system");
+die "Couldn't find system userid"
+    unless $sysid;
+
+my $dbh = LJ::get_db_writer();
+die "Could not connect to global master"
+    unless $dbh;
+
+
+# find info on styles based on public layouts
+
+# need to select from:
+# s2styles - get style name
+# s2stylelayers - get layout s2lid
+# s2layers - get userid of layer
+# s2info - get redist_uniq
+
+{
+    print "Converting styles based on public layouts...";
+
+    my $sth = $dbh->prepare("SELECT s.styleid, i.value " .
+                            "FROM s2styles s, s2stylelayers sl, s2layers l, 
s2info i " .
+                            "WHERE s.styleid=sl.styleid AND l.s2lid=sl.s2lid 
AND i.s2lid=l.s2lid " .
+                            "AND l.userid=? AND l.type='layout' AND 
s.name='wizard' " .
+                            "AND i.infokey='redist_uniq'");
+    $sth->execute($sysid);
+    my $ct = 0;
+    while (my ($styleid, $redist_uniq) = $sth->fetchrow_array) {
+
+        my $layout = (split("/", $redist_uniq))[0];
+        $dbh->do("UPDATE s2styles SET name=? WHERE styleid=?",
+                 undef, "wizard-$layout", $styleid);
+        $ct++;
+        print "." if $ct % 1000 == 0;
+    }
+
+    print " $ct done.\n";
+}
+
+
+# find info on styles based on user layouts
+
+# need to select from:
+# s2styles - get style name
+# s2stylelayers - get layout s2lid
+# s2layers - get userid of layer
+
+{
+    print "Converting styles based on user layouts...";
+
+    my $sth = $dbh->prepare("SELECT s.styleid, l.s2lid " .
+                            "FROM s2styles s, s2stylelayers sl, s2layers l " .
+                            "WHERE s.styleid=sl.styleid AND l.s2lid=sl.s2lid " 
.
+                            "AND l.userid<>? AND l.type='layout' AND 
s.name='wizard'");
+    $sth->execute($sysid);
+    my $ct = 0;
+    while (my ($styleid, $s2lid) = $sth->fetchrow_array) {
+
+        $dbh->do("UPDATE s2styles SET name=? WHERE styleid=?",
+                 undef, "wizard-$s2lid", $styleid);
+        $ct++;
+        print "." if $ct % 1000 == 0;
+    }
+
+    print " $ct done.\n";
+}
diff -r 4d8bd333d94e -r e592e3f488fb bin/upgrading/update-db-general.pl
--- a/bin/upgrading/update-db-general.pl        Sun Sep 20 09:15:19 2009 +0000
+++ b/bin/upgrading/update-db-general.pl        Sun Sep 20 18:51:52 2009 +0000
@@ -890,8 +890,6 @@ register_tabledrop("portal_typemap");
 register_tabledrop("portal_typemap");
 register_tabledrop("memkeyword");
 register_tabledrop("memorable");
-register_tabledrop("s2source");
-register_tabledrop("s2stylelayers");
 
 register_tablecreate("infohistory", <<'EOC');
 CREATE TABLE infohistory (
@@ -1047,6 +1045,16 @@ CREATE TABLE s2info (
 )
 EOC
 
+# TODO: Move anything left here to s2source_inno for sites migrating from LJ
+# to DW, then nuke table. New sites should have nothing here.
+register_tablecreate("s2source", <<'EOC'); # global
+CREATE TABLE s2source (
+    s2lid INT UNSIGNED NOT NULL,
+    PRIMARY KEY (s2lid),
+    s2code MEDIUMBLOB
+)
+EOC
+
 register_tablecreate("s2source_inno", <<'EOC'); # global
 CREATE TABLE s2source_inno (
     s2lid INT UNSIGNED NOT NULL,
@@ -1096,6 +1104,15 @@ CREATE TABLE s2styles (
     modtime INT UNSIGNED NOT NULL,
 
     INDEX (userid)
+)
+EOC
+
+register_tablecreate("s2stylelayers", <<'EOC'); # global
+CREATE TABLE s2stylelayers (
+    styleid INT UNSIGNED NOT NULL,
+    type ENUM('core','i18nc','layout','theme','i18n','user') NOT NULL,
+    UNIQUE (styleid, type),
+    s2lid INT UNSIGNED NOT NULL
 )
 EOC
 
@@ -3222,6 +3239,15 @@ register_alter(sub {
         set_dbnote("privcode_all_to_*", 1);
     }
 
+    # convert 'wizard' s2 styles to 'wizard-uniq'
+    if (table_relevant("s2styles") && !check_dbnote("s2style-wizard-update")) {
+
+        # set_dbnote will return true if $opt_sql is set and it sets
+        # the note successfully.  only then do we run the wizard updater
+        set_dbnote("s2style-wizard-update", 1) &&
+            system("$ENV{'LJHOME'}/bin/upgrading/s2style-wizard-update.pl");
+    }
+
     # this never ended up being useful, and just freaked people out 
unnecessarily.
     if (column_type("user", "track")) {
         do_alter("user", "ALTER TABLE user DROP track");
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/DW/BusinessRules.pm
--- a/cgi-bin/DW/BusinessRules.pm       Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/DW/BusinessRules.pm       Sun Sep 20 18:51:52 2009 +0000
@@ -19,7 +19,8 @@ use strict;
 use strict;
 use warnings;
 use Carp ();
-use lib "$LJ::HOME/cgi-bin";
+use DW;
+use LJ::ModuleLoader;
 
 =head1 NAME
 
@@ -91,7 +92,7 @@ sub install_overrides {
 
     my $pkgpath = $callpkg;
     $pkgpath =~ s!::!/!g;
-    return unless -d "$LJ::HOME/cgi-bin/$pkgpath";
+    return unless -d DW->home . "/cgi-bin/$pkgpath";
 
     my %seen;
     foreach my $dpkg ( LJ::ModuleLoader->module_subclasses( $callpkg ) ) {
diff -r 4d8bd333d94e -r e592e3f488fb 
cgi-bin/DW/BusinessRules/InviteCodeRequests.pm
--- a/cgi-bin/DW/BusinessRules/InviteCodeRequests.pm    Sun Sep 20 09:15:19 
2009 +0000
+++ b/cgi-bin/DW/BusinessRules/InviteCodeRequests.pm    Sun Sep 20 18:51:52 
2009 +0000
@@ -18,7 +18,6 @@ package DW::BusinessRules::InviteCodeReq
 package DW::BusinessRules::InviteCodeRequests;
 use strict;
 use warnings;
-use lib "$LJ::HOME/cgi-bin";
 use base 'DW::BusinessRules';
 
 =head1 NAME
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/DW/BusinessRules/InviteCodes.pm
--- a/cgi-bin/DW/BusinessRules/InviteCodes.pm   Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/DW/BusinessRules/InviteCodes.pm   Sun Sep 20 18:51:52 2009 +0000
@@ -20,7 +20,6 @@ use warnings;
 use warnings;
 use Carp ();
 use List::Util ();
-use lib "$LJ::HOME/cgi-bin";
 use base 'DW::BusinessRules';
 use LJ::Lang;
 
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/DW/Worker/DistributeInvites.pm
--- a/cgi-bin/DW/Worker/DistributeInvites.pm    Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/DW/Worker/DistributeInvites.pm    Sun Sep 20 18:51:52 2009 +0000
@@ -18,7 +18,6 @@
 
 use strict;
 use warnings;
-use lib "$LJ::HOME/cgi-bin";
 
 package DW::Worker::DistributeInvites;
 use base 'TheSchwartz::Worker';
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/DW/Worker/XPostWorker.pm
--- a/cgi-bin/DW/Worker/XPostWorker.pm  Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/DW/Worker/XPostWorker.pm  Sun Sep 20 18:51:52 2009 +0000
@@ -20,7 +20,6 @@
 
 use strict;
 use warnings;
-use lib "$LJ::HOME/cgi-bin";
 
 package DW::Worker::XPostWorker;
 use base 'TheSchwartz::Worker';
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/LJ/Blob.pm
--- a/cgi-bin/LJ/Blob.pm        Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/LJ/Blob.pm        Sun Sep 20 18:51:52 2009 +0000
@@ -2,7 +2,6 @@
 
 package LJ::Blob;
 use strict;
-use lib "$LJ::HOME/cgi-bin";
 use BlobClient;
 use BlobClient::Local;
 
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/LJ/NotificationMethod/DebugLog.pm
--- a/cgi-bin/LJ/NotificationMethod/DebugLog.pm Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/LJ/NotificationMethod/DebugLog.pm Sun Sep 20 18:51:52 2009 +0000
@@ -3,7 +3,6 @@ use strict;
 use strict;
 use Carp qw/ croak /;
 use base 'LJ::NotificationMethod';
-use lib "$LJ::HOME/cgi-bin";
 require "weblib.pl";
 
 sub can_digest { 1 };
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/LJ/NotificationMethod/Email.pm
--- a/cgi-bin/LJ/NotificationMethod/Email.pm    Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/LJ/NotificationMethod/Email.pm    Sun Sep 20 18:51:52 2009 +0000
@@ -4,7 +4,6 @@ use Carp qw/ croak /;
 use Carp qw/ croak /;
 use base 'LJ::NotificationMethod';
 
-use lib "$LJ::HOME/cgi-bin";
 require "weblib.pl";
 
 sub can_digest { 1 };
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/LJ/S2.pm
--- a/cgi-bin/LJ/S2.pm  Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/LJ/S2.pm  Sun Sep 20 18:51:52 2009 +0000
@@ -4,7 +4,8 @@ package LJ::S2;
 package LJ::S2;
 
 use strict;
-use lib "$LJ::HOME/src/s2";
+use DW;
+use lib DW->home . "/src/s2";
 use S2;
 use S2::Color;
 use S2::Checker;
@@ -867,15 +868,59 @@ sub cleanup_layers {
     S2::unregister_layer($_) foreach grep { ! $pub->{$_} } @unload;
 }
 
+sub clone_layer
+{
+    die "LJ::S2::clone_layer() has not been ported to use s2compiled2, but 
this function is not currently in use anywhere; if you use this function, 
please update it to use s2compiled2.\n";
+
+    my $id = shift;
+    return 0 unless $id;
+
+    my $dbh = LJ::get_db_writer();
+    my $r;
+
+    $r = $dbh->selectrow_hashref("SELECT * FROM s2layers WHERE s2lid=?", 
undef, $id);
+    return 0 unless $r;
+    $dbh->do("INSERT INTO s2layers (b2lid, userid, type) VALUES (?,?,?)",
+             undef, $r->{'b2lid'}, $r->{'userid'}, $r->{'type'});
+    my $newid = $dbh->{'mysql_insertid'};
+    return 0 unless $newid;
+
+    foreach my $t (qw(s2compiled s2info s2source)) {
+        if ($t eq "s2source") {
+            $r = LJ::S2::load_layer_source_row($id);
+        } else {
+            $r = $dbh->selectrow_hashref("SELECT * FROM $t WHERE s2lid=?", 
undef, $id);
+        }
+        next unless $r;
+        $r->{'s2lid'} = $newid;
+
+        # kinda hacky:  we have to update the layer id
+        if ($t eq "s2compiled") {
+            $r->{'compdata'} =~ s/\$_LID = (\d+)/\$_LID = $newid/;
+        }
+
+        $dbh->do("INSERT INTO $t (" . join(',', keys %$r) . ") VALUES (".
+                 join(',', map { $dbh->quote($_) } values %$r) . ")");
+    }
+
+    return $newid;
+}
+
 sub create_style
 {
-    my ( $u, $name ) = @_;
+    my ($u, $name, $cloneid) = @_;
 
     my $dbh = LJ::get_db_writer();
     return 0 unless $dbh && $u->writer;
 
     my $uid = $u->{userid} + 0
         or return 0;
+
+    my $clone;
+    $clone = load_style($cloneid) if $cloneid;
+
+    # can't clone somebody else's style
+    return 0 if $clone && $clone->{'userid'} != $uid;
 
     # can't create name-less style
     return 0 unless $name =~ /\S/;
@@ -884,6 +929,20 @@ sub create_style
              undef, $u->{'userid'}, $name);
     my $styleid = $dbh->{'mysql_insertid'};
     return 0 unless $styleid;
+
+    if ($clone) {
+        $clone->{'layer'}->{'user'} =
+            LJ::clone_layer($clone->{'layer'}->{'user'});
+
+        my $values;
+        foreach my $ly ('core','i18nc','layout','theme','i18n','user') {
+            next unless $clone->{'layer'}->{$ly};
+            $values .= "," if $values;
+            $values .= "($uid, $styleid, '$ly', $clone->{'layer'}->{$ly})";
+        }
+        $u->do("REPLACE INTO s2stylelayers2 (userid, styleid, type, s2lid) ".
+               "VALUES $values") if $values;
+    }
 
     return $styleid;
 }
@@ -927,7 +986,9 @@ sub delete_user_style
     my $dbh = LJ::get_db_writer();
     return 0 unless $dbh && $u->writer;
 
-    $dbh->do("DELETE FROM s2styles WHERE styleid=?", undef, $styleid)
+    foreach my $t (qw(s2styles s2stylelayers)) {
+        $dbh->do("DELETE FROM $t WHERE styleid=?", undef, $styleid)
+    }
     $u->do("DELETE FROM s2stylelayers2 WHERE userid=? AND styleid=?", undef,
            $u->{userid}, $styleid);
 
@@ -999,7 +1060,7 @@ sub create_layer
 }
 
 # takes optional $u as first argument... if user argument is specified, will
-# look through s2stylelayers2 and delete all mappings that this user has to
+# look through s2stylelayers and delete all mappings that this user has to
 # this particular layer.
 sub delete_layer
 {
@@ -1034,6 +1095,9 @@ sub delete_layer
             # map in the ids we got from the user's styles and clear layers 
referencing
             # this particular layer id
             my $in = join(',', map { $_ + 0 } @ids);
+            $dbh->do("DELETE FROM s2stylelayers WHERE styleid IN ($in) AND 
s2lid = ?",
+                     undef, $lid);
+
             $u->do("DELETE FROM s2stylelayers2 WHERE userid=? AND styleid IN 
($in) AND s2lid = ?",
                    undef, $u->{userid}, $lid);
 
@@ -1086,8 +1150,14 @@ sub get_style_layers
         return 1;
     };
 
-    $fetch->( $u, "SELECT type, s2lid FROM s2stylelayers2 " .
-                  "WHERE userid=? AND styleid=?", $u->userid, $styleid );
+    unless ($fetch->($u, "SELECT type, s2lid FROM s2stylelayers2 " .
+                     "WHERE userid=? AND styleid=?", $u->{userid}, $styleid)) {
+        my $dbh = LJ::get_db_writer();
+        if ($fetch->($dbh, "SELECT type, s2lid FROM s2stylelayers WHERE 
styleid=?",
+                     $styleid)) {
+            LJ::S2::set_style_layers_raw($u, $styleid, %stylay);
+        }
+    }
 
     # set in memcache
     LJ::MemCache::set($memkey, \%stylay);
@@ -1095,7 +1165,43 @@ sub get_style_layers
     return \%stylay;
 }
 
+# the old interfaces.  handles merging with global database data if necessary.
 sub set_style_layers
+{
+    my ($u, $styleid, %newlay) = @_;
+    my $dbh = LJ::get_db_writer();
+    return 0 unless $dbh && $u->writer;
+
+    my @lay = ('core','i18nc','layout','theme','i18n','user');
+    my %need = map { $_, 1 } @lay;
+    delete $need{$_} foreach keys %newlay;
+    if (%need) {
+        # see if the needed layers are already on the user cluster
+        my ($sth, $t, $lid);
+
+        $sth = $u->prepare("SELECT type FROM s2stylelayers2 WHERE userid=? AND 
styleid=?");
+        $sth->execute($u->{'userid'}, $styleid);
+        while (($t) = $sth->fetchrow_array) {
+            delete $need{$t};
+        }
+
+        # if we still don't have everything, see if they exist on the
+        # global cluster, and we'll merge them into the %newlay being
+        # posted, so they end up on the user cluster
+        if (%need) {
+            $sth = $dbh->prepare("SELECT type, s2lid FROM s2stylelayers WHERE 
styleid=?");
+            $sth->execute($styleid);
+            while (($t, $lid) = $sth->fetchrow_array) {
+                $newlay{$t} = $lid;
+            }
+        }
+    }
+
+    set_style_layers_raw($u, $styleid, %newlay);
+}
+
+# just set in user cluster, not merging with global
+sub set_style_layers_raw {
     my ($u, $styleid, %newlay) = @_;
     my $dbh = LJ::get_db_writer();
     return 0 unless $dbh && $u->writer;
@@ -1404,17 +1510,37 @@ sub load_layer_source
 sub load_layer_source
 {
     my $s2lid = shift;
-    my $dbh = LJ::get_db_writer();
-
-    return $dbh->selectrow_array( "SELECT s2code FROM s2source_inno WHERE 
s2lid=?", undef, $s2lid );
+
+    # s2source is the old global MyISAM table that contains s2 layer sources
+    # s2source_inno is new global InnoDB table that contains new layer sources
+    # -- lazy migration is done whenever an insert/delete happens
+
+    my $dbh = LJ::get_db_writer();
+
+    # first try InnoDB table
+    my $s2source = $dbh->selectrow_array("SELECT s2code FROM s2source_inno 
WHERE s2lid=?", undef, $s2lid);
+    return $s2source if $s2source;
+
+    # fall back to MyISAM
+    return $dbh->selectrow_array("SELECT s2code FROM s2source WHERE s2lid=?", 
undef, $s2lid);
 }
 
 sub load_layer_source_row
 {
     my $s2lid = shift;
-    my $dbh = LJ::get_db_writer();
-
-    return $dbh->selectrow_hashref( "SELECT * FROM s2source_inno WHERE 
s2lid=?", undef, $s2lid );
+
+    # s2source is the old global MyISAM table that contains s2 layer sources
+    # s2source_inno is new global InnoDB table that contains new layer sources
+    # -- lazy migration is done whenever an insert/delete happens
+
+    my $dbh = LJ::get_db_writer();
+
+    # first try InnoDB table
+    my $s2source = $dbh->selectrow_hashref("SELECT * FROM s2source_inno WHERE 
s2lid=?", undef, $s2lid);
+    return $s2source if $s2source;
+
+    # fall back to MyISAM
+    return $dbh->selectrow_hashref("SELECT * FROM s2source WHERE s2lid=?", 
undef, $s2lid);
 }
 
 sub get_layout_langs
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm        Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/LJ/User.pm        Sun Sep 20 18:51:52 2009 +0000
@@ -4624,6 +4624,57 @@ sub can_add_tags_to {
 }
 
 
+# <LJFUNC>
+# name: LJ::User::get_keyword_id
+# class:
+# des: Get the id for a keyword.
+# args: uuid, keyword, autovivify?
+# des-uuid: User object or userid to use.
+# des-keyword: A string keyword to get the id of.
+# returns: Returns a kwid into [dbtable[userkeywords]].
+#          If the keyword doesn't exist, it is automatically created for you.
+# des-autovivify: If present and 1, automatically create keyword.
+#                 If present and 0, do not automatically create the keyword.
+#                 If not present, default behavior is the old
+#                 style -- yes, do automatically create the keyword.
+# </LJFUNC>
+sub get_keyword_id
+{
+    my ( $u, $kw, $autovivify ) = @_;
+    $u = LJ::want_user( $u );
+    return undef unless $u;
+    $autovivify = 1 unless defined $autovivify;
+
+    # setup the keyword for use
+    return 0 unless $kw =~ /\S/;
+    $kw = LJ::text_trim( $kw, LJ::BMAX_KEYWORD, LJ::CMAX_KEYWORD );
+
+    # get the keyword and insert it if necessary
+    my $kwid = $u->selectrow_array( 'SELECT kwid FROM userkeywords WHERE 
userid = ? AND keyword = ?',
+                                    undef, $u->userid, $kw ) + 0;
+    if ( $autovivify && ! $kwid ) {
+        # create a new keyword
+        $kwid = LJ::alloc_user_counter( $u, 'K' );
+        return undef unless $kwid;
+
+        # attempt to insert the keyword
+        my $rv = $u->do( "INSERT IGNORE INTO userkeywords (userid, kwid, 
keyword) VALUES (?, ?, ?)",
+                         undef, $u->userid, $kwid, $kw ) + 0;
+        return undef if $u->err;
+
+        # at this point, if $rv is 0, the keyword is already there so try again
+        unless ( $rv ) {
+            $kwid = $u->selectrow_array( 'SELECT kwid FROM userkeywords WHERE 
userid = ? AND keyword = ?',
+                                         undef, $u->userid, $kw ) + 0;
+        }
+
+        # nuke cache
+        $u->memc_delete( 'kws' );
+    }
+    return $kwid;
+}
+
+
 sub tags {
     my $u = shift;
 
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/LJ/Userpic.pm
--- a/cgi-bin/LJ/Userpic.pm     Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/LJ/Userpic.pm     Sun Sep 20 18:51:52 2009 +0000
@@ -879,7 +879,7 @@ sub set_keywords {
     my $picid = $self->{picid};
 
     foreach my $kw (@keywords) {
-        my $kwid = LJ::get_keyword_id( $u, $kw );
+        my $kwid = $u->get_keyword_id( $kw );
         next unless $kwid; # TODO: fire some warning that keyword was bogus
 
         if (++$c > $LJ::MAX_USERPIC_KEYWORDS) {
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/ljlib.pl
--- a/cgi-bin/ljlib.pl  Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/ljlib.pl  Sun Sep 20 18:51:52 2009 +0000
@@ -1501,66 +1501,6 @@ sub cmd_buffer_add
 }
 
 
-# <LJFUNC>
-# name: LJ::get_keyword_id
-# class:
-# des: Get the id for a keyword.
-# args: uuid?, keyword, autovivify?
-# des-uuid: User object or userid to use.
-# des-keyword: A string keyword to get the id of.
-# returns: Returns a kwid into [dbtable[userkeywords]].
-#          If the keyword doesn't exist, it is automatically created for you.
-# des-autovivify: If present and 1, automatically create keyword.
-#                 If present and 0, do not automatically create the keyword.
-#                 If not present, default behavior is the old
-#                 style -- yes, do automatically create the keyword.
-# </LJFUNC>
-sub get_keyword_id
-{
-    &nodb;
-
-    # see if we got a user? if so we use userkeywords on a cluster
-    my $u;
-    if (@_ >= 2) {
-        $u = LJ::want_user(shift);
-        return undef unless $u;
-    }
-
-    my ($kw, $autovivify) = @_;
-    $autovivify = 1 unless defined $autovivify;
-
-    # setup the keyword for use
-    unless ($kw =~ /\S/) { return 0; }
-    $kw = LJ::text_trim($kw, LJ::BMAX_KEYWORD, LJ::CMAX_KEYWORD);
-
-    # get the keyword and insert it if necessary
-    my $kwid;
-    if ( $u ) {
-        $kwid = $u->selectrow_array('SELECT kwid FROM userkeywords WHERE 
userid = ? AND keyword = ?',
-                                    undef, $u->{userid}, $kw) + 0;
-        if ($autovivify && ! $kwid) {
-            # create a new keyword
-            $kwid = LJ::alloc_user_counter($u, 'K');
-            return undef unless $kwid;
-
-            # attempt to insert the keyword
-            my $rv = $u->do("INSERT IGNORE INTO userkeywords (userid, kwid, 
keyword) VALUES (?, ?, ?)",
-                            undef, $u->{userid}, $kwid, $kw) + 0;
-            return undef if $u->err;
-
-            # at this point, if $rv is 0, the keyword is already there so try 
again
-            unless ($rv) {
-                $kwid = $u->selectrow_array('SELECT kwid FROM userkeywords 
WHERE userid = ? AND keyword = ?',
-                                            undef, $u->{userid}, $kw) + 0;
-            }
-
-            # nuke cache
-            LJ::MemCache::delete([ $u->{userid}, "kws:$u->{userid}" ]);
-        }
-    }
-    return $kwid;
-}
-
 sub get_interest {
     my $intid = shift
         or return undef;
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/ljmemories.pl
--- a/cgi-bin/ljmemories.pl     Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/ljmemories.pl     Sun Sep 20 18:51:52 2009 +0000
@@ -56,7 +56,7 @@ sub create {
     $journalid += 0;
     $ditemid += 0;
     $security ||= 'public';
-    $kwids ||= [ LJ::get_keyword_id($u, '*') ]; # * means no category
+    $kwids ||= [ $u->get_keyword_id( '*' ) ]; # * means no category
     $des = LJ::trim($des);
     return undef unless $userid && $journalid && $ditemid && $des && $security 
&& @$kwids;
     return undef unless $security =~ /^(?:public|friends|private)$/;
diff -r 4d8bd333d94e -r e592e3f488fb cgi-bin/taglib.pl
--- a/cgi-bin/taglib.pl Sun Sep 20 09:15:19 2009 +0000
+++ b/cgi-bin/taglib.pl Sun Sep 20 18:51:52 2009 +0000
@@ -730,7 +730,7 @@ sub update_logtags {
         # and turn everything into ids
         $opts->{"${verb}_ids"} ||= [];
         foreach my $kw (@{$opts->{$verb} || []}) {
-            my $kwid = LJ::get_keyword_id($u, $kw, $can_control);
+            my $kwid = $u->get_keyword_id( $kw, $can_control );
             if ($can_control) {
                 # error if we failed to create
                 return undef unless $kwid;
@@ -1065,7 +1065,7 @@ sub create_usertag {
 
     my %res;
     foreach my $tag (@$tags) {
-        my $kwid = LJ::get_keyword_id($u, $tag);
+        my $kwid = $u->get_keyword_id( $tag );
         return undef unless $kwid;
 
         $res{$tag} = $kwid;
@@ -1125,7 +1125,7 @@ sub delete_usertag {
         my $tag = LJ::Tags::validate_tag($val);
         return undef unless $tag;
 
-        $kwid = LJ::get_keyword_id($u, $tag, 0);
+        $kwid = $u->get_keyword_id( $tag, 0 );
     } elsif ($type eq 'id') {
         $kwid = $val + 0;
     }
@@ -1213,14 +1213,14 @@ sub rename_usertag {
         my $val = LJ::Tags::validate_tag($oldkw);
         return $err->( LJ::Lang::ml( 'taglib.error.invalid', { tagname => 
LJ::ehtml( $oldkw ) } ) )
             unless $val;
-        $kwid = LJ::get_keyword_id($u, $val, 0);
+        $kwid = $u->get_keyword_id( $val, 0 );
     } elsif ($type eq 'id') {
         $kwid = $oldkw + 0;
     }
     return $err->() unless $kwid;
 
     # see if this is already a keyword
-    my $newkwid = LJ::get_keyword_id($u, $newname);
+    my $newkwid = $u->get_keyword_id( $newname );
     return undef unless $newkwid;
 
     # see if the tag we're renaming TO already exists as a keyword,
@@ -1293,7 +1293,7 @@ sub set_usertag_display {
         return undef unless $var;
 
         # do not auto-vivify but get the keyword id
-        $kwid = LJ::get_keyword_id($u, $var, 0);
+        $kwid = $u->get_keyword_id( $var, 0 );
     }
     return undef unless $kwid;
 
diff -r 4d8bd333d94e -r e592e3f488fb htdocs/tools/memadd.bml
--- a/htdocs/tools/memadd.bml   Sun Sep 20 09:15:19 2009 +0000
+++ b/htdocs/tools/memadd.bml   Sun Sep 20 18:51:52 2009 +0000
@@ -313,7 +313,7 @@
                 return;
             }
 
-            my $kwid = LJ::get_keyword_id($memoryu, $kw);
+            my $kwid = $memoryu->get_keyword_id( $kw );
             $needflush = 1 unless defined $exist_kw->{$kwid};
             push @kwid, $kwid;
         }
diff -r 4d8bd333d94e -r e592e3f488fb t/00-compile.t
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/t/00-compile.t    Sun Sep 20 18:51:52 2009 +0000
@@ -0,0 +1,113 @@
+#!/usrb/bin/perl -w
+use strict;
+use Test::Most;
+use File::Temp;
+use File::Find::Rule;
+use File::Basename qw(dirname);
+use File::Spec;
+
+my $dir = File::Temp::tempdir( CLEANUP => 1 );
+
+# FIXME: fix the modules that are now skipped
+# some of the modules and scripts cannot yet cleanly loaded
+# instead of waiting them to be fixed we are skipping them for now
+# They should be fixed or makred why they cannot run.
+my %SKIP = (
+    'LJ/PersistentQueue.pm'   => 'bug 1787  needs Data::Queue::Persistent',
+    'LJ/LDAP.pm'              => 'bug 1788  needs Net::LDAP',
+    'LJ/ConfCheck/General.pm' => 'needs to be integrated into LJ::ConfCheck',
+    'LJ/S2/EntryPage.pm'      => 'definition of S2::PROPS is missing (found in 
src/s2/S2.pm)',
+    'LJ/Widget/CreateAccountProfile.pm' => 'Bareword "LJ::BMAX_NAME"',
+    'LJ/Widget/IPPU/SettingProd.pm' => 'Bareword "LJ::get_remote"',
+    'DW/User/Edges/CommMembership.pm' => 'Undefined subroutine 
&DW::User::Edges::define_edge',
+    'DW/User/Edges/WatchTrust.pm'  => 'Bareword "LJ::BMAX_GRPNAME2"',
+    'DW/User/Edges.pm'   => 'Bareword "LJ::BMAX_GRPNAME2"',
+    'DW/External/XPostProtocol/LJXMLRPC.pm' => 'Cant locate object method 
"new" via package "DW::External::XPostProtocol::LJXMLRPC"',
+
+    'DW/Hooks/NavStrip.pm'    => 'Undefined subroutine &LJ::register_hook',
+    'DW/Hooks/SiteScheme.pm'  => 'Undefined subroutine &LJ::register_hook',
+    'LJ/Hooks/PingBack.pm'    => 'Undefined subroutine &LJ::register_hook',
+    'DW/Hooks/SSL.pm'         => 'Undefined subroutine &LJ::register_hook',
+    'DW/Hooks/Display.pm'     => 'Undefined subroutine &LJ::register_hook',
+    'DW/Hooks/Changelog.pm'   => 'Undefined subroutine &LJ::register_hook',
+    'DW/Hooks/EntryForm.pm'   => 'Undefined subroutine &LJ::register_hook',
+
+    'LJ/Test/AtomAPI.pm'      => 'needs Apache/Constants',
+    'Test/FakeApache.pm'      => 'needs Apache/Constants.pm',
+    'Apache/CompressClientFixup.pm' => 'needs Apache/Constants.pm',
+
+    'Data/ObjectDriver/Driver/DBD/SQLite.pm' => 'Bareword "DBI::SQL_BLOB"',
+    'Data/ObjectDriver/Driver/DBD/Oracle.pm' => 'no Oracle',
+
+    'cgi-bin/dw-nonfree.pl' => 'Undefined subroutine &LJ::register_hook',
+    'cgi-bin/ljdefaults.pl' => 'Cant return outside a subroutine at 
cgi-bin/ljdefaults.pl',    
+    'cgi-bin/modperl.pl'    => 'Cant locate object method "server" via package 
"Apache2::ServerUtil"',
+    'cgi-bin/lj-bml-init.pl' => 'Undefined subroutine &BML::register_isocode',
+    'cgi-bin/ljlib-local.pl' => 'Undefined subroutine &LJ::register_hook',
+    'cgi-bin/lj-bml-blocks.pl' => 'Undefined subroutine &BML::register_block',
+    'cgi-bin/ljuserpics.pl'  => 'croak is not imported',
+);
+
+my @scripts = File::Find::Rule->file->name('*.pl')->in('cgi-bin');
+my @modules = File::Find::Rule->relative->file->name('*.pm')->in('cgi-bin');
+
+
+plan tests => 2 * @scripts + 2 * @modules;
+bail_on_fail;
+
+#diag explain \...@scripts;
+#diag explain \...@modules;
+
+my $out = "$dir/out";
+my $err = "$dir/err";
+my $lib = File::Spec->catdir(dirname(dirname($0)), 'cgi-bin');
+
+foreach my $file (@modules) {
+    my $module = substr $file, 0, -3;
+    $module =~ s{/}{::}g;
+
+    if ($SKIP{$file}) {
+        Test::More->builder->skip($SKIP{$file}) for 1..2;
+        next;
+    }
+
+    system qq($^X -I$lib -e "require $module; print 'ok';" > $out 2>$err);
+    my $err_data = slurp($err);
+    is($err_data, '', "STDERR of $file");
+
+    my $out_data = slurp($out);
+    is($out_data, 'ok', "STDOUT of $file");
+}
+
+foreach my $file (@scripts) {
+    if ($SKIP{$file}) {
+        Test::More->builder->skip($SKIP{$file}) for 1..2;
+        next;
+    }
+
+    system qq($^X -I$lib $file > $out 2>$err);
+    my $err_data = slurp($err);
+    is($err_data, '', "STDERR of $file");
+
+    my $out_data = slurp($out);
+    is($out_data, '', "STDOUT of $file");
+}
+
+# Bail out if any of the tests failed
+BAIL_OUT("Aborting test suite") if scalar 
+    grep { not $_->{ok} } Test::More->builder->details;
+
+
+
+
+
+######################################################################
+# Support Functions
+
+sub slurp {
+    my $file = shift;
+    open my $fh, '<', $file or die $!;
+    local $/ = undef;
+    return <$fh>;
+}
+
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to