App-Schema-Data

 view release on metacpan or  search on metacpan

Data.pm  view on Meta::CPAN

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 )