X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FDB2.pm;h=7634eb61f05a54e4ae9ab90efef83f22e845a299;hb=8acda57c41ff1e2eda847e53b073217cb9035136;hp=a6e145291c0ec35bdcc8bc2f2df04c9250820f8e;hpb=843f8ecda2d9885b79402416f048016c1ecc4114;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/DB2.pm b/lib/DBIx/Class/Storage/DBI/DB2.pm index a6e1452..7634eb6 100644 --- a/lib/DBIx/Class/Storage/DBI/DB2.pm +++ b/lib/DBIx/Class/Storage/DBI/DB2.pm @@ -4,45 +4,82 @@ use strict; use warnings; use base qw/DBIx::Class::Storage::DBI/; +use mro 'c3'; +use Try::Tiny; +use namespace::clean; -# __PACKAGE__->load_components(qw/PK::Auto/); +__PACKAGE__->datetime_parser_type('DateTime::Format::DB2'); +__PACKAGE__->sql_quote_char ('"'); -sub last_insert_id -{ - my ($self) = @_; +# lazy-default kind of thing +sub sql_name_sep { + my $self = shift; - my $dbh = $self->_dbh; - my $sth = $dbh->prepare_cached("VALUES(IDENTITY_VAL_LOCAL())", {}, 3); - $sth->execute(); + my $v = $self->next::method(@_); - my @res = $sth->fetchrow_array(); + if (! defined $v and ! @_) { + $v = $self->next::method($self->_dbh_get_info('SQL_QUALIFIER_NAME_SEPARATOR') || '.'); + } - return @res ? $res[0] : undef; - + return $v; } -1; +sub sql_limit_dialect { + my $self = shift; + + my $v = $self->next::method(@_); + + if (! defined $v and ! @_) { + $v = $self->next::method( + ($self->_server_info->{normalized_dbms_version}||0) >= 5.004 + ? 'RowNumberOver' + : 'FetchFirst' + ); + } + + return $v; +} + +sub _dbh_last_insert_id { + my ($self, $dbh, $source, $col) = @_; -=head1 NAME + my $name_sep = $self->sql_name_sep; -DBIx::Class::Storage::DBI::DB2 - Automatic primary key class for DB2 + my $sth = $dbh->prepare_cached( + # An older equivalent of 'VALUES(IDENTITY_VAL_LOCAL())', for compat + # with ancient DB2 versions. Should work on modern DB2's as well: + # http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0002369.htm?resultof=%22%73%79%73%64%75%6d%6d%79%31%22%20 + "SELECT IDENTITY_VAL_LOCAL() FROM sysibm${name_sep}sysdummy1", + {}, + 3 + ); + $sth->execute(); + + my @res = $sth->fetchrow_array(); + + return @res ? $res[0] : undef; +} + +1; -=head1 SYNOPSIS +=head1 NAME - # In your table classes - __PACKAGE__->load_components(qw/PK::Auto Core/); - __PACKAGE__->set_primary_key('id'); +DBIx::Class::Storage::DBI::DB2 - IBM DB2 support for DBIx::Class =head1 DESCRIPTION -This class implements autoincrements for DB2. +This class implements autoincrements for DB2, sets the limit dialect to +RowNumberOver over FetchFirst depending on the availability of support for +RowNumberOver, queries the server name_sep from L and sets the L +parser to L. -=head1 AUTHORS +=head1 AUTHOR -Jess Robinson +See L and L. =head1 LICENSE You may distribute this code under the same terms as Perl itself. =cut +# vim:sts=2 sw=2: