X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FPg.pm;h=0dc7ea8cbc5626ec0676f35e51846dfa27b13154;hb=d95ec4a6c9197df1ca2f1c38c85e4932dba2dab4;hp=8f5ac8db6eb473ae7f9ce7c99baa5d198c82189b;hpb=227d836679dd2e91b1cf49c3d9e566be79f49297;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Pg.pm b/lib/DBIx/Class/Storage/DBI/Pg.pm index 8f5ac8d..0dc7ea8 100644 --- a/lib/DBIx/Class/Storage/DBI/Pg.pm +++ b/lib/DBIx/Class/Storage/DBI/Pg.pm @@ -8,21 +8,21 @@ use base qw/ /; use mro 'c3'; -use DBD::Pg qw(:pg_types); use Scope::Guard (); -use Context::Preserve (); - -# Ask for a DBD::Pg with array support -warn __PACKAGE__.": DBD::Pg 2.9.2 or greater is strongly recommended\n" - if ($DBD::Pg::VERSION < 2.009002); # pg uses (used?) version::qv() - -sub _supports_insert_returning { - my $self = shift; - - return 1 - if $self->_server_info->{dbms_ver_normalized} >= 8.002; - - return 0; +use Context::Preserve 'preserve_context'; +use DBIx::Class::Carp; +use Try::Tiny; +use namespace::clean; + +__PACKAGE__->sql_limit_dialect ('LimitOffset'); +__PACKAGE__->sql_quote_char ('"'); +__PACKAGE__->datetime_parser_type ('DateTime::Format::Pg'); + +sub _determine_supports_insert_returning { + return shift->_server_info->{normalized_dbms_version} >= 8.002 + ? 1 + : 0 + ; } sub with_deferred_fk_checks { @@ -36,8 +36,7 @@ sub with_deferred_fk_checks { $self->_do_query('SET CONSTRAINTS ALL IMMEDIATE'); }); - return Context::Preserve::preserve_context(sub { $sub->() }, - after => sub { $txn_scope_guard->commit }); + return preserve_context { $sub->() } after => sub { $txn_scope_guard->commit }; } # only used when INSERT ... RETURNING is disabled @@ -46,8 +45,10 @@ sub last_insert_id { my @values; + my $col_info = $source->columns_info(\@cols); + for my $col (@cols) { - my $seq = ( $source->column_info($col)->{sequence} ||= $self->dbh_do('_dbh_get_autoinc_seq', $source, $col) ) + my $seq = ( $col_info->{$col}{sequence} ||= $self->dbh_do('_dbh_get_autoinc_seq', $source, $col) ) or $self->throw_exception( sprintf( 'could not determine sequence for column %s.%s, please consider adding a schema-qualified sequence to its column info', $source->name, @@ -66,7 +67,7 @@ sub _sequence_fetch { $self->throw_exception('No sequence to fetch') unless $sequence; my ($val) = $self->_get_dbh->selectrow_array( - sprintf ("select %s('%s')", $function, $sequence) + sprintf ("select %s('%s')", $function, (ref $sequence eq 'SCALAR') ? $$sequence : $sequence) ); return $val; @@ -163,40 +164,68 @@ sub sqlt_type { return 'PostgreSQL'; } -sub datetime_parser_type { return "DateTime::Format::Pg"; } - +my $type_cache; sub bind_attribute_by_data_type { my ($self,$data_type) = @_; - my $bind_attributes = { - bytea => { pg_type => DBD::Pg::PG_BYTEA }, - blob => { pg_type => DBD::Pg::PG_BYTEA }, - }; + # Ask for a DBD::Pg with array support + # pg uses (used?) version::qv() + require DBD::Pg; - if( defined $bind_attributes->{$data_type} ) { - return $bind_attributes->{$data_type}; + if ($self->_server_info->{normalized_dbms_version} >= 9.0) { + if (not try { DBD::Pg->VERSION('2.17.2') }) { + carp_once( __PACKAGE__.': BYTEA columns are known to not work on Pg >=' + . " 9.0 with DBD::Pg < 2.17.2\n" ); + } } - else { - return; + elsif (not try { DBD::Pg->VERSION('2.9.2') }) { + carp_once( __PACKAGE__.': DBD::Pg 2.9.2 or greater is strongly recommended' + . "for BYTEA column support.\n" ); + } + + # cache the result of _is_binary_lob_type + if (!exists $type_cache->{$data_type}) { + $type_cache->{$data_type} = $self->_is_binary_lob_type($data_type) + ? +{ pg_type => DBD::Pg::PG_BYTEA() } + : undef } + + $type_cache->{$data_type}; } -sub _svp_begin { +sub _exec_svp_begin { my ($self, $name) = @_; - $self->_get_dbh->pg_savepoint($name); + $self->_dbh->pg_savepoint($name); } -sub _svp_release { +sub _exec_svp_release { my ($self, $name) = @_; - $self->_get_dbh->pg_release($name); + $self->_dbh->pg_release($name); } -sub _svp_rollback { +sub _exec_svp_rollback { my ($self, $name) = @_; - $self->_get_dbh->pg_rollback_to($name); + $self->_dbh->pg_rollback_to($name); +} + +sub deployment_statements { + my $self = shift;; + my ($schema, $type, $version, $dir, $sqltargs, @rest) = @_; + + $sqltargs ||= {}; + + if ( + ! exists $sqltargs->{producer_args}{postgres_version} + and + my $dver = $self->_server_info->{normalized_dbms_version} + ) { + $sqltargs->{producer_args}{postgres_version} = $dver; + } + + $self->next::method($schema, $type, $version, $dir, $sqltargs, @rest); } 1; @@ -212,7 +241,6 @@ DBIx::Class::Storage::DBI::Pg - Automatic primary key class for PostgreSQL # In your result (table) classes use base 'DBIx::Class::Core'; __PACKAGE__->set_primary_key('id'); - __PACKAGE__->sequence('mysequence'); =head1 DESCRIPTION