diff options
Diffstat (limited to 'Bugzilla/DB/Mysql.pm')
-rw-r--r-- | Bugzilla/DB/Mysql.pm | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm new file mode 100644 index 000000000..d2204433b --- /dev/null +++ b/Bugzilla/DB/Mysql.pm @@ -0,0 +1,162 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Dave Miller <davem00@aol.com> +# Gayathri Swaminath <gayathrik00@aol.com> +# Jeroen Ruigrok van der Werven <asmodai@wxs.nl> +# Dave Lawrence <dkl@redhat.com> +# Tomas Kopal <Tomas.Kopal@altap.cz> + +=head1 NAME + +Bugzilla::DB::Mysql - Bugzilla database compatibility layer for MySQL + +=head1 DESCRIPTION + +This module overrides methods of the Bugzilla::DB module with MySQL specific +implementation. It is instantiated by the Bugzilla::DB module and should never +be used directly. + +For interface details see L<Bugzilla::DB> and L<DBI>. + +=cut + +package Bugzilla::DB::Mysql; + +use strict; + +use Bugzilla::Error; +use Carp; + +# This module extends the DB interface via inheritance +use base qw(Bugzilla::DB); + +sub new { + my ($class, $user, $pass, $host, $dbname, $port, $sock) = @_; + + # construct the DSN from the parameters we got + my $dsn = "DBI:mysql:host=$host;database=$dbname;port=$port"; + $dsn .= ";mysql_socket=$sock" if $sock; + + my $self = $class->db_new($dsn, $user, $pass); + + # all class local variables stored in DBI derived class needs to have + # a prefix 'private_'. See DBI documentation. + $self->{private_bz_tables_locked} = 0; + + bless ($self, $class); + + return $self; +} + +# 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 { + my ($self) = @_; + + my ($last_insert_id) = $self->selectrow_array('SELECT LAST_INSERT_ID()'); + + return $last_insert_id; +} + +sub sql_regexp { + return "REGEXP"; +} + +sub sql_not_regexp { + return "NOT REGEXP"; +} + +sub sql_limit { + my ($self, $limit,$offset) = @_; + + if (defined($offset)) { + return "LIMIT $offset, $limit"; + } else { + return "LIMIT $limit"; + } +} + +sub sql_to_days { + my ($self, $date) = @_; + + return "TO_DAYS($date)"; +} + +sub sql_date_format { + my ($self, $date, $format) = @_; + + $format = "%Y.%m.%d %H:%i:%s" if !$format; + + return "DATE_FORMAT($date, " . $self->quote($format) . ")"; +} + +sub sql_interval { + my ($self, $interval) = @_; + + return "INTERVAL $interval"; +} + +sub bz_lock_tables { + my ($self, @tables) = @_; + + # Check first if there was no lock before + if ($self->{private_bz_tables_locked}) { + carp("Tables already locked"); + ThrowCodeError("already_locked"); + } else { + $self->do('LOCK TABLE ' . join(', ', @tables)); + + $self->{private_bz_tables_locked} = 1; + } +} + +sub bz_unlock_tables { + my ($self, $abort) = @_; + + # Check first if there was previous matching lock + if (!$self->{private_bz_tables_locked}) { + # Abort is allowed even without previous lock for error handling + return if $abort; + carp("No matching lock"); + ThrowCodeError("no_matching_lock"); + } else { + $self->do("UNLOCK TABLES"); + + $self->{private_bz_tables_locked} = 0; + } +} + +# As Bugzilla currently runs on MyISAM storage, which does not supprt +# transactions, these functions die when called. +# Maybe we should just ignore these calls for now, but as we are not +# using transactions in MySQL yet, this just hints the developers. +sub bz_start_transaction { + die("Attempt to start transaction on DB without transaction support"); +} + +sub bz_commit_transaction { + die("Attempt to commit transaction on DB without transaction support"); +} + +sub bz_rollback_transaction { + die("Attempt to rollback transaction on DB without transaction support"); +} + +1; |