Bug 68921 - Multiple checkers on same query

git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@1037 6955db30-a419-402b-8a0d-67ecbb4d7f56
master
vfilippov 2010-10-29 16:03:48 +00:00
parent ff239fbf1e
commit a076b36558
5 changed files with 36 additions and 40 deletions

View File

@ -24,7 +24,7 @@ $user->in_group('bz_editcheckers')
action => 'modify',
object => 'checkers'});
my $id = $params->{query_id};
my $id = $params->{id};
defined($id) && detaint_natural($id);
if ($params->{save})
{
@ -72,6 +72,7 @@ if ($params->{save})
else
{
$ch = Bugzilla::Checker->check({ id => $id });
$ch->set_query_id($params->{query_id});
$ch->set_message($params->{message});
$ch->set_flags($flags);
$ch->set_except_fields($except);
@ -81,7 +82,7 @@ if ($params->{save})
}
elsif ($params->{delete})
{
Bugzilla->dbh->do('DELETE FROM checkers WHERE query_id=?', undef, $id);
Bugzilla->dbh->do('DELETE FROM checkers WHERE id=?', undef, $id);
}
print $cgi->redirect(-location => 'editcheckers.cgi');
exit;

View File

@ -22,6 +22,7 @@ use constant {
our @EXPORT = qw(CF_FREEZE CF_FATAL CF_CREATE CF_UPDATE CF_DENY);
use constant DB_COLUMNS => (
'id',
# <Это состояние> задаётся соответствием запросу поиска.
'query_id',
# Кто создал
@ -38,7 +39,7 @@ use constant DB_COLUMNS => (
'except_fields',
);
use constant NAME_FIELD => 'message';
use constant ID_FIELD => 'query_id';
use constant ID_FIELD => 'id';
use constant LIST_ORDER => NAME_FIELD;
use constant REQUIRED_CREATE_FIELDS => qw(query_id message);
@ -49,6 +50,7 @@ use constant VALIDATORS => {
};
use constant UPDATE_COLUMNS => (
'query_id',
'flags',
'message',
'sql_code',
@ -90,9 +92,8 @@ sub create
{
$params->{except_fields} = encode_json($params->{except_fields});
}
Bugzilla::Object::create($class, $params);
my $self = $class->new($params->{query_id});
$self->update if $self;
my $self = Bugzilla::Object::create($class, $params);
$self->update;
return $self;
}
@ -142,6 +143,7 @@ sub _check_flags
return $value;
}
sub id { $_[0]->{id} }
sub query_id { $_[0]->{query_id} }
sub user_id { $_[0]->{user_id} }
sub message { $_[0]->{message} }

View File

@ -19,8 +19,8 @@ sub refresh_checker
{
my ($query) = @_;
my $dbh = Bugzilla->dbh;
my $chk = Bugzilla::Checker->new($query->id) || return;
$chk->update;
my ($chk) = @{ Bugzilla::Checker->match({ query_id => $query->id }) };
$chk && $chk->update;
}
sub all
@ -54,7 +54,7 @@ sub check
{
$s = $_->sql_code;
$i = $_->id;
$s =~ s/^(.*)(GROUP\s+BY)/SELECT $i query_id FROM $1 AND bugs.bug_id=$bug_id $2/iso;
$s =~ s/^(.*)(GROUP\s+BY)/SELECT $i id FROM $1 AND bugs.bug_id=$bug_id $2/iso;
push @$sql, $s;
}
}

View File

@ -114,6 +114,7 @@ sub db_schema_abstract_schema
# Bug 68921 - Предикаты корректности из запросов поиска
$schema->{checkers} = {
FIELDS => [
id => {TYPE => 'MEDIUMSERIAL', NOTNULL => 1, PRIMARYKEY => 1},
query_id => {TYPE => 'INT3', NOTNULL => 1, REFERENCES => {TABLE => 'namedqueries', COLUMN => 'id'}},
user_id => {TYPE => 'INT3', REFERENCES => {TABLE => 'profiles', COLUMN => 'userid'}},
is_freeze => {TYPE => 'BOOLEAN'},
@ -123,7 +124,7 @@ sub db_schema_abstract_schema
except_fields => {TYPE => 'BLOB'},
],
INDEXES => [
checkers_primary_idx => { FIELDS => ['query_id'], TYPE => 'UNIQUE' },
checkers_query_id_idx => { FIELDS => ['query_id'] },
],
};
return 1;
@ -312,25 +313,12 @@ sub install_update_db
}
# Временное, можно удалить
if ($dbh->bz_column_info('checkers', 'is_freeze'))
if (!$dbh->bz_column_info('checkers', 'id'))
{
use Bugzilla::Checker;
use JSON;
$dbh->bz_add_column('checkers', flags => {TYPE => 'INT2', NOTNULL => 1, DEFAULT => 1});
my $rows = $dbh->selectall_arrayref('SELECT * FROM checkers', {Slice=>{}});
for (@$rows)
{
$_->{except_fields} = $_->{except_fields} ? decode_json($_->{except_fields}) : {};
$dbh->do('UPDATE checkers SET flags=?, except_fields=? WHERE query_id=?', undef,
($_->{is_freeze} ? 1 : 0) * CF_FREEZE |
($_->{is_fatal} ? 1 : 0) * CF_FATAL |
($_->{except_fields}->{deny_all} ? 1 : 0) * CF_DENY |
CF_CREATE | CF_UPDATE,
$_->{except_fields}->{except_fields} ? encode_json($_->{except_fields}->{except_fields}) : undef,
$_->{query_id});
}
$dbh->bz_drop_column('checkers', 'is_freeze');
$dbh->bz_drop_column('checkers', 'is_fatal');
$dbh->bz_add_index('checkers', checkers_query_id_idx => { FIELDS => ['query_id'] });
$dbh->bz_drop_index('checkers', 'checkers_primary_idx');
$dbh->bz_drop_index_raw('checkers', 'checkers_primary_idx');
$dbh->bz_add_column('checkers', id => {TYPE => 'MEDIUMSERIAL', NOTNULL => 1, PRIMARYKEY => 1});
}
return 1;

View File

@ -9,9 +9,10 @@
<dl>
[% FOR c = checkers %]
<dt>
[% c.name | html %]:
<a href="?mode=edit&query_id=[% c.query_id %]">править</a>,
<a href="javascript:void(0)" onclick="if(confirm('Действительно удалить эту проверку?')){window.location.href='?save=1&delete=1&query_id=[% c.query_id %]';}">удалить</a>
<a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=[% c.query.name | url_quote %]
[% IF c.query.shared_with_group.id %]&amp;sharer_id=[% c.query.user.id %][% END %]">[% c.name | html %]</a>:
<a href="?mode=edit&id=[% c.id %]">править</a>,
<a href="javascript:void(0)" onclick="if(confirm('Действительно удалить эту проверку?')){window.location.href='?save=1&delete=1&id=[% c.id %]';}">удалить</a>
</dt>
<dd>
[% c.message | html %]
@ -35,17 +36,21 @@
<table>
[% IF create %]
<input type="hidden" name="create" value="1" />
<tr>
<th>Сохранённый запрос:</th>
<td><select name="query_id">
[% FOREACH q = user.queries %]
<option value="[% q.id %]" [% " selected='selected'" IF checker.query_id == q.id %] >[% q.name | html %]</option>
[% END %]
</select></td>
</tr>
[% ELSE %]
<input type="hidden" name="query_id" value="[% checker.query_id %]" />
<input type="hidden" name="id" value="[% checker.id %]" />
[% END %]
<tr>
<th>Сохранённый запрос:</th>
<td><select name="query_id">
[% FOREACH q = user.queries %]
[% SET found = 1 IF checker.query_id == q.id %]
<option value="[% q.id %]" [% " selected='selected'" IF checker.query_id == q.id %] >[% q.name | html %]</option>
[% END %]
[% IF checker.query_id AND !found %]
<option value="[% checker.query_id %]" selected='selected'>[% checker.query.name | html %]</option>
[% END %]
</select></td>
</tr>
<tr>
<th>Сообщение об ошибке:</th>
<td><textarea name="message" rows="8" cols="80">[% checker.message | html %]</textarea></td>