DPTW/MariaDB/DPTW.05.scores.my.sql

213 lines
5.9 KiB
MySQL
Raw Permalink Normal View History

create database if not exists DPTW character set utf8mb4 collate utf8mb4_general_ci;
use DPTW;
delimiter ;^
drop function if exists scores_set_validate;^
create function scores_set_validate(
$mode varchar(32),
$nick varchar(32),
$score integer
) returns bigint begin
return (
((case
when $mode is null then 1 << 0
when $mode = '' then 1 << 1
/*else ifnull((
select 0 from Modes where date_out is null && name = $mode limit 1
), 1 << 2) end) << 0) | */
else 0 end) << 0) |
((case
when $nick is null then 1 << 0
when $nick = '' then 1 << 1
else 0 end) << 3) |
((case
when $score is null then 1 << 0
when $score < 0 then 1 << 1
else 0 end) << 5) |
0);
end;^
drop procedure if exists modes_get;^
create procedure modes_get(
in $mode varchar(32),
out $id integer
) begin
set $id := (select id from Modes where date_out is null && name = $mode limit 1);
if $id is null then begin
insert into Modes(name) values($mode);
set $id := last_insert_id();
end;end if;
end;^
drop procedure if exists nicks_get;^
create procedure nicks_get(
in $nick varchar(32),
out $id integer
) begin
set $id := (select id from Nicks where date_out is null && name = $nick limit 1);
if $id is null then begin
insert into Nicks(name) values($nick);
set $id := last_insert_id();
end;end if;
end;^
drop procedure if exists scores_set;^
create procedure scores_set(
in `$session` text,
in $mode varchar(32),
in $nick varchar(32),
in $score integer,
out $error bigint,
out $id integer
) begin
declare `$database` varchar(64) default 'DPTW';
declare `$procedure` varchar(64) default 'scores_set';
declare $parameters text default json_set('{}',
'$.mode', $mode,
'$.nick', $nick,
'$.score', $score,
'$.id', 0
);
declare $session_id integer;
declare $ip_id integer;
declare $user_agent_id integer;
declare exit handler for sqlexception begin
get diagnostics condition 1
@_status = returned_sqlstate,
@_code = mysql_errno,
@message = message_text;
set $error := $error | 1 << 0;
call exceptions_set($session_id, `$database`, `$procedure`, $ip_id, $user_agent_id, $parameters, $error, @message, @_status, @_code);
end;
set $id := 0;
call sessions_full_validate(`$session`, $error, $session_id, $ip_id, $user_agent_id);
set $error := $error | (scores_set_validate($mode, $nick, $score) << 13);
if !$error then begin
declare $mode_id integer;
declare $nick_id integer;
declare $procedure_id integer;
call modes_get($mode, $mode_id);
call nicks_get($nick, $nick_id);
call procedures_get(`$database`, `$procedure`, $procedure_id);
insert into Scores(`session`, `procedure`, mode, nick, score) values
($session_id, $procedure_id, $mode_id, $nick_id, $score);
set $id := last_insert_id();
set $parameters := json_set($parameters, '$.id', $id);
end;end if;
call logs_set($session_id, `$database`, `$procedure`, $parameters, $error, true);
end;^
drop function if exists scores_list_validate;^
create function scores_list_validate(
$mode varchar(32),
$page integer,
$items_per_page integer,
$nicks varchar(32)
) returns bigint begin
return (
((case
when $mode is null then 1 << 0
when $mode = '' then 1 << 1
else ifnull((
select 0 from Modes where date_out is null && name = $mode limit 1
), 1 << 2) end) << 0) |
((case
when $page is null then 1 << 0
when $page < 1 then 1 << 1
else 0 end) << 3) |
((case
when $items_per_page is null then 1 << 0
when $items_per_page < 1 then 1 << 1
else 0 end) << 5) |
(if($nicks is null, 1 << 0, 0) << 7) |
0);
end;^
drop procedure if exists scores_list;^
create procedure scores_list(
in `$session` text,
in $mode varchar(32),
in $page integer,
in $items_per_page integer,
in $nicks varchar(32),
out $error bigint,
out $pages integer,
out $items integer
) begin
declare `$database` varchar(64) default 'DPTW';
declare `$procedure` varchar(64) default 'scores_list';
declare $parameters text default json_set('{}',
'$.page', $page,
'$.items_per_page', $items_per_page,
'$.nicks', $nicks,
'$.pages', 0,
'$.items', 0
);
declare $session_id integer;
declare $ip_id integer;
declare $user_agent_id integer;
declare exit handler for sqlexception begin
get diagnostics condition 1
@_status = returned_sqlstate,
@_code = mysql_errno,
@message = message_text;
set $error := $error | 1 << 0;
call exceptions_set($session_id, `$database`, `$procedure`, $parameters, $error, @message, @_status, @_code);
end;
set $pages := 0;
set $items := 0;
call sessions_full_validate(`$session`, $error, $session_id, $ip_id, $user_agent_id);
set $error := $error | (scores_list_validate($mode, $page, $items_per_page, $nicks) << 13);
if !$error then begin
declare $item_from integer;
declare $mode_id integer default (select id from Modes where date_out is null && name = $mode limit 1);
drop temporary table if exists DPTW_SCORES_LIST_TEMPORARY;
create temporary table DPTW_SCORES_LIST_TEMPORARY as select * from (
select *, rownum() as `position` from (select * from DPTW.ScoresView where mode_id = $mode_id) sublevel
) subtable where ifnull($nicks, '') = '' || nick like concat('%', $nicks, '%');
set $items := (select count(1) from DPTW_SCORES_LIST_TEMPORARY limit 1);
set $pages := ceil($items / $items_per_page);
if $page > $pages then
set $page := $pages;
end if;
set $item_from := ($page - 1) * $items_per_page;
select * from DPTW_SCORES_LIST_TEMPORARY limit $item_from, $items_per_page;
set $parameters := json_Set($parameters,
'$.pages', $pages,
'$.items', $items
);
end;end if;
call logs_set($session_id, `$database`, `$procedure`, $parameters, $error, true);
end;^
delimiter ;