sub
_rebless {
my
$self
=
shift
;
my
$dbtype
;
try
{
$dbtype
= @{
$self
->_get_dbh->selectrow_arrayref(
qq{sp_server_info \@attribute_id=1}
)}[2]
}
catch
{
$self
->throw_exception(
"Unable to establish connection to determine database type: $_"
)
};
if
(
$dbtype
) {
$dbtype
=~ s/\W/_/gi;
$dbtype
=
'ASE'
if
$dbtype
eq
'SQL_Server'
;
my
$subclass
= __PACKAGE__ .
"::$dbtype"
;
if
(
$self
->load_optional_class(
$subclass
)) {
bless
$self
,
$subclass
;
$self
->_rebless;
}
}
}
sub
_init {
my
$self
=
shift
;
if
(!
$self
->isa(
'DBIx::Class::Storage::DBI::Sybase::FreeTDS'
) and
$self
->_using_freetds) {
my
@isa
= @{mro::get_linear_isa(
ref
$self
)};
my
$class
=
shift
@isa
;
my
$trait_class
=
$class
.
'::FreeTDS'
;
mro::set_mro (
$trait_class
,
'c3'
);
no
strict
'refs'
;
@{
"${trait_class}::ISA"
} = (
$class
,
'DBIx::Class::Storage::DBI::Sybase::FreeTDS'
,
@isa
);
bless
(
$self
,
$trait_class
);
Class::C3->reinitialize()
if
DBIx::Class::_ENV_::OLD_MRO;
$self
->_init(
@_
);
}
$self
->
next
::method(
@_
);
}
sub
_ping {
my
$self
=
shift
;
my
$dbh
=
$self
->_dbh or
return
0;
local
$dbh
->{RaiseError} = 1;
local
$dbh
->{PrintError} = 0;
if
(
$dbh
->{syb_no_child_con}) {
return
try
{
$self
->_connect->
do
(
'select 1'
);
1;
}
catch
{
0;
};
}
return
try
{
$dbh
->
do
(
'select 1'
);
1;
}
catch
{
0;
};
}
sub
_set_max_connect {
my
$self
=
shift
;
my
$val
=
shift
|| 256;
my
$dsn
=
$self
->_dbi_connect_info->[0];
return
if
ref
(
$dsn
) eq
'CODE'
;
if
(
$dsn
!~ /maxConnect=/) {
$self
->_dbi_connect_info->[0] =
"$dsn;maxConnect=$val"
;
my
$connected
=
defined
$self
->_dbh;
$self
->disconnect;
$self
->ensure_connected
if
$connected
;
}
}
sub
_using_freetds {
my
$self
=
shift
;
return
(
$self
->_get_dbh->{syb_oc_version}||
''
) =~ /freetds/i;
}
sub
_using_freetds_version {
my
$inf
=
shift
->_get_dbh->{syb_oc_version};
return
undef
unless
(
$inf
||
''
) =~ /freetds/i;
return
$inf
=~ /v([0-9\.]+)/ ? $1 : 0;
}
1;