RT::Extension::Converter::RT1 - Handle the RT1 side of a conversion


RT-Extension-Converter documentation Contained in the RT-Extension-Converter distribution.

Index


Code Index:

NAME

Top

RT::Extension::Converter::RT1 - Handle the RT1 side of a conversion

SYNOPSIS

Top

    use RT::Extension::Converter::RT1;
    my $converter = RT::Extension::Converter::RT1->new;

DESCRIPTION

Top

Object that should be used by converter scripts to

METHODS

Top

new

Returns a converter object after setting up things such as the config

config

Returns a config object

_handle

private method for the db handle of the RT1 database

_connect

conect to the RT1 database

_run_query

Takes a sql string and a list of placeholder values

 _run_query( sql => $sql, placeholders => \@placeholders )

Returns a statement handle

_fetch_data

wrapper around _run_query to hide the boring bits of iterating over the data set and cleaning up when we get to the end of the data.

_sth

Stores several named sth's for this object (since multiple queries can be happening simultaneously).

Takes Name => sth for set Name for get

_clean_sth

finishes the sth and gets rid of it takes the name of the sth

get_user

Intended to be called in a loop. Wraps over the DBH iterator. When called for the first time, will fetch the users and returns one as a hashref. Will keep returning one until we run out.

get_queue

Intended to be called in a loop. Wraps over the DBH iterator. When called for the first time, will fetch the queues and returns one as a hashref. Will keep returning one until we run out.

get_area

Intended to be called in a loop. Wraps over the DBH iterator. When called for the first time, will fetch the areas for the queue and returns one as a hashref. Will keep returning one until we run out.

Takes one argument, Name => Queue's Name

get_queue_acl

Intended to be called in a loop. Wraps over the DBH iterator. When called for the first time, will fetch the acls for the queue and returns one as a hashref. Will keep returning one until we run out.

Takes one argument, Name => Queue's Name

get_ticket

Intended to be called in a loop. Wraps over the DBH iterator. When called for the first time, will fetch all tickets and return one as a hashref. Will keep returning one until we run out.

get_transactions

Takes the ticketid passed in and returns an arrayref of transaction data.

AUTHOR

Top

Kevin Falcone <falcone@bestpractical.com>

LICENCE AND COPYRIGHT

Top

DISCLAIMER OF WARRANTY

Top

BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.


RT-Extension-Converter documentation Contained in the RT-Extension-Converter distribution.
package RT::Extension::Converter::RT1;

use warnings;
use strict;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors(qw(config _handle ));

use RT::Extension::Converter::RT1::Config;
use DBI;

sub new {
    my $class = shift;

    my $self = $class->SUPER::new(@_);
    $self->config(RT::Extension::Converter::RT1::Config->new);
    return $self;
}

# this probably really wants to be using DBIx::SearchBuilder or
# some other ORM, but we're really just doing a few simple SQL calls
# so we'll avoid having to map the old tables for now

sub _connect {
    my $self = shift;
    my $config = $self->config;
    
    my $dsn = sprintf("DBI:mysql:database=%s;host=%s;",
                      $config->database, $config->dbhost,
                      { RaiseError => 1 });
    print "connecting to $dsn" if $config->debug;
    my $dbh = DBI->connect($dsn, $config->dbuser, $config->dbpassword) 
        or die "Can't connect to RT1 database: ".$DBI::errstr;

    return $self->_handle($dbh);
}

sub _run_query {
    my $self = shift;
    my %args = @_;

    my $handle= $self->_handle|| $self->_connect;

    my @placeholders = @{$args{placeholders}||[]};
    
    my $sth = $handle->prepare($args{sql});
    $sth->execute(@placeholders) or 
      die("Can't run query: $args{sql} - " . 
          join(" ",@placeholders) . 
          "\nReason:" . $DBI::errstr . "\n");
    
    return $sth;
}

sub _fetch_data {
    my $self = shift;
    my %args = @_;
    my $name = delete $args{name};

    my $sth = $self->_sth($name);

    unless ($sth) {
        $sth = $self->_run_query( %args );
        $self->_sth( $name => $sth );
    }

    my $data = $sth->fetchrow_hashref;

    $self->_clean_sth($name) unless $data;

    return $data;
}

sub _sth {
    my $self = shift;

    if (@_ > 1) {
        my ($name,$sth) = @_;
        $self->{sths}{$name} = $sth;
    } elsif (@_) {
        my $name = shift;
        $self->{sths}{$name};
    } else {
        die "You must pass at least a name to _sth";
    }
}

sub _clean_sth {
    my $self = shift;
    my $name = shift;

    $self->_sth($name)->finish;
    $self->_sth($name,undef);
    return;
}

sub get_user {
    my $self = shift;

    my $sql = <<ESQL;
select user_id as Name, 
       real_name as RealName, 
       password as Password, 
       email as EmailAddress, 
       phone as WorkPhone, 
       comments as Comments, 
       admin_rt as SuperUser
from users
ESQL

    my $user_data = $self->_fetch_data( name => 'User', sql => $sql );

    if ($user_data && !$user_data->{EmailAddress}) {
        $user_data->{EmailAddress} = $user_data->{Name}.'@'.$self->config->email_domain;
    }

    return $user_data;
}

sub get_queue {
    my $self = shift;

    my $sql = <<ESQL;
select queue_id as Name, 
       mail_alias as CorrespondAddress, 
       comment_alias as CommentAddress, 
       default_prio as InitialPriority, 
       default_final_prio as FinalPriority, 
       default_due_in as DefaultDueIn
from queues
ESQL

    my $queue_data = $self->_fetch_data( name => 'Queue', sql => $sql );

    if ($queue_data) {
        $queue_data->{Description} = "Imported from RT 1.0";
    }

    return $queue_data;

}

sub get_area {
    my $self = shift;
    my %args = @_;

    my $sql = 'select area from queue_areas where queue_id = ?';

    my $area_data = $self->_fetch_data( name => 'Area', 
                                        sql => $sql, 
                                        placeholders => [$args{Name}] );

    return $area_data;
}

sub get_queue_acl {
    my $self = shift;
    my %args = @_;

    my $sql = 'select user_id, display, manipulate, admin from queue_acl where queue_id = ?';

    my $acl_data = $self->_fetch_data( name => 'ACL', 
                                       sql => $sql, 
                                       placeholders => [$args{Name}] );

    return $acl_data;
}

sub get_ticket {
    my $self = shift;
    my %args = @_;

    my $sql = <<SQL;
select serial_num as id,
       effective_sn as EffectiveId,
       status as Status,
       requestors as Requestors,
       owner as Owner,
       subject as Subject,
       priority as Priority,
       final_priority as FinalPriority,
       initial_priority as InitialPriority,
       date_due as Due,
       date_told as Told,
       date_created as Created,
       date_acted as Updated,
       queue_id as Queue,
       area as Area
from each_req 
SQL
    my $ticket_data = $self->_fetch_data( name => 'Ticket', sql => $sql );

    return $ticket_data;
}

sub get_transactions {
    my $self = shift;
    my $ticket_id = shift;
    my $transactions;

    my $sql = 'select * from transactions where serial_num = ? order by trans_date asc';
    while (my $transaction = $self->_fetch_data( name => 'Transaction', 
            sql => $sql, 
            placeholders => [$ticket_id]) ) {
        if ($transaction->{actor} && $transaction->{actor} !~ /\@/) {
            $transaction->{actor} .= '@'.$self->config->email_domain;
        }
        push @$transactions,$transaction;
    }
    return $transactions;
}

1;