File Coverage

blib/lib/DBIx/NamedDSN.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             package DBIx::NamedDSN;
2              
3 1     1   15919 use 5.005;
  1         5  
  1         44  
4 1     1   14 use strict;
  1         2  
  1         40  
5 1     1   6 use vars qw($VERSION $DBI_KEY_NAME %CACHED_DSNS $NAMED_DSN_CONFIG $CONNECT_INFO_KEY);
  1         7  
  1         99  
6              
7 1     1   5 use Carp;
  1         2  
  1         75  
8 1     1   1511 use DBI;
  0            
  0            
9              
10             $VERSION='0.11';
11             $DBI_KEY_NAME='ndsn_name';
12             $NAMED_DSN_CONFIG='/usr/local/etc/named_dsn.conf';
13             $CONNECT_INFO_KEY='ndsn_connection_info';
14              
15             sub connect {
16             my $self=shift;
17             my ($name,$user,$pass,@rest)=@_;
18             my ($dsn,$st_user,$st_passwd)=$self->get_cached_dsn($name);
19             my $dbh;
20              
21             # here we pass it through if it looks like a dbi connect string,
22             # so people can take advantage of the connect_string method with
23             # normal boring handles.
24              
25             $dsn=$name if (!$dsn && $name=~/^dbi:/);
26             croak "Unrecognized named DSN: '$name'. (Do you need to add it in '".$NAMED_DSN_CONFIG."'?)" unless $dsn;
27            
28             $user||=$st_user;
29             $pass||=$st_passwd;
30              
31             $dbh=DBI->connect($dsn,$user,$pass,@rest);
32              
33             if ($dbh) {
34             my $hash=tied %$dbh;
35             $hash->{$DBI_KEY_NAME}=$name;
36             $hash->{$CONNECT_INFO_KEY}={connect_string=>$dsn,user=>$user,pass=>$pass,everything_else=>[@rest]};
37             }
38             return $dbh;
39             }
40              
41             sub get_cached_dsn {
42             my $self=shift;
43             my $name=shift;
44            
45             unless (%CACHED_DSNS) {
46             open FH, $NAMED_DSN_CONFIG or croak "Could not open config file: ".$NAMED_DSN_CONFIG;
47             %CACHED_DSNS=map {split /\t/,$_,2} grep {/\w+\tdbi:\w+/} map {chomp; s/^\s+//; s/\#.*//;$_} ;
48             close FH;
49             }
50              
51             return unless defined $CACHED_DSNS{$name};
52              
53             return split(/\t/,$CACHED_DSNS{$name});
54             }
55              
56             sub DBI::db::connection_string {
57             my $self=shift;
58            
59             my $hash=tied %$self;
60             return $hash->{$DBIx::NamedDSN::CONNECT_INFO_KEY}->{connect_string};
61             }
62              
63             sub DBI::db::ndsn_identifier {
64             my $self=shift;
65            
66             my $hash=tied %$self;
67             return $hash->{$DBIx::NamedDSN::DBI_KEY_NAME};
68             }
69             1;
70              
71             __END__