line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#!/usr/bin/perl -w |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
package DBIx::InterpolationBinding; |
4
|
|
|
|
|
|
|
|
5
|
2
|
|
|
2
|
|
40737
|
use 5.005; |
|
2
|
|
|
|
|
8
|
|
|
2
|
|
|
|
|
64
|
|
6
|
2
|
|
|
2
|
|
9
|
use strict; |
|
2
|
|
|
|
|
5
|
|
|
2
|
|
|
|
|
66
|
|
7
|
2
|
|
|
2
|
|
9
|
use vars qw($VERSION $DEBUG); |
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
149
|
|
8
|
|
|
|
|
|
|
|
9
|
2
|
|
|
|
|
37
|
use overload '""' => \&_convert_object_to_string, |
10
|
|
|
|
|
|
|
'.' => \&_append_item_to_object, |
11
|
2
|
|
|
2
|
|
3124
|
'fallback' => 1; |
|
2
|
|
|
|
|
3738
|
|
12
|
|
|
|
|
|
|
require DBI; |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
$VERSION = '1.01'; |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
$DEBUG = 0; |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
sub import { |
19
|
2
|
|
|
2
|
|
28
|
overload::constant 'q' => \&_prepare_object_from_string; |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
# Bind the execute method into the DBI namespace |
22
|
|
|
|
|
|
|
# We do it twice to avoid a tedious warning |
23
|
|
|
|
|
|
|
# We would use the warnings pragma, but this is 5.005 :-) |
24
|
2
|
|
|
|
|
201
|
*DBI::db::execute = \&dbi_exec; |
25
|
2
|
|
|
|
|
220
|
*DBI::db::execute = \&dbi_exec; |
26
|
|
|
|
|
|
|
} |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
sub unimport { |
29
|
1
|
|
|
1
|
|
10
|
overload::remove_constant 'q'; |
30
|
|
|
|
|
|
|
} |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
sub dbi_exec { |
33
|
9
|
|
|
9
|
0
|
406
|
my ($dbi, $sql) = @_; |
34
|
|
|
|
|
|
|
|
35
|
9
|
100
|
66
|
|
|
273
|
return $dbi->set_err(1, |
36
|
|
|
|
|
|
|
'\$dbh->execute can only be used with a magic string.') |
37
|
|
|
|
|
|
|
unless (ref $sql and $sql->isa(__PACKAGE__)); |
38
|
8
|
|
|
|
|
19
|
($sql, my @params) = _create_sql_and_params($sql); |
39
|
|
|
|
|
|
|
|
40
|
8
|
50
|
|
|
|
20
|
print STDERR "DBI::prepare($sql)\nDBI::execute(", join(", ", |
41
|
|
|
|
|
|
|
@params) , ")\n" if $DEBUG; |
42
|
8
|
50
|
|
|
|
44
|
my $sth = $dbi->prepare($sql) or return; |
43
|
8
|
50
|
|
|
|
1879
|
$sth->execute(@params) or return; |
44
|
8
|
|
|
|
|
7293
|
return $sth; |
45
|
|
|
|
|
|
|
} |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
sub _create_sql_and_params { |
48
|
11
|
|
|
11
|
|
148
|
my ($sql, @params) = @_; |
49
|
|
|
|
|
|
|
|
50
|
11
|
100
|
66
|
|
|
56
|
if (ref $sql and $sql->isa(__PACKAGE__)) { |
51
|
|
|
|
|
|
|
# We have a DBOx::InterpolationBinding string |
52
|
9
|
|
|
|
|
10
|
unshift @params, @{ $sql->{bind_params} }; |
|
9
|
|
|
|
|
22
|
|
53
|
9
|
|
|
|
|
18
|
$sql = $sql->{sql_string} |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
|
56
|
11
|
|
|
|
|
42
|
return ($sql, @params); |
57
|
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
sub _prepare_object_from_string { |
60
|
45
|
|
|
45
|
|
138
|
my (undef, $string, $mode) = @_; |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
# We only want to affect double-quoted strings |
63
|
45
|
100
|
|
|
|
2463
|
return $string unless ($mode eq "qq"); |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
# Make an object out of the string |
66
|
25
|
|
|
|
|
71
|
my $self = { |
67
|
|
|
|
|
|
|
string => $string, |
68
|
|
|
|
|
|
|
sql_string => $string, |
69
|
|
|
|
|
|
|
bind_params => [ ] |
70
|
|
|
|
|
|
|
}; |
71
|
25
|
|
|
|
|
2582
|
return bless $self => __PACKAGE__; |
72
|
|
|
|
|
|
|
} |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
sub _convert_object_to_string { |
75
|
11
|
|
|
11
|
|
4535
|
my ($self) = @_; |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
# We need a string for this (eg. to print or use outside DBI) |
78
|
11
|
|
|
|
|
350
|
return $self->{string}; |
79
|
|
|
|
|
|
|
} |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
sub _append_item_to_object { |
82
|
39
|
|
|
39
|
|
105728
|
my ($self, $string, $flipped) = @_; |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
# $new_hash will become the object we return, so the old one |
85
|
|
|
|
|
|
|
# isn't mashed. |
86
|
39
|
|
|
|
|
198
|
my $new_hash = { %$self }; |
87
|
39
|
|
|
|
|
73
|
$new_hash->{bind_params} = [ @{ $self->{bind_params} } ]; |
|
39
|
|
|
|
|
105
|
|
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
# At this point, the thing that isn't $self is either an object of |
90
|
|
|
|
|
|
|
# this class, or it's a boring string. Also, we either need to append |
91
|
|
|
|
|
|
|
# the other thingy before this one, or after, depending on $flipped. |
92
|
39
|
|
66
|
|
|
182
|
my $string_is_this_class = ref($string) && $string->isa(__PACKAGE__); |
93
|
|
|
|
|
|
|
|
94
|
39
|
100
|
66
|
|
|
138
|
if ($string_is_this_class and not $flipped) { |
95
|
16
|
|
|
|
|
43
|
$new_hash->{sql_string} .= $string->{sql_string}; |
96
|
16
|
|
|
|
|
36
|
$new_hash->{string} .= $string->{string}; |
97
|
16
|
|
|
|
|
21
|
push @{ $new_hash->{bind_params} }, @{ $string->{bind_params} }; |
|
16
|
|
|
|
|
27
|
|
|
16
|
|
|
|
|
34
|
|
98
|
|
|
|
|
|
|
} |
99
|
39
|
50
|
66
|
|
|
131
|
if ($string_is_this_class and $flipped) { |
100
|
0
|
|
|
|
|
0
|
$new_hash->{sql_string} = $string->{sql_string} . |
101
|
|
|
|
|
|
|
$new_hash->{sql_string}; |
102
|
0
|
|
|
|
|
0
|
$new_hash->{string} = $string->{string} . $new_hash->{string}; |
103
|
0
|
|
|
|
|
0
|
unshift @{ $new_hash->{bind_params} }, @{ $string->{bind_params} }; |
|
0
|
|
|
|
|
0
|
|
|
0
|
|
|
|
|
0
|
|
104
|
|
|
|
|
|
|
} |
105
|
|
|
|
|
|
|
|
106
|
39
|
50
|
33
|
|
|
113
|
if ($flipped and not $string_is_this_class) { |
107
|
0
|
|
|
|
|
0
|
$new_hash->{sql_string} = "?" . $new_hash->{sql_string}; |
108
|
0
|
|
|
|
|
0
|
$new_hash->{string} = $string . $new_hash->{string}; |
109
|
0
|
|
|
|
|
0
|
unshift @{ $new_hash->{bind_params} }, $string; |
|
0
|
|
|
|
|
0
|
|
110
|
|
|
|
|
|
|
} |
111
|
39
|
100
|
33
|
|
|
144
|
if (not($flipped) and not $string_is_this_class) { |
112
|
23
|
|
|
|
|
45
|
$new_hash->{sql_string} .= "?"; |
113
|
23
|
|
|
|
|
44
|
$new_hash->{string} .= $string; |
114
|
23
|
|
|
|
|
24
|
push @{ $new_hash->{bind_params} }, $string; |
|
23
|
|
|
|
|
48
|
|
115
|
|
|
|
|
|
|
} |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
# Make the new thing an object |
118
|
39
|
|
|
|
|
190
|
return bless $new_hash => ref($self); |
119
|
|
|
|
|
|
|
} |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
1; |
122
|
|
|
|
|
|
|
__END__ |