X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FPg.pm;h=d38f84cfc39acc7b86bd43b0b4d67c8afea3a1fa;hb=cecf64bc6850edb1c2ad4af03d51aee022326921;hp=0dc7ea8cbc5626ec0676f35e51846dfa27b13154;hpb=9aec3ec60e053fc70810822c75b1008acdccd8b0;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 0dc7ea8..d38f84c 100644 --- a/lib/DBIx/Class/Storage/DBI/Pg.pm +++ b/lib/DBIx/Class/Storage/DBI/Pg.pm @@ -3,10 +3,7 @@ package DBIx::Class::Storage::DBI::Pg; use strict; use warnings; -use base qw/ - DBIx::Class::Storage::DBI::MultiColumnIn -/; -use mro 'c3'; +use base qw/DBIx::Class::Storage::DBI/; use Scope::Guard (); use Context::Preserve 'preserve_context'; @@ -17,6 +14,7 @@ use namespace::clean; __PACKAGE__->sql_limit_dialect ('LimitOffset'); __PACKAGE__->sql_quote_char ('"'); __PACKAGE__->datetime_parser_type ('DateTime::Format::Pg'); +__PACKAGE__->_use_multicolumn_in (1); sub _determine_supports_insert_returning { return shift->_server_info->{normalized_dbms_version} >= 8.002 @@ -164,33 +162,34 @@ sub sqlt_type { return 'PostgreSQL'; } -my $type_cache; sub bind_attribute_by_data_type { my ($self,$data_type) = @_; - # Ask for a DBD::Pg with array support - # pg uses (used?) version::qv() - require DBD::Pg; - - 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" ); + 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' + ); + } + 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' + )} + + $DBD::Pg::__DBIC_DBD_VERSION_CHECK_DONE__ = 1; } - } - 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 + return { pg_type => DBD::Pg::PG_BYTEA() }; + } + else { + return undef; } - - $type_cache->{$data_type}; } sub _exec_svp_begin {