__PACKAGE__->mk_group_accessors(
simple
=>
qw/_identity/
);
__PACKAGE__->sql_limit_dialect (
'RowNumberOver'
);
__PACKAGE__->sql_quote_char (
'"'
);
__PACKAGE__->new_guid(
'UUIDTOSTR(NEWID())'
);
__PACKAGE__->cursor_class(
'DBIx::Class::Storage::DBI::SQLAnywhere::Cursor'
);
sub
last_insert_id {
shift
->_identity }
sub
_prefetch_autovalues {
my
$self
=
shift
;
my
(
$source
,
$colinfo
,
$to_insert
) =
@_
;
my
$values
=
$self
->
next
::method(
@_
);
my
$identity_col
=
first {
$colinfo
->{
$_
}{is_auto_increment} }
keys
%$colinfo
;
if
(not
$identity_col
) {
foreach
my
$pk_col
(
$source
->primary_columns) {
if
(
!
exists
$to_insert
->{
$pk_col
}
and
$colinfo
->{
$pk_col
}{data_type}
and
$colinfo
->{
$pk_col
}{data_type} !~ /^uniqueidentifier/i
) {
$identity_col
=
$pk_col
;
last
;
}
}
}
if
(
$identity_col
&& (not
exists
$to_insert
->{
$identity_col
})) {
my
$dbh
=
$self
->_get_dbh;
my
$table_name
=
$source
->from;
$table_name
=
$$table_name
if
ref
$table_name
;
my
(
$identity
) =
try
{
$dbh
->selectrow_array(
"SELECT GET_IDENTITY('$table_name')"
)
};
if
(
defined
$identity
) {
$values
->{
$identity_col
} =
$identity
;
$self
->_identity(
$identity
);
}
}
return
$values
;
}
sub
_uuid_to_str {
my
(
$self
,
$data
) =
@_
;
$data
=
unpack
'H*'
,
$data
;
for
my
$pos
(8, 13, 18, 23) {
substr
(
$data
,
$pos
, 0) =
'-'
;
}
return
$data
;
}
sub
select_single {
my
$self
=
shift
;
my
@row
=
$self
->
next
::method(
@_
);
return
@row
unless
$self
->cursor_class->isa(
'DBIx::Class::Storage::DBI::SQLAnywhere::Cursor'
);
my
(
$ident
,
$select
) =
@_
;
my
$col_info
=
$self
->_resolve_column_info(
$ident
);
for
my
$select_idx
(0..
$#$select
) {
my
$selected
=
$select
->[
$select_idx
];
next
if
ref
$selected
;
my
$data_type
=
$col_info
->{
$selected
}{data_type}
or
next
;
if
(
$self
->_is_guid_type(
$data_type
)) {
my
$returned
=
$row
[
$select_idx
];
if
(
length
$returned
== 16) {
$row
[
$select_idx
] =
$self
->_uuid_to_str(
$returned
);
}
}
}
return
@row
;
}
sub
build_datetime_parser {
my
$self
=
shift
;
my
$type
=
"DateTime::Format::Strptime"
;
try
{
eval
"require ${type}"
}
catch
{
$self
->throw_exception(
"Couldn't load ${type}: $_"
);
};
return
$type
->new(
pattern
=>
'%Y-%m-%d %H:%M:%S.%6N'
);
}
sub
connect_call_datetime_setup {
my
$self
=
shift
;
$self
->_do_query(
"set temporary option timestamp_format = 'yyyy-mm-dd hh:mm:ss.ssssss'"
);
$self
->_do_query(
"set temporary option date_format = 'yyyy-mm-dd hh:mm:ss.ssssss'"
);
}
sub
_exec_svp_begin {
my
(
$self
,
$name
) =
@_
;
$self
->_dbh->
do
(
"SAVEPOINT $name"
);
}
sub
_exec_svp_release { 1 }
sub
_exec_svp_rollback {
my
(
$self
,
$name
) =
@_
;
$self
->_dbh->
do
(
"ROLLBACK TO SAVEPOINT $name"
)
}
1;