Aion-Query

 view release on metacpan or  search on metacpan

t/aion/query.t  view on Meta::CPAN

# 
# # DESCRIPTION
# 
# `Aion::Query` позволяет строить SQL-запрос используя простой механизм шаблонов.
# 
# Обычно SQL-запросы строятся с помощью условий, что нагружает код.
# 
# Вторая проблема — размещение символов Юникода в однобайтовых кодировках, что уменьшает размер базы данных. Пока проблема решена тольк...
# 
# # SUBROUTINES
# 
# ## query ($query, %params)
# 
# Предоставляет SQL-запросы (DCL, DDL, DQL и DML) к СУБД с квотированием параметров.
# 
done_testing; }; subtest 'query ($query, %params)' => sub { 
::is_deeply scalar do {query "SELECT * FROM author WHERE name=:name", name => 'Pushkin A.S.'}, scalar do {[{id=>1, name=>"Pushkin A.S."}]}, 'query "SELECT * FROM author WHERE name=:name", name => \'Pushkin A.S.\' # --> [{id=>1, name=>"Pushkin A.S."}]...

# 
# ## LAST_INSERT_ID ()
# 
# Возвращает идентификатор последней вставки.
# 
done_testing; }; subtest 'LAST_INSERT_ID ()' => sub { 
::is scalar do {query "INSERT INTO author (name) VALUES (:name)", name => "Alice"}, scalar do{1}, 'query "INSERT INTO author (name) VALUES (:name)", name => "Alice"  # -> 1';
::is scalar do {LAST_INSERT_ID}, scalar do{3}, 'LAST_INSERT_ID  # -> 3';

# 
# ## quote ($scalar)
# 
# Квотирует скаляр для SQL-запроса.
# 
done_testing; }; subtest 'quote ($scalar)' => sub { 
::is scalar do {quote undef}, "NULL", 'quote undef     # => NULL';
::is scalar do {quote "abc"}, "'abc'", 'quote "abc"     # => \'abc\'';
::is scalar do {quote 123}, "123", 'quote 123       # => 123';
::is scalar do {quote "123"}, "'123'", 'quote "123"     # => \'123\'';
::is scalar do {quote(0+"123")}, "123", 'quote(0+"123")  # => 123';
::is scalar do {quote(123 . "")}, "'123'", 'quote(123 . "") # => \'123\'';
::is scalar do {quote 123.0}, "123.0", 'quote 123.0       # => 123.0';
::is scalar do {quote(0.0+"126")}, "126", 'quote(0.0+"126")  # => 126';
::is scalar do {quote("127"+0.0)}, "127", 'quote("127"+0.0)  # => 127';
::is scalar do {quote("128"-0.0)}, "128", 'quote("128"-0.0)  # => 128';
::is scalar do {quote("129"+1.e-100)}, "129.0", 'quote("129"+1.e-100)  # => 129.0';

# use for insert formula: SELECT :x as summ ⇒ x => \"xyz + 123"
::is scalar do {quote \"without quote"}, "without quote", 'quote \"without quote"  # => without quote';

# use in: WHERE id in (:x)
::is scalar do {quote [1,2,"5"]}, "1, 2, '5'", 'quote [1,2,"5"] # => 1, 2, \'5\'';

# use in: INSERT INTO author VALUES :x
::is scalar do {quote [[1, 2], [3, "4"]]}, "(1, 2), (3, '4')", 'quote [[1, 2], [3, "4"]]  # => (1, 2), (3, \'4\')';

# use in multiupdate: UPDATE author SET name=CASE id :x ELSE null END
::is scalar do {quote \[2=>'Pushkin A.', 1=>'Pushkin A.S.']}, "WHEN 2 THEN 'Pushkin A.' WHEN 1 THEN 'Pushkin A.S.'", 'quote \[2=>\'Pushkin A.\', 1=>\'Pushkin A.S.\']  # => WHEN 2 THEN \'Pushkin A.\' WHEN 1 THEN \'Pushkin A.S.\'';

# use for UPDATE SET :x or INSERT SET :x
::is scalar do {quote {name => 'A.S.', id => 12}}, "id = 12, name = 'A.S.'", 'quote {name => \'A.S.\', id => 12}   # => id = 12, name = \'A.S.\'';

::is_deeply scalar do {[map quote, -6, "-6", 1.5, "1.5"]}, scalar do {[-6, "'-6'", 1.5, "'1.5'"]}, '[map quote, -6, "-6", 1.5, "1.5"] # --> [-6, "\'-6\'", 1.5, "\'1.5\'"]';


# 
# ## query_prepare ($query, %param)
# 
# Заменяет параметры (`%param`) в запросе (`$query`) и возвращает его. Параметры заключаются в кавычки через подпрограмму `quote`.
# 
# Параметры вида `:x` будут квотироваться с учётом флагов скаляра, которые укажут, что в нём находится: строка, целое или число с плавающей Ð...
# 
# Чтобы явно указать тип скаляра используйте префиксы: `:^x` – целое, `:.x` – строка, `:~x` – плавающее.
# 
done_testing; }; subtest 'query_prepare ($query, %param)' => sub { 
::is scalar do {query_prepare "INSERT author SET name IN (:name)", name => ["Alice", 1, 1.0]}, "INSERT author SET name IN ('Alice', 1, 1.0)", 'query_prepare "INSERT author SET name IN (:name)", name => ["Alice", 1, 1.0]  # => INSERT author SET name I...

::is scalar do {query_prepare ":x :^x :.x :~x", x => "10"}, "'10' 10 10.0 '10'", 'query_prepare ":x :^x :.x :~x", x => "10"  # => \'10\' 10 10.0 \'10\'';

my $query = query_prepare "SELECT *
FROM author
    words*>> JOIN word:_
WHERE 1
    name>> AND name like :name
",
    name => "%Alice%",
    words => [1, 2, 3],
;

my $res = << 'END';
SELECT *
FROM author
    JOIN word1
    JOIN word2
    JOIN word3
WHERE 1
    AND name like '%Alice%'
END

::is scalar do {$query}, scalar do{$res}, '$query # -> $res';

# 
# ## query_do ($query)
# 
# Выполняет запрос и возвращает его результат.
# 
done_testing; }; subtest 'query_do ($query)' => sub { 
::is_deeply scalar do {query_do "SELECT count(*) as n FROM author"}, scalar do {[{n=>3}]}, 'query_do "SELECT count(*) as n FROM author"  # --> [{n=>3}]';
::is_deeply scalar do {query_do "SELECT id FROM author WHERE id=2"}, scalar do {[{id=>2}]}, 'query_do "SELECT id FROM author WHERE id=2"  # --> [{id=>2}]';

# 
# ## query_ref ($query, %kw)
# 
# Как `query`, но всегда возвращает скаляр.
# 
done_testing; }; subtest 'query_ref ($query, %kw)' => sub { 
my @res = query_ref "SELECT id FROM author WHERE id=:id", id => 2;
::is_deeply scalar do {\@res}, scalar do {[[ {id=>2} ]]}, '\@res  # --> [[ {id=>2} ]]';

# 
# ## query_sth ($query, %kw)
# 
# Как `query`, но возвращает `$sth`.



( run in 0.651 second using v1.01-cache-2.11-cpan-e1769b4cff6 )