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