Anansi-DatabaseComponent
view release on metacpan or search on metacpan
lib/Anansi/DatabaseComponent.pm view on Meta::CPAN
return 0 if(!defined($autocommit));
return 0 if(ref($autocommit) !~ /^$/);
return 0 if($autocommit !~ /^[\+\-]?\d+$/);
return 1 if($autocommit);
return 0;
}
Anansi::DatabaseComponent::addChannel('Anansi::DatabaseComponent', 'AUTOCOMMIT' => 'autocommit');
=head2 bind
if(Anansi::DatabaseComponent::bind($OBJECT,
HANDLE => $HANDLE,
INPUT => [
{
NAME => 'someParameter'
}, {
DEFAULT => 123,
NAME => 'anotherParameter'
}
],
VALUE => {
someParameter => 'abc'
}
));
if($OBJECT->bind(
HANDLE => $HANDLE,
INPUT => [
{
NAME => 'yetAnotherParameter',
TYPE => 'TEXT'
}
],
VALUE => [
yetAnotherParameter => 456
]
lib/Anansi/DatabaseComponent.pm view on Meta::CPAN
=back
Attempts to use the supplied parameters to assign values to a SQL statement that
has already been prepared to accept them. Returns B<0> I<(zero)> on failure and
the database statement handle on success.
=cut
sub bind {
my ($self, %parameters) = @_;
return 0 if(!defined($parameters{HANDLE}));
return 0 if(!defined($parameters{INPUT}));
return 0 if(ref($parameters{INPUT}) !~ /^ARRAY$/i);
return 0 if(!defined($parameters{VALUE}));
return 0 if(ref($parameters{VALUE}) !~ /^HASH$/i);
my $index = 1;
foreach my $input (@{$parameters{INPUT}}) {
if(defined(${$parameters{VALUE}}{${$input}{NAME}})) {
if(defined(${$input}{TYPE})) {
$parameters{HANDLE}->bind_param($index, ${$parameters{VALUE}}{${$input}{NAME}}, ${$input}{TYPE});
} else {
$parameters{HANDLE}->bind_param($index, ${$parameters{VALUE}}{${$input}{NAME}});
}
} elsif(defined(${$input}{DEFAULT})) {
if(defined(${$input}{TYPE})) {
$parameters{HANDLE}->bind_param($index, ${$input}{DEFAULT}, ${$input}{TYPE});
} else {
$parameters{HANDLE}->bind_param($index, ${$input}{DEFAULT});
}
} elsif(defined(${$input}{TYPE})) {
$parameters{HANDLE}->bind_param($index, '', ${$input}{TYPE});
} else {
$parameters{HANDLE}->bind_param($index, '');
}
$index++;
}
return $parameters{HANDLE};
}
=head2 binding
if(1 == Anansi::DatabaseComponent::binding($OBJECT));
if(1 == $OBJECT->binding());
=over 4
=item self I<(Blessed Hash B<or> String, Required)>
Either an object or a string of this namespace.
=item parameters I<(Array, Optional)>
An array of hashes. Each hash should contain a I<NAME> key with a string value.
=back
Verifies that the supplied parameters are all hashes and that they each contain
a I<NAME> key with a string value. Returns B<1> I<(one)> when validity is
confirmed and B<0> I<(zero)> when an invalid structure is determined. Used to
validate the I<INPUT> parameter of the B<bind> method.
=cut
sub binding {
my ($self, @parameters) = @_;
foreach my $parameter (@parameters) {
return 0 if(ref($parameter) !~ /^HASH$/i);
return 0 if(!defined(${$parameter}{NAME}));
return 0 if(ref(${$parameter}{NAME}) !~ /^$/);
return 0 if(${$parameter}{NAME} !~ /^[a-zA-Z_]+(\s*[a-zA-Z0-9_]+)*$/);
}
return 1;
}
lib/Anansi/DatabaseComponent.pm view on Meta::CPAN
=item parameters I<(Hash, Required)>
Named parameters.
=over 4
=item INPUT I<Array, Optional>
An array of hashes. Each hash should contain a I<NAME> key with a string value
that represents the name of a parameter to associate with the corresponding B<?>
I<(Question mark)>. See the I<bind> method for details.
=item SQL I<(String, Optional)>
The SQL statement to prepare.
=item STATEMENT I<(String, Required)>
The name to associate with the prepared SQL statement.
=back
lib/Anansi/DatabaseComponent.pm view on Meta::CPAN
my $questionMarks = $questionMarks =~ s/\?/$1/sg;
if(0 == $questionMarks) {
return 0 if(defined($parameters{INPUT}));
} elsif(!defined($parameters{INPUT})) {
return 0;
} elsif(ref($parameters{INPUT}) !~ /^ARRAY$/i) {
return 0;
} elsif(scalar(@{$parameters{INPUT}}) != $questionMarks) {
return 0;
} else {
return 0 if(!$self->binding((@{$parameters{INPUT}})));
}
my $handle;
eval {
$handle = $self->{HANDLE}->prepare($parameters{SQL});
1;
} or do {
$self->rollback();
return 0;
};
my %statement = (
lib/Anansi/DatabaseComponent.pm view on Meta::CPAN
Named parameters.
=over 4
=item INPUT I<(Array, Optional)>
An array of hashes with each element corresponding to an equivalent B<?>
I<(Question mark)> found within the supplied I<SQL>. If the number of elements
is not the same as the number of B<?> I<(Question mark)>s found in the statement
then the statement is invalid. See the I<bind> method for details.
=item SQL I<(String, Optional)>
The SQL statement to execute.
=item STATEMENT I<(String, Optional)>
The name associated with a prepared SQL statement. This is interchangeable with
the SQL parameter but helps to speed up repetitive database interaction.
lib/Anansi/DatabaseComponent.pm view on Meta::CPAN
sub statement {
my ($self, $channel, %parameters) = @_;
return 0 if(ref($self) =~ /^(|ARRAY|CODE|FORMAT|GLOB|HASH|IO|LVALUE|REF|Regexp|SCALAR|VSTRING)$/i);
my $prepared = $self->prepare(undef, (%parameters));
my $handle;
if($prepared) {
$handle = ${$prepared}{HANDLE};
if(defined(${$prepared}{INPUT})) {
my $bound = $self->bind(
HANDLE => $handle,
INPUT => ${$prepared}{INPUT},
VALUE => \%parameters,
);
return 0 if(!$bound);
}
} else {
eval {
$handle = $self->{HANDLE}->prepare($parameters{SQL});
1;
lib/Anansi/DatabaseComponent.pm view on Meta::CPAN
} elsif(!defined($parameters{INPUT})) {
$self->rollback();
return 0;
} elsif(ref($parameters{INPUT}) !~ /^ARRAY$/i) {
$self->rollback();
return 0;
} elsif(scalar(@{$parameters{INPUT}}) != $questionMarks) {
$self->rollback();
return 0;
} else {
if(!$self->bind(
HANDLE => $handle,
INPUT => $parameters{INPUT},
VALUE => \%parameters,
)) {
$self->rollback();
return 0;
}
}
}
eval {
( run in 0.914 second using v1.01-cache-2.11-cpan-2398b32b56e )