Bug 68921, Bug 61728

git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@1212 6955db30-a419-402b-8a0d-67ecbb4d7f56
master
vfilippov 2011-02-03 16:16:34 +00:00
parent c7ae2bbeac
commit 1780fc75ca
5 changed files with 26 additions and 1 deletions

View File

@ -94,6 +94,12 @@ sub get_param_list
type => 't',
default => 'mailto:',
},
{
name => 'ext_disable_refresh_views',
type => 'b',
default => 0,
},
);
}

View File

@ -5,6 +5,7 @@
# что было совместимо со стандартной системой хуков Bugzilla, которую убрали в 3.6.
use strict;
use Bugzilla;
use Bugzilla::Hook;
use Bugzilla::Extension;

View File

@ -125,7 +125,7 @@ sub db_schema_abstract_schema
query_id => {TYPE => 'INT3', NOTNULL => 1, REFERENCES => {TABLE => 'namedqueries', COLUMN => 'id'}},
user_id => {TYPE => 'INT3', REFERENCES => {TABLE => 'profiles', COLUMN => 'userid'}},
flags => {TYPE => 'INT2', NOTNULL => 1, DEFAULT => 0},
message => {TYPE => 'varchar(255)', NOTNULL => 1},
message => {TYPE => 'LONGTEXT', NOTNULL => 1},
sql_code => {TYPE => 'LONGTEXT'},
except_fields => {TYPE => 'LONGBLOB'},
],
@ -380,6 +380,12 @@ sub install_update_fielddefs
# Bug 70605 - Делаем вид, что изменили какое-то поле, чтобы при checksetup автоматически сбросился кэш
$dbh->do('UPDATE fielddefs SET delta_ts=NOW() WHERE name=\'delta_ts\'');
# Bug 69481 - Длина описания проверок
if ($dbh->bz_column_info('checkers', 'message')->{TYPE} ne 'LONGTEXT')
{
$dbh->bz_alter_column('checkers', message => {TYPE => 'LONGTEXT', NOTNULL => 1});
}
return 1;
}

View File

@ -17,23 +17,31 @@ sub refresh_views
return 1;
}
# Refresh views, optionally only for $users = [ 'username@domain.org', ... ]
sub refresh_some_views
{
my ($users) = @_;
my %u = ( map { $_ => 1 } @{ $users || [] } );
my $dbh = Bugzilla->dbh;
my $r = $dbh->real_table_list('view$%$bugs', 'VIEW');
# Save current user
my $old_user = Bugzilla->user;
for (@$r)
{
# Determine user
my (undef, $user, $query) = split /\$/, $_, -1;
!%u || $u{$user} or next;
my ($userid) = $dbh->selectrow_array('SELECT userid FROM profiles WHERE login_name LIKE ? ORDER BY userid LIMIT 1', undef, $user.'@%');
$userid or next;
my $userobj = Bugzilla::User->new($userid) or next;
# Modify current user (hack)
Bugzilla->request_cache->user = $userobj;
# Determine saved search
my $q = $query;
$q =~ tr/_/ /;
my $storedquery = Bugzilla::Search::LookupNamedQuery($q, $userid, undef, 0) or next;
my $cgi = new Bugzilla::CGI($storedquery);
# get SQL code
my $search = new Bugzilla::Search(
params => $cgi,
fields => [ 'bug_id', grep { $_ ne 'bug_id' } split /[ ,]+/, $cgi->param('columnlist') ],
@ -41,6 +49,7 @@ sub refresh_some_views
) or next;
my $sqlquery = $search->getSQL();
$sqlquery =~ s/ORDER\s+BY\s+bugs.bug_id//so;
# Recreate views
$dbh->do('DROP VIEW IF EXISTS view$'.$user.'$'.$query.'$longdescs');
$dbh->do('DROP VIEW IF EXISTS view$'.$user.'$'.$query.'$bugs_activity');
$dbh->do('DROP VIEW IF EXISTS view$'.$user.'$'.$query.'$scrum_cards');
@ -50,6 +59,8 @@ sub refresh_some_views
$dbh->do('CREATE '.($dbh->isa('Bugzilla::DB::Mysql') ? 'SQL SECURITY DEFINER' : '').' VIEW view$'.$user.'$'.$query.'$bugs_activity AS SELECT a.bug_id, u.login_name, a.bug_when, f.name field_name, a.removed, a.added FROM bugs_activity a INNER JOIN view$'.$user.'$'.$query.'$bugs b ON b.bug_id=a.bug_id INNER JOIN profiles u ON u.userid=a.who INNER JOIN fielddefs f ON f.id=a.fieldid');
$dbh->do('CREATE '.($dbh->isa('Bugzilla::DB::Mysql') ? 'SQL SECURITY DEFINER' : '').' VIEW view$'.$user.'$'.$query.'$scrum_cards AS SELECT s.* FROM scrum_cards s INNER JOIN view$'.$user.'$'.$query.'$bugs b ON b.bug_id=s.bug_id');
}
# Restore current user
Bugzilla->request_cache->{user} = $old_user;
}
# hooks:

View File

@ -40,5 +40,6 @@
orwiki_url => "Mason Lodge ЦОР Wiki main page URL",
rawiki_url => "RosAtom project Wiki main page URL",
user_mailto => "Substitution for 'mailto:' (e.g. link to Plantime search)",
ext_disable_refresh_views => "Disable automatic external DB views refreshing",
}
%]