DBIx-DWIW
view release on metacpan or search on metacpan
lib/DBIx/DWIW.pm view on Meta::CPAN
calls C<die()>, so you may want to C<eval {...}> the call. The
C<NoAbort> option (described below) controls that behavior.
C<Connect()> accepts ``hash-style'' key/value pairs as arguments. The
arguments which it recognizes are:
=over
=item Host
The name of the host to connect to. Use C<undef> to force a socket
connection on the local machine.
=item User
The database user to authenticate as.
=item Pass
The password to authenticate with.
=item DB
The name of the database to use.
=item Socket
NOT IMPLEMENTED.
The path to the Unix socket to use.
=item Port
The port number to connect to.
=item Proxy
Set to true to connect to a DBI::ProxyServer proxy. You'll also need
to set ProxyHost, ProxyKey, and ProxyPort. You may also want to set
ProxyKey and ProxyCipher.
=item ProxyHost
The hostname of the proxy server.
=item ProxyPort
The port number on which the proxy is listening. This is probably
different than the port number on which the database server is
listening.
=item ProxyKey
If the proxy server you're using requires encryption, supply the
encryption key (as a hex string).
=item ProxyCipher
If the proxy server requires encryption, supply the name of the
package which provides encryption. Typically this is something
like C<Crypt::DES> or C<Crypt::Blowfish>.
=item Unique
A boolean which controls connection reuse.
If false (the default), multiple C<Connect>s with the same connection
parameters (User, Pass, DB, Host) return the same open
connection. If C<Unique> is true, it returns a connection distinct
from all other connections.
If you have a process with an active connection that fork()s, be aware
that you CANNOT share the connection between the parent and child.
Well, you can if you're REALLY CAREFUL and know what you're doing.
But don't do it.
Instead, acquire a new connection in the child. Be sure to set this
flag when you do, or you'll end up with the same connection and spend
a lot of time pulling your hair out over why the code does mysterious
things.
As of version 0.27, DWIW also checks the class name of the caller and
guarantees unique connections across different classes. So if you
call Connect() from SubClass1 and SubClass2, each class gets its own
connection.
=item Verbose
Turns verbose reporting on. See C<Verbose()>.
=item Quiet
Turns off warning messages. See C<Quiet()>.
=item NoRetry
If true, the C<Connect()> fails immediately if it can't connect to
the database. Normally, it retries based on calls to
C<RetryWait()>. C<NoRetry> affects only C<Connect>, and has no effect
on the fault-tolerance of the package once connected.
=item NoAbort
If there is an error in the arguments, or in the end the database
can't be connected to, C<Connect()> normally prints an error message
and dies. If C<NoAbort> is true, it puts the error string into
C<$@> and return false.
=item Timeout
The amount of time (in seconds) after which C<Connect()> should give up and
return. You may use fractional seconds. A Timeout of zero is the same as
not having one at all.
If you set the timeout, you probably also want to set C<NoRetry> to a
true value. Otherwise you'll be surprised when a server is down and
your retry logic is running.
=item QueryTimeout
The amount of time (in seconds) after which query operations should give up
lib/DBIx/DWIW.pm view on Meta::CPAN
## and default to nothing ("") if it exists but is empty.
##
my $Host;
if (exists $Options{Host})
{
$Host = delete($Options{Host}) || "";
}
else
{
$Host = $class->DefaultHost($DB) || "";
}
if (not $DB)
{
$@ = "missing DB parameter to Connect";
die $@ unless $NoAbort;
return ();
}
if (not $User)
{
$@ = "missing User parameter to Connect";
die $@ unless $NoAbort;
return ();
}
if (not defined $Password)
{
$@ = "missing Pass parameter to Connect";
die $@ unless $NoAbort;
return ();
}
# if (%Options)
# {
# my $keys = join(', ', keys %Options);
# $@ = "bad parameters [$keys] to Connect()";
# die $@ unless $NoAbort;
# return ();
# }
my $myhost = hostname();
my $desc;
if (defined $Host)
{
$desc = "connection to $Host\'s MySQL server from $myhost";
}
else
{
$desc = "local connection to MySQL server on $myhost";
}
## we're going to build the dsn up incrementally...
my $dsn;
## proxy details
##
## This can be factored together once I'm sure it is working.
# DBI:Proxy:cipher=Crypt::DES;key=$key;hostname=$proxy_host;port=8192;dsn=DBI:mysql:$db:$host
if ($Options{Proxy})
{
if (not ($Options{ProxyHost} and $Options{ProxyPort}))
{
$@ = "ProxyHost and ProxyPort are required when Proxy is set";
die $@ unless $NoAbort;
return ();
}
$dsn = "DBI:Proxy";
my $proxy_port = $Options{ProxyPort};
my $proxy_host = $Options{ProxyHost};
if ($Options{ProxyCipher} and $Options{ProxyKey})
{
my $proxy_cipher = $Options{ProxyCipher};
my $proxy_key = $Options{ProxyKey};
$dsn .= ":cipher=$proxy_cipher;key=$proxy_key";
}
$dsn .= ";hostname=$proxy_host;port=$proxy_port";
$dsn .= ";dsn=DBI:mysql:$DB:$Host;mysql_client_found_rows=1";
}
else
{
if ($Port)
{
$dsn .= "DBI:mysql:$DB:$Host;port=$Port;mysql_client_found_rows=1";
}
else
{
$dsn .= "DBI:mysql:$DB:$Host;mysql_client_found_rows=1";
}
}
warn "DSN: $dsn\n" if $ENV{DEBUG};
##
## If we're not looking for a unique connection, and we already have
## one with the same options, use it.
##
if (not $Unique)
{
if (my $db = $CurrentConnections{$dsn . $class})
{
if (defined $Verbose)
{
$db->{VERBOSE} = $Verbose;
}
return $db;
}
}
if ($Host and my $Override = $ConnectTimeoutOverrideByHost{$Host})
{
( run in 1.570 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )