Fey::DBIManager - Manage a set of DBI handles


Fey-DBIManager documentation Contained in the Fey-DBIManager distribution.

Index


Code Index:

NAME

Top

Fey::DBIManager - Manage a set of DBI handles

VERSION

Top

version 0.16

SYNOPSIS

Top

  my $manager = Fey::DBIManager->new();

  $manager->add_source( dsn => 'dbi:Pg:dbname=MyDB' );

  my $source = $manager->default_source();

  my $source = $manager->source_for_sql($select_sql);

DESCRIPTION

Top

Fey::DBIManager manager a set of Fey::DBIManager::Source objects, each of which in turn represents a single DBI handle.

It's main purpose is to provide a single interface to one or more data sources, allowing you to easily define your database connections in one spot.

METHODS

Top

This class provides the following methods:

Fey::DBIManager->new()

Returns a new Fey::DBIManager object.

$manager->add_source(...)

This method adds a new Fey::DBIManager::Source object to the manager. It can either accept an instantiated Fey::DBIManager::Source object, or a set of parameters needed to create a new source.

Sources are identified by name, and if you try to add one that already exists in the manager, an error will be thrown.

$manager->get_source($name)

Given a source name, this returns the named source, if it exists in the manager.

$manager->remove_source($name)

Removes the named source, if it exists in the manager.

$manager->has_source($name)

Returns true if the manager has the named source.

$manager->sources()

Returns all of the source in the manager.

$manager->default_source()

This method returns the default source for the manager. If the manager has only one source, then this is the default. Otherwise it looks for a source named "default". If no such source exists, or if the manager has no sources at all, then an exception is thrown.

$manager->source_for_sql($sql_object)

This method accepts a single Fey::SQL object and returns an appropriate source.

By default, this method simply returns the default source. It exists to provide a spot for subclasses which want to do something more clever, such as use one source for reads and another for writes.

BUGS

Top

Please report any bugs or feature requests to bug-fey-dbimanager@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

AUTHOR

Top

Dave Rolsky <autarch@urth.org>

COPYRIGHT AND LICENSE

Top


Fey-DBIManager documentation Contained in the Fey-DBIManager distribution.

package Fey::DBIManager;
BEGIN {
  $Fey::DBIManager::VERSION = '0.16';
}

use strict;
use warnings;
use namespace::autoclean;

use Fey::Exceptions qw( object_state_error param_error );
use Scalar::Util qw( blessed );

use Fey::DBIManager::Source;

use Moose 0.90;
use MooseX::SemiAffordanceAccessor;
use MooseX::StrictConstructor;

has _sources => (
    traits   => ['Hash'],
    is       => 'ro',
    isa      => 'HashRef[Fey::DBIManager::Source]',
    default  => sub { {} },
    init_arg => undef,
    handles  => {
        get_source    => 'get',
        add_source    => 'set',
        remove_source => 'delete',
        _source_count => 'count',
        has_source    => 'exists',
        sources       => 'values',
    },
);

around 'add_source' => sub {
    my $orig = shift;
    my $self = shift;

    my $source;
    if ( @_ > 1 ) {
        $source = Fey::DBIManager::Source->new(@_);
    }
    else {
        $source = shift;
    }

    my $name;
    if ( blessed $source && $source->can('name') ) {
        $name = $source->name();

        param_error qq{You already have a source named "$name".}
            if $self->has_source($name);
    }

    my $return = $self->$orig( $name => $source );

    return $return;
};

sub default_source {
    my $self = shift;

    if ( $self->_source_count() == 0 ) {
        object_state_error
            'This manager has no default source because it has no sources at all.';
    }
    elsif ( $self->_source_count() == 1 ) {

        # Need to force scalar context for the return value
        return ( $self->sources() )[0];
    }
    elsif ( my $source = $self->get_source('default') ) {
        return $source;
    }
    else {
        object_state_error
            'This manager has multiple sources, but none are named "default".';
    }

    return;
}

sub source_for_sql {
    my $self = shift;

    return $self->default_source();
}

__PACKAGE__->meta()->make_immutable();

1;

# ABSTRACT: Manage a set of DBI handles




__END__