summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkanat%kerio.com <>2005-02-25 11:34:10 +0100
committermkanat%kerio.com <>2005-02-25 11:34:10 +0100
commit65f999de859324507eb40e934bc6b647f143511a (patch)
tree0965cbeaf58c9210a82309b2f322dd0b3720a386
parent12feab493e0f734375ac6a542560e2603994bdf6 (diff)
downloadbugzilla-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.pm61
-rwxr-xr-xuserprefs.cgi53
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();
}