TreePath

 view release on metacpan or  search on metacpan

lib/TreePath/Backend/DBIx.pm  view on Meta::CPAN


has 'schema'     => (
                     is        => 'rw',
                     predicate => 'has_schema',
                     lazy_build      => 1,
                    );

has '_source_name' => (
                is       => 'rw',
                isa      => 'Str',
               );

has '_populate_backend' => (
                is       => 'rw',
                isa      => 'Int',
               );

sub _build_model_config {
  my $self = shift;

  my $model_config = $self->conf->{$self->config->{backend}->{args}->{model}}
      or croak "'backend/args/model' is not defined in conf file !";
  return $model_config
}

sub _build_schema {
  my $self = shift;

  my($dsn, $user, $password, $allattrs) = $self->_connect_info;

  my $schema_class =  $self->model_config->{schema_class};
  eval "require $schema_class";
  if( $@ ){
    die("Cannot load $schema_class : $@");
  }
  return $schema_class->connect($dsn,$user,$password,$allattrs);
}


sub _connect_info {
  my $self = shift;

  my $model_config = $self->model_config;

  my ($dsn, $user, $password, $unicode_option, $db_type);
  eval {
    if (!$dsn)
      {
        if (ref $model_config->{'connect_info'}) {

          $dsn      = $model_config->{'connect_info'}->{dsn};
          $user     = $model_config->{'connect_info'}->{user};
          $password = $model_config->{'connect_info'}->{password};

          # Determine database type amongst: SQLite, Pg or MySQL
          $dsn =~ m/^dbi:(\w+)/;
          $db_type = lc($1);
          my %unicode_connection_for_db = (
                'sqlite' => { sqlite_unicode    => 1 },
                'pg'     => { pg_enable_utf8    => 1 },
                'mysql'  => { mysql_enable_utf8 => 1 },

                );
          $unicode_option = $unicode_connection_for_db{$db_type};
        }
        else {
          $dsn = $model_config->{'connect_info'};
        }
      }
  };

  if ($@) {
    die "Your DSN line in " . $self->conf . " doesn't look like a valid DSN.";
  }
  die "No valid Data Source Name (DSN).\n" if !$dsn;
  $dsn =~ s/__HOME__/$FindBin::Bin\/\.\./g;

  if ( $db_type eq 'sqlite' ){
    $dsn =~ m/.*:(.*)$/;
    my $dir = dir($1)->parent;
    $dir->mkpath;
  }

  my $merge    = Hash::Merge->new( 'LEFT_PRECEDENT' );
  my $allattrs = $merge->merge( $unicode_option, $attrs );

  return $dsn, $user, $password, $allattrs;
}



sub _load {
    my $self = shift;

    $self->_log("Loading tree from dbix");

    $self->_populate_backend($self->config->{backend}->{args}->{'populate_backend'})
        if ( $self->can('_populate_backend') && ! defined $self->_populate_backend && defined $self->config->{backend}->{args}->{'populate_backend'} );

    my $schema = $self->schema;
    my @sources_name = keys %{$self->config->{backend}->{args}->{sources_name}}
        or croak "'backend/args/sources_name' is not defined in conf file !";

    my @datas;
   foreach my $source_name ( @sources_name ) {

       my($dsn, $user, $password, $allattrs) = $self->_connect_info;
       $self->_source_name($source_name);
       eval { $schema->resultset($source_name)->count };

      if ( $@ ) {
          print "Deploy and populate $dsn\n" if $self->debug;
          $schema->deploy;
          $schema->_populate if ( $schema->can('_populate') && $self->_populate_backend);
      }
      my $rs = $self->schema->resultset($source_name)->search();

       my @primary_columns = $rs->result_source->primary_columns;
       croak "Multi-column primary keys are not supported." if (scalar @primary_columns > 1 );
       croak "No primary key found." if (scalar @primary_columns == 0 );
       my $primary_key = shift @primary_columns;



( run in 1.554 second using v1.01-cache-2.11-cpan-e1769b4cff6 )