X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FSQLAnywhere.pm;h=c233361df4f575083b84bbc31dfe9489d0186714;hb=b979420a9fa5c170a4b926882051f800c132750b;hp=207330ef489f7deb2fe5b7798b8dda1270dfcc21;hpb=db8f81cfaadcb0be86af0998fcfd68710e015e82;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm b/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm index 207330e..c233361 100644 --- a/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm +++ b/lib/DBIx/Class/Storage/DBI/SQLAnywhere.pm @@ -12,17 +12,24 @@ __PACKAGE__->mk_group_accessors(simple => qw/ =head1 NAME -DBIx::Class::Storage::DBI::Sybase::ASA - Driver for Sybase SQL Anywhere +DBIx::Class::Storage::DBI::SQLAnywhere - Driver for Sybase SQL Anywhere =head1 DESCRIPTION -This class implements autoincrements for Sybase SQL Anywhere and selects the -RowNumberOver limit implementation. +This class implements autoincrements for Sybase SQL Anywhere, selects the +RowNumberOver limit implementation and provides +L support. You need the C driver that comes with the SQL Anywhere distribution, B the one on CPAN. It is usually under a path such as: - /opt/sqlanywhere11/sdk/perl + /opt/sqlanywhere11/sdk/perl + +Recommended L settings: + + on_connect_call => 'datetime_setup' + +=head1 METHODS =cut @@ -32,17 +39,21 @@ sub insert { my $self = shift; my ($source, $to_insert) = @_; - my $supplied_col_info = $self->_resolve_column_info($source, [keys %$to_insert]); - - my $is_identity_insert = (List::Util::first { $_->{is_auto_increment} } (values %$supplied_col_info) ) - ? 1 - : 0; - my $identity_col = List::Util::first { $source->column_info($_)->{is_auto_increment} } $source->columns; - if ((not $is_identity_insert) && $identity_col) { +# 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}) { + $identity_col = $pk_col; + last; + } + } + } + + if ($identity_col && (not exists $to_insert->{$identity_col})) { my $dbh = $self->_get_dbh; my $table_name = $source->from; $table_name = $$table_name if ref $table_name; @@ -57,7 +68,7 @@ sub insert { return $self->next::method(@_); } -# stolen from DB2 +# this sub stolen from DB2 sub _sql_maker_opts { my ( $self, $opts ) = @_; @@ -69,6 +80,48 @@ sub _sql_maker_opts { return { limit_dialect => 'RowNumberOver', %{$self->{_sql_maker_opts}||{}} }; } +# this sub stolen from MSSQL + +sub build_datetime_parser { + my $self = shift; + my $type = "DateTime::Format::Strptime"; + eval "use ${type}"; + $self->throw_exception("Couldn't load ${type}: $@") if $@; + return $type->new( pattern => '%Y-%m-%d %H:%M:%S.%6N' ); +} + +=head2 connect_call_datetime_setup + +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 +L. + +The C data type supports up to 6 digits after the decimal point for +second precision. The full precision is used. + +The C data type supposedly stores hours and minutes too, according to the +documentation, but I could not get that to work. It seems to only store the +date. + +You will need the L module for inflation to work. + +=cut + +sub connect_call_datetime_setup { + my $self = shift; + + $self->_do_query( + "set temporary option timestamp_format = 'yyyy-mm-dd hh:mm:ss.ssssss'" + ); + $self->_do_query( + "set temporary option date_format = 'yyyy-mm-dd hh:mm:ss.ssssss'" + ); +} + 1; =head1 AUTHOR