MojoX-Mysql

 view release on metacpan or  search on metacpan

lib/MojoX/Mysql/DB.pm  view on Meta::CPAN

package MojoX::Mysql::DB;
use Mojo::Base -base;
use Mojo::Util qw(dumper);
use Carp qw(croak);

has [qw(id)] => '_default';

sub DESTROY {
	my $self = shift;
	$self->rollback;
	$self->disconnect;
	$self->flush;
}

# Master connect DB
sub connect_master {
	my $self = shift;
	my $id   = $self->id;
	$self->flush;

	my $config = {};
	if(exists $self->{'config'}->{$id}->{'master'}){
		$config = $self->{'config'}->{$id}->{'master'};
	}
	else{
		croak 'Not found id server';
	}

	if(defined $config && ref($config) eq 'HASH' && %{$config}){
		if(ref($self->{'dbh'}{'master'}{$id}) eq 'DBI::db'){
			my $dbh = $self->{'dbh'}{'master'}{$id};
			return $dbh if($dbh->ping);
		}

		my $dbh = DBI->connect("DBI:mysql:".$config->{'dsn'}, $config->{'user'}, $config->{'password'}, {
			AutoCommit=>0,
			RaiseError=>0,
			PrintError=>0,
			mysql_enable_utf8=>1,
			mysql_auto_reconnect=>1,
			mysql_write_timeout=>$config->{'write_timeout'},
			mysql_read_timeout=>$config->{'read_timeout'},
		});

		if($DBI::errstr){
			$self->{'dbh'}{'master'}{$id} = undef;
			croak $DBI::errstr;
			return;
		}
		else{
			$self->{'dbh'}{'master'}{$id} = $dbh;
			$dbh->{'RaiseError'} = 1;
			return $dbh;
		}
	}
	return;
}

# Slave connect DB
sub connect_slave {
	my $self = shift;
	my $id   = $self->id;
	$self->flush;

	my $config = {};
	if(exists $self->{'config'}{$id}->{'slave'}){
		$config = $self->{'config'}->{$id}->{'slave'};
	}
	else{
		croak 'Not found id server';
	}

	if(defined $config && ref($config) eq 'ARRAY' && @{$config}){
		if(ref($self->{'dbh'}{'slave'}{$id}) eq 'DBI::db'){
			my $dbh = $self->{'dbh'}{'slave'}{$id};
			return $dbh if($dbh->ping);
		}

		for my $conf (@{$config}){

			my $dbh = DBI->connect("DBI:mysql:".$conf->{'dsn'}, $conf->{'user'}, $conf->{'password'}, {
				AutoCommit=>0,
				RaiseError=>0,
				PrintError=>0,
				mysql_enable_utf8=>1,
				mysql_auto_reconnect=>1,
				mysql_write_timeout=>$conf->{'write_timeout'},
				mysql_read_timeout=>$conf->{'read_timeout'},
				mysql_connect_timeout=>$conf->{'connect_timeout'},
			});

			if($DBI::errstr){
				$self->{'dbh'}{'slave'}{$id} = undef;
				next;
			}
			else{
				$self->{'dbh'}{'slave'}{$id} = $dbh;
				$dbh->{'RaiseError'} = 1;
				return $dbh;
			}
		}
	}
	return;
}

sub commit {
	my ($self) = @_;
	while(my($id,$types) = each %{$self->{'dbh'}}){
		if(ref $types eq 'HASH'){
			for my $type (keys %{$types}){
				my $dbh = $self->{'dbh'}->{$id}->{$type};
				if(ref $dbh eq 'DBI::db'){
					$dbh->commit;
					warn "commit:$id,$type" if(defined $ENV{'MOJO_MYSQL_DEBUG'});
				}
			}
		}
	}
}

sub rollback {
	my ($self) = @_;
	while(my($id,$types) = each %{$self->{'dbh'}}){
		if(ref $types eq 'HASH'){
			for my $type (keys %{$types}){
				my $dbh = $self->{'dbh'}->{$id}->{$type};
				if(ref $dbh eq 'DBI::db'){
					$dbh->rollback;
					warn "rollback:$id,$type" if(defined $ENV{'MOJO_MYSQL_DEBUG'});
				}
			}
		}
	}
}

sub disconnect {
	my ($self) = @_;
	while(my($id,$types) = each %{$self->{'dbh'}}){
		if(ref $types eq 'HASH'){
			for my $type (keys %{$types}){
				my $dbh = $self->{'dbh'}->{$id}->{$type};
				if(ref $dbh eq 'DBI::db'){
					$dbh->disconnect;
					warn "disconnect:$id,$type" if(defined $ENV{'MOJO_MYSQL_DEBUG'});
				}



( run in 1.145 second using v1.01-cache-2.11-cpan-6aa56a78535 )