X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FSQLAnywhere.pm;h=5d9170db7e5532ae1d968fc3067f0471cf4e270f;hb=fd323bf1046faa7de5a8c985268d80ec5b703361;hp=1de7706e51d85444c640e311b36a6381cf777e41;hpb=9cf3db6f931299a211a15e12421b4ff9766f0dd2;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm b/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm index 1de7706..5d9170d 100644 --- a/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm +++ b/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm @@ -2,9 +2,11 @@ package DBIx::Class::Storage::DBI::SQLAnywhere; use strict; use warnings; -use base qw/DBIx::Class::Storage::DBI/; +use base qw/DBIx::Class::Storage::DBI::UniqueIdentifier/; use mro 'c3'; use List::Util (); +use Try::Tiny; +use namespace::clean; __PACKAGE__->mk_group_accessors(simple => qw/ _identity @@ -25,7 +27,7 @@ distribution, B the one on CPAN. It is usually under a path such as: /opt/sqlanywhere11/sdk/perl -Recommended L settings: +Recommended L settings: on_connect_call => 'datetime_setup' @@ -35,18 +37,22 @@ Recommended L settings: sub last_insert_id { shift->_identity } +sub _new_uuid { 'UUIDTOSTR(NEWID())' } + sub insert { my $self = shift; my ($source, $to_insert) = @_; my $identity_col = List::Util::first { - $source->column_info($_)->{is_auto_increment} + $source->column_info($_)->{is_auto_increment} } $source->columns; # user might have an identity PK without is_auto_increment if (not $identity_col) { foreach my $pk_col ($source->primary_columns) { - if (not exists $to_insert->{$pk_col}) { + if (not exists $to_insert->{$pk_col} && + $source->column_info($pk_col)->{data_type} !~ /^uniqueidentifier/i) + { $identity_col = $pk_col; last; } @@ -58,11 +64,36 @@ sub insert { my $table_name = $source->from; $table_name = $$table_name if ref $table_name; - my ($identity) = $dbh->selectrow_array("SELECT GET_IDENTITY('$table_name')"); + my ($identity) = try { + $dbh->selectrow_array("SELECT GET_IDENTITY('$table_name')") + }; + + if (defined $identity) { + $to_insert->{$identity_col} = $identity; + $self->_identity($identity); + } + } + + return $self->next::method(@_); +} + +# convert UUIDs to strings in selects +sub _select_args { + my $self = shift; + my ($ident, $select) = @_; + + my $col_info = $self->_resolve_column_info($ident); - $to_insert->{$identity_col} = $identity; + for my $select_idx (0..$#$select) { + my $selected = $select->[$select_idx]; - $self->_identity($identity); + next if ref $selected; + + my $data_type = $col_info->{$selected}{data_type}; + + if ($data_type && lc($data_type) eq 'uniqueidentifier') { + $select->[$select_idx] = { UUIDTOSTR => $selected }; + } } return $self->next::method(@_); @@ -85,8 +116,13 @@ sub _sql_maker_opts { sub build_datetime_parser { my $self = shift; my $type = "DateTime::Format::Strptime"; - eval "use ${type}"; - $self->throw_exception("Couldn't load ${type}: $@") if $@; + try { + eval "require ${type}" + } + catch { + $self->throw_exception("Couldn't load ${type}: $_"); + }; + return $type->new( pattern => '%Y-%m-%d %H:%M:%S.%6N' ); } @@ -96,8 +132,8 @@ Used as: on_connect_call => 'datetime_setup' -In L to set the date and timestamp -formats (as temporary options for the session) for use with +In L to set the date and +timestamp formats (as temporary options for the session) for use with L. The C data type supports up to 6 digits after the decimal point for @@ -139,6 +175,19 @@ sub _svp_rollback { 1; +=head1 MAXIMUM CURSORS + +A L application can use a lot of cursors, due to the usage of +L. + +The default cursor maximum is C<50>, which can be a bit too low. This limit can +be turned off (or increased) by the DBA by executing: + + set option max_statement_count = 0 + set option max_cursor_count = 0 + +Highly recommended. + =head1 AUTHOR See L and L.