diff options
author | mkanat%kerio.com <> | 2005-02-25 11:34:10 +0100 |
---|---|---|
committer | mkanat%kerio.com <> | 2005-02-25 11:34:10 +0100 |
commit | 65f999de859324507eb40e934bc6b647f143511a (patch) | |
tree | 0965cbeaf58c9210a82309b2f322dd0b3720a386 | |
parent | 12feab493e0f734375ac6a542560e2603994bdf6 (diff) | |
download | bugzilla-65f999de859324507eb40e934bc6b647f143511a.tar.gz bugzilla-65f999de859324507eb40e934bc6b647f143511a.tar.xz |
Bug 281550: Remove RelationSet from userprefs.cgi (and thus fix non-ANSI INSERT)
Patch By Max Kanat-Alexander <mkanat@kerio.com> r=LpSolit, a=myk
-rw-r--r-- | Bugzilla/Util.pm | 61 | ||||
-rwxr-xr-x | userprefs.cgi | 53 |
2 files changed, 81 insertions, 33 deletions
diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm index 6175e0ab2..3bc39ff09 100644 --- a/Bugzilla/Util.pm +++ b/Bugzilla/Util.pm @@ -33,6 +33,7 @@ use base qw(Exporter); html_quote url_quote value_quote xml_quote css_class_quote lsearch max min + diff_arrays trim diff_strings wrap_comment format_time format_time_decimal file_mod_time); @@ -166,6 +167,29 @@ sub min { return $min; } +sub diff_arrays { + my ($old_ref, $new_ref) = @_; + + my @old = @$old_ref; + my @new = @$new_ref; + + # For each pair of (old, new) entries: + # If they're equal, set them to empty. When done, @old contains entries + # that were removed; @new contains ones that got added. + foreach my $oldv (@old) { + foreach my $newv (@new) { + next if ($newv eq ''); + if ($oldv eq $newv) { + $newv = $oldv = ''; + } + } + } + + my @removed = grep { $_ ne '' } @old; + my @added = grep { $_ ne '' } @new; + return (\@removed, \@added); +} + sub trim { my ($str) = @_; if ($str) { @@ -184,20 +208,10 @@ sub diff_strings { my @old = split(" ", $oldstr); my @new = split(" ", $newstr); - # For each pair of (old, new) entries: - # If they're equal, set them to empty. When done, @old contains entries - # that were removed; @new contains ones that got added. + my ($rem, $add) = diff_arrays(\@old, \@new); - foreach my $oldv (@old) { - foreach my $newv (@new) { - next if ($newv eq ''); - if ($oldv eq $newv) { - $newv = $oldv = ''; - } - } - } - my $removed = join (", ", grep { $_ ne '' } @old); - my $added = join (", ", grep { $_ ne '' } @new); + my $removed = join (", ", @$rem); + my $added = join (", ", @$add); return ($removed, $added); } @@ -303,6 +317,9 @@ Bugzilla::Util - Generic utility functions for bugzilla $val = max($a, $b, $c); $val = min($a, $b, $c); + # Data manipulation + ($removed, $added) = diff_arrays(\@old, \@new); + # Functions for manipulating strings $val = trim(" abc "); ($removed, $added) = diff_strings($old, $new); @@ -415,6 +432,24 @@ Returns the minimum from a set of values. =back +=head2 Data Manipulation + +=over 4 + +=item C<diff_arrays(\@old, \@new)> + + Description: Takes two arrayrefs, and will tell you what it takes to + get from @old to @new. + Params: @old = array that you are changing from + @new = array that you are changing to + Returns: A list of two arrayrefs. The first is a reference to an + array containing items that were removed from @old. The + second is a reference to an array containing items + that were added to @old. If both returned arrays are + empty, @old and @new contain the same values. + +=back + =head2 String Manipulation =over 4 diff --git a/userprefs.cgi b/userprefs.cgi index 72f7232ae..974791d52 100755 --- a/userprefs.cgi +++ b/userprefs.cgi @@ -33,8 +33,6 @@ use Bugzilla::User; require "CGI.pl"; -use Bugzilla::RelationSet; - # Use global template variables. use vars qw($template $vars $userid); @@ -142,11 +140,14 @@ sub SaveAccount { sub DoEmail { + my $dbh = Bugzilla->dbh; + if (Param("supportwatchers")) { - my $watcheduserSet = new Bugzilla::RelationSet; - $watcheduserSet->mergeFromDB("SELECT watched FROM watch WHERE" . - " watcher=$userid"); - $vars->{'watchedusers'} = $watcheduserSet->toString(); + my $watched_ref = $dbh->selectcol_arrayref( + "SELECT profiles.login_name FROM watch, profiles" + . " WHERE watcher = ? AND watch.watched = profiles.userid", + undef, $userid); + $vars->{'watchedusers'} = join(',', @$watched_ref); } SendSQL("SELECT emailflags FROM profiles WHERE userid = $userid"); @@ -232,20 +233,32 @@ sub SaveEmail { $dbh->bz_lock_tables('watch WRITE', 'profiles READ'); # what the db looks like now - my $origWatchedUsers = new Bugzilla::RelationSet; - $origWatchedUsers->mergeFromDB("SELECT watched FROM watch WHERE" . - " watcher=$userid"); - - # Update the database to look like the form - my $newWatchedUsers = new Bugzilla::RelationSet($cgi->param('watchedusers')); - my @CCDELTAS = $origWatchedUsers->generateSqlDeltas( - $newWatchedUsers, - "watch", - "watcher", - $userid, - "watched"); - ($CCDELTAS[0] eq "") || SendSQL($CCDELTAS[0]); - ($CCDELTAS[1] eq "") || SendSQL($CCDELTAS[1]); + my $old_watch_ids = + $dbh->selectcol_arrayref("SELECT watched FROM watch" + . " WHERE watcher = ?", undef, $userid); + + # The new information given to us by the user. + my @new_watch_names = split(/[,\s]+/, $cgi->param('watchedusers')); + my @new_watch_ids = (); + foreach my $username (@new_watch_names) { + my $watched_userid = DBNameToIdAndCheck(trim($username)); + push(@new_watch_ids, $watched_userid); + } + my ($removed, $added) = diff_arrays($old_watch_ids, \@new_watch_ids); + + # Remove people who were removed. + my $delete_sth = $dbh->prepare('DELETE FROM watch WHERE watched = ?' + . ' AND watcher = ?'); + foreach my $remove_me (@$removed) { + $delete_sth->execute($remove_me, $userid); + } + + # Add people who were added. + my $insert_sth = $dbh->prepare('INSERT INTO watch (watched, watcher)' + . ' VALUES (?, ?)'); + foreach my $add_me (@$added) { + $insert_sth->execute($add_me, $userid); + } $dbh->bz_unlock_tables(); } |