123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- # -*- 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.
- #
- # Contributor(s): Tiago R. Mello <timello@async.com.br>
- # Max Kanat-Alexander <mkanat@bugzilla.org>
- use strict;
- package Bugzilla::Version;
- use base qw(Bugzilla::Object);
- use Bugzilla::Install::Util qw(vers_cmp);
- use Bugzilla::Util;
- use Bugzilla::Error;
- ################################
- ##### Initialization #####
- ################################
- use constant DEFAULT_VERSION => 'unspecified';
- use constant DB_TABLE => 'versions';
- use constant DB_COLUMNS => qw(
- id
- value
- product_id
- );
- use constant NAME_FIELD => 'value';
- # This is "id" because it has to be filled in and id is probably the fastest.
- # We do a custom sort in new_from_list below.
- use constant LIST_ORDER => 'id';
- sub new {
- my $class = shift;
- my $param = shift;
- my $dbh = Bugzilla->dbh;
- my $product;
- if (ref $param) {
- $product = $param->{product};
- my $name = $param->{name};
- if (!defined $product) {
- ThrowCodeError('bad_arg',
- {argument => 'product',
- function => "${class}::new"});
- }
- if (!defined $name) {
- ThrowCodeError('bad_arg',
- {argument => 'name',
- function => "${class}::new"});
- }
- my $condition = 'product_id = ? AND value = ?';
- my @values = ($product->id, $name);
- $param = { condition => $condition, values => \@values };
- }
- unshift @_, $param;
- return $class->SUPER::new(@_);
- }
- sub new_from_list {
- my $self = shift;
- my $list = $self->SUPER::new_from_list(@_);
- return [sort { vers_cmp(lc($a->name), lc($b->name)) } @$list];
- }
- sub bug_count {
- my $self = shift;
- my $dbh = Bugzilla->dbh;
- if (!defined $self->{'bug_count'}) {
- $self->{'bug_count'} = $dbh->selectrow_array(qq{
- SELECT COUNT(*) FROM bugs
- WHERE product_id = ? AND version = ?}, undef,
- ($self->product_id, $self->name)) || 0;
- }
- return $self->{'bug_count'};
- }
- sub remove_from_db {
- my $self = shift;
- my $dbh = Bugzilla->dbh;
- # The version cannot be removed if there are bugs
- # associated with it.
- if ($self->bug_count) {
- ThrowUserError("version_has_bugs", { nb => $self->bug_count });
- }
- $dbh->do(q{DELETE FROM versions WHERE product_id = ? AND value = ?},
- undef, ($self->product_id, $self->name));
- }
- sub update {
- my $self = shift;
- my ($name, $product) = @_;
- my $dbh = Bugzilla->dbh;
- $name || ThrowUserError('version_not_specified');
- # Remove unprintable characters
- $name = clean_text($name);
- return 0 if ($name eq $self->name);
- my $version = new Bugzilla::Version({ product => $product, name => $name });
- if ($version) {
- ThrowUserError('version_already_exists',
- {'name' => $version->name,
- 'product' => $product->name});
- }
- trick_taint($name);
- $dbh->do("UPDATE bugs SET version = ?
- WHERE version = ? AND product_id = ?", undef,
- ($name, $self->name, $self->product_id));
- $dbh->do("UPDATE versions SET value = ?
- WHERE product_id = ? AND value = ?", undef,
- ($name, $self->product_id, $self->name));
- $self->{'value'} = $name;
- return 1;
- }
- ###############################
- ##### Accessors ####
- ###############################
- sub name { return $_[0]->{'value'}; }
- sub product_id { return $_[0]->{'product_id'}; }
- ###############################
- ##### Subroutines ###
- ###############################
- sub create {
- my ($name, $product) = @_;
- my $dbh = Bugzilla->dbh;
- # Cleanups and validity checks
- $name || ThrowUserError('version_blank_name');
- # Remove unprintable characters
- $name = clean_text($name);
- my $version = new Bugzilla::Version({ product => $product, name => $name });
- if ($version) {
- ThrowUserError('version_already_exists',
- {'name' => $version->name,
- 'product' => $product->name});
- }
- # Add the new version
- trick_taint($name);
- $dbh->do(q{INSERT INTO versions (value, product_id)
- VALUES (?, ?)}, undef, ($name, $product->id));
- return new Bugzilla::Version($dbh->bz_last_key('versions', 'id'));
- }
- 1;
- __END__
- =head1 NAME
- Bugzilla::Version - Bugzilla product version class.
- =head1 SYNOPSIS
- use Bugzilla::Version;
- my $version = new Bugzilla::Version(1, 'version_value');
- my $product_id = $version->product_id;
- my $value = $version->value;
- $version->remove_from_db;
- my $updated = $version->update($version_name, $product);
- my $version = $hash_ref->{'version_value'};
- my $version = Bugzilla::Version::create($version_name, $product);
- =head1 DESCRIPTION
- Version.pm represents a Product Version object.
- =head1 METHODS
- =over
- =item C<new($product_id, $value)>
- Description: The constructor is used to load an existing version
- by passing a product id and a version value.
- Params: $product_id - Integer with a product id.
- $value - String with a version value.
- Returns: A Bugzilla::Version object.
- =item C<bug_count()>
- Description: Returns the total of bugs that belong to the version.
- Params: none.
- Returns: Integer with the number of bugs.
- =item C<remove_from_db()>
- Description: Removes the version from the database.
- Params: none.
- Retruns: none.
- =item C<update($name, $product)>
- Description: Update the value of the version.
- Params: $name - String with the new version value.
- $product - Bugzilla::Product object the version belongs to.
- Returns: An integer - 1 if the version has been updated, else 0.
- =back
- =head1 SUBROUTINES
- =over
- =item C<create($version_name, $product)>
- Description: Create a new version for the given product.
- Params: $version_name - String with a version value.
- $product - A Bugzilla::Product object.
- Returns: A Bugzilla::Version object.
- =back
- =cut
|