After 5e0eea35 we can actually test for cleaned namespaces within CDBI
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / CDBICompat / ImaDBI.pm
1 package # hide from PAUSE
2     DBIx::Class::CDBICompat::ImaDBI;
3
4 use strict;
5 use warnings;
6 use DBIx::ContextualFetch;
7
8 use base 'DBIx::Class';
9
10 use DBIx::Class::_Util qw(quote_sub perlstring);
11 use namespace::clean;
12
13 __PACKAGE__->mk_classdata('sql_transformer_class' =>
14                           'DBIx::Class::CDBICompat::SQLTransformer');
15
16 sub db_Main {
17   return $_[0]->storage->dbh;
18 }
19
20 sub connection {
21   my ($class, @info) = @_;
22   $info[3] = { %{ $info[3] || {}} };
23   $info[3]->{RootClass} = 'DBIx::ContextualFetch';
24   return $class->next::method(@info);
25 }
26
27 sub __driver {
28   return $_[0]->storage->dbh->{Driver}->{Name};
29 }
30
31 sub set_sql {
32   my ($class, $name, $sql) = @_;
33
34   quote_sub "${class}::sql_${name}", sprintf( <<'EOC', perlstring $sql );
35     my $class = shift;
36     return $class->storage->dbh_do(
37       _prepare_sth => $class->transform_sql(%s, @_)
38     );
39 EOC
40
41
42   if ($sql =~ /select/i) {  # FIXME - this should be anchore surely...?
43     quote_sub "${class}::search_${name}", sprintf( <<'EOC', "sql_$name" );
44       my ($class, @args) = @_;
45       $class->sth_to_objects( $class->%s, \@args);
46 EOC
47   }
48 }
49
50 sub sth_to_objects {
51   my ($class, $sth, $execute_args) = @_;
52
53   $sth->execute(@$execute_args);
54
55   my @ret;
56   while (my $row = $sth->fetchrow_hashref) {
57     push(@ret, $class->inflate_result($class->result_source_instance, $row));
58   }
59
60   return @ret;
61 }
62
63 sub transform_sql {
64   my ($class, $sql, @args) = @_;
65
66   my $tclass = $class->sql_transformer_class;
67   $class->ensure_class_loaded($tclass);
68   my $t = $tclass->new($class, $sql, @args);
69
70   return sprintf($t->sql, $t->args);
71 }
72
73 package
74   DBIx::ContextualFetch::st; # HIDE FROM PAUSE THIS IS NOT OUR CLASS
75
76 no warnings 'redefine';
77
78 sub _untaint_execute {
79   my $sth = shift;
80   my $old_value = $sth->{Taint};
81   $sth->{Taint} = 0;
82   my $ret;
83   {
84     no warnings 'uninitialized';
85     $ret = $sth->SUPER::execute(@_);
86   }
87   $sth->{Taint} = $old_value;
88   return $ret;
89 }
90
91 1;