Catalyst-Plugin-Authorization-Abilities

 view release on metacpan or  search on metacpan

t/lib/Schema/Utils.pm  view on Meta::CPAN

                     #builder   => '_build_schema',
                    );

sub _load_config {
  my $self = shift;

  my $config;
  if ( defined $self->conf && -e $self->conf ){

    my ($jfdi_h, $jfdi) = Config::JFDI->open($self->conf)
      or croak "Error (conf: ".$self->conf.") : $!\n";
    $config = $jfdi->get;
  }
  else{ $config = {} };

  $self->config($config);
  # get debug from args || from conf
  $self->debug($self->config->{'debug'} || 0)
    if ( ! defined $self->debug );

  if ( $self->debug ) {
    print " conf: " . $self->conf . "\n dsn: " . $self->dsn . "\n";
  }
}

sub _build_model {
  my $self = shift;
  my $config       = $self->config;

  my $model_conf = $self->config->{$self->ns_conf}->{model}
    or croak "'" . $self->ns_conf . ":
   model: XXX'
 is not defined in "  . $self->conf . " !";

  my $model = $config->{$model_conf}
    or croak "'$model_conf:
 is not defined in "  . $self->conf . " !";

  return $model
}


sub _connect_info {
  my $self = shift;

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

          $dsn      = $self->dsn;
          $user     = ${$model->{'connect_info'}}[1];
          $password = ${$model->{'connect_info'}}[2];

          # 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};
        }
  };

  if ($@) {
    die "Your DSN line in " . $self->dsn . " 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 _build_schema {
  my $self = shift;


  my $schema_class = $self->model->{schema_class};
  $schema_class->require or die $@;

  my ($dsn, $user, $pass, $args ) = $self->_connect_info;
  return $schema_class->connect($dsn, $user, $pass, $args )
    or die "Failed to connect to database";
}



sub schema_class {
  my $self = shift;

  return $self->model->{'connect_info'}->{schema_class};
}

sub dsn {
  my $self = shift;

  my $dsn = ${$self->model->{'connect_info'}}[0]
    or croak "dsn is not defined in " . $self->conf;

  return $dsn
}

=head2 init_schema

    use Schema::Utils;

    my $schema    = Schema::Utils->schema( conf => $conf  );
    $schema->init_schema(populate => 1);



( run in 3.255 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )