how did this happen?
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker / MySQL.pm
CommitLineData
87aa29e2 1package # Hide from PAUSE
d5dedbd6 2 DBIx::Class::SQLMaker::MySQL;
87aa29e2 3
5e7a0b00 4use warnings;
5use strict;
6
d5dedbd6 7use base qw( DBIx::Class::SQLMaker );
87aa29e2 8
9#
10# MySQL does not understand the standard INSERT INTO $table DEFAULT VALUES
11# Adjust SQL here instead
12#
13sub insert {
14 my $self = shift;
15
87aa29e2 16 if (! $_[1] or (ref $_[1] eq 'HASH' and !keys %{$_[1]} ) ) {
70551c3d 17 my $table = $self->_quote($_[0]);
87aa29e2 18 return "INSERT INTO ${table} () VALUES ()"
19 }
20
70551c3d 21 return $self->next::method (@_);
87aa29e2 22}
23
b8391c87 24# Allow STRAIGHT_JOIN's
25sub _generate_join_clause {
26 my ($self, $join_type) = @_;
27
28 if( $join_type && $join_type =~ /^STRAIGHT\z/i ) {
29 return ' STRAIGHT_JOIN '
30 }
31
70551c3d 32 return $self->next::method($join_type);
b8391c87 33}
4e0a89e4 34
35# LOCK IN SHARE MODE
36my $for_syntax = {
37 update => 'FOR UPDATE',
38 shared => 'LOCK IN SHARE MODE'
39};
40
41sub _lock_select {
42 my ($self, $type) = @_;
43
70c28808 44 my $sql = $for_syntax->{$type}
45 || $self->throw_exception("Unknown SELECT .. FOR type '$type' requested");
4e0a89e4 46
47 return " $sql";
48}
49
905dee87 50sub _datetime_now_sql { 'NOW()' }
76145305 51{
52 my %part_map = (
37256abd 53 microsecond => 'MICROSECOND',
54 second => 'SECOND',
55 minute => 'MINUTE',
56 hour => 'HOUR',
57 day_of_month => 'DAY',
58 week => 'WEEK',
59 month => 'MONTH',
60 quarter => 'QUARTER',
61 year => 'YEAR',
37256abd 62 second_microsecond => 'SECOND_MICROSECOND',
63 minute_microsecond => 'MINUTE_MICROSECOND',
64 minute_second => 'MINUTE_SECOND',
65 hour_microsecond => 'HOUR_MICROSECOND',
66 hour_second => 'HOUR_SECOND',
67 hour_minute => 'HOUR_MINUTE',
68 day_microsecond => 'DAY_MICROSECOND',
69 day_second => 'DAY_SECOND',
70 day_minute => 'DAY_MINUTE',
71 day_hour => 'DAY_HOUR',
72 year_month => 'YEAR_MONTH',
76145305 73 );
74
2aedbd3d 75 my %diff_part_map = %part_map;
76 $diff_part_map{day} = delete $diff_part_map{day_of_month};
77
c33937bf 78 sub _datetime_sql {
79 die $_[0]->_unsupported_date_extraction($_[1], 'MySQL')
80 unless exists $part_map{$_[1]};
81 "EXTRACT($part_map{$_[1]} FROM $_[2])"
82 }
a53284b5 83 sub _reorder_add_datetime_vars {
84 my ($self, $amount, $date) = @_;
85
86 return ($date, $amount);
87 }
905dee87 88 sub _datetime_add_sql {
89 die $_[0]->_unsupported_date_adding($_[1], 'MySQL')
90 unless exists $diff_part_map{$_[1]};
91 "DATE_ADD($_[2], INTERVAL $_[3] $diff_part_map{$_[1]})"
92 }
a53284b5 93 sub _reorder_diff_datetime_vars {
94 my ($self, $d1, $d2) = @_;
95
96 return ($d2, $d1);
97 }
98
c33937bf 99 sub _datetime_diff_sql {
100 die $_[0]->_unsupported_date_diff($_[1], 'MySQL')
101 unless exists $diff_part_map{$_[1]};
102 "TIMESTAMPDIFF($diff_part_map{$_[1]}, $_[2], $_[3])"
103 }
76145305 104}
105
dff53b7e 106=head1 DATE FUNCTION IMPLEMENTATION
107
108=head1 DATE FUNCTION IMPLEMENTATION
109
110The function used to extract date information is C<DATEPART>, which supports
111
112 microsecond
113 second
114 minute
115 hour
116 day_of_month
117 week
118 month
119 quarter
120 year
121 second_microsecond
122 minute_microsecond
123 minute_second
124 hour_microsecond
125 hour_second
126 hour_minute
127 day_microsecond
128 day_second
129 day_minute
130 day_hour
131 year_month
132
133The function used to diff dates is C<TIMESTAMPDIFF>, which supports
134
135 microsecond
136 second
137 minute
138 hour
139 day
140 week
141 month
142 quarter
143 year
144 second_microsecond
145 minute_microsecond
146 minute_second
147 hour_microsecond
148 hour_second
149 hour_minute
150 day_microsecond
151 day_second
152 day_minute
153 day_hour
154 year_month
155
156=cut
157
87aa29e2 1581;