X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=script%2Fdbicdump;h=2fdae37eeed98b91b9c741f8ba091d0a5bd45801;hb=160b07c52696f02de5573349e70c9892e71479ce;hp=d1573b2313a99c0b8dae189875385cfe0ec1d71b;hpb=e83cb1490767415df0cf154b3238aa8a1db78ae3;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/script/dbicdump b/script/dbicdump index d1573b2..2fdae37 100644 --- a/script/dbicdump +++ b/script/dbicdump @@ -1,12 +1,69 @@ #!/usr/bin/perl +=encoding UTF-8 + =head1 NAME dbicdump - Dump a schema using DBIx::Class::Schema::Loader =head1 SYNOPSIS - dbicdump [-o = ] + dbicdump + dbicdump [-I ] [-o = ] \ + + +Examples: + + $ dbicdump schema.conf + + $ dbicdump -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + MyApp::Schema dbi:SQLite:./foo.db + + $ dbicdump -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + MyApp::Schema dbi:SQLite:./foo.db '{ quote_char => "\"" }' + + $ dbicdump -Ilib -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + -o preserve_case=1 \ + MyApp::Schema dbi:mysql:database=foo user pass '{ quote_char => "`" }' + + $ dbicdump -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + MyApp::Schema 'dbi:mysql:database=foo;host=domain.tld;port=3306' user pass + +On Windows that would be: + + $ dbicdump -o dump_directory=.\lib ^ + -o components="[q{InflateColumn::DateTime}]" ^ + -o preserve_case=1 ^ + MyApp::Schema dbi:mysql:database=foo user pass "{ quote_char => q{`} }" + +Configuration files must have schema_class and connect_info sections, +an example of a general config file is as follows: + + schema_class MyApp::Schema + + lib /extra/perl/libs + + # connection string + + dsn dbi:mysql:example + user root + pass secret + + + # dbic loader options + + dump_directory ./lib + components InflateColumn::DateTime + components TimeStamp + + +Using a config file requires L installed. + +The optional C key is equivalent to the C<-I> option. =head1 DESCRIPTION @@ -27,7 +84,15 @@ L, L. =head1 AUTHOR -Dagfinn Ilmari Mannsåker C<< >> +Dagfinn Ilmari MannsÃ¥ker C<< >> + +=head1 CONTRIBUTORS + +Caelum: Rafael Kitover + +alnewkirk: Al Newkirk + +moritz: Moritz Lenz =head1 LICENSE @@ -39,19 +104,95 @@ under the same terms as Perl itself. use strict; use warnings; use Getopt::Long; - use Pod::Usage; - -use DBIx::Class::Schema::Loader qw/ make_schema_at /; -require DBIx::Class::Schema::Loader::Base; +use DBIx::Class::Schema::Loader 'make_schema_at'; +use namespace::clean; +use DBIx::Class::Schema::Loader::Base (); +use DBIx::Class::Schema::Loader::Optional::Dependencies (); +require lib; my $loader_options; -GetOptions( 'loader-option|o=s%' => \&handle_option ); +Getopt::Long::Configure('gnu_getopt'); + +GetOptions( + 'I=s' => sub { shift; lib->import(shift) }, + 'loader-option|o=s%' => \&handle_option, +); + $loader_options->{dump_directory} ||= '.'; -my ($schema_class, @loader_connect_info) = @ARGV - or pod2usage(1); +if (@ARGV == 1) { + if (not DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for('dbicdump_config')) { + die sprintf "You must install the following CPAN modules to use a config file with dbicdump: %s.\n", + DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for('dbicdump_config'); + } + + my $configuration_file = shift @ARGV; + + my $configurations = + Config::Any->load_files( { + use_ext => 1, + flatten_to_hash => 1, + files => [$configuration_file] } ); + + my $c = (values %$configurations)[0]; + + unless (keys %{$c->{connect_info}} && $c->{schema_class}) { + pod2usage(1); + } + + my @libs; + + if ($c->{lib}) { + if (ref $c->{lib}) { + @libs = @{ $c->{lib} }; + } + + @libs = ($c->{lib}); + } + + lib->import($_) for @libs; + + my ($dsn, $user, $pass, $options) = + map { $c->{connect_info}->{$_} } qw/dsn user pass options/; + $options ||= {}; + $c->{loader_options}->{dump_directory} ||= + $loader_options->{dump_directory}; + + make_schema_at( + $c->{schema_class}, + $c->{loader_options} || {}, + [ $dsn, $user, $pass, %{$options} ], + ); +} +else { + my ($schema_class, @loader_connect_info) = @ARGV + or pod2usage(1); + + my $dsn = shift @loader_connect_info; + + my ($user, $pass) = $dsn =~ /sqlite/i ? ('', '') + : splice @loader_connect_info, 0, 2; + + my @extra_connect_info_opts = map parse_value($_), @loader_connect_info; + + make_schema_at( + $schema_class, + $loader_options, + [ $dsn, $user, $pass, @extra_connect_info_opts ], + ); +} + +exit 0; + +sub parse_value { + my $value = shift; + + $value = eval $value if $value =~ /^\s*(?:sub\s*\{|q\w?\s*[^\w\s]|[[{])/; + + return $value; +} sub handle_option { my ($self, $key, $value) = @_; @@ -60,13 +201,11 @@ sub handle_option { die "Unknown option: $key\n" unless DBIx::Class::Schema::Loader::Base->can($key); - $value = eval $value if $value =~ /^\s*(?:sub\s*\{|q\w?\s*[^\w\s]|[[{])/; + $value = parse_value $value; $loader_options->{$key} = $value; } -make_schema_at( - $schema_class, - $loader_options, - \@loader_connect_info, -); +1; + +__END__