use base qw(Exporter);
@Bugzilla::Util::EXPORT = qw(trick_taint detaint_natural
detaint_signed
+ with_writable_database with_readonly_database
html_quote url_quote xml_quote
css_class_quote html_light_quote
i_am_cgi i_am_webservice correct_urlbase remote_ip
use Encode::Guess;
use POSIX qw(floor ceil);
use Taint::Util qw(untaint);
+use Try::Tiny;
+
+sub with_writable_database(&) {
+ my ($code) = @_;
+ my $dbh = Bugzilla->dbh_main;
+ local Bugzilla->request_cache->{dbh} = $dbh;
+ local Bugzilla->request_cache->{error_mode} = ERROR_MODE_DIE;
+ try {
+ $dbh->bz_start_transaction;
+ $code->();
+ $dbh->bz_commit_transaction;
+ } catch {
+ $dbh->bz_rollback_transaction;
+ # re-throw
+ die $_;
+ };
+}
+
+sub with_readonly_database(&) {
+ my ($code) = @_;
+ local Bugzilla->request_cache->{dbh} = undef;
+ local Bugzilla->request_cache->{error_mode} = ERROR_MODE_DIE;
+ Bugzilla->switch_to_shadow_db();
+ $code->();
+}
sub trick_taint {
untaint($_[0]);
use Bugzilla::Constants;
use Bugzilla::Search;
-use Bugzilla::Util qw(diff_arrays);
+use Bugzilla::Util qw(diff_arrays with_writable_database with_readonly_database);
use Bugzilla::Extension::PhabBugz::Constants;
use Bugzilla::Extension::PhabBugz::Policy;
}
}
- $self->process_revision_change($object_phid, $story_text);
+ with_writable_database {
+ $self->process_revision_change($object_phid, $story_text);
+ };
$self->save_last_id($story_id, 'feed');
}
$self->logger->debug("USER REALNAME: $user_realname");
$self->logger->debug("OBJECT PHID: $object_phid");
- $self->process_new_user($user_data);
+ with_readonly_database {
+ $self->process_new_user($user_data);
+ };
$self->save_last_id($user_id, 'user');
}
}
# Pre setup before making changes
my $old_user = set_phab_user();
- my $is_shadow_db = Bugzilla->is_shadow_db; Bugzilla->switch_to_main_db if $is_shadow_db;
- my $dbh = Bugzilla->dbh;
- $dbh->bz_start_transaction;
-
my $bug = Bugzilla::Bug->new({ id => $revision->bug_id, cache => 1 });
# REVISION SECURITY POLICY
Bugzilla::BugMail::Send($bug_id, { changer => Bugzilla->user });
}
- $dbh->bz_commit_transaction;
- Bugzilla->switch_to_shadow_db if $is_shadow_db;
-
Bugzilla->set_user($old_user);
$self->logger->info('SUCCESS: Revision D' . $revision->id . ' processed');
# Pre setup before querying DB
my $old_user = set_phab_user();
- Bugzilla->switch_to_shadow_db();
-
my $params = {
f3 => 'OP',
j3 => 'OR',