Advertisement
Guest User

dbi

a guest
Apr 4th, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. package GG::Plugins::Dbi;
  2. use strict;
  3. use warnings;
  4.  
  5. use Mojo::Base 'Mojolicious::Plugin';
  6.  
  7. use GG::Dbi;
  8.  
  9. our $VERSION = '0.02';
  10.  
  11. our $FORMATS = {
  12. url_date => '%Y%m%d',
  13. url_datetime => '%Y%m%d%H%M%S',
  14. mysql_date => '%Y-%m-%d',
  15. mysql_datetime => '%Y-%m-%d %H:%M:%S'
  16. };
  17.  
  18. sub register {
  19. my ( $self, $app, $args ) = @_;
  20. $args ||= {};
  21.  
  22. unless (ref($app)->can('dbi'))
  23. {
  24. ref($app)->attr('dbi');
  25. ref($app)->attr('dbh');
  26. ref($app)->attr('_dbh_requests_counter'=>0);
  27. }
  28.  
  29. my $max_requests_per_connection = $args->{requests_per_connection}||100;
  30.  
  31. $app->plugins->add_hook(
  32. before_dispatch => sub {
  33. my ( $self, $c ) = @_;
  34. my $dbi;
  35. if ( $args->{dbi} ) {
  36.  
  37. #external dbi
  38. $dbi = $args->{dbi};
  39. } elsif ($c->app->dbh and $c->app->_dbh_requests_counter < $max_requests_per_connection and $self->_check_connected($c->app->dbh) ){
  40. $dbi =$c->app->dbh;
  41. $c->app->log->debug("use cached DB connection, requests served: ".$c->app->_dbh_requests_counter);
  42. $c->app->_dbh_requests_counter($c->app->_dbh_requests_counter + 1);
  43. }
  44.  
  45. else {
  46. $dbi = GG::Dbi->connect(
  47. 'DBI:mysql:'.$args->{db_name}.':'.$args->{db_host}, # DSN
  48. $args->{db_user}, $args->{db_password}, # Username and password
  49. {
  50. # Additional options
  51. PrintError => 1, # warn() on errors
  52. RaiseError => 0, # don't die on error
  53. AutoCommit => 1,
  54. }
  55. );
  56. unless ($dbi) {
  57. my $err_msg = "DB connect error. 'DBI:mysql:$args->{db_name}:$args->{db_host}, $args->{db_user}, $args->{db_password}, error: $DBI::errstr";
  58. $c->app->log->error($err_msg);
  59.  
  60. # Render exception template
  61. my $options = {
  62. template => 'exception',
  63. format => 'html',
  64. status => 500,
  65. exception => $err_msg
  66. };
  67. $c->app->static->serve_500($c);
  68. return;
  69. }
  70. $dbi->lc_columns = 0; # Lower Case column
  71. $dbi->encoding('utf8'); # Default utf8 encoding
  72.  
  73. unless ($dbi) {
  74. my $err_msg = "DB connect error. dsn=$args->{dsn}, error";
  75. $c->app->log->error($err_msg);
  76.  
  77. # Render exception template
  78. my $options = {
  79. template => 'exception',
  80. format => 'html',
  81. status => 500,
  82. exception => $err_msg
  83. };
  84. $c->app->static->serve_500($c);
  85. return;
  86. }
  87. $dbi->dbh->do("SET NAMES utf8");
  88. $c->app->dbi($dbi);
  89. $c->app->dbh($dbi->dbh);
  90. $c->app->_dbh_requests_counter(1);
  91. }
  92. }
  93. );
  94.  
  95. $app->plugins->add_hook(
  96. after_dispatch => sub {
  97. my ( $self, $c ) = @_;
  98. $c->app->dbi->disconnect or $c->app->log->error("Disconnect error $DBI::errstr");;
  99. $c->app->log->debug("disconnect from DB $args->{db_name}");
  100. }
  101. );
  102. }
  103.  
  104. sub _check_connected{
  105. my $self = shift;
  106. my $dbh = shift;
  107. return unless $dbh;
  108. local $dbh->{RaiseError} = 1; # be on the safe side
  109. return $dbh->ping();
  110. }
  111.  
  112. 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement