Bug 61728 - Debug view$...$... for PostgreSQL
git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@1121 6955db30-a419-402b-8a0d-67ecbb4d7f56master
parent
4042d21282
commit
f3fec9bc14
|
@ -300,16 +300,17 @@ sub import {
|
|||
$Exporter::ExportLevel-- if $is_exporter;
|
||||
}
|
||||
|
||||
sub sql_istrcmp {
|
||||
sub sql_istrcmp
|
||||
{
|
||||
my ($self, $left, $right, $op) = @_;
|
||||
$op ||= "=";
|
||||
|
||||
return "$left ILIKE $right" if $op eq '=';
|
||||
return $self->sql_istring($left) . " $op " . $self->sql_istring($right);
|
||||
}
|
||||
|
||||
sub sql_istring {
|
||||
sub sql_istring
|
||||
{
|
||||
my ($self, $string) = @_;
|
||||
|
||||
return "LOWER($string)";
|
||||
}
|
||||
|
||||
|
|
|
@ -113,6 +113,13 @@ sub new {
|
|||
return $self;
|
||||
}
|
||||
|
||||
sub real_table_list
|
||||
{
|
||||
my $self = shift;
|
||||
my ($table_like, $table_type) = @_;
|
||||
return $self->selectcol_arrayref('SHOW TABLES LIKE ?', undef, $table_like);
|
||||
}
|
||||
|
||||
# when last_insert_id() is supported on MySQL by lowest DBI/DBD version
|
||||
# required by Bugzilla, this implementation can be removed.
|
||||
sub bz_last_key {
|
||||
|
@ -208,12 +215,20 @@ sub sql_fulltext_search
|
|||
);
|
||||
}
|
||||
|
||||
# Case-insensitive collation is used in MySQL
|
||||
sub sql_istring {
|
||||
my ($self, $string) = @_;
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
# Case-insensitive collation is used in MySQL
|
||||
sub sql_istrcmp {
|
||||
my ($self, $a, $b, $op) = @_;
|
||||
$op ||= "=";
|
||||
return "$a $op $b";
|
||||
}
|
||||
|
||||
sub sql_from_days {
|
||||
my ($self, $days) = @_;
|
||||
|
||||
|
|
|
@ -196,6 +196,17 @@ sub sql_fulltext_search
|
|||
);
|
||||
}
|
||||
|
||||
sub real_table_list
|
||||
{
|
||||
my $self = shift;
|
||||
my ($table_like, $table_type) = @_;
|
||||
return $self->selectcol_arrayref(
|
||||
'SELECT table_name FROM information_schema.tables WHERE table_name LIKE ?'.
|
||||
' AND table_type=? AND table_catalog=current_database() AND table_schema=current_schema()',
|
||||
undef, $table_like, lc($table_type) eq 'view' ? 'VIEW' : 'BASE TABLE'
|
||||
);
|
||||
}
|
||||
|
||||
# Tell us whether or not a particular sequence exists in the DB.
|
||||
sub bz_sequence_exists {
|
||||
my ($self, $seq_name) = @_;
|
||||
|
|
|
@ -79,7 +79,7 @@ sub new {
|
|||
{argument => 'name',
|
||||
function => "${class}::new"});
|
||||
}
|
||||
my $condition = 'userid = ? AND name = ?';
|
||||
my $condition = 'userid = ? AND '.$dbh->sql_istrcmp('name', '?');
|
||||
my $user_id = blessed $user ? $user->id : $user;
|
||||
detaint_natural($user_id)
|
||||
|| ThrowCodeError('param_must_be_numeric',
|
||||
|
|
|
@ -22,7 +22,7 @@ sub refresh_some_views
|
|||
my ($users) = @_;
|
||||
my %u = ( map { $_ => 1 } @{ $users || [] } );
|
||||
my $dbh = Bugzilla->dbh;
|
||||
my $r = $dbh->selectcol_arrayref('SHOW TABLES LIKE \'view$%$bugs\'');
|
||||
my $r = $dbh->real_table_list('view$%$bugs', 'VIEW');
|
||||
for (@$r)
|
||||
{
|
||||
my (undef, $user, $query) = split /\$/, $_, -1;
|
||||
|
@ -40,15 +40,15 @@ sub refresh_some_views
|
|||
user => $userobj,
|
||||
) or next;
|
||||
my $sqlquery = $search->getSQL();
|
||||
$sqlquery =~ s/ORDER\s+BY\s+`?bugs`?.`?bug_id`?//so;
|
||||
$dbh->do('DROP VIEW IF EXISTS `view$'.$user.'$'.$query.'$bugs`');
|
||||
$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`');
|
||||
$dbh->do('CREATE SQL SECURITY DEFINER VIEW `view$'.$user.'$'.$query.'$bugs` AS '.$sqlquery);
|
||||
$dbh->do('CREATE SQL SECURITY DEFINER VIEW `view$'.$user.'$'.$query.'$longdescs` AS SELECT l.bug_id, u.login_name, l.bug_when, l.thetext, l.work_time FROM longdescs l INNER JOIN `view$'.$user.'$'.$query.'$bugs` b ON b.bug_id=l.bug_id INNER JOIN profiles u ON u.userid=l.who'.($userobj->is_insider?'':' WHERE l.isprivate=0'));
|
||||
$dbh->do('CREATE 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 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');
|
||||
$sqlquery =~ s/ORDER\s+BY\s+bugs.bug_id//so;
|
||||
$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');
|
||||
$dbh->do('DROP VIEW IF EXISTS view$'.$user.'$'.$query.'$bugs');
|
||||
$dbh->do('CREATE '.($dbh->isa('Bugzilla::DB::Mysql') ? 'SQL SECURITY DEFINER' : '').' VIEW view$'.$user.'$'.$query.'$bugs AS '.$sqlquery);
|
||||
$dbh->do('CREATE '.($dbh->isa('Bugzilla::DB::Mysql') ? 'SQL SECURITY DEFINER' : '').' VIEW view$'.$user.'$'.$query.'$longdescs AS SELECT l.bug_id, u.login_name, l.bug_when, l.thetext, l.work_time FROM longdescs l INNER JOIN view$'.$user.'$'.$query.'$bugs b ON b.bug_id=l.bug_id INNER JOIN profiles u ON u.userid=l.who'.($userobj->is_insider?'':' WHERE l.isprivate=0'));
|
||||
$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');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue