summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Util.pm
diff options
context:
space:
mode:
authorDylan William Hardison <dylan@hardison.net>2018-03-06 19:55:13 +0100
committerGitHub <noreply@github.com>2018-03-06 19:55:13 +0100
commit9b78fe861eb4ca608c75a888cc854a12f2e8d3db (patch)
tree85b1e462ac08f4c9a7ad77d82c100f83bea646e3 /Bugzilla/Util.pm
parent9d857c9d526b68171a8be57ec821b578bad73912 (diff)
downloadbugzilla-9b78fe861eb4ca608c75a888cc854a12f2e8d3db.tar.gz
bugzilla-9b78fe861eb4ca608c75a888cc854a12f2e8d3db.tar.xz
Bug 1443537 - Add utility functions for switching database handle to writeable or read-only mode
Diffstat (limited to 'Bugzilla/Util.pm')
-rw-r--r--Bugzilla/Util.pm26
1 files changed, 26 insertions, 0 deletions
diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm
index 91f06e650..7d85a4dfd 100644
--- a/Bugzilla/Util.pm
+++ b/Bugzilla/Util.pm
@@ -14,6 +14,7 @@ use warnings;
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
@@ -44,6 +45,31 @@ use Encode qw(encode decode resolve_alias);
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]);