Commit | Line | Data |
843f8ecd |
1 | package DBIx::Class::Storage::DBI::mysql; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
698775ed |
6 | use base qw/ |
7 | DBIx::Class::Storage::DBI::MultiColumnIn |
698775ed |
8 | DBIx::Class::Storage::DBI |
9 | /; |
2ad62d97 |
10 | use mro 'c3'; |
843f8ecd |
11 | |
87aa29e2 |
12 | __PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks::MySQL'); |
843f8ecd |
13 | |
e96a93df |
14 | sub with_deferred_fk_checks { |
15 | my ($self, $sub) = @_; |
16 | |
5cf7285e |
17 | $self->_do_query('SET FOREIGN_KEY_CHECKS = 0'); |
e96a93df |
18 | $sub->(); |
5cf7285e |
19 | $self->_do_query('SET FOREIGN_KEY_CHECKS = 1'); |
e96a93df |
20 | } |
21 | |
97a0a148 |
22 | sub connect_call_set_strict_mode { |
0fde80d9 |
23 | my $self = shift; |
97a0a148 |
24 | |
25 | # the @@sql_mode puts back what was previously set on the session handle |
26 | $self->_do_query(q|SET SQL_MODE = CONCAT('ANSI,TRADITIONAL,ONLY_FULL_GROUP_BY,', @@sql_mode)|); |
0fde80d9 |
27 | $self->_do_query(q|SET SQL_AUTO_IS_NULL = 0|); |
28 | } |
29 | |
d4f16b21 |
30 | sub _dbh_last_insert_id { |
31 | my ($self, $dbh, $source, $col) = @_; |
32 | $dbh->{mysql_insertid}; |
843f8ecd |
33 | } |
34 | |
d3944540 |
35 | # we need to figure out what mysql version we're running |
36 | sub sql_maker { |
37 | my $self = shift; |
38 | |
39 | unless ($self->_sql_maker) { |
40 | my $maker = $self->next::method (@_); |
41 | |
42 | # mysql 3 does not understand a bare JOIN |
43 | my $mysql_ver = $self->_get_dbh->get_info(18); |
44 | $maker->{_default_jointype} = 'INNER' if $mysql_ver =~ /^3/; |
45 | } |
46 | |
47 | return $self->_sql_maker; |
48 | } |
49 | |
e8d293df |
50 | sub sqlt_type { |
51 | return 'MySQL'; |
52 | } |
53 | |
adb3554a |
54 | sub _svp_begin { |
eeb8cfeb |
55 | my ($self, $name) = @_; |
adb3554a |
56 | |
9ae966b9 |
57 | $self->_get_dbh->do("SAVEPOINT $name"); |
adb3554a |
58 | } |
59 | |
60 | sub _svp_release { |
eeb8cfeb |
61 | my ($self, $name) = @_; |
adb3554a |
62 | |
9ae966b9 |
63 | $self->_get_dbh->do("RELEASE SAVEPOINT $name"); |
adb3554a |
64 | } |
65 | |
66 | sub _svp_rollback { |
eeb8cfeb |
67 | my ($self, $name) = @_; |
adb3554a |
68 | |
9ae966b9 |
69 | $self->_get_dbh->do("ROLLBACK TO SAVEPOINT $name") |
adb3554a |
70 | } |
48fe9087 |
71 | |
106d5f3b |
72 | sub is_replicating { |
9ae966b9 |
73 | my $status = shift->_get_dbh->selectrow_hashref('show slave status'); |
f797e89e |
74 | return ($status->{Slave_IO_Running} eq 'Yes') && ($status->{Slave_SQL_Running} eq 'Yes'); |
106d5f3b |
75 | } |
76 | |
77 | sub lag_behind_master { |
9ae966b9 |
78 | return shift->_get_dbh->selectrow_hashref('show slave status')->{Seconds_Behind_Master}; |
106d5f3b |
79 | } |
80 | |
613f65e5 |
81 | # MySql can not do subquery update/deletes, only way is slow per-row operations. |
ab807c12 |
82 | # This assumes you have set proper transaction isolation and use innodb. |
b5963465 |
83 | sub _subq_update_delete { |
613f65e5 |
84 | return shift->_per_row_update_delete (@_); |
85 | } |
86 | |
843f8ecd |
87 | 1; |
88 | |
75d07914 |
89 | =head1 NAME |
843f8ecd |
90 | |
c9d438ff |
91 | DBIx::Class::Storage::DBI::mysql - Storage::DBI class implementing MySQL specifics |
843f8ecd |
92 | |
93 | =head1 SYNOPSIS |
94 | |
c9d438ff |
95 | Storage::DBI autodetects the underlying MySQL database, and re-blesses the |
96 | C<$storage> object into this class. |
97 | |
3ce9dd08 |
98 | my $schema = MyDb::Schema->connect( $dsn, $user, $pass, { on_connect_call => 'set_strict_mode' } ); |
843f8ecd |
99 | |
100 | =head1 DESCRIPTION |
101 | |
b8391c87 |
102 | This class implements MySQL specific bits of L<DBIx::Class::Storage::DBI>, |
103 | like AutoIncrement column support and savepoints. Also it augments the |
104 | SQL maker to support the MySQL-specific C<STRAIGHT_JOIN> join type, which |
105 | you can use by specifying C<< join_type => 'straight' >> in the |
106 | L<relationship attributes|DBIx::Class::Relationship::Base/join_type> |
107 | |
c9d438ff |
108 | |
97a0a148 |
109 | It also provides a one-stop on-connect macro C<set_strict_mode> which sets |
110 | session variables such that MySQL behaves more predictably as far as the |
111 | SQL standard is concerned. |
0fde80d9 |
112 | |
3c01add8 |
113 | =head1 STORAGE OPTIONS |
114 | |
115 | =head2 set_strict_mode |
116 | |
117 | Enables session-wide strict options upon connecting. Equivalent to: |
118 | |
119 | ->connect ( ... , { |
120 | on_connect_do => [ |
121 | q|SET SQL_MODE = CONCAT('ANSI,TRADITIONAL,ONLY_FULL_GROUP_BY,', @@sql_mode)|, |
122 | q|SET SQL_AUTO_IS_NULL = 0|, |
123 | ] |
124 | }); |
125 | |
843f8ecd |
126 | =head1 AUTHORS |
127 | |
c9d438ff |
128 | See L<DBIx::Class/CONTRIBUTORS> |
843f8ecd |
129 | |
130 | =head1 LICENSE |
131 | |
132 | You may distribute this code under the same terms as Perl itself. |
133 | |
134 | =cut |