Aion-Query
view release on metacpan or search on metacpan
lib/Aion/Query.pm view on Meta::CPAN
}
elsif(DRV =~ /sqlite/i) { "DBI:${\ DRV}:dbname=${\ BASE}" }
else { die "Using DSN! DRV: ${\ DRV} is'nt supported." }
}
}
my $CONN;
sub default_connect_options() {
return default_dsn, USER, PASS, $CONN //= CONN // do {
if(DRV =~ /mysql|mariadb/i) {[
"SET NAMES utf8",
"SET sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'",
]}
else {[]}
};
}
# ÐÐ¾Ð½Ð½ÐµÐºÑ Ðº базе и id коннекÑа
sub base_connect {
my ($dsn, $user, $password, $conn) = @_;
my $base = DBI->connect($dsn, $user, $password, {
RaiseError => 1,
PrintError => 0,
$dsn =~ /^DBI:mysql/i ? (mysql_enable_utf8 => 1): (),
}) or die "Connect to db failed";
$base->do($_) for @$conn;
return $base unless wantarray;
my ($base_connection_id) = $dsn =~ /^DBI:(mysql|mariadb)/i
? $base->selectrow_array("SELECT connection_id()")
: -1;
return $base, $base_connection_id;
}
lib/Aion/Query.pm view on Meta::CPAN
# }
sub LAST_INSERT_ID() {
$base->last_insert_id
}
# ÐÑеобÑазÑÐµÑ Ð² бинаÑнÑÑ ÑÑÑÐ¾ÐºÑ Ð¿ÑинÑÑÑÑ Ð² MYSQL
sub _to_hex_str($) {
my ($s) = @_;
no utf8;
use bytes;
$s =~ s/./sprintf "%02X", ord $&/gaes;
"X'$s'"
}
# ÐÐ´ÐµÑ Ð¿ÐµÑекодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñимволов:
# Рбазе иÑполÑзÑеÑÑÑ cp1251, поÑÑÐ¾Ð¼Ñ ÑимволÑ, коÑоÑÑе в Ð½ÐµÑ Ð½Ðµ вÑ
одÑÑ, нÑжно пеÑевеÑÑи в поÑледоваÑелÑноÑÑи.
# Ðид поÑледоваÑелÑноÑÑи: °ЧÐСÐÐ_Ð_254-ÑиÑной ÑиÑÑеме; \x7F
# Ðнак ° вÑбÑан поÑомÑ, ÑÑо он вÑÑе 127, ÑооÑвеÑÑÑвенно ÑÑÑока из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, ÑодеÑжаÑÐ°Ñ ÑакÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ,
# бÑÐ´ÐµÑ Ñ Ñлагом utf8, ÑÑо необÑ
одимо Ð´Ð»Ñ Ð¾Ð±ÑаÑного пеÑекодиÑованиÑ.
sub _recode_cp1251 {
my ($s) = @_;
return $s unless BQ;
$s =~ s/°|[^\Q$Aion::Format::CIF\E]/"°${\ to_radix(ord $&, 254) }\x7F"/ge;
$s
}
sub quote(;$);
sub quote(;$) {
my $k = @_ == 0? $_: $_[0];
lib/Aion/Query.pm view on Meta::CPAN
ref $k eq "REF" && ref $$k eq "ARRAY"?
join(" ", List::Util::pairmap { join " ", "WHEN", quote $a, "THEN", quote $b } @$$k):
ref $k eq "SCALAR"? $$k:
Scalar::Util::blessed $k ? $k:
ref $k ne ""? die "Something strange: `$k`":
$k =~ /^-?(?:0|[1-9]\d*)(\.\d+)?\z/a
&& ($ref = ref B::svref_2object(@_ == 0? \$_: \$_[0])
) ne "B::PV"? (
!$1 && $ref eq "B::NV"? "$k.0": $k
):
!utf8::is_utf8($k)? (
$k =~ /[^\t\n -~]/a ? _to_hex_str($k): #$base->quote($k, DBI::SQL_BINARY):
Aion::Format::to_str($k)
):
Aion::Format::to_str(_recode_cp1251($k))
}
sub _set_type {
my ($type, $x) = @_;
if(ref $x eq "ARRAY") {
[map _set_type($type, $_), @$x]
lib/Aion/Query.pm view on Meta::CPAN
$sth->execute;
$_[1] = [@{$sth->{NAME}}];
my $res = $sth->fetchall_arrayref({});
$sth->finish;
$res
}: $base->selectall_arrayref($query, { Slice => {} });
if(defined $r and BQ) {
for my $row (@$r) {
for my $k (keys %$row) {
$row->{$k} =~ s/°([^\x7F]{1,7})\x7F/chr from_radix($1, 254)/ge if utf8::is_utf8($row->{$k});
}
}
}
$r
} else {
0 + $base->do($query)
}
};
die +(length($query)>MAX_QUERY_ERROR? substr($query, 0, MAX_QUERY_ERROR) . " ...": $query) . "\n\n$@" if $@;
t/aion/query.t view on Meta::CPAN
use common::sense; use open qw/:std :utf8/; use Carp qw//; use File::Basename qw//; use File::Slurper qw//; use File::Spec qw//; use File::Path qw//; use Scalar::Util qw//; use Test::More 0.98; BEGIN { $SIG{__DIE__} = sub { my ($s) = @...
# # NAME
#
# Aion::Query - ÑÑнкÑионалÑнÑй инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к базам даннÑÑ
SQL (MySQL, MariaDB, Postgres и SQLite)
#
# # VERSION
#
# 0.0.5
#
# # SYNOPSIS
#
( run in 1.394 second using v1.01-cache-2.11-cpan-49f99fa48dc )