213 lines
5.9 KiB
MySQL
213 lines
5.9 KiB
MySQL
|
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 ;
|