Version.pm 4.16 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
# -*- 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>

use strict;

package Bugzilla::Version;

use Bugzilla::Util;
use Bugzilla::Error;

################################
#####   Initialization     #####
################################

use constant DEFAULT_VERSION => 'unspecified';

use constant DB_COLUMNS => qw(
    versions.value
    versions.product_id
);

our $columns = join(", ", DB_COLUMNS);

sub new {
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = {};
    bless($self, $class);
    return $self->_init(@_);
}

sub _init {
    my $self = shift;
    my ($product_id, $value) = (@_);
    my $dbh = Bugzilla->dbh;

    my $version;

    if (defined $product_id
        && detaint_natural($product_id)
        && defined $value) {

        trick_taint($value);
        $version = $dbh->selectrow_hashref(qq{
            SELECT $columns FROM versions
            WHERE value = ?
            AND product_id = ?}, undef, ($value, $product_id));
    } else {
        ThrowCodeError('bad_arg',
            {argument => 'product_id/value',
             function => 'Bugzilla::Version::_init'});
    }

    return undef unless (defined $version);

    foreach my $field (keys %$version) {
        $self->{$field} = $version->{$field};
    }
    return $self;
}

75 76 77 78 79 80 81 82 83 84 85 86 87
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'};
}

88 89 90 91
###############################
#####     Accessors        ####
###############################

92
sub name       { return $_[0]->{'value'};      }
93 94 95 96 97 98
sub product_id { return $_[0]->{'product_id'}; }

###############################
#####     Subroutines       ###
###############################

99
sub check_version {
100 101 102 103 104 105 106 107
    my ($product, $version_name) = @_;

    $version_name || ThrowUserError('version_not_specified');
    my $version = new Bugzilla::Version($product->id, $version_name);
    unless ($version) {
        ThrowUserError('version_not_valid',
                       {'product' => $product->name,
                        'version' => $version_name});
108
    }
109
    return $version;
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
}

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;

    my $version = $hash_ref->{'version_value'};

131 132 133
    my $version = Bugzilla::Version::check_version($product_obj,
                                                   'acme_version');

134 135 136 137 138 139 140 141 142 143 144 145 146
=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.

147
 Params:      $product_id - Integer with a product id.
148 149 150 151
              $value - String with a version value.

 Returns:     A Bugzilla::Version object.

152 153 154 155 156 157 158 159
=item C<bug_count()>

 Description: Returns the total of bugs that belong to the version.

 Params:      none.

 Returns:     Integer with the number of bugs.

160 161 162 163 164 165
=back

=head1 SUBROUTINES

=over

166 167 168 169 170 171
=item C<check_version($product, $version_name)>

 Description: Checks if the version name exists for the product name.

 Params:      $product - A Bugzilla::Product object.
              $version_name - String with a version name.
172

173
 Returns:     Bugzilla::Version object.
174 175 176 177

=back

=cut