DBIO

 view release on metacpan or  search on metacpan

lib/DBIO/Storage.pm  view on Meta::CPAN

package DBIO::Storage;
# ABSTRACT: Generic Storage Handler

use strict;
use warnings;

use base qw/DBIO::Base/;
use mro 'c3';

{
  package # Hide from PAUSE
    DBIO::Storage::NESTED_ROLLBACK_EXCEPTION;
  use base 'DBIO::Exception';
}

use DBIO::Carp;
use DBIO::Storage::BlockRunner;
use Scalar::Util qw/blessed weaken/;
use DBIO::Storage::TxnScopeGuard;
use Try::Tiny;
use namespace::clean;

__PACKAGE__->mk_group_accessors(simple => qw/
  debug schema transaction_depth deferred_rollback auto_savepoint savepoints
  access_broker access_broker_mode
/);
__PACKAGE__->mk_group_accessors(component_class => 'cursor_class');

__PACKAGE__->cursor_class('DBIO::Cursor');

sub cursor { shift->cursor_class(@_); }



sub new {
  my ($self, $schema) = @_;

  $self = ref $self if ref $self;

  my $new = bless( {
    transaction_depth => 0,
    savepoints => [],
  }, $self);

  $new->set_schema($schema);
  $new->debug(1)
    if $ENV{DBIO_TRACE};

  $new;
}



sub set_schema {
  my ($self, $schema) = @_;
  $self->schema($schema);
  weaken $self->{schema} if ref $self->{schema};
}


sub set_access_broker {
  my ($self, $broker, $mode) = @_;

  $self->throw_exception('set_access_broker() requires a broker object')
    unless blessed($broker);

  $self->throw_exception(
    'set_access_broker() requires a DBIO::AccessBroker instance'
  ) unless $broker->isa('DBIO::AccessBroker');

  $self->access_broker($broker);
  $self->access_broker_mode($mode || 'write');
  $broker->set_storage($self);

  return $self;
}


sub clear_access_broker {
  my $self = shift;
  $self->access_broker(undef);
  $self->access_broker_mode(undef);
  return $self;
}


sub current_access_broker_connect_info {
  my ($self, $mode) = @_;
  my $broker = $self->access_broker or return;
  $mode ||= $self->access_broker_mode || 'write';
  return $broker->current_connect_info_for_storage($self, $mode);
}


sub connected { die "Virtual method!" }


sub disconnect { die "Virtual method!" }


sub ensure_connected { die "Virtual method!" }



sub throw_exception {
  my $self = shift;

  if (ref $self and $self->schema) {
    $self->schema->throw_exception(@_);
  }
  else {
    DBIO::Exception->throw(@_);
  }
}





( run in 0.596 second using v1.01-cache-2.11-cpan-995e09ba956 )