X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FDB2.pm;h=c34e641cb65f9e44ec8f5fc042262c17c460ed25;hb=cf52a9ad15a73aedfc1822643d63a9aa7982c72c;hp=7b4874100a4955ecb0c01fc799eb737bee30c566;hpb=2ad62d97476187e57d20ee49b39d7a7af864bb20;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/DB2.pm b/lib/DBIx/Class/Storage/DBI/DB2.pm index 7b48741..c34e641 100644 --- a/lib/DBIx/Class/Storage/DBI/DB2.pm +++ b/lib/DBIx/Class/Storage/DBI/DB2.pm @@ -5,52 +5,85 @@ use warnings; use base qw/DBIx::Class::Storage::DBI/; use mro 'c3'; +use Try::Tiny; +use namespace::clean; -sub _dbh_last_insert_id { - my ($self, $dbh, $source, $col) = @_; +__PACKAGE__->datetime_parser_type('DateTime::Format::DB2'); +__PACKAGE__->sql_quote_char ('"'); + +# lazy-default kind of thing +sub sql_name_sep { + my $self = shift; - 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; } -sub datetime_parser_type { "DateTime::Format::DB2"; } +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' + ); + } -sub _sql_maker_opts { - my ( $self, $opts ) = @_; - - if ( $opts ) { - $self->{_sql_maker_opts} = { %$opts }; - } - - return { limit_dialect => 'RowNumberOver', %{$self->{_sql_maker_opts}||{}} }; + return $v; } -1; +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(); -=head1 SYNOPSIS + my @res = $sth->fetchrow_array(); - # In your table classes - __PACKAGE__->load_components(qw/PK::Auto Core/); - __PACKAGE__->set_primary_key('id'); + return @res ? $res[0] : undef; +} + +=head1 NAME + +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 FURTHER QUESTIONS? -Jess Robinson +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 + +1; + +# vim:sts=2 sw=2: