X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FPg.pm;h=a8fd85bc27d4e606b07553f108efe3eb5b08c59c;hb=12a184d0a0c1868708e43aaabefe08f9e7ac9ec4;hp=056b9cc73caa60345ff82b53c729f17473cca9e7;hpb=2131aa2eac548e0b10325b97c10d22a61fffd9c9;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Storage/DBI/Pg.pm b/lib/DBIx/Class/Storage/DBI/Pg.pm index 056b9cc..a8fd85b 100644 --- a/lib/DBIx/Class/Storage/DBI/Pg.pm +++ b/lib/DBIx/Class/Storage/DBI/Pg.pm @@ -8,7 +8,7 @@ use base qw/DBIx::Class::Storage::DBI/; use Scope::Guard (); use Context::Preserve 'preserve_context'; use DBIx::Class::Carp; -use Try::Tiny; +use DBIx::Class::_Util 'modver_gt_or_eq'; use namespace::clean; __PACKAGE__->sql_limit_dialect ('LimitOffset'); @@ -30,12 +30,11 @@ sub with_deferred_fk_checks { $self->_do_query('SET CONSTRAINTS ALL DEFERRED'); - return preserve_context { - my $sg = Scope::Guard->new(sub { - $self->_do_query('SET CONSTRAINTS ALL IMMEDIATE'); - }); - $sub->() - } after => sub { $txn_scope_guard->commit }; + my $sg = Scope::Guard->new(sub { + $self->_do_query('SET CONSTRAINTS ALL IMMEDIATE'); + }); + + return preserve_context { $sub->() } after => sub { $txn_scope_guard->commit }; } # only used when INSERT ... RETURNING is disabled @@ -158,30 +157,69 @@ EOS return $seq_expr; } +sub _dbh_execute_for_fetch { + #my ($self, $source, $sth, $tuple_status, @extra) = @_; + + # This is used for bulk insert, so make sure we use a server-side + # prepared statement from the start, unless it's disabled + local $_[2]->{pg_switch_prepared} = 1 if + modver_gt_or_eq( 'DBD::Pg', '3.0.0' ) + and + $_[2]->FETCH('pg_switch_prepared') > 0 + ; + + shift->next::method(@_); +} sub sqlt_type { return 'PostgreSQL'; } +# Pg is not able to MAX(boolean_column), sigh... +# +# Generally it would make more sense to have this in the SQLMaker hierarchy, +# so that eventually { -max => ... } DTRT, but plans going forward are +# murky at best +# --ribasushi +# +sub _minmax_operator_for_datatype { + #my ($self, $datatype, $want_max) = @_; + + return ($_[2] ? 'BOOL_OR' : 'BOOL_AND') + if ($_[1] || '') =~ /\Abool(?:ean)?\z/i; + + shift->next::method(@_); +} + sub bind_attribute_by_data_type { my ($self,$data_type) = @_; if ($self->_is_binary_lob_type($data_type)) { # this is a hot-ish codepath, use an escape flag to minimize # amount of function/method calls - # additionally version.pm is cock, and memleaks on multiple - # ->VERSION calls # the flag is stored in the DBD namespace, so that Class::Unload # will work (unlikely, but still) - unless ($DBD::Pg::__DBIC_DBD_VERSION_CHECK_DONE__) { - if ($self->_server_info->{normalized_dbms_version} >= 9.0) { - try { DBD::Pg->VERSION('2.17.2'); 1 } or carp ( - __PACKAGE__.': BYTEA columns are known to not work on Pg >= 9.0 with DBD::Pg < 2.17.2' + unless ( + modver_gt_or_eq( 'DBD::Pg', '2.17.2' ) + or + $DBD::Pg::__DBIC_DBD_VERSION_CHECK_DONE__ + ) { + if ( $self->_server_info->{normalized_dbms_version} >= 9.0 ) { + $self->throw_exception( + 'BYTEA columns are known to not work on Pg >= 9.0 with DBD::Pg < 2.17.2' ); } - elsif (not try { DBD::Pg->VERSION('2.9.2'); 1 } ) { carp ( - __PACKAGE__.': DBD::Pg 2.9.2 or greater is strongly recommended for BYTEA column support' - )} + elsif ( + require DBIx::Class::Optional::Dependencies + and + my $missing = DBIx::Class::Optional::Dependencies->req_missing_for([qw( rdbms_pg binary_data )]) + ) { + # FIXME - perhaps this needs to be an exception too...? + # too old to test sensibly... + carp ( + __PACKAGE__ . ": BYTEA column support strongly recommends $missing" + ) + } $DBD::Pg::__DBIC_DBD_VERSION_CHECK_DONE__ = 1; }