File Coverage

blib/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm
Criterion Covered Total %
statement 21 53 39.6
branch 1 14 7.1
condition 1 11 9.0
subroutine 7 13 53.8
pod 1 1 100.0
total 31 92 33.7


line stmt bran cond sub pod time code
1             package DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server;
2              
3 3     3   2191 use strict;
  3         7  
  3         96  
4 3     3   16 use warnings;
  3         10  
  3         109  
5              
6 3         938 use base qw/
7             DBIx::Class::Storage::DBI::Sybase
8             DBIx::Class::Storage::DBI::MSSQL
9 3     3   14 /;
  3         4  
10 3     3   36 use mro 'c3';
  3         8  
  3         19  
11              
12 3     3   90 use DBIx::Class::Carp;
  3         7  
  3         24  
13 3     3   17 use namespace::clean;
  3         6  
  3         18  
14              
15             =head1 NAME
16              
17             DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server - Support for Microsoft
18             SQL Server via DBD::Sybase
19              
20             =head1 SYNOPSIS
21              
22             This subclass supports MSSQL server connections via L.
23              
24             =head1 DESCRIPTION
25              
26             This driver tries to determine whether your version of L and
27             supporting libraries (usually FreeTDS) support using placeholders, if not the
28             storage will be reblessed to
29             L.
30              
31             The MSSQL specific functionality is provided by
32             L.
33              
34             =head1 METHODS
35              
36             =cut
37              
38             __PACKAGE__->datetime_parser_type(
39             'DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format'
40             );
41              
42             sub _rebless {
43 0     0   0 my $self = shift;
44 0         0 my $dbh = $self->_get_dbh;
45              
46 0 0       0 return if ref $self ne __PACKAGE__;
47 0 0       0 if (not $self->_use_typeless_placeholders) {
48 0 0       0 carp_once <<'EOF' unless $ENV{DBIC_MSSQL_FREETDS_LOWVER_NOWARN};
49             Placeholders do not seem to be supported in your configuration of
50             DBD::Sybase/FreeTDS.
51              
52             This means you are taking a large performance hit, as caching of prepared
53             statements is disabled.
54              
55             Make sure to configure your server with "tds version" of 8.0 or 7.0 in
56             /etc/freetds/freetds.conf .
57              
58             To turn off this warning, set the DBIC_MSSQL_FREETDS_LOWVER_NOWARN environment
59             variable.
60             EOF
61             require
62 0         0 DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::NoBindVars;
63 0         0 bless $self,
64             'DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::NoBindVars';
65 0         0 $self->_rebless;
66             }
67             }
68              
69             sub _init {
70 1     1   3 my $self = shift;
71              
72 1         4 $self->next::method(@_);
73              
74             # work around massively broken freetds versions after 0.82
75             # - explicitly no scope_identity
76             # - no sth caching
77             #
78             # warn about the fact as well, do not provide a mechanism to shut it up
79 1 50 0     7 if ($self->_using_freetds and (my $ver = $self->_using_freetds_version||999) > 0.82) {
      33        
80 0           carp_once(
81             "Your DBD::Sybase was compiled against buggy FreeTDS version $ver. "
82             . 'Statement caching does not work and will be disabled.'
83             );
84              
85 0           $self->_identity_method('@@identity');
86 0           $self->_no_scope_identity_query(1);
87 0           $self->disable_sth_caching(1);
88             }
89             }
90              
91             # invoked only if DBD::Sybase is compiled against FreeTDS
92             sub _set_autocommit_stmt {
93 0     0     my ($self, $on) = @_;
94              
95 0 0         return 'SET IMPLICIT_TRANSACTIONS ' . ($on ? 'OFF' : 'ON');
96             }
97              
98             sub _get_server_version {
99 0     0     my $self = shift;
100              
101 0           my $product_version = $self->_get_dbh->selectrow_hashref('master.dbo.xp_msver ProductVersion');
102              
103 0 0         if ((my $version = $product_version->{Character_Value}) =~ /^(\d+)\./) {
104 0           return $version;
105             }
106             else {
107 0           $self->throw_exception(
108             "MSSQL Version Retrieval Failed, Your ProductVersion's Character_Value is missing or malformed!"
109             );
110             }
111             }
112              
113             =head2 connect_call_datetime_setup
114              
115             Used as:
116              
117             on_connect_call => 'datetime_setup'
118              
119             In L to set:
120              
121             $dbh->syb_date_fmt('ISO_strict'); # output fmt: 2004-08-21T14:36:48.080Z
122              
123             On connection for use with L
124              
125             This works for both C and C columns, although
126             C columns only have minute precision.
127              
128             =cut
129              
130             sub connect_call_datetime_setup {
131 0     0 1   my $self = shift;
132 0           my $dbh = $self->_get_dbh;
133              
134 0 0         if ($dbh->can('syb_date_fmt')) {
135             # amazingly, this works with FreeTDS
136 0           $dbh->syb_date_fmt('ISO_strict');
137             }
138             else{
139 0           carp_once
140             'Your DBD::Sybase is too old to support '
141             . 'DBIx::Class::InflateColumn::DateTime, please upgrade!';
142             }
143             }
144              
145              
146             package # hide from PAUSE
147             DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::DateTime::Format;
148              
149             my $datetime_parse_format = '%Y-%m-%dT%H:%M:%S.%3NZ';
150             my $datetime_format_format = '%Y-%m-%d %H:%M:%S.%3N'; # %F %T
151              
152             my ($datetime_parser, $datetime_formatter);
153              
154             sub parse_datetime {
155 0     0     shift;
156 0           require DateTime::Format::Strptime;
157 0   0       $datetime_parser ||= DateTime::Format::Strptime->new(
158             pattern => $datetime_parse_format,
159             on_error => 'croak',
160             );
161 0           return $datetime_parser->parse_datetime(shift);
162             }
163              
164             sub format_datetime {
165 0     0     shift;
166 0           require DateTime::Format::Strptime;
167 0   0       $datetime_formatter ||= DateTime::Format::Strptime->new(
168             pattern => $datetime_format_format,
169             on_error => 'croak',
170             );
171 0           return $datetime_formatter->format_datetime(shift);
172             }
173              
174             =head1 FURTHER QUESTIONS?
175              
176             Check the list of L.
177              
178             =head1 COPYRIGHT AND LICENSE
179              
180             This module is free software L
181             by the L. You can
182             redistribute it and/or modify it under the same terms as the
183             L.
184              
185             =cut
186              
187             1;
188