-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdates.sql
More file actions
197 lines (182 loc) · 5.05 KB
/
updates.sql
File metadata and controls
197 lines (182 loc) · 5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
create extension pgcrypto;
create or replace function RegisterUser(NameArg varchar(200),
PassArg text)
returns boolean
as
$$
declare
AffectedRows integer;
begin
insert into Users (Username, AuthToken, ELO)
values (NameArg, crypt(PassArg, gen_salt('bf')), 1000);
get diagnostics AffectedRows = row_count;
return AffectedRows > 0;
end;
$$ language plpgsql;
create or replace function ChangeNickname(IdArg integer,
NewNick varchar(200))
returns boolean
as
$$
declare
AffectedRows integer;
begin
update Users set Username = NewNick
where UserId = IdArg;
get diagnostics AffectedRows = row_count;
return AffectedRows > 0;
end;
$$ language plpgsql;
create or replace function GameStarted(PlayedMapArg MapEnum,
MatchIdArg integer)
returns integer
as
$$
declare
NewId integer;
begin
insert into Games (PlayedMap, StartTime, EndTime, WonRoundsTeam1, WonRoundsTeam2, MatchId) values
(PlayedMapArg, now(), null, 0, 0, MatchIdArg)
returning GameId into NewId;
return NewId;
end;
$$ language plpgsql;
create or replace function GameFinished(GameIdArg integer,
Team1RoundsWon integer,
Team2RoundsWon integer,
PlayerIds integer[],
PlayerKills integer[],
PlayerAssists integer[],
PlayerDeaths integer[])
returns integer
as
$$
declare
AffectedRows integer;
PlayersCount integer := array_length(PlayerIds, 1);
begin
update Games set EndTime = now(), WonRoundsTeam1 = Team1RoundsWon, WonRoundsTeam2 = Team2RoundsWon
where GameId = GameIdArg;
for i in 1..PlayersCount loop
insert into UserStat (UserId, GameId, Kills, Assists, Deaths) values
(PlayerIds[i], GameIdArg, PlayerKills[i], PlayerAssists[i], PlayerDeaths[i]);
end loop;
get diagnostics AffectedRows = row_count;
return AffectedRows;
end;
$$ language plpgsql;
-- Ограничения по рейтингу для игры в хабе
create or replace function CheckPlayerELO()
returns trigger
as
$$
declare PlayerELO integer;
declare LeftBound integer;
declare RightBound integer;
begin
select ELO
from Users
where UserId = new.UserId
into PlayerELO;
select ELOLeftBound, ELORightBound
from Hubs
where HubId = new.HubId
into LeftBound, RightBound;
if LeftBound <= PlayerELO and PlayerELO <= RightBound
then
return new;
else
raise exception 'ELO of user is not in bounds of hub bounds';
end if;
end;
$$ language plpgsql;
create trigger UserCanPlayInHub
before insert on HubPlayers
for each row
execute procedure CheckPlayerELO();
-- Матч может быть либо в рамках хаба, либо в рамках турнира,
-- либо в рамках ни того и ни другого, но не в обоих сразу
create or replace function IsMatchNotInHub()
returns trigger
as
$$
begin
if not exists (select MatchId from HubMatches where MatchId = new.MatchId)
then
return new;
else
raise exception 'Match is not in hub';
end if;
end;
$$ language plpgsql;
create or replace function IsMatchNotInTournament()
returns trigger
as
$$
begin
if not exists (select MatchId from TournamentMatches where MatchId = new.MatchId)
then
return new;
else
raise exception 'Match is not in tournament';
end if;
end;
$$ language plpgsql;
create trigger CheckHubMatchAdd
before insert on HubMatches
for each row
execute procedure IsMatchNotInTournament();
create trigger CheckTournamentMatchAdd
before insert on TournamentMatches
for each row
execute procedure IsMatchNotInHub();
-- Пользователь должен был играть в этом матче, чтобы иметь статистику по нему
create or replace function UserPlayedInTeamCheck()
returns trigger
as
$$
begin
if new.UserId in (select UserId from Games
natural join Matches
inner join Teams on Teams.TeamId = Matches.PickingSideTeamId or Teams.TeamId = Matches.OtherTeam
natural join TeamsUsers
where GameId = new.GameId)
then
return new;
else
raise exception 'User did not play in this game';
end if;
end;
$$ language plpgsql;
create trigger UserPlayedInTeam
before insert on UserStat
for each row
execute procedure UserPlayedInTeamCheck();
-- Если матч прошел в рамках хаба, то все его участники должны быть в таблице HubPlayers
create or replace function AllPlayersOfMatchInHubCheck()
returns trigger
as
$$
begin
if not exists (select HubPlayers.UserId from HubPlayers
left join (select UserId from Matches
inner join Teams t1 on t1.TeamId = Matches.PickingSideTeamId
natural join TeamsUsers
where MatchId = new.MatchId
union
select UserId from Matches
inner join Teams t1 on t1.TeamId = Matches.OtherTeam
natural join TeamsUsers
where MatchId = new.MatchId) MatchPlayers on HubPlayers.UserId = MatchPlayers.UserId
where HubId = new.HubId and HubPlayers.UserId is null)
then
return new;
else
raise exception 'Not all players of match in hub';
end if;
end;
$$ language plpgsql;
create trigger AllPlayersOfMatchInHubCheck
before insert on HubMatches
for each row
execute procedure AllPlayersOfMatchInHubCheck();