Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package GG::Plugins::Dbi;
- use strict;
- use warnings;
- use Mojo::Base 'Mojolicious::Plugin';
- use GG::Dbi;
- our $VERSION = '0.02';
- our $FORMATS = {
- url_date => '%Y%m%d',
- url_datetime => '%Y%m%d%H%M%S',
- mysql_date => '%Y-%m-%d',
- mysql_datetime => '%Y-%m-%d %H:%M:%S'
- };
- sub register {
- my ( $self, $app, $args ) = @_;
- $args ||= {};
- unless (ref($app)->can('dbi'))
- {
- ref($app)->attr('dbi');
- ref($app)->attr('dbh');
- ref($app)->attr('_dbh_requests_counter'=>0);
- }
- my $max_requests_per_connection = $args->{requests_per_connection}||100;
- $app->plugins->add_hook(
- before_dispatch => sub {
- my ( $self, $c ) = @_;
- my $dbi;
- if ( $args->{dbi} ) {
- #external dbi
- $dbi = $args->{dbi};
- } elsif ($c->app->dbh and $c->app->_dbh_requests_counter < $max_requests_per_connection and $self->_check_connected($c->app->dbh) ){
- $dbi =$c->app->dbh;
- $c->app->log->debug("use cached DB connection, requests served: ".$c->app->_dbh_requests_counter);
- $c->app->_dbh_requests_counter($c->app->_dbh_requests_counter + 1);
- }
- else {
- $dbi = GG::Dbi->connect(
- 'DBI:mysql:'.$args->{db_name}.':'.$args->{db_host}, # DSN
- $args->{db_user}, $args->{db_password}, # Username and password
- {
- # Additional options
- PrintError => 1, # warn() on errors
- RaiseError => 0, # don't die on error
- AutoCommit => 1,
- }
- );
- unless ($dbi) {
- my $err_msg = "DB connect error. 'DBI:mysql:$args->{db_name}:$args->{db_host}, $args->{db_user}, $args->{db_password}, error: $DBI::errstr";
- $c->app->log->error($err_msg);
- # Render exception template
- my $options = {
- template => 'exception',
- format => 'html',
- status => 500,
- exception => $err_msg
- };
- $c->app->static->serve_500($c);
- return;
- }
- $dbi->lc_columns = 0; # Lower Case column
- $dbi->encoding('utf8'); # Default utf8 encoding
- unless ($dbi) {
- my $err_msg = "DB connect error. dsn=$args->{dsn}, error";
- $c->app->log->error($err_msg);
- # Render exception template
- my $options = {
- template => 'exception',
- format => 'html',
- status => 500,
- exception => $err_msg
- };
- $c->app->static->serve_500($c);
- return;
- }
- $dbi->dbh->do("SET NAMES utf8");
- $c->app->dbi($dbi);
- $c->app->dbh($dbi->dbh);
- $c->app->_dbh_requests_counter(1);
- }
- }
- );
- $app->plugins->add_hook(
- after_dispatch => sub {
- my ( $self, $c ) = @_;
- $c->app->dbi->disconnect or $c->app->log->error("Disconnect error $DBI::errstr");;
- $c->app->log->debug("disconnect from DB $args->{db_name}");
- }
- );
- }
- sub _check_connected{
- my $self = shift;
- my $dbh = shift;
- return unless $dbh;
- local $dbh->{RaiseError} = 1; # be on the safe side
- return $dbh->ping();
- }
- 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement