зеркало из https://github.com/mozilla/pjs.git
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
This commit is contained in:
Родитель
0edd98534d
Коммит
86707e20bd
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
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);
|
||||
|
||||
# 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]);
|
||||
# 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();
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче