Guest User

Untitled

a guest
Jun 20th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. package Connector;
  2.  
  3. use strict;
  4. use warnings;
  5. use Carp;
  6. use Data::Util qw/is_array_ref/;
  7. use List::Util qw/shuffle/;
  8. use Log::Minimal;
  9. use Scope::Container;
  10. use DBIx::Connector;
  11. use Data::MessagePack;
  12.  
  13. sub connect {
  14. my $class = shift;
  15. if ( is_array_ref($_[0]) ) {
  16. my @dsn = @_;
  17.  
  18. my $connector;
  19. my $dsn_key = build_dsn_key(@dsn);
  20. my $dbh = lookup_container($dsn_key);
  21. return $dbh if $dbh;
  22.  
  23. for my $s_dsn ( shuffle(@dsn) ) {
  24. eval {
  25. ($dbh, $connector) = $class->connect(@$s_dsn);
  26. };
  27. infof($@) if $@;
  28. last if ( $dbh );
  29. }
  30.  
  31. if ( $dbh ) {
  32. save_container($dsn_key, $connector);
  33. return wantarray ? ( $dbh, $connector ) : $dbh;
  34. }
  35.  
  36. croak("couldnt connect all DB, " .
  37. join(",", map { $_->[0] } @dsn));
  38.  
  39. }
  40.  
  41. my @dsn = @_;
  42. my $dsn_key = build_dsn_key(\@dsn);
  43. my $dbh = lookup_container($dsn_key);
  44. return $dbh if $dbh;
  45.  
  46. my $connector = DBIx::Connector->new(@dsn);
  47. $dbh = $connector->dbh;
  48.  
  49. save_container($dsn_key, $connector);
  50. return wantarray ? ( $dbh, $connector ) : $dbh;
  51. }
  52.  
  53. sub build_dsn_key {
  54. my @dsn = @_;
  55. @dsn = sort { $a->[0] cmp $b->[0] } @dsn;
  56. Data::MessagePack->pack(\@dsn);
  57. }
  58.  
  59. sub lookup_container {
  60. my $key = shift;
  61. my $connector = scope_container("pickless:dbix:connector:".$key);
  62. return if !$connector;
  63. my $dbh;
  64. eval {
  65. $dbh = $connector->_dbh;
  66. };
  67. return if $@;
  68. return $dbh;
  69. }
  70.  
  71. sub save_container {
  72. my $key = shift;
  73. scope_container("pickless:dbix:connector:".$key, shift);
  74. }
  75.  
  76. 1;
  77.  
  78.  
  79. =head1 NAME
  80.  
  81. connector - DBI connection cache with Scope::Container
  82.  
  83. =head1 SYNOPSIS
  84.  
  85. use Scope::Container;
  86. use Connector;
  87.  
  88. my $container = start_scope_container();
  89.  
  90. {
  91. my $dbh = Connector->connect("dbi:mysql:mydb","user","password",{RaiseError=>1});
  92.  
  93. my $dbh2 = Connector->connect(
  94. ["dbi:mysql:mydb;host=srv1","user","password",{RaiseError=>1}],
  95. ["dbi:mysql:mydb;host=srv2","user","password",{RaiseError=>1}],
  96. ["dbi:mysql:mydb;host=srv3","user","password",{RaiseError=>1}],
  97. );
  98. }
  99.  
  100. {
  101. #return from cache
  102. my $dbh = Connector->connect("dbi:mysql:mydb","user","password",{RaiseError=>1});
  103.  
  104. my $dbh2 = Connector->connect(
  105. ["dbi:mysql:mydb;host=srv1","user","password",{RaiseError=>1}],
  106. ["dbi:mysql:mydb;host=srv2","user","password",{RaiseError=>1}],
  107. ["dbi:mysql:mydb;host=srv3","user","password",{RaiseError=>1}],
  108. );
  109. }
  110.  
  111. # clear DB connection cache if $container scope out
  112.  
  113. =head1 DESCRIPTION
  114.  
  115. DBI connection cache with Scope::Container
  116.  
  117. =head1 AUTHOR
  118.  
  119. Masahiro Nagano E<lt>kazeburo {at} gmail.comE<gt>
  120.  
  121. =head1 SEE ALSO
  122.  
  123. =head1 LICENSE
  124.  
  125. This library is free software; you can redistribute it and/or modify
  126. it under the same terms as Perl itself.
  127.  
  128. =cut
Add Comment
Please, Sign In to add comment