Commit | Line | Data |
84ddb3da |
1 | package # Hide from PAUSE |
d5dedbd6 |
2 | DBIx::Class::SQLMaker::MSSQL; |
84ddb3da |
3 | |
4a233f30 |
4 | use warnings; |
5 | use strict; |
6 | |
d5dedbd6 |
7 | use base qw( DBIx::Class::SQLMaker ); |
84ddb3da |
8 | |
9 | # |
10 | # MSSQL does not support ... OVER() ... RNO limits |
11 | # |
12 | sub _rno_default_order { |
13 | return \ '(SELECT(1))'; |
14 | } |
15 | |
f1b1d954 |
16 | # more or less copy pasted directly from ::SQLMaker |
17 | sub insert { |
18 | my $self = shift; |
19 | my $table = $self->_table(shift); |
20 | my $data = shift || return; |
21 | my $options = shift; |
22 | |
23 | if (! $data or (ref $data eq 'HASH' and !keys %{$data} ) ) { |
24 | my @bind; |
25 | my $sql = sprintf( |
26 | 'INSERT INTO %s DEFAULT VALUES', $_[0]->_quote($table) |
27 | ); |
28 | |
29 | if ( ($options||{})->{returning} ) { |
30 | my $s; |
31 | ($s, @bind) = $self->_insert_returning ($options); |
32 | $sql .= $s; |
33 | } |
34 | |
35 | return ($sql, @bind); |
36 | } |
37 | |
38 | my $method = $self->_METHOD_FOR_refkind("_insert", $data); |
39 | my ($sql, @bind) = $self->$method($data); |
40 | |
41 | $sql = join " ", $self->_sqlcase('insert into'), $table, $sql; |
42 | |
43 | if ($options->{returning}) { |
44 | my ($s, @b) = $self->_insert_returning ($options); |
45 | $sql =~ s/\bVALUES\b/$s VALUES/; |
46 | @bind = (@b, @bind); |
47 | } |
48 | |
49 | return wantarray ? ($sql, @bind) : $sql; |
50 | } |
51 | |
52 | |
53 | # insert returning docs at |
54 | # http://msdn.microsoft.com/en-us/library/ms177564.aspx |
55 | |
56 | sub _insert_returning { |
57 | my ($self, $options) = @_; |
58 | |
59 | my $f = $options->{returning}; |
60 | |
61 | my @f_list = do { |
62 | if (! ref $f) { |
63 | ($f) |
64 | } |
65 | elsif (ref $f eq 'ARRAY') { |
66 | @$f |
67 | } |
68 | elsif (ref $f eq 'SCALAR') { |
69 | ( |
70 | ($$f) |
71 | ) |
72 | } |
73 | else { |
74 | $self->throw_exception("Unsupported INSERT RETURNING option $f"); |
75 | } |
76 | }; |
77 | |
78 | return ( |
79 | join ' ', |
80 | $self->_sqlcase(' output'), |
81 | join ', ', |
82 | map $self->_quote("INSERTED.$_"), @f_list, |
83 | ); |
84 | } |
85 | |
86 | 1 |