Class-Usul

 view release on metacpan or  search on metacpan

lib/Class/Usul/Schema.pm  view on Meta::CPAN

package Class::Usul::Schema;

use namespace::autoclean;

use Class::Usul::Constants   qw( AS_PARA AS_PASSWORD EXCEPTION_CLASS COMMA
                                 FAILED FALSE NUL OK QUOTED_RE SPC TRUE );
use Class::Usul::Crypt::Util qw( encrypt_for_config );
use Class::Usul::Functions   qw( distname ensure_class_loaded io throw trim );
use Class::Usul::Types       qw( ArrayRef Bool HashRef Maybe NonEmptySimpleStr
                                 PositiveInt SimpleStr Str );
use Data::Record;
use Try::Tiny;
use Unexpected::Functions    qw( inflate_placeholders Unspecified );
use Moo;
use Class::Usul::Options;

extends q(Class::Usul::Programs);
with    q(Class::Usul::TraitFor::ConnectInfo);

# Attribute constructors
my $_build_connect_options = sub {
   my $self  = shift;
   my $copts = { password => NUL, user => NUL, };
   my $text  = 'Need the database administrators id and password';

   $self->output( $text, AS_PARA );

   my $prompt = '+Database administrator id';
   my $user = $self->db_admin_ids->{ lc $self->driver } || NUL;

   $copts->{user} = $self->get_line( $prompt, $user, TRUE, 0 );
   $prompt = '+Database administrator password';
   $copts->{password} = $self->get_line( $prompt, AS_PASSWORD );
   return $copts;
};

my $_build_qdb = sub {
   my $self = shift;
   my $cmds = $self->ddl_commands->{ lc $self->driver };
   my $code = $cmds ? $cmds->{ '-qualify_db' } : undef;

   return $code ? $code->( $self, $self->database ) : $self->database;
};

my $_connect_info = sub {
   my $self = shift;

   return $self->get_connect_info( $self, { database => $self->database } );
};

my $_extract_from_dsn = sub {
   my ($self, $field, $dsn) = @_;

   $self->options and $self->options->{bootstrap} and return;

   return (map  { s{ \A $field [=] }{}mx; $_ }
           grep { m{ \A $field [=] }mx }
           split  m{           [;] }mx, $dsn // $self->dsn)[ 0 ];
};

my $_qualify_database_path = sub {
   return $_[ 0 ]->config->datadir->catfile( $_[ 1 ].'.db' )->pathname;
};

my $_rebuild_dsn = sub {
   my $self = shift;
   my $dsn  = 'dbi:'.$self->driver.':database='.$self->_qualified_db;

   $self->host and $dsn .= ';host='.$self->host;
   $self->port and $dsn .= ';port='.$self->port;

   return $self->_set_dsn( $dsn );



( run in 0.632 second using v1.01-cache-2.11-cpan-39bf76dae61 )