X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FAdmin.pm;h=300c48540bcabc788631b8ecc98d154418b4aeca;hb=367eaf50970dd3fd223ce5e1f0337703f2a6c70e;hp=20a86b8dc0ee18223a70998bee5817fdd8318f97;hpb=a03b396bd7cd939f7f70ec42f56761636b8b9f7e;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Admin.pm b/lib/DBIx/Class/Admin.pm index 20a86b8..300c485 100644 --- a/lib/DBIx/Class/Admin.pm +++ b/lib/DBIx/Class/Admin.pm @@ -1,21 +1,24 @@ package DBIx::Class::Admin; +use warnings; +use strict; + # check deps BEGIN { - use Carp::Clan qw/^DBIx::Class/; - use DBIx::Class; - croak('The following modules are required for DBIx::Class::Admin ' . DBIx::Class::Optional::Dependencies->req_missing_for ('admin') ) - unless DBIx::Class::Optional::Dependencies->req_ok_for ('admin'); + require DBIx::Class::Optional::Dependencies; + if (my $missing = DBIx::Class::Optional::Dependencies->req_missing_for ('admin') ) { + die "The following extra modules are required for DBIx::Class::Admin: $missing\n"; + } } +use JSON::Any qw(DWIW PP JSON CPANEL XS); use Moose; use MooseX::Types::Moose qw/Int Str Any Bool/; use DBIx::Class::Admin::Types qw/DBICConnectInfo DBICHashRef/; use MooseX::Types::JSON qw(JSON); use MooseX::Types::Path::Class qw(Dir File); -use Try::Tiny; -use JSON::Any qw(DWIW XS JSON); -use namespace::autoclean; +use MooseX::Types::LoadableClass qw(LoadableClass); +use namespace::clean; =head1 NAME @@ -69,7 +72,7 @@ the class of the schema to load has 'schema_class' => ( is => 'ro', - isa => Str, + isa => LoadableClass, ); @@ -87,14 +90,11 @@ has 'schema' => ( sub _build_schema { my ($self) = @_; - require Class::MOP; - Class::MOP::load_class($self->schema_class); - $self->connect_info->[3]->{ignore_version} =1; - return $self->schema_class->connect(@{$self->connect_info()} ); # , $self->connect_info->[3], { ignore_version => 1} ); + $self->connect_info->[3]{ignore_version} = 1; + return $self->schema_class->clone->connection(@{$self->connect_info}); } - =head2 resultset a resultset from the schema to operate on @@ -135,7 +135,7 @@ has 'set' => ( =head2 attrs -a hash ref or json string to be used for passing additonal info to the ->search call +a hash ref or json string to be used for passing additional info to the ->search call =cut @@ -169,7 +169,7 @@ sub _build_connect_info { config_file provide a config_file to read connect_info from, if this is provided config_stanze should also be provided to locate where the connect_info is in the config -The config file should be in a format readable by Config::General +The config file should be in a format readable by Config::Any. =cut @@ -182,7 +182,7 @@ has config_file => ( =head2 config_stanza -config_stanza for use with config_file should be a '::' deliminated 'path' to the connection information +config_stanza for use with config_file should be a '::' delimited 'path' to the connection information designed for use with catalyst config files =cut @@ -209,9 +209,6 @@ has config => ( sub _build_config { my ($self) = @_; - eval { require Config::Any } - or die ("Config::Any is required to parse the config file.\n"); - my $cfg = Config::Any->load_files ( {files => [$self->config_file], use_ext =>1, flatten_to_hash=>1}); # just grab the config from the config file @@ -233,6 +230,17 @@ has 'sql_dir' => ( ); +=head2 sql_type + +The type of sql dialect to use for creating sql files from schema + +=cut + +has 'sql_type' => ( + is => 'ro', + isa => Str, +); + =head2 version Used for install, the version which will be 'installed' in the schema @@ -247,7 +255,7 @@ has version => ( =head2 preversion -Previouse version of the schema to create an upgrade diff for, the full sql for that version of the sql must be in the sql_dir +Previous version of the schema to create an upgrade diff for, the full sql for that version of the sql must be in the sql_dir =cut @@ -286,6 +294,24 @@ has '_confirm' => ( ); +=head2 trace + +Toggle DBIx::Class debug output + +=cut + +has trace => ( + is => 'rw', + isa => Bool, + trigger => \&_trigger_trace, +); + +sub _trigger_trace { + my ($self, $new, $old) = @_; + $self->schema->storage->debug($new); +} + + =head1 METHODS =head2 create @@ -296,8 +322,9 @@ has '_confirm' => ( =back -L will generate sql for the supplied schema_class in sql_dir. The flavour of sql to -generate can be controlled by suppling a sqlt_type which should be a L name. +C will generate sql for the supplied schema_class in sql_dir. The +flavour of sql to generate can be controlled by supplying a sqlt_type which +should be a L name. Arguments for L can be supplied in the sqlt_args hashref. @@ -309,12 +336,17 @@ sub create { my ($self, $sqlt_type, $sqlt_args, $preversion) = @_; $preversion ||= $self->preversion(); + $sqlt_type ||= $self->sql_type(); my $schema = $self->schema(); - # create the dir if does not exist - $self->sql_dir->mkpath() if ( ! -d $self->sql_dir); - $schema->create_ddl_dir( $sqlt_type, (defined $schema->schema_version ? $schema->schema_version : ""), $self->sql_dir->stringify, $preversion, $sqlt_args ); + $schema->create_ddl_dir( + $sqlt_type, + (defined $schema->schema_version ? $schema->schema_version : ""), + $self->sql_dir, + $preversion, + $sqlt_args, + ); } @@ -334,10 +366,12 @@ B sub upgrade { my ($self) = @_; my $schema = $self->schema(); + if (!$schema->get_db_version()) { # schema is unversioned $schema->throw_exception ("Could not determin current schema version, please either install() or deploy().\n"); } else { + $schema->upgrade_directory ($self->sql_dir) if $self->sql_dir; # this will override whatever default the schema has my $ret = $schema->upgrade(); return $ret; } @@ -366,12 +400,12 @@ sub install { $version ||= $self->version(); if (!$schema->get_db_version() ) { # schema is unversioned - print "Going to install schema version\n"; + print "Going to install schema version\n" if (!$self->quiet); my $ret = $schema->install($version); - print "retun is $ret\n"; + print "return is $ret\n" if (!$self->quiet); } elsif ($schema->get_db_version() and $self->force ) { - carp "Forcing install may not be a good idea"; + warn "Forcing install may not be a good idea\n"; if($self->_confirm() ) { $self->schema->_set_db_version({ version => $version}); } @@ -421,7 +455,7 @@ sub insert { $rs ||= $self->resultset(); $set ||= $self->set(); my $resultset = $self->schema->resultset($rs); - my $obj = $resultset->create( $set ); + my $obj = $resultset->new_result($set)->insert; print ''.ref($resultset).' ID: '.join(',',$obj->id())."\n" if (!$self->quiet); } @@ -446,7 +480,8 @@ sub update { $where ||= $self->where(); $set ||= $self->set(); my $resultset = $self->schema->resultset($rs); - $resultset = $resultset->search( ($where||{}) ); + $resultset = $resultset->search_rs( $where ) + if $where; my $count = $resultset->count(); print "This action will modify $count ".ref($resultset)." records.\n" if (!$self->quiet); @@ -477,7 +512,8 @@ sub delete { $where ||= $self->where(); $attrs ||= $self->attrs(); my $resultset = $self->schema->resultset($rs); - $resultset = $resultset->search( ($where||{}), ($attrs||()) ); + $resultset = $resultset->search_rs( ($where||{}), ($attrs||()) ) + if $where or $attrs; my $count = $resultset->count(); print "This action will delete $count ".ref($resultset)." records.\n" if (!$self->quiet); @@ -508,7 +544,8 @@ sub select { $where ||= $self->where(); $attrs ||= $self->attrs(); my $resultset = $self->schema->resultset($rs); - $resultset = $resultset->search( ($where||{}), ($attrs||()) ); + $resultset = $resultset->search_rs( ($where||{}), ($attrs||()) ) + if $where or $attrs; my @data; my @columns = $resultset->result_source->columns(); @@ -527,12 +564,14 @@ sub select { sub _confirm { my ($self) = @_; - print "Are you sure you want to do this? (type YES to confirm) \n"; + # mainly here for testing return 1 if ($self->meta->get_attribute('_confirm')->get_value($self)); + + print "Are you sure you want to do this? (type YES to confirm) \n"; my $response = ; - return 1 if ($response=~/^YES/); - return; + + return ($response=~/^YES/); } sub _find_stanza { @@ -546,16 +585,20 @@ sub _find_stanza { die ("Could not find $stanza in config, $path does not seem to exist.\n"); } } + $cfg = $cfg->{connect_info} if exists $cfg->{connect_info}; return $cfg; } -=head1 AUTHOR +=head1 FURTHER QUESTIONS? -See L. +Check the list of L. -=head1 LICENSE +=head1 COPYRIGHT AND LICENSE -You may distribute this code under the same terms as Perl itself +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut