convert from the bottom up
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Replicated / WithDSN.pm
1 package DBIx::Class::Storage::DBI::Replicated::WithDSN;
2
3 use Try::Tiny qw(try);
4 use Scalar::Util ();
5 use Role::Tiny;
6 requires qw/_query_start/;
7
8 =head1 NAME
9
10 DBIx::Class::Storage::DBI::Replicated::WithDSN - A DBI Storage Role with DSN
11 information in trace output
12
13 =head1 SYNOPSIS
14
15 This class is used internally by L<DBIx::Class::Storage::DBI::Replicated>.
16
17 =head1 DESCRIPTION
18
19 This role adds C<DSN: > info to storage debugging output.
20
21 =head1 METHODS
22
23 This class defines the following methods.
24
25 =head2 around: _query_start
26
27 Add C<DSN: > to debugging output.
28
29 =cut
30
31 around '_query_start' => sub {
32   my ($method, $self, $sql, @bind) = @_;
33
34   my $dsn = (try { $self->dsn }) || $self->_dbi_connect_info->[0];
35
36   my($op, $rest) = (($sql=~m/^(\w+)(.+)$/),'NOP', 'NO SQL');
37   my $storage_type = $self->can('active') ? 'REPLICANT' : 'MASTER';
38
39   my $query = do {
40     if ((Scalar::Util::reftype($dsn)||'') ne 'CODE') {
41       "$op [DSN_$storage_type=$dsn]$rest";
42     }
43     elsif (my $id = try { $self->id }) {
44       "$op [$storage_type=$id]$rest";
45     }
46     else {
47       "$op [$storage_type]$rest";
48     }
49   };
50
51   $self->$method($query, @bind);
52 };
53
54 =head1 ALSO SEE
55
56 L<DBIx::Class::Storage::DBI>
57
58 =head1 AUTHOR
59
60 John Napiorkowski <jjnapiork@cpan.org>
61
62 =head1 LICENSE
63
64 You may distribute this code under the same terms as Perl itself.
65
66 =cut
67
68 1;