-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprocedures.sql
225 lines (197 loc) · 7.97 KB
/
procedures.sql
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
DROP PROCEDURE IF EXISTS updateLoadout;
DROP PROCEDURE IF EXISTS updateLink;
DROP PROCEDURE IF EXISTS updatePlayer;
DROP PROCEDURE IF EXISTS updateNickname;
DROP PROCEDURE IF EXISTS removeNickname;
DROP PROCEDURE IF EXISTS updateSeason;
DROP PROCEDURE IF EXISTS uploadSummary;
GO
CREATE PROCEDURE updateLoadout
@uuid UNIQUEIDENTIFIER,
@slot INT,
@data NVARCHAR(MAX)
AS
IF NOT EXISTS (SELECT p.uuid FROM Player p WHERE p.uuid = @uuid)
INSERT INTO Player (uuid, name) VALUES (@uuid, 'Unnamed');
IF EXISTS (SELECT uuid, slot FROM PvpLoadout WHERE uuid = @uuid AND slot = @slot)
UPDATE PvpLoadout SET loadoutData = @data WHERE uuid = @uuid AND slot = @slot;
ELSE
INSERT INTO PvpLoadout (uuid, slot, loadoutData) VALUES (@uuid, @slot, @data);
GO
GO
CREATE PROCEDURE updateLink
@discordId BIGINT,
@uuid UNIQUEIDENTIFIER,
@name NVARCHAR(MAX)
AS
-- NAME is not used for link removal
-- remove linked discord account from a player
IF @discordId IS NULL
UPDATE Player SET @discordId = NULL WHERE uuid = @uuid;
-- remove linked discord account from a discord accout
ELSE IF @uuid IS NULL
UPDATE Player SET @discordId = NULL WHERE discordId = @discordId;
-- adding a link
ELSE BEGIN
-- this doesn't care if a minecraft account has already been linked to some other discordid
-- it will overwrite that link and set the original minecraft account to be unlinked
-- the minecraft player that used to be attached to this
DECLARE @oldUuid UNIQUEIDENTIFIER = (SELECT uuid FROM Player WHERE discordId = @discordId);
SELECT @oldUuid AS oldUUID
IF @oldUuid IS NOT NULL
UPDATE Player SET discordId = NULL WHERE uuid = @oldUuid;
IF EXISTS (SELECT * FROM Player WHERE uuid = @uuid)
UPDATE Player SET discordId = @discordId WHERE uuid = @uuid;
ELSE
INSERT INTO Player (uuid, name, discordId) VALUES (@uuid, ISNULL(@name, 'Unknown'), @discordId);
END;
GO
GO
CREATE PROCEDURE updatePlayer
@uuid UNIQUEIDENTIFIER,
@name NVARCHAR(MAX)
AS
IF EXISTS (SELECT uuid FROM Player WHERE uuid = @uuid)
UPDATE Player SET name = @name WHERE uuid = @uuid;
ELSE
INSERT INTO Player (uuid, name, discordId) VALUES (@uuid, ISNULL(@name, 'Unknown'), NULL);
GO
GO
CREATE PROCEDURE updateNickname
@uuid UNIQUEIDENTIFIER,
@nickname NVARCHAR(MAX)
AS
INSERT INTO Nickname (uuid, nickname) VALUES (@uuid, @nickname);
GO
GO
CREATE PROCEDURE removeNickname
@uuid UNIQUEIDENTIFIER,
@nickname NVARCHAR(MAX)
AS
DELETE FROM Nickname WHERE uuid = @uuid AND nickname = @nickname;
GO
GO
CREATE PROCEDURE updateSeason
@number INT,
@logo VARBINARY(MAX),
@color INT,
@championColor INT,
@champion UNIQUEIDENTIFIER
AS
IF EXISTS (SELECT number FROM Season WHERE number = @number) BEGIN
IF @logo IS NOT NULL
UPDATE Season SET logo = @logo WHERE number = @number;
IF @color IS NOT NULL
UPDATE Season SET color = @color WHERE number = @number;
IF @championColor IS NOT NULL
UPDATE Season SET championColor = @championColor WHERE number = @number;
IF @champion IS NOT NULL
UPDATE Season SET champion = @champion WHERE number = @number;
END;
ELSE BEGIN
INSERT INTO Season (number, logo, color, championColor, champion)
VALUES (@number, ISNULL(@logo, CONVERT(VARBINARY(MAX), '')), ISNULL(@color, 0xffffff), ISNULL(@championColor, 0xffffff), @champion);
END;
SELECT s.number, s.logo, s.color, s.championColor, p.name FROM Season s
LEFT JOIN Player p ON p.uuid = s.champion
WHERE s.number = @number;
GO
GO
CREATE PROCEDURE uploadSummary
@json NVARCHAR(MAX),
@seasonNumber INT,
@gameNumber INT
AS
DECLARE @seasonError NVARCHAR(MAX) = CONCAT('Season ', @seasonNumber, ' does not exist');
IF NOT EXISTS (SELECT * FROM Season WHERE number = @seasonNumber)
THROW 51000, @seasonError, 1;
DELETE FROM gp FROM GamePlayer gp WHERE gp.gameId IN (SELECT g.id FROM Game g WHERE g.number = @gameNumber AND g.seasonNumber = @seasonNumber);
DELETE FROM Game WHERE number = @gameNumber AND seasonNumber = @seasonNumber;
DECLARE @date DATETIMEOFFSET = (SELECT TOP 1 value FROM STRING_SPLIT(JSON_VALUE(@json, '$.date'), '['));
DECLARE @gameType NCHAR(3) = JSON_VALUE(@json, '$.gameType');
DECLARE @gameLength INT = JSON_VALUE(@json, '$.gameLength');
DECLARE @teams TABLE (
name NVARCHAR(MAX),
color0 INT,
color1 INT,
members NVARCHAR(MAX)
);
DECLARE @players TABLE (
name NVARCHAR(MAX),
place INT,
timeSurvived INT,
killedBy UNIQUEIDENTIFIER,
uuid UNIQUEIDENTIFIER,
teamId INT
);
INSERT INTO @players SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.players')) WITH (
name NVARCHAR(MAX) '$.name',
place INT '$.place',
timeSurvived INT '$.timeSurvived',
killedBy UNIQUEIDENTIFIER '$.killedBy',
uuid UNIQUEIDENTIFIER '$.uuid',
teamID INT
);
INSERT INTO @teams SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.teams')) WITH (
name NVARCHAR(MAX) '$.name',
color0 INT '$.color0',
color1 INT '$.color1',
members NVARCHAR(MAX) '$.members' AS JSON
);
-- add the game
INSERT INTO Game (seasonNumber, number, startDate, type, matchTime) VALUES (@seasonNumber, @gameNumber, @date, @gameType, @gameLength)
DECLARE @gameId INT = @@IDENTITY;
DECLARE @tname NVARCHAR(MAX);
DECLARE @color0 INT;
DECLARE @color1 INT;
DECLARE @membersString NVARCHAR(MAX);
DECLARE @teamId INT;
DECLARE @membersTable TABLE ( uuid UNIQUEIDENTIFIER );
-- add teams
DECLARE @teamIterator CURSOR;
SET @teamIterator = CURSOR FOR SELECT [name], color0, color1, members FROM @teams;
OPEN @teamIterator;
FETCH NEXT FROM @teamIterator INTO @tname, @color0, @color1, @membersString;
WHILE @@FETCH_STATUS = 0 BEGIN
-- create the team
INSERT INTO Team (name, color0, color1) VALUES (@tname, @color0, @color1);
SET @teamId = @@IDENTITY;
DELETE FROM @membersTable;
INSERT INTO @membersTable SELECT * FROM OPENJSON(@membersString) WITH (
uuid UNIQUEIDENTIFIER '$'
);
-- mark temporary players as belonging to the team
UPDATE ps SET ps.teamId = @teamId FROM @players ps WHERE ps.uuid IN (SELECT ms.uuid FROM @membersTable ms);
FETCH NEXT FROM @teamIterator INTO @tname, @color0, @color1, @membersString;
END;
CLOSE @teamIterator;
DEALLOCATE @teamIterator;
DECLARE @iterUuid UNIQUEIDENTIFIER;
DECLARE @iterName NVARCHAR(MAX);
DECLARE @iterPlace INT;
DECLARE @iterTimeSurvived INT;
DECLARE @iterKilledBy UNIQUEIDENTIFIER;
DECLARE @iterTeamId INT;
-- first add the uuids and names of players into the database
-- ignore game specific rankings
DECLARE @playerIterator CURSOR;
SET @playerIterator = CURSOR FOR SELECT p.uuid, p.name FROM @players p;
OPEN @playerIterator;
FETCH NEXT FROM @playerIterator INTO @iterUuid, @iterName;
WHILE @@FETCH_STATUS = 0 BEGIN
EXECUTE updatePlayer @iterUuid, @iterName;
FETCH NEXT FROM @playerIterator INTO @iterUuid, @iterName;
END;
CLOSE @playerIterator;
DEALLOCATE @playerIterator;
-- create the gameplayers
SET @playerIterator = CURSOR FOR SELECT p.place, p.timeSurvived, p.killedBy, p.uuid, p.teamId FROM @players p;
OPEN @playerIterator;
FETCH NEXT FROM @playerIterator INTO @iterPlace, @iterTimeSurvived, @iterKilledBy, @iterUuid, @iterTeamId;
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO GamePlayer (place, timeSurvived, uuid, gameId, teamId, killedBy) VALUES (@iterPlace, @iterTimeSurvived, @iterUuid, @gameId, @iterTeamId, @iterKilledBy);
FETCH NEXT FROM @playerIterator INTO @iterPlace, @iterTimeSurvived, @iterKilledBy, @iterUuid, @iterTeamId;
END;
CLOSE @playerIterator;
DEALLOCATE @playerIterator;
GO