minor POD fixes
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / ADO / Microsoft_SQL_Server.pm
1 package DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server;
2
3 use strict;
4 use warnings;
5
6 use base qw/
7   DBIx::Class::Storage::DBI::ADO
8   DBIx::Class::Storage::DBI::MSSQL
9 /;
10 use mro 'c3';
11
12 sub _rebless {
13   my $self = shift;
14   $self->_identity_method('@@identity');
15 }
16
17 sub source_bind_attributes {
18   my $self = shift;
19   my ($source) = @_;
20
21   my $bind_attributes = $self->next::method(@_);
22
23   foreach my $column ($source->columns) {
24     $bind_attributes->{$column}{ado_size} ||= 8000; # max VARCHAR
25   }
26
27   return $bind_attributes;
28 }
29
30 sub bind_attribute_by_data_type {
31   my ($self, $data_type) = @_;
32
33   ($data_type = lc($data_type)) =~ s/\s+.*//;
34
35   my $max_size =
36     $self->_mssql_max_data_type_representation_size_in_bytes->{$data_type};
37
38   my $res = {};
39   $res->{ado_size} = $max_size if $max_size;
40
41   return $res;
42 }
43
44 # approximate
45 # XXX needs to support varchar(max) and varbinary(max)
46 sub _mssql_max_data_type_representation_size_in_bytes {
47   my $self = shift;
48
49   my $blob_max = $self->_get_dbh->{LongReadLen} || 32768;
50
51   return +{
52 # MSSQL types
53     char => 8000,
54     varchar => 8000,
55     binary => 8000,
56     varbinary => 8000,
57     nchar => 8000,
58     nvarchar => 8000,
59     numeric => 100,
60     smallint => 100,
61     tinyint => 100,
62     smallmoney => 100,
63     bigint => 100,
64     bit => 100,
65     decimal => 100,
66     integer => 100,
67     int => 100,
68     money => 100,
69     float => 100,
70     real => 100,
71     uniqueidentifier => 100,
72     ntext => $blob_max,
73     text => $blob_max,
74     image => $blob_max,
75     date => 100,
76     datetime => 100,
77     datetime2 => 100,
78     datetimeoffset => 100,
79     smalldatetime => 100,
80     time => 100,
81     timestamp => 100,
82     cursor => 100,
83     hierarchyid => 100,
84     sql_variant => 100,
85     table => 100,
86     xml => $blob_max, # ???
87
88 # some non-MSSQL types
89     serial => 100,
90     bigserial => 100,
91     varchar2 => 8000,
92     blob => $blob_max,
93     clob => $blob_max,
94   }
95 }
96
97 1;
98
99 =head1 NAME
100
101 DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server - Support for Microsoft
102 SQL Server via DBD::ADO
103
104 =head1 SYNOPSIS
105
106 This subclass supports MSSQL server connections via L<DBD::ADO>.
107
108 =head1 DESCRIPTION
109
110 The MSSQL specific functionality is provided by
111 L<DBIx::Class::Storage::DBI::MSSQL>.
112
113 =head2 CAVEATS
114
115 =head3 identities
116
117 C<_identity_method> is set to C<@@identity>, as C<SCOPE_IDENTITY()> doesn't work
118 with L<DBD::ADO>. See L<DBIx::Class::Storage::DBI::MSSQL/IMPLEMENTATION NOTES>
119 for caveats regarding this.
120
121 =head3 truncation bug
122
123 There is a bug with MSSQL ADO providers where data gets truncated based on the
124 size of the bind sizes in the first prepare call:
125
126 L<https://rt.cpan.org/Ticket/Display.html?id=52048>
127
128 The C<ado_size> workaround is used (see L<DBD::ADO/"ADO Providers">) with the
129 approximate maximum size of the data_type of the bound column, or 8000 (maximum
130 VARCHAR size) if the data_type is not available.
131
132 This code is incomplete and may be buggy. Particularly, C<VARCHAR(MAX)> is not
133 supported yet. The data_type list for other DBs is also incomplete. Please
134 report problems (and send patches.)
135
136 =head1 AUTHOR
137
138 See L<DBIx::Class/CONTRIBUTORS>.
139
140 =head1 LICENSE
141
142 You may distribute this code under the same terms as Perl itself.
143
144 =cut