App-Schema-Data
view release on metacpan or search on metacpan
package App::Schema::Data;
use strict;
use warnings;
use English;
use Error::Pure qw(err);
use Getopt::Std;
use Unicode::UTF8 qw(decode_utf8 encode_utf8);
our $VERSION = 0.05;
# Constructor.
sub new {
my ($class, @params) = @_;
# Create object.
my $self = bless {}, $class;
# Object.
return $self;
}
# Run.
sub run {
my $self = shift;
# Process arguments.
$self->{'_opts'} = {
'h' => 0,
'l' => undef,
'p' => '',
'u' => '',
'v' => undef,
};
if (! getopts('hl:p:u:v:', $self->{'_opts'})
|| $self->{'_opts'}->{'h'}
|| @ARGV < 2) {
print STDERR "Usage: $0 [-h] [-l plugin:...] [-p password] [-u user] [-v schema_version] [--version] dsn ".
"schema_data_module var_key=var_value ..\n";
print STDERR "\t-h\t\t\tPrint help.\n";
print STDERR "\t-l plugin:...\t\tLoad data from plugin.\n";
print STDERR "\t-p password\t\tDatabase password.\n";
print STDERR "\t-u user\t\t\tDatabase user.\n";
print STDERR "\t-v schema_version\tSchema version (default is ".
"latest version).\n";
print STDERR "\t--version\t\tPrint version.\n";
print STDERR "\tdsn\t\t\tDatabase DSN. e.g. dbi:SQLite:dbname=ex1.db\n";
print STDERR "\tschema_data_module\tName of Schema data module.\n";
print STDERR "\tvar_key=var_value\tVariable keys with values for insert.\n";
return 1;
}
$self->{'_dsn'} = shift @ARGV;
$self->{'_schema_data_module'} = shift @ARGV;
$self->{'_variables'} = {
map {
my ($k, $v) = split m/=/ms, decode_utf8($_), 2;
($k => $v);
} @ARGV
};
eval "require $self->{'_schema_data_module'}";
if ($EVAL_ERROR) {
err 'Cannot load Schema data module.',
'Module name', $self->{'_schema_data_module'},
'Error', $EVAL_ERROR,
;
}
my $data_module;
my $data_version;
if ($self->{'_schema_data_module'}->can('new')) {
my $versioned_data = $self->{'_schema_data_module'}->new(
$self->{'_opts'}->{'v'} ? (
'version' => $self->{'_opts'}->{'v'},
) : (),
);
$data_module = $versioned_data->schema_data;
$data_version = $versioned_data->version;
} else {
$data_module = $self->{'_schema_data_module'};
}
my $data = eval {
$data_module->new(
'db_options' => {},
'db_password' => $self->{'_opts'}->{'p'},
'db_user' => $self->{'_opts'}->{'u'},
'dsn' => $self->{'_dsn'},
);
};
if ($EVAL_ERROR) {
err 'Cannot connect to Schema database.',
'Error', $EVAL_ERROR,
;
}
# Check Schema::Data::Data instance.
if (! $data->isa('Schema::Data::Data')) {
err "Schema data module must be a 'Schema::Data::Data' instance.";
}
$data->insert($self->{'_variables'});
my $print_version = '';
if (defined $data_version) {
$print_version = '(v'.$data_version.') ';
}
print "Schema data ${print_version}from '$self->{'_schema_data_module'}' was ".
"inserted to '$self->{'_dsn'}'.\n";
my @plugins;
if (defined $self->{'_opts'}->{'l'}) {
@plugins = split m/:/ms, $self->{'_opts'}->{'l'};
}
foreach my $plugin (@plugins) {
# Load plugin object.
my $plugin_module = "$self->{'_schema_data_module'}::Plugin::$plugin";
eval "require $plugin_module";
if ($EVAL_ERROR) {
err 'Cannot load Schema data plugin module.',
'Module name', $plugin_module,
'Error', $EVAL_ERROR,
;
}
# Create plugin object.
my $plugin = eval {
$plugin_module->new(
'schema' => $data->schema,
'verbose_cb' => sub {
my $message = shift;
print encode_utf8($message)."\n";
return;
},
);
};
if ($EVAL_ERROR) {
err "Cannot create '$plugin_module' object.",
'Error', $EVAL_ERROR,
;
}
# Load plugin data.
$plugin->load($self->{'_variables'});
}
return 0;
}
1;
__END__
=pod
=encoding utf8
=head1 NAME
App::Schema::Data - Base class for schema-data script.
=head1 SYNOPSIS
use App::Schema::Data;
my $app = App::Schema::Data->new;
my $exit_code = $app->run;
=head1 METHODS
=head2 C<new>
( run in 0.738 second using v1.01-cache-2.11-cpan-71847e10f99 )