Initial set_ansi_mode code - make sure to utilize _do_query instead of dbh->do, so...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / mysql.pm
CommitLineData
843f8ecd 1package DBIx::Class::Storage::DBI::mysql;
2
3use strict;
4use warnings;
5
698775ed 6use base qw/
7 DBIx::Class::Storage::DBI::MultiColumnIn
8 DBIx::Class::Storage::DBI::AmbiguousGlob
9 DBIx::Class::Storage::DBI
10/;
2ad62d97 11use mro 'c3';
843f8ecd 12
87aa29e2 13__PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks::MySQL');
843f8ecd 14
e96a93df 15sub with_deferred_fk_checks {
16 my ($self, $sub) = @_;
17
5cf7285e 18 $self->_do_query('SET FOREIGN_KEY_CHECKS = 0');
e96a93df 19 $sub->();
5cf7285e 20 $self->_do_query('SET FOREIGN_KEY_CHECKS = 1');
e96a93df 21}
22
0fde80d9 23sub connect_call_set_ansi_mode {
24 my $self = shift;
25 $self->_do_query(q|SET SQL_MODE = 'ANSI,TRADITIONAL'|);
26 $self->_do_query(q|SET SQL_AUTO_IS_NULL = 0|);
27}
28
d4f16b21 29sub _dbh_last_insert_id {
30 my ($self, $dbh, $source, $col) = @_;
31 $dbh->{mysql_insertid};
843f8ecd 32}
33
e8d293df 34sub sqlt_type {
35 return 'MySQL';
36}
37
adb3554a 38sub _svp_begin {
eeb8cfeb 39 my ($self, $name) = @_;
adb3554a 40
eeb8cfeb 41 $self->dbh->do("SAVEPOINT $name");
adb3554a 42}
43
44sub _svp_release {
eeb8cfeb 45 my ($self, $name) = @_;
adb3554a 46
eeb8cfeb 47 $self->dbh->do("RELEASE SAVEPOINT $name");
adb3554a 48}
49
50sub _svp_rollback {
eeb8cfeb 51 my ($self, $name) = @_;
adb3554a 52
eeb8cfeb 53 $self->dbh->do("ROLLBACK TO SAVEPOINT $name")
adb3554a 54}
48fe9087 55
106d5f3b 56sub is_replicating {
f797e89e 57 my $status = shift->dbh->selectrow_hashref('show slave status');
58 return ($status->{Slave_IO_Running} eq 'Yes') && ($status->{Slave_SQL_Running} eq 'Yes');
106d5f3b 59}
60
61sub lag_behind_master {
f797e89e 62 return shift->dbh->selectrow_hashref('show slave status')->{Seconds_Behind_Master};
106d5f3b 63}
64
613f65e5 65# MySql can not do subquery update/deletes, only way is slow per-row operations.
ab807c12 66# This assumes you have set proper transaction isolation and use innodb.
b5963465 67sub _subq_update_delete {
613f65e5 68 return shift->_per_row_update_delete (@_);
69}
70
843f8ecd 711;
72
75d07914 73=head1 NAME
843f8ecd 74
c9d438ff 75DBIx::Class::Storage::DBI::mysql - Storage::DBI class implementing MySQL specifics
843f8ecd 76
77=head1 SYNOPSIS
78
c9d438ff 79Storage::DBI autodetects the underlying MySQL database, and re-blesses the
80C<$storage> object into this class.
81
82 my $schema = MyDatbase->connect( $dsn, $user, $pass, { set_ansi_mode => 1 } );
843f8ecd 83
84=head1 DESCRIPTION
85
c9d438ff 86This class implements MySQL specific bits of L<DBIx::Class::Storage::DBI>.
87
0fde80d9 88It also provides a one-stop macro that sets session variables such that
89MySQL behaves more predictably as far as the SQL standard is concerned.
90
843f8ecd 91=head1 AUTHORS
92
c9d438ff 93See L<DBIx::Class/CONTRIBUTORS>
843f8ecd 94
95=head1 LICENSE
96
97You may distribute this code under the same terms as Perl itself.
98
99=cut