=head1 NAME DBIx::SQLEngine::Driver::MSSQL - Support Microsoft SQL Server via DBD::ODBC =head1 SYNOPSIS B: Adds methods to a DBI database handle. my $sqldb = DBIx::SQLEngine->new( 'dbi:odbc:mycnxn' ); B Uses driver's idioms or emulation. $hash_ary = $sqldb->fetch_select( table => 'students' limit => 5, offset => 10 ); =head1 DESCRIPTION This package provides a subclass of DBIx::SQLEngine which compensates for Microsoft SQL Server's idiosyncrasies. =head2 Under Development Note: this driver class has been added recently and not yet tested in real-world conditions. =head2 About Driver Subclasses You do not need to use this package directly; when you connect to a database, the SQLEngine object is automatically re-blessed in to the appropriate subclass. =cut ######################################################################## package DBIx::SQLEngine::Driver::MSSQL; use strict; use Carp; ######################################################################## =head1 FETCHING DATA (SQL DQL) =head2 Methods Used By Complex Queries =over 4 =item sql_limit() Adds support for SQL select limit clause. =back =cut sub sql_limit { my $self = shift; my ( $limit, $offset, $sql, @params ) = @_; # You can't apply "limit" to non-table fetches like "select LAST_INSERT_ID" if ( $sql =~ /\bfrom\b/i and defined $limit or defined $offset) { $sql .= " limit $limit" if $limit; $sql .= " offset $offset" if $offset; } return ($sql, @params); } ######################################################################## ######################################################################## =head1 EDITING DATA (SQL DML) =head2 Insert to Add Data =over 4 =item do_insert_with_sequence() $sqldb->do_insert_with_sequence( $sequence_name, %sql_clauses ) : $row_count Implemented using _seq_do_insert_postfetch and seq_fetch_current. =item seq_fetch_current $sqldb->seq_fetch_current( ) : $current_value Implemented using MS SQL's "select @@IDENTITY". Note that this doesn't fetch the current sequence value for a given table, since it doesn't respect the table and field arguments, but merely returns the last sequencial value created during this session. =back =cut # $rows = $self->do_insert_with_sequence( $sequence, %clauses ); sub do_insert_with_sequence { (shift)->_seq_do_insert_postfetch( @_ ) } # $current_id = $sqldb->seq_fetch_current( ); sub seq_fetch_current { my ($self, $table, $field) = @_; $self->fetch_one_value( sql => 'select @@IDENTITY AS lastID' ); } ######################################################################## ######################################################################## =head1 DEFINING STRUCTURES (SQL DDL) =head2 Create and Drop Tables =over 4 =item dbms_create_column_types() $sqldb->dbms_create_column_types () : %column_type_codes Implemented using MS SQL's blob and int types. =item dbms_create_column_text_long_type $sqldb->dbms_create_column_text_long_type () : $col_type_str Implemented using MS SQL's blob type. =back =cut sub dbms_create_column_types { 'sequential' => 'int not null', 'binary' => 'blob', } sub dbms_create_column_text_long_type { 'blob' } ######################################################################## ######################################################################## =head1 INTERNAL STATEMENT METHODS (DBI STH) =head2 Statement Handle Lifecycle =over 4 =item prepare_execute() After the normal prepare_execute cycle, this also sets the sth's LongReadLen to dbms_longreadlen_bufsize(). =item dbms_longreadlen_bufsize() Set to 1_000_000. =back =cut sub dbms_longreadlen_bufsize { 1_000_000 } sub prepare_execute { my $self = shift; my $sth = $self->SUPER::prepare_execute( @_ ); $sth->{LongReadLen} = $self->dbms_longreadlen_bufsize; $sth->{LongTruncOk} = 0; $sth; } ######################################################################## =head2 recoverable_query_exceptions $sqldb->recoverable_query_exceptions() : @common_error_messages Provides a list of error messages which represent common communication failures or other incidental errors. =cut sub recoverable_query_exceptions { 'Communication link failure', 'General network error', } ######################################################################## =head1 SEE ALSO See L for the overall interface and developer documentation. See L for general information about this distribution, including installation and license information. =cut ######################################################################## 1;